pax_global_header00006660000000000000000000000064152606435740014526gustar00rootroot0000000000000052 comment=fa03b48b8cdfe336065f5ad8eb51fbcc40c6b1d2 typeddjango-django-stubs-fa03b48/000077500000000000000000000000001526064357400170455ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/.editorconfig000066400000000000000000000004421526064357400215220ustar00rootroot00000000000000# Check http://editorconfig.org for more information # This is the main config file for this project: root = true [*] charset = utf-8 end_of_line = lf insert_final_newline = true indent_style = space trim_trailing_whitespace = true [*.{py, pyi}] indent_size = 4 [*.toml] indent_size = 2 typeddjango-django-stubs-fa03b48/.gitattributes000066400000000000000000000001321526064357400217340ustar00rootroot00000000000000scripts/allowlist_*.txt linguist-language=ini pyrightconfig*.json linguist-language=jsonc typeddjango-django-stubs-fa03b48/.github/000077500000000000000000000000001526064357400204055ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/.github/AI_POLICY.md000066400000000000000000000034411526064357400223010ustar00rootroot00000000000000 We support using AI (i.e., LLMs) as tools for coding. However, you remain responsible for any code you publish and we are responsible for any code we merge and release. We hold a high bar for all contributions to our projects. **AI should not be used to generate comments when communicating with maintainers**. We expect comments on our projects to be written by humans. We may hide any comments that we believe are AI generated. If you are opening an issue, we expect you to describe the problem in your own words. If you are opening a pull request, we expect you to be able to explain the proposed changes in your own words. This includes the pull request body and responses to questions. **Do not copy responses from the AI when replying to questions from maintainers.** Due to the foundational nature of our projects, we require a human in the loop who understands the work produced by AI. **We do not allow autonomous agents to be used for contributing to our projects**. We will close any pull requests that we believe were created autonomously. If you wish to include context from an interaction with AI in your comments, it must be in a quote block (e.g., using `>`) and disclosed as such. It must be accompanied by human commentary explaining the relevance and implications of the context. Do not share long snippets. We understand that AI is useful when communicating as a non-native English speaker. If you are using AI to edit your comments for this purpose, please take the time to ensure it reflects your own voice and ideas. If using AI for translation, we recommend writing in your native language and including the AI translation in a quote block. typeddjango-django-stubs-fa03b48/.github/ISSUE_TEMPLATE/000077500000000000000000000000001526064357400225705ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/.github/ISSUE_TEMPLATE/bug.md000066400000000000000000000011241526064357400236650ustar00rootroot00000000000000--- name: Bug about: Create a report of something is not working labels: 'bug' --- # Bug report ## What's wrong ## How is that should be ## System information - OS: - `python` version: - `django` version: - `mypy` version: - `django-stubs` version: - `django-stubs-ext` version: typeddjango-django-stubs-fa03b48/.github/pull_request_template.md000066400000000000000000000011461526064357400253500ustar00rootroot00000000000000# I have made things! ## Related issues ## AI Policy - [ ] I have read and agree to the [AI Policy](https://github.com/typeddjango/django-stubs/blob/master/.github/AI_POLICY.md), removed any "Co-Authored-By" lines attributing coding agents, and manually reviewed the final result typeddjango-django-stubs-fa03b48/.github/renovate.json5000066400000000000000000000031031526064357400232050ustar00rootroot00000000000000{ $schema: "https://docs.renovatebot.com/renovate-schema.json", extends: ["config:best-practices"], // Python versions in CI are managed manually (test-older-django pins 3.12) ignoreDeps: ["python"], suppressNotifications: ["prEditedNotification"], mode: "full", // Wait 3 days before proposing updates to limit supply chain attack exposure minimumReleaseAge: "3 days", lockFileMaintenance: { enabled: true, automerge: true, automergeType: "branch", schedule: ["* * * * 1"], automergeSchedule: ["* * * * 2"], }, packageRules: [ { matchPackageNames: ["mypy"], rangeStrategy: "widen", }, { // Group upload/download artifact updates, the versions are dependent groupName: "Artifact GitHub Actions dependencies", matchManagers: ["github-actions"], matchPackageNames: ["actions/upload-artifact", "actions/download-artifact"], }, { // Don't update GitHub runners (e.g. 'runs-on: ubuntu-latest') groupName: "GitHub runners", matchManagers: ["github-actions"], matchDatasources: ["github-runners"], enabled: false, }, { // Django 6.0 dropped Python <3.12 support, keep the compat pin on 5.x. // Match the pyproject value, not the version: uv.lock has two django entries // and renovate's lockfile lookup keeps only the last one (6.x), see // https://github.com/renovatebot/renovate/blob/main/lib/modules/manager/pep621/schema.ts matchPackageNames: ["django"], matchCurrentValue: "/^==5\\./", allowedVersions: "<6.0.0", }, ], } typeddjango-django-stubs-fa03b48/.github/workflows/000077500000000000000000000000001526064357400224425ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/.github/workflows/mypy_primer.yml000066400000000000000000000063111526064357400255420ustar00rootroot00000000000000name: Run mypy_primer on: # Only run on PR, since we diff against main pull_request: concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true permissions: contents: read jobs: mypy_primer: name: Run runs-on: ubuntu-latest strategy: matrix: shard-index: [0] # e.g. change this to [0, 1, 2] and --num-shards below to 3 fail-fast: false steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: path: django-stubs_to_test fetch-depth: 0 - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 with: python-version: "3.14" - name: Install uv uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 - name: Install dependencies run: | uv venv uv pip install git+https://github.com/hauntsaninja/mypy_primer.git - name: Run mypy_primer shell: bash run: | cd django-stubs_to_test MYPY_VERSION=$(uv tree --package=mypy --depth=0 -q | sed -n 's/^mypy v\(.\+\)$/\1/p') echo "new commit" git checkout $GITHUB_SHA git rev-list --format=%s --max-count=1 HEAD MERGE_BASE=$(git merge-base $GITHUB_SHA origin/$GITHUB_BASE_REF) git worktree add ../django-stubs_base $MERGE_BASE cd ../django-stubs_base echo "base commit" git rev-list --format=%s --max-count=1 HEAD echo '' cd .. # fail action if exit code isn't zero or one ( uv run mypy_primer \ --new v${MYPY_VERSION} --old v${MYPY_VERSION} \ --known-dependency-selector django-stubs \ --old-prepend-path django-stubs_base --new-prepend-path django-stubs_to_test \ --num-shards 1 --shard-index ${{ matrix.shard-index }} \ --debug \ --output concise \ | tee diff_${{ matrix.shard-index }}.txt ) || [ $? -eq 1 ] - if: ${{ matrix.shard-index == 0 }} name: Save PR number run: | echo ${{ github.event.pull_request.number }} | tee pr_number.txt - name: Upload mypy_primer diff + PR number uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 if: ${{ matrix.shard-index == 0 }} with: name: mypy_primer_diffs-${{ matrix.shard-index }} path: | diff_${{ matrix.shard-index }}.txt pr_number.txt - name: Upload mypy_primer diff uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 if: ${{ matrix.shard-index != 0 }} with: name: mypy_primer_diffs-${{ matrix.shard-index }} path: diff_${{ matrix.shard-index }}.txt join_artifacts: name: Join artifacts runs-on: ubuntu-latest needs: [mypy_primer] permissions: contents: read steps: - name: Merge artifacts uses: actions/upload-artifact/merge@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: mypy_primer_diffs pattern: mypy_primer_diffs-* delete-merged: true typeddjango-django-stubs-fa03b48/.github/workflows/mypy_primer_comment.yml000066400000000000000000000074741526064357400272770ustar00rootroot00000000000000name: Comment with mypy_primer diff on: workflow_run: workflows: - Run mypy_primer types: - completed permissions: contents: read pull-requests: write jobs: comment: name: Comment PR from mypy_primer runs-on: ubuntu-latest if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: Download diffs uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const fs = require('fs'); const artifacts = await github.rest.actions.listWorkflowRunArtifacts({ owner: context.repo.owner, repo: context.repo.repo, run_id: ${{ github.event.workflow_run.id }}, }); const [matchArtifact] = artifacts.data.artifacts.filter((artifact) => artifact.name == "mypy_primer_diffs"); const download = await github.rest.actions.downloadArtifact({ owner: context.repo.owner, repo: context.repo.repo, artifact_id: matchArtifact.id, archive_format: "zip", }); fs.writeFileSync("diff.zip", Buffer.from(download.data)); - run: unzip diff.zip - name: Get PR number id: get-pr-number uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: script: | const fs = require('fs'); return parseInt(fs.readFileSync("pr_number.txt", { encoding: "utf8" })) - name: Hide old comments uses: int128/hide-comment-action@d87d3445b5b7c0181476117977004197b1d19ddc # v1.75.0 with: token: ${{ secrets.GITHUB_TOKEN }} issue-number: ${{ steps.get-pr-number.outputs.result }} - run: cat diff_*.txt | tee fulldiff.txt - name: Post comment id: post-comment uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | const MAX_CHARACTERS = 50000 const MAX_CHARACTERS_PER_PROJECT = MAX_CHARACTERS / 3 const fs = require('fs') let data = fs.readFileSync('fulldiff.txt', { encoding: 'utf8' }) function truncateIfNeeded(original, maxLength) { if (original.length <= maxLength) { return original } let truncated = original.substring(0, maxLength) // further, remove last line that might be truncated truncated = truncated.substring(0, truncated.lastIndexOf('\n')) let lines_truncated = original.split('\n').length - truncated.split('\n').length return `${truncated}\n\n... (truncated ${lines_truncated} lines) ...` } const projects = data.split('\n\n') // don't let one project dominate data = projects.map(project => truncateIfNeeded(project, MAX_CHARACTERS_PER_PROJECT)).join('\n\n') // posting comment fails if too long, so truncate data = truncateIfNeeded(data, MAX_CHARACTERS) console.log("Diff from mypy_primer:") console.log(data) let body if (data.trim()) { body = 'Diff from [mypy_primer](https://github.com/hauntsaninja/mypy_primer), ' body += 'showing the effect of this PR on type check results on a corpus of open source code:\n```diff\n' body += data + '```' const prNumber = parseInt(fs.readFileSync("pr_number.txt", { encoding: "utf8" })) await github.rest.issues.createComment({ issue_number: prNumber, owner: context.repo.owner, repo: context.repo.repo, body }) } typeddjango-django-stubs-fa03b48/.github/workflows/release.yml000066400000000000000000000027401526064357400246100ustar00rootroot00000000000000name: Release on: release: types: [published] concurrency: group: release-${{ github.event.release.tag_name }} jobs: build-and-publish-ext: runs-on: ubuntu-latest environment: name: release-ext url: https://pypi.org/p/django-stubs-ext permissions: id-token: write steps: - name: Install uv & Python uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 with: python-version: "3.13" - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: fetch-depth: 0 - name: Build ext package run: uv build --package=django-stubs-ext - name: Publish ext to PyPI uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2 build-and-publish: runs-on: ubuntu-latest needs: [build-and-publish-ext] environment: name: release url: https://pypi.org/p/django-stubs permissions: id-token: write steps: - name: Install uv & Python uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 with: python-version: "3.13" - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: fetch-depth: 0 - name: Build package run: uv build --package=django-stubs - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2 typeddjango-django-stubs-fa03b48/.github/workflows/test.yml000066400000000000000000000225421526064357400241510ustar00rootroot00000000000000name: test on: push: branches: - master # Renovate "automerge" branches -- there is no PR, so branch tests are used instead - "renovate/lock-file-maintenance" pull_request: workflow_dispatch: env: UV_FROZEN: true # https://docs.astral.sh/uv/configuration/environment/#uv_frozen UV_NO_SYNC: true # prevent `uv run` cmd from bringing very dev dependencies permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: mypy-self-check: timeout-minutes: 10 runs-on: ubuntu-latest strategy: matrix: python-version: ['3.11', '3.12', '3.13', '3.14'] fail-fast: false steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Install uv uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: uv sync --no-dev --group tests - name: Run mypy on plugin code run: uv run mypy mypy_django_plugin - name: Run mypy on ext code run: uv run mypy ext - name: Run mypy on scripts and utils run: uv run mypy scripts - name: Run mypy on stubs run: uv run mypy --cache-dir=/dev/null --no-incremental django-stubs - name: Run mypy on the test cases run: uv run mypy tests test: timeout-minutes: 15 runs-on: ubuntu-latest strategy: matrix: python-version: ['3.11', '3.12', '3.13', '3.14'] shard: [0, 1] fail-fast: false steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Cache apt packages uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: /var/cache/apt/archives key: apt-gdal-${{ runner.os }} - name: Setup system dependencies run: | sudo apt-get update || true sudo apt-get install -y --no-install-recommends libgdal-dev libproj-dev - name: Install uv uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: uv sync --no-dev --group tests # Must match `shard` definition in the test matrix: - name: Run pytest tests run: uv run pytest --num-shards=2 --shard-id=${{ matrix.shard }} -n auto tests test-older-django: timeout-minutes: 15 runs-on: ubuntu-latest strategy: matrix: shard: [0, 1] fail-fast: false steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Cache apt packages uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: /var/cache/apt/archives key: apt-gdal-${{ runner.os }} - name: Setup system dependencies run: | sudo apt-get update || true sudo apt-get install -y --no-install-recommends libgdal-dev libproj-dev - name: Install uv uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 - name: Set up Python uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 with: python-version: '3.12' - name: Install dependencies run: uv sync --no-dev --group tests - name: Downgrade Django run: uv pip install django==5.2.0 # Exit 1 only if ont of the pytest error is a mypy crash - name: Run pytest tests run: "! uv run pytest --num-shards=2 --shard-id=${{ matrix.shard }} -n auto tests | grep 'pytest_mypy_plugins.utils.TypecheckAssertionError: Critical error occurred'" stubtest: timeout-minutes: 10 runs-on: ubuntu-latest strategy: matrix: python-version: ['3.12', '3.13', '3.14'] fail-fast: false steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Cache apt packages uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 with: path: /var/cache/apt/archives key: apt-gdal-${{ runner.os }} - name: Setup system dependencies run: | sudo apt-get update || true sudo apt-get install -y --no-install-recommends libgdal-dev libproj-dev - name: Install uv uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: uv sync --no-dev --group tests - name: Run stubtest run: uv run ./scripts/stubtest.sh run-pyright: timeout-minutes: 10 runs-on: ubuntu-latest strategy: matrix: python-version: ['3.12'] # TODO: enable on other versions fail-fast: false steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Install uv uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: uv sync --no-dev --group pyright # See https://github.com/jakebailey/pyright-action#providing-a-pyright-version-sourced-from-preexisting-dependencies - name: Add venv to path run: echo "$PWD/.venv/bin" >> $GITHUB_PATH - name: Run pyright on the test cases uses: jakebailey/pyright-action@8ec14b5cfe41f26e5f41686a31eb6012758217ef # v3 with: version: PATH run-pyrefly: timeout-minutes: 10 runs-on: ubuntu-latest strategy: matrix: python-version: ['3.12'] fail-fast: false steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Install uv uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: uv sync --no-dev --group pyrefly - name: Add venv to path run: echo "$PWD/.venv/bin" >> $GITHUB_PATH - name: Run pyrefly on the test cases run: pyrefly check tests/assert_type run-ty: timeout-minutes: 10 runs-on: ubuntu-latest strategy: matrix: python-version: ['3.12'] fail-fast: false steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Install uv uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: uv sync --no-dev --group ty - name: Add venv to path run: echo "$PWD/.venv/bin" >> $GITHUB_PATH - name: Run ty on the test cases run: ty check tests/assert_type matrix-test: timeout-minutes: 10 runs-on: ubuntu-latest strategy: fail-fast: false matrix: python-version: ['3.11', '3.12', '3.13', '3.14'] django-version: ['5.2'] include: - python-version: '3.12' django-version: '6.0' - python-version: '3.13' django-version: '6.0' - python-version: '3.12' django-version: '6.1' - python-version: '3.13' django-version: '6.1' - python-version: '3.14' django-version: '6.1' steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Install uv uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: uv sync --no-dev --group tests - name: Run django-stubs-ext tests run: uv run --with "django==${{ matrix.django-version }}" pytest ext build-and-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: fetch-tags: true - name: Install uv & Python uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 with: python-version: "3.13" - name: Ensure uv.lock is up to date run: env --unset=UV_FROZEN uv lock --check - name: Build run: uv build --all-packages typeddjango-django-stubs-fa03b48/.gitignore000066400000000000000000000002601526064357400210330ustar00rootroot00000000000000*.egg-info .DS_Store .idea/ .vscode/ .mypy_cache/ .pytest_cache/ .ruff_cache/ .venv/ venv/ __pycache__/ django-source/ out/ pip-wheel-metadata/ stubgen/ build/ dist/ ext/dist/ typeddjango-django-stubs-fa03b48/.pre-commit-config.yaml000066400000000000000000000025631526064357400233340ustar00rootroot00000000000000# See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks default_language_version: python: "3.13" repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # frozen: v6.0.0 hooks: - id: trailing-whitespace - id: check-executables-have-shebangs - id: debug-statements - id: end-of-file-fixer - id: check-yaml - id: check-toml - id: check-merge-conflict - id: mixed-line-ending args: [--fix=lf] - id: check-case-conflict - repo: https://github.com/astral-sh/ruff-pre-commit rev: a56c0b927e6465d37cae3e97d35d4d18ab2b96cd # frozen: v0.16.9 hooks: - id: ruff-check args: ["--fix", "--exit-non-zero-on-fix"] - id: ruff-format - repo: https://github.com/codespell-project/codespell rev: 57b21406f092110c18776e39b0bda50d37c945c8 # frozen: v2.4.3 hooks: - id: codespell args: ["-w"] - repo: https://github.com/astral-sh/uv-pre-commit rev: 2aeb804518b4373dbf5adb8dddc5466d9a6e6b21 # frozen: 0.12.19 hooks: - id: uv-lock ci: autofix_commit_msg: "[pre-commit.ci] auto fixes from pre-commit.com hooks" autofix_prs: true autoupdate_commit_msg: "[pre-commit.ci] pre-commit autoupdate" autoupdate_schedule: weekly submodules: false skip: - uv-lock typeddjango-django-stubs-fa03b48/CONTRIBUTING.md000066400000000000000000000230141526064357400212760ustar00rootroot00000000000000# Contribution Guide This project is open source and community driven. As such we encourage code contributions of all kinds. Some areas you can contribute in: 1. Improve the stubs 2. Sync stubs with the latest version of Django 3. Improve plugin code and extend its capabilities 4. Write tests 5. Update dependencies 6. Fix and remove things from our `scripts/stubtest/allowlist_todo.txt` ## Tutorials If you want to start working on this project, you will need to get familiar with python typings. The Mypy documentation offers an excellent resource for this, as well as the python official documentation: - [Mypy typing documentation](https://mypy.readthedocs.io/en/stable/#overview-type-system-reference) - [Python official typing documentation](https://docs.python.org/3/library/typing.html) - [Typing in Python](https://inventwithpython.com/blog/2019/11/24/type-hints-for-busy-python-programmers/) article Additionally, the following resources might be useful: - [How to write custom mypy plugins](https://mypy.readthedocs.io/en/stable/extending_mypy.html) - [Typechecking Django and DRF](https://sobolevn.me/2019/08/typechecking-django-and-drf) guide - [Testing mypy stubs, plugins, and types](https://sobolevn.me/2019/08/testing-mypy-types) guide - [Awesome Python Typing](https://github.com/typeddjango/awesome-python-typing) list ## Dev setup ### Repository Setup As a first step you will need to fork this repository and clone your fork locally. In order to be able to continuously sync your fork with the origin repository's master branch, you will need to set up an upstream master. To do so follow this [official github guide](https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/syncing-a-fork). ### System Dependencies The test suite requires some system libraries that Django itself treats as optional. This project depends on `mysqlclient`, which needs MySQL/MariaDB C client libraries to build. Install them for your platform following the [mysqlclient install guide](https://github.com/PyMySQL/mysqlclient#install). For Debian/Ubuntu, the [django-docker-box packages list](https://github.com/django/django-docker-box/blob/main/packages.txt) is also a useful reference. **GDAL and GEOS** are needed to pass all tests (2 GIS-related tests require them). See the Django documentation on [installing geospatial libraries](https://docs.djangoproject.com/en/stable/ref/contrib/gis/install/geolibs/). If you're not working on GIS-related stubs, you can skip GDAL/GEOS — the 2 failing tests won't affect other contributions. > **macOS Note:** Homebrew installs GDAL/GEOS to `/opt/homebrew` (Apple Silicon) or `/usr/local` (Intel), > which are not in the default library search path. The GIS tests may fail unless you create symlinks: > > ```bash > sudo mkdir -p /usr/local/lib > sudo ln -s /opt/homebrew/opt/gdal/lib/libgdal.dylib /usr/local/lib/libgdal.dylib > sudo ln -s /opt/homebrew/opt/geos/lib/libgeos_c.dylib /usr/local/lib/libgeos_c.dylib > ``` ### Dependency Setup We use [uv](https://github.com/astral-sh/uv) to manage our dev dependencies. To install it, see their [installation guide](https://docs.astral.sh/uv/getting-started/installation/) We use [just](https://github.com/casey/just) as a command runner. Install it with: ```bash uv tool install rust-just ``` Then bootstrap your environment (installs pre-commit hooks and syncs dependencies): ```bash just bootstrap ```
Manual setup (without just) ```bash uv sync source .venv/bin/activate pre-commit install --install-hooks ```
### Testing and Linting Running `just` at the root of the repository lists all available recipes Before submitting a PR, run all checks at once: ```bash just pre-mr-check ``` Extra arguments can be passed to `test` and `stubtest`: ```bash just test tests -k test_name just stubtest --allowlist extra.txt ``` If you get unexpected results, clear the mypy cache with `just clean`. ### Model-based `assert_type` tests For tests that need Django models, add a `models.py` module under `tests/assert_type/`. Its package is discovered and automatically added to `INSTALLED_APPS` for the test suite. To keep a test self-contained, put both the models **and** the `assert_type` assertions in that single `models.py`. Write the assertions inside functions, they are never executed and only statically checked, so they can safely reference the app registry: ```python # tests/assert_type/apps/test_registry/models.py from __future__ import annotations from django.apps import apps from django.db import models from typing_extensions import assert_type class First(models.Model): pass def get_model_resolves_literal_references() -> None: # only the mypy plugin resolves the reference; the stubs return `type[Any]`, so the # other type checkers need an inline ignore for the `assert_type` mismatch assert_type(apps.get_model("test_registry.First"), type[First]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] ``` ```text tests/assert_type/ └── apps/test_registry/ ├── __init__.py └── models.py ``` ### Debugging plugin code For yml tests, we use a dedicated [pytest plugin](https://github.com/typeddjango/pytest-mypy-plugins) that is by default running mypy in a subprocess, making it difficult to debug. To avoid that, run pytest with the `--mypy-same-process` flag. ```shell pytest --mypy-same-process tests/typecheck/managers/querysets/test_annotate.yml ``` ### Testing stubs with `stubtest` Run `just stubtest` (or [`./scripts/stubtest.sh`](scripts/stubtest.sh) directly) to test that stubs and sources are in-line. We have some special files to allow errors: 1. [`scripts/stubtest/allowlist.txt`](scripts/stubtest/allowlist.txt) - Permanent exclusions, e.g. internal utilities, plugin-handled items, type system limitations. 2. [`scripts/stubtest/allowlist_todo.txt`](scripts/stubtest/allowlist_todo.txt) - General backlog of stub errors to fix or move to permanent allowlist. You might also want to disable `incremental` mode while working on `stubtest` changes. This mode leads to several known problems (stubs do not show up or have strange errors). ## Submission Guidelines The workflow for contributions is fairly simple: 1. Fork and set up the repository as in the previous step. 2. Create a local branch. 3. Make whatever changes you want to contribute. 4. Ensure your contribution passes linting and tests. 5. Make a pull request with an adequate description. ## Generics As Django uses a lot of the more dynamic features of Python (i.e. metaobjects), statically typing it requires heavy use of generics. Unfortunately, the syntax for generics is also valid Python syntax. For instance, the statement `class SomeClass(SuperType[int])` implicitly translates to `class SomeClass(SuperType.__class_getitem__(int))`. If `SuperType` doesn't define the `__class_getitem__` method, this causes a runtime error, even if the code passes type checking. When adding a new generic class, or changing an existing class to use generics, the `tests/test_generic_consistency.py` test checks that the class (or one of its bases) is patched in the [`django_stubs_ext.patch` module](https://github.com/typeddjango/django-stubs/blob/master/ext/django_stubs_ext/patch.py). If it fails, please add the new generic class to the `_need_generic` list there. ## Private attributes We only add hints for private attributes when it has some demonstrated real-world use case. That means from a third-party package or some well described snippet for a project. This rule helps us avoid tying in too closely to Django’s undocumented internals. ## Releasing `django-stubs` 1. Open a pull request that updates `pyproject.toml`, `ext/pyproject.toml` and `README.md` (anyone can open this PR, not just maintainers): - Version number `major.minor.patch` is formed as follows: `major.minor` version must match newest supported Django release. `patch` is sequentially increasing for each stubs release. Reset to `0` if `major.minor` was updated. - Update the `version =` value within `[project]` section in **both** `pyproject.toml` files. The versions must be in sync. - Update `django-stubs-ext>=` dependency in root `pyproject.toml` to the same version number. - Run `uv lock` to update lockfile - Add a new row at the top of ['Version compatibility' table in README.md](README.md#version-compatibility). - Use pull request title "Version x.y.z release" by convention. - Add the correct classifiers to `classifiers =` if support is added for a new Python or Django version 2. Ensure the CI succeeds. A maintainer must merge this PR. If it's just a version bump, no need to wait for a second maintainer's approval. 3. A maintainer must [сreate a new GitHub release](https://github.com/typeddjango/django-stubs/releases/new): - Under "Choose a tag" enter the new version number. Do **not** use `v` prefix. - Click "Generate release notes". - Look for merged PRs with the ['release notes reminder' label](https://github.com/typeddjango/django-stubs/issues?q=is%3Aopen+is%3Aissue+label%3A%22release+notes+reminder%22) and move them to a separate section at the top, so that they stand out. Remove the label from PRs. - Delete all release notes lines containing `by @pre-commit-ci` or `by @dependabot`, as these are irrelevant for our users. 4. Once you feel brave enough, click "Publish release". 5. Check that the [release workflow](https://github.com/typeddjango/django-stubs/actions/workflows/release.yml) succeeds. typeddjango-django-stubs-fa03b48/LICENSE.md000066400000000000000000000020631526064357400204520ustar00rootroot00000000000000Copyright (c) Maxim Kurnikov. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. typeddjango-django-stubs-fa03b48/README.md000066400000000000000000000511241526064357400203270ustar00rootroot00000000000000django-stubs [![test](https://github.com/typeddjango/django-stubs/actions/workflows/test.yml/badge.svg?branch=master&event=push)](https://github.com/typeddjango/django-stubs/actions/workflows/test.yml) [![Checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/) [![StackOverflow](https://shields.io/badge/ask-stackoverflow-orange?logo=stackoverflow)](https://stackoverflow.com/questions/tagged/django-stubs?tab=Active) This package contains [type stubs](https://www.python.org/dev/peps/pep-0561/) and a custom mypy plugin to provide more precise static types and type inference for Django framework. Django uses some Python "magic" that makes having precise types for some code patterns problematic. This is why we need this project. The final goal is to be able to get precise types for most common patterns. ## Supported type checkers - mypy: full and complete support with multiple advanced features with our custom mypy plugin - pyright: basic support, checked in CI - pyrefly: basic support, checked in CI - ty: basic support, checked in CI ## Installation ```bash pip install 'django-stubs[compatible-mypy]' ``` To make mypy aware of the plugin, you need to add ```ini [mypy] plugins = mypy_django_plugin.main [mypy.plugins.django-stubs] django_settings_module = "myproject.settings" ``` in your `mypy.ini` or `setup.cfg` [file](https://mypy.readthedocs.io/en/latest/config_file.html). [pyproject.toml](https://mypy.readthedocs.io/en/stable/config_file.html#using-a-pyproject-toml-file) configurations are also supported: ```toml [tool.mypy] plugins = ["mypy_django_plugin.main"] [tool.django-stubs] django_settings_module = "myproject.settings" ``` Two things happening here: 1. We need to explicitly list our plugin to be loaded by `mypy` 2. You can either specify `django_settings_module` as seen above, or let `django_stubs` use the `DJANGO_SETTINGS_MODULE` variable from your environment. This fully working [typed boilerplate](https://github.com/wemake-services/wemake-django-template) can serve you as an example. ## Version compatibility We rely on different `django` and `mypy` versions: | django-stubs | Mypy version | Django version | Django partial support | Python version | |----------------|--------------|----------------|------------------------|----------------| | 6.1.2 | 1.13 - 2.4 | 6.1 | 6.0, 5.2 | 3.11 - 3.14 | | 6.1.1 | 1.13 - 2.3 | 6.1 | 6.0, 5.2 | 3.11 - 3.14 | | 6.1.0 | 1.13 - 2.3 | 6.1 | 6.0, 5.2 | 3.11 - 3.14 | | 6.0.9 | 1.13 - 2.3 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 | | 6.0.8 | 1.13 - 2.3 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 | | 6.0.7 | 1.13 - 2.3 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 | | 6.0.6 | 1.13 - 2.1 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 | | 6.0.5 | 1.13 - 2.1 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 | | 6.0.4 | 1.13 - 2.0 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 | | 6.0.3 | 1.13 - 1.20 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 | | 6.0.2 | 1.13 - 1.20 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 | | 6.0.1 | 1.13 - 1.19 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 | | 6.0.0 | 1.13 - 1.19 | 6.0 | 5.2, 5.1, 5.0 | 3.10 - 3.14 | | 5.2.9 | 1.13 - 1.19 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 | | 5.2.8 | 1.13 - 1.19 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 | | 5.2.7 | 1.13 - 1.18 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 | | 5.2.6 | 1.13 - 1.18 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 | | 5.2.5 | 1.13 - 1.18 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 | | 5.2.4 | 1.13 - 1.18 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 | | 5.2.3 | 1.13 - 1.18 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 | | 5.2.2 | 1.13 - 1.17 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 | | 5.2.1 | 1.13 - 1.16 | 5.2 | 5.1, 5.0 | 3.10 - 3.13 | | 5.2.0 | 1.13+ | 5.2 | 5.1, 5.0 | 3.10 - 3.13 | What "partial" support means, and why we don't pin to the exact Django/mypy version, is explained in https://github.com/typeddjango/django-stubs/discussions/2101#discussioncomment-9276632. ## Features ### Type checking of Model Meta attributes > [!NOTE] > If you are using the mypy plugin and have `django_stub_ext` installed, your model `Meta` classes > will be automatically type-checked without further changes. By inheriting from the `TypedModelMeta` class, you can ensure you're using correct types for attributes: ```python from django.db import models from django_stubs_ext.db.models import TypedModelMeta class MyModel(models.Model): example = models.CharField(max_length=100) class Meta(TypedModelMeta): ordering = ["example"] constraints = [ models.UniqueConstraint(fields=["example"], name="unique_example"), ] ``` ### Other typed base classes * `django_stubs_ext.db.router.TypedDatabaseRouter` can be used as base when implementing custom database routers. ## Settings django-stubs has a few settings, which you can list in: * `pyproject.toml`, under the table `[tool.django-stubs]` * `mypy.ini` under the table `[mypy.plugins.django-stubs]` The supported settings are: - `django_settings_module`, a string, default to `os.getenv(DJANGO_SETTINGS_MODULE)`. Specify the import path of your settings module, the same as Django’s [`DJANGO_SETTINGS_MODULE` environment variable](https://docs.djangoproject.com/en/stable/topics/settings/#designating-the-settings). - `strict_settings`, a boolean, default `true`. Set to `false` if using dynamic settings, as [described below](https://github.com/typeddjango/django-stubs#how-to-use-a-custom-library-to-handle-django-settings). - `strict_model_abstract_attrs`, a boolean, default `true`. Set to `false` if you want to keep `.objects`, `.DoesNotExist`, `.NotUpdated`, and `.MultipleObjectsReturned` attributes on `models.Model` type. [See here why](https://github.com/typeddjango/django-stubs?tab=readme-ov-file#how-to-use-typemodel-annotation-with-objects-attribute) this is dangerous to do by default. ## FAQ ### Is this an official Django project? No, it is not. We are independent from Django at the moment. There's a [proposal](https://github.com/django/deps/pull/65) to merge our project into the Django itself. You can show your support by liking the PR. ### Is it safe to use this in production? Yes, it is! This project does not affect your runtime at all. It only affects `mypy` type checking process. But, it does not make any sense to use this project without `mypy`. ### mypy crashes when I run it with this plugin installed The current implementation uses Django's runtime to extract information about models, so it might crash if your installed apps or `models.py` are broken. In other words, if your `manage.py runserver` crashes, mypy will crash too. You can also run `mypy` with [`--tb`](https://mypy.readthedocs.io/en/stable/command_line.html#cmdoption-mypy-show-traceback) option to get extra information about the error. ### I cannot use QuerySet or Manager with type annotations You can get a `TypeError: 'type' object is not subscriptable` when you will try to use `QuerySet[MyModel]`, `Manager[MyModel]` or some other Django-based Generic types. This happens because these Django classes do not support [`__class_getitem__`](https://www.python.org/dev/peps/pep-0560/#class-getitem) magic method in runtime. 1. You can go with our [`django_stubs_ext`](https://github.com/typeddjango/django-stubs/tree/master/ext) helper, that patches all the types we use as Generic in django. Install it: ```bash pip install django-stubs-ext # as a production dependency ``` And then place in your top-level settings: ```python import django_stubs_ext django_stubs_ext.monkeypatch() ``` You can add extra types to patch with `django_stubs_ext.monkeypatch(extra_classes=[YourDesiredType])` **If you use generic symbols in `django.contrib.auth.forms`**, you will have to do the monkeypatching manually in your first [`AppConfig.ready`](https://docs.djangoproject.com/en/stable/ref/applications/#django.apps.AppConfig.ready). This is currently required because `django.contrib.auth.forms` cannot be imported until django is initialized. ```python import django_stubs_ext from django.apps import AppConfig class ClientsConfig(AppConfig): name = "clients" def ready(self) -> None: from django.contrib.auth.forms import SetPasswordMixin, SetUnusablePasswordMixin # For Django version prior to 5.1, use `extra_classes=[SetPasswordForm, AdminPasswordChangeForm]` instead. django_stubs_ext.monkeypatch(extra_classes=[SetPasswordMixin, SetUnusablePasswordMixin]) ``` 2. You can use strings instead: `'QuerySet[MyModel]'` and `'Manager[MyModel]'`, this way it will work as a type for `mypy` and as a regular `str` in runtime. ### How can I create a HttpRequest that's guaranteed to have an authenticated user? Django's built in [`HttpRequest`](https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.HttpRequest) has the attribute `user` that resolves to the type `User | AnonymousUser` where `User` is the user model specified by the `AUTH_USER_MODEL` setting. If you want a `HttpRequest` that you can type-annotate with where you know that the user is authenticated you can subclass the normal `HttpRequest` class like so: ```python from django.http import HttpRequest from my_user_app.models import MyUser class AuthenticatedHttpRequest(HttpRequest): user: MyUser ``` And then use `AuthenticatedHttpRequest` instead of the standard `HttpRequest` for when you know that the user is authenticated. For example in views using the `@login_required` decorator. ### Why am I getting incompatible return type errors on my custom managers? If you declare your custom managers without generics and override built-in methods you might see an error message about incompatible error messages, something like this: ```python from django.db import models class MyManager(model.Manager): def create(self, **kwargs) -> "MyModel": pass ``` will cause this error message: > error: Return type "MyModel" of "create" incompatible with return type "_T" in supertype "BaseManager" This is happening because the `Manager` class is generic, but without specifying generics the built-in manager methods are expected to return the generic type of the base manager, which is any model. To fix this issue you should declare your manager with your model as the type variable: ```python class MyManager(models.Manager["MyModel"]): ... ``` ### How do I annotate cases where I called QuerySet.annotate? Django-stubs provides a special type, `django_stubs_ext.WithAnnotations[Model, ]`, which indicates that the `Model` has been annotated, meaning it requires extra attributes on the model instance. You should provide a `TypedDict` of these attributes, e.g. `WithAnnotations[MyModel, MyTypedDict]`, to specify which annotated attributes are present. Currently, the mypy plugin can recognize that specific names were passed to `QuerySet.annotate` and include them in the type, but does not record the types of these attributes. The knowledge of the specific annotated fields is not yet used in creating more specific types for `QuerySet`'s `values`, `values_list`, or `filter` methods, however knowledge that the model was annotated _is_ used to create a broader type result type for `values`/`values_list`, and to allow `filter`ing on any field. ```python from typing import TypedDict from django_stubs_ext import WithAnnotations from django.db import models from django.db.models.expressions import Value class MyModel(models.Model): username = models.CharField(max_length=100) class MyTypedDict(TypedDict): foo: str def func(m: WithAnnotations[MyModel, MyTypedDict]) -> str: print(m.bar) # Error, since field "bar" is not in MyModel or MyTypedDict. return m.foo # OK, since we said field "foo" was allowed func(MyModel.objects.annotate(foo=Value("")).get(id=1)) # OK func(MyModel.objects.annotate(bar=Value("")).get(id=1)) # Error ``` You can also use `WithAnnotations` in custom `QuerySet` methods by making the queryset generic over a model `TypeVar`. This way the return type stays accurate through chained calls and manager access: ```python from typing import TypeVar, TypedDict from django.db import models from django.db.models import Manager from django_stubs_ext import WithAnnotations class SalesDict(TypedDict): total_sales: int _Model = TypeVar("_Model", bound=models.Model, covariant=True) class ProductQuerySet(models.QuerySet[_Model]): def with_sales(self) -> "ProductQuerySet[WithAnnotations[_Model, SalesDict]]": return self.annotate(total_sales=models.Sum("order__amount")) ProductManager = Manager.from_queryset(ProductQuerySet) class Product(models.Model): name = models.CharField(max_length=100) objects = ProductManager() product = Product.objects.with_sales().get(id=1) product.total_sales # OK, int product.name # OK, str ``` ### Why am I getting incompatible argument type mentioning `_StrPromise`? The lazy translation functions of Django (such as `gettext_lazy`) return a `Promise` instead of `str`. These two types [cannot be used interchangeably](https://github.com/typeddjango/django-stubs/pull/1139#issuecomment-1232167698). The return type of these functions was therefore [changed](https://github.com/typeddjango/django-stubs/pull/689) to reflect that. If you encounter this error in your own code, you can either cast the `Promise` to `str` (causing the translation to be evaluated), or use the `StrPromise` or `StrOrPromise` types from `django-stubs-ext` in type hints. Which solution to choose depends depends on the particular case. See [working with lazy translation objects](https://docs.djangoproject.com/en/stable/topics/i18n/translation/#working-with-lazy-translation-objects) in the Django documentation for more information. If this is reported on Django code, please report an issue or open a pull request to fix the type hints. ### How to use a custom library to handle Django settings? Using something like [`django-split-settings`](https://github.com/wemake-services/django-split-settings) or [`django-configurations`](https://github.com/jazzband/django-configurations) will make it hard for mypy to infer your settings. This might also be the case when using something like: ```python try: from .local_settings import * except Exception: pass ``` So, mypy would not like this code: ```python from django.conf import settings settings.CUSTOM_VALUE # E: 'Settings' object has no attribute 'CUSTOM_VALUE' ``` To handle this corner case we have a special setting `strict_settings` (`True` by default), you can switch it to `False` to always return `Any` and not raise any errors if runtime settings module has the given value, for example `pyproject.toml`: ```toml [tool.django-stubs] strict_settings = false ``` or `mypy.ini`: ```ini [mypy.plugins.django-stubs] strict_settings = false ``` And then: ```python from typing import reveal_type # Works: reveal_type(settings.EXISTS_AT_RUNTIME) # N: Any # Errors: reveal_type(settings.MISSING) # E: 'Settings' object has no attribute 'MISSING' ``` ### How to use `type[Model]` annotation with `.objects` attribute? Let's say you have a function similar to this one, which accepts a model type and accesses its `.object` attribute: ```python from django.db import models def assert_zero_count(model_type: type[models.Model]) -> None: assert model_type.objects.count() == 0 ``` This code will raise an error from mypy: ``` error: "type[Model]" has no attribute "objects" [attr-defined] ``` It is a common problem: some `type[models.Model]` types won't have `.objects` available. Notable example: [abstract models](https://docs.djangoproject.com/en/stable/topics/db/models/#abstract-base-classes). See [the reasoning here](https://github.com/typeddjango/django-stubs/issues/1684). So, instead for the general case you should write: ```python def assert_zero_count(model_type: type[models.Model]) -> None: assert model_type._default_manager.count() == 0 ``` Configurable with `strict_model_abstract_attrs = false` to skip removing `.objects`, `.DoesNotExist`, `.NotUpdated`, and `.MultipleObjectsReturned` attributes from `model.Model` if you are using our mypy plugin. Use this setting on your own risk, because it can hide valid errors. ### Do I need to annotate reverse relations? Not if you use our mypy plugin. It reads your app registry and declares every reverse accessor for you, as `RelatedManager[Model]`, or `ManyRelatedManager[Model, Through]` for a `ManyToManyField`. pyright, pyrefly and ty do not run the plugin, so under those you declare them yourself. Reach for `RelatedManager` rather than `Manager`: a reverse accessor is read from a model instance, whereas a regular manager such as `objects` only exists on the model class. ```python from django.db import models from django_stubs_ext.db.models.manager import ManyRelatedManager, RelatedManager class Article(models.Model): category_set: RelatedManager[Category] tags: ManyRelatedManager[Tag, ArticleTag] ``` Make sure to import symbols from `django_stubs_ext.db.models.manager`. Django dynamically create these so they cannot be imported directly ### How to type a custom `models.Field`? > [!NOTE] > This require type generic support, see this section to enable it. Django `models.Field` (and subclasses) are generic types with two parameters: - `_ST`: type that can be used when setting a value - `_GT`: type that will be returned when getting a value When you create a subclass, you have two options depending on how strict you want the type to be for consumers of your custom field. 1. Generic subclass: ```python from typing import TypeVar, reveal_type from django.db import models _ST = TypeVar("_ST", contravariant=True) _GT = TypeVar("_GT", covariant=True) class MyIntegerField(models.IntegerField[_ST, _GT]): ... class User(models.Model): my_field = MyIntegerField() reveal_type(User().my_field) # N: Revealed type is "int" User().my_field = "12" # OK (because Django IntegerField allows str and will try to coerce it) ``` 2. Non-generic subclass (more strict): ```python from typing import reveal_type from django.db import models # This is a non-generic subclass being very explicit # that it expects only int when setting values. class MyStrictIntegerField(models.IntegerField[int, int]): ... class User(models.Model): my_field = MyStrictIntegerField() reveal_type(User().my_field) # N: Revealed type is "int" User().my_field = "12" # E: Incompatible types in assignment (expression has type "str", variable has type "int") ``` See mypy section on [generic classes subclasses](https://mypy.readthedocs.io/en/stable/generics.html#defining-subclasses-of-generic-classes). ## Related projects - [`awesome-python-typing`](https://github.com/typeddjango/awesome-python-typing) - Awesome list of all typing-related things in Python. - [`djangorestframework-stubs`](https://github.com/typeddjango/djangorestframework-stubs) - Stubs for Django REST Framework. - [`pytest-mypy-plugins`](https://github.com/typeddjango/pytest-mypy-plugins) - `pytest` plugin that we use for testing `mypy` stubs and plugins. - [`wemake-django-template`](https://github.com/wemake-services/wemake-django-template) - Create new typed Django projects in seconds. - [`django-modern-rest`](https://github.com/wemake-services/django-modern-rest) - Modern REST framework for Django with everything properly typed. ## Contributing This project is open source and community driven. As such we encourage contributions big and small. You can contribute by doing any of the following: 1. Contribute code (e.g. improve stubs, add plugin capabilities, write tests etc) - to do so please follow the [contribution guide](./CONTRIBUTING.md). 2. Assist in code reviews and discussions in issues. 3. Identify bugs and issues and report these 4. Ask and answer questions on [StackOverflow](https://stackoverflow.com/questions/tagged/django-stubs) You can always also reach out in gitter to discuss your contributions! typeddjango-django-stubs-fa03b48/django-stubs/000077500000000000000000000000001526064357400214455ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/__init__.pyi000066400000000000000000000003401526064357400237240ustar00rootroot00000000000000from typing import Literal from .utils.version import get_version as get_version VERSION: tuple[int, int, int, Literal["alpha", "beta", "rc", "final"], int] __version__: str def setup(set_prefix: bool = ...) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/apps/000077500000000000000000000000001526064357400224105ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/apps/__init__.pyi000066400000000000000000000001571526064357400246750ustar00rootroot00000000000000from .config import AppConfig as AppConfig from .registry import apps as apps __all__ = ["AppConfig", "apps"] typeddjango-django-stubs-fa03b48/django-stubs/apps/config.pyi000066400000000000000000000021701526064357400244000ustar00rootroot00000000000000import types from collections.abc import Iterator from django.apps.registry import Apps from django.db.models.base import Model from django.utils.functional import _Getter, _StrOrPromise APPS_MODULE_NAME: str MODELS_MODULE_NAME: str class AppConfig: name: str module: types.ModuleType | None apps: Apps | None label: str verbose_name: _StrOrPromise path: str models_module: types.ModuleType | None # Default auto_field is a cached_property on the base, but is usually subclassed as a str # If not subclassing with a str, a type ignore[override] is needed models: dict[str, type[Model]] default: bool default_auto_field: str | _Getter[str] def __init__(self, app_name: str, app_module: types.ModuleType | None) -> None: ... @classmethod def create(cls, entry: str) -> AppConfig: ... def get_model(self, model_name: str, require_ready: bool = True) -> type[Model]: ... def get_models( self, include_auto_created: bool = False, include_swapped: bool = False ) -> Iterator[type[Model]]: ... def import_models(self) -> None: ... def ready(self) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/apps/registry.pyi000066400000000000000000000042421526064357400250050ustar00rootroot00000000000000import threading from collections import defaultdict from collections.abc import Callable, Iterable from typing import Any from django.db.models.base import Model from .config import AppConfig class Apps: all_models: dict[str, dict[str, type[Model]]] app_configs: dict[str, AppConfig] stored_app_configs: list[Any] apps_ready: bool ready_event: threading.Event loading: bool # Maps ("app_label", "modelname") tuples to lists of functions to be called when the corresponding model is ready. _pending_operations: defaultdict[tuple[str, str], list[Callable[[type[Model]], Any]]] _apps: dict[str, type[Any]] models_ready: bool ready: bool def __init__(self, installed_apps: Iterable[AppConfig | str] | None = ()) -> None: ... def populate(self, installed_apps: Iterable[AppConfig | str] | None = None) -> None: ... def check_apps_ready(self) -> None: ... def check_models_ready(self) -> None: ... def get_app_configs(self) -> Iterable[AppConfig]: ... def get_app_config(self, app_label: str) -> AppConfig: ... # it's not possible to support it in plugin properly now def get_models(self, include_auto_created: bool = False, include_swapped: bool = False) -> list[type[Model]]: ... def get_model(self, app_label: str, model_name: str | None = None, require_ready: bool = True) -> type[Any]: ... def register_model(self, app_label: str, model: type[Model]) -> None: ... def is_installed(self, app_name: str) -> bool: ... def get_containing_app_config(self, object_name: str) -> AppConfig | None: ... def get_registered_model(self, app_label: str, model_name: str) -> type[Model]: ... def get_swappable_settings_name(self, to_string: str) -> str | None: ... def set_available_apps(self, available: Iterable[str]) -> None: ... def unset_available_apps(self) -> None: ... def set_installed_apps(self, installed: Iterable[str]) -> None: ... def unset_installed_apps(self) -> None: ... def clear_cache(self) -> None: ... def lazy_model_operation(self, function: Callable[..., Any], *model_keys: Any) -> None: ... def do_pending_operations(self, model: type[Model]) -> None: ... apps: Apps typeddjango-django-stubs-fa03b48/django-stubs/conf/000077500000000000000000000000001526064357400223725ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/conf/__init__.pyi000066400000000000000000000032601526064357400246550ustar00rootroot00000000000000from typing import Any, Literal, Self, type_check_only from django.utils.functional import LazyObject from typing_extensions import override # explicit dependency on standard settings to make it loaded from . import global_settings # noqa: F401 ENVIRONMENT_VARIABLE: Literal["DJANGO_SETTINGS_MODULE"] DEFAULT_STORAGE_ALIAS: Literal["default"] STATICFILES_STORAGE_ALIAS: Literal["staticfiles"] # RemovedInDjango70Warning. SIGNED_COOKIE_LEGACY_SALT_DEPRECATED_MSG: str USE_BLANK_CHOICE_DASH_DEPRECATED_MSG: str DEPRECATED_EMAIL_SETTINGS: set[str] EMAIL_SETTING_DEPRECATED_MSG: str # required for plugin to be able to distinguish this specific instance of LazySettings from others @type_check_only class _DjangoConfLazyObject(LazyObject[Any]): @override def __getattr__(self, item: Any) -> Any: ... class LazySettings(_DjangoConfLazyObject): SETTINGS_MODULE: str @property def configured(self) -> bool: ... def configure(self, default_settings: Any = ..., **options: Any) -> None: ... settings: LazySettings class Settings: SETTINGS_MODULE: str def __init__(self, settings_module: str) -> None: ... def is_overridden(self, setting: str) -> bool: ... class UserSettingsHolder: SETTINGS_MODULE: None def __init__(self, default_settings: Any) -> None: ... def __getattr__(self, name: str) -> Any: ... @override def __setattr__(self, name: str, value: Any) -> None: ... @override def __delattr__(self, name: str) -> None: ... def is_overridden(self, setting: str) -> bool: ... class SettingsReference(str): def __new__(self, value: Any, setting_name: str) -> Self: ... def __init__(self, value: str, setting_name: str) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/conf/global_settings.pyi000066400000000000000000000454141526064357400263050ustar00rootroot00000000000000from collections.abc import Collection, Mapping, Sequence from re import Pattern from typing import Any, Literal, NotRequired, Protocol, TypeAlias, TypedDict, type_check_only from django.utils.functional import _StrOrPromise from django_stubs_ext.settings import TemplatesSetting # This is defined here as a do-nothing function because we can't import # django.utils.translation -- that module depends on the settings. def gettext_noop(s: str) -> str: ... # Note: the tuple element format for ADMINS or MANAGERS is deprecated. Use a # list of strings instead. _Admins: TypeAlias = list[str] | list[tuple[str, str]] #################### # CORE # #################### DEBUG: bool # Whether the framework should propagate raw exceptions rather than catching # them. This is useful under some testing situations and should never be used # on a live site. DEBUG_PROPAGATE_EXCEPTIONS: bool # People who get code error notifications. # In the format [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')] ADMINS: _Admins # List of IP addresses, as strings, that: # * See debug comments, when DEBUG is true # * Receive x-headers INTERNAL_IPS: list[str] # Hosts/domain names that are valid for this site. # "*" matches anything, ".example.com" matches example.com and all subdomains ALLOWED_HOSTS: list[str] # Local time zone for this installation. All choices can be found here: # https://en.wikipedia.org/wiki/List_of_tz_zones_by_name (although not all # systems may support all possibilities). When USE_TZ is True, this is # interpreted as the default user time zone. TIME_ZONE: str # If you set this to True, Django will use timezone-aware datetimes. USE_TZ: bool # Language code for this installation. All choices can be found here: # http://www.i18nguy.com/unicode/language-identifiers.html LANGUAGE_CODE: str # Languages we provide translations for, out of the box. LANGUAGES: list[tuple[str, str]] # Languages using BiDi (right-to-left) layout LANGUAGES_BIDI: list[str] # If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. USE_I18N: bool LOCALE_PATHS: list[str] # Settings for language cookie LANGUAGE_COOKIE_NAME: str LANGUAGE_COOKIE_AGE: int | None LANGUAGE_COOKIE_DOMAIN: str | None LANGUAGE_COOKIE_PATH: str LANGUAGE_COOKIE_HTTPONLY: bool LANGUAGE_COOKIE_SAMESITE: Literal["Lax", "Strict", "None", False] | None LANGUAGE_COOKIE_SECURE: bool # Not-necessarily-technical managers of the site. They get broken link # notifications and other various emails. MANAGERS: _Admins # Default charset to use for all HttpResponse objects, if a # MIME type isn't manually specified. These are used to construct the # Content-Type header. DEFAULT_CHARSET: str # `SERIALIZATION_MODULES` is a dictionary (`dict[str, str]`) of modules containing serializer definitions. # Because Django doesn't define it, we can't provide its type here. Use `getattr` for type-safe access # e.g. `getattr(settings, "SERIALIZATION_MODULES")` # Email address that error messages come from. SERVER_EMAIL: str # Database connection info. If left empty, will default to the dummy backend. DATABASES: dict[str, dict[str, Any]] # Classes used to implement DB routing behavior. @type_check_only class Router(Protocol): def allow_migrate(self, db: str, app_label: str, **hints: Any) -> bool | None: ... DATABASE_ROUTERS: list[str | Router] # Mailer configurations. No mailers are defined by default. # RemovedInDjango70Warning: uncomment the next line. # MAILERS: Mapping[str, Mapping[str, Any]] # RemovedInDjango70Warning. # The email backend to use. For possible shortcuts see django.core.mail. # The default is to use the SMTP backend. # Third-party backends can be specified by providing a Python path # to a module that defines an EmailBackend class. EMAIL_BACKEND: str # `EMAIL_FILE_PATH` is a `str` indicating the directory used by the file email backend to store output files. # Because Django doesn't define it, we can't provide its type here. Use `getattr` for type-safe access # e.g. `getattr(settings, "EMAIL_FILE_PATH")` # RemovedInDjango70Warning. # Host for sending email. EMAIL_HOST: str # RemovedInDjango70Warning. # Port for sending email. EMAIL_PORT: int # Whether to send SMTP 'Date' header in the local time zone or in UTC. EMAIL_USE_LOCALTIME: bool # RemovedInDjango70Warning. # Optional SMTP authentication information for EMAIL_HOST. EMAIL_HOST_USER: str EMAIL_HOST_PASSWORD: str EMAIL_USE_TLS: bool EMAIL_USE_SSL: bool EMAIL_SSL_CERTFILE: str | None EMAIL_SSL_KEYFILE: str | None EMAIL_TIMEOUT: int | None # List of strings representing installed apps. INSTALLED_APPS: list[str] TEMPLATES: list[TemplatesSetting] # Default form rendering class. FORM_RENDERER: str # RemovedInDjango70Warning: This setting allows to revert back to the old # blank choice label in Django 6.1. USE_BLANK_CHOICE_DASH: bool # Default email address to use for various automated correspondence from # the site managers. DEFAULT_FROM_EMAIL: str # Subject-line prefix for email messages send with django.core.mail.mail_admins # or ...mail_managers. Make sure to include the trailing space. EMAIL_SUBJECT_PREFIX: str # Whether to append trailing slashes to URLs. APPEND_SLASH: bool # Whether to prepend the "www." subdomain to URLs that don't have it. PREPEND_WWW: bool # Override the server-derived value of SCRIPT_NAME FORCE_SCRIPT_NAME: str | None # List of compiled regular expression objects representing User-Agent strings # that are not allowed to visit any page, systemwide. Use this for bad # robots/crawlers. Here are a few examples: # import re # DISALLOWED_USER_AGENTS = [ # re.compile(r'^NaverBot.*'), # re.compile(r'^EmailSiphon.*'), # re.compile(r'^SiteSucker.*'), # re.compile(r'^sohu-search'), # ] DISALLOWED_USER_AGENTS: list[Pattern[str]] ABSOLUTE_URL_OVERRIDES: dict[str, Any] # List of compiled regular expression objects representing URLs that need not # be reported by BrokenLinkEmailsMiddleware. Here are a few examples: # import re # IGNORABLE_404_URLS = [ # re.compile(r'^/apple-touch-icon.*\.png$'), # re.compile(r'^/favicon.ico$'), # re.compile(r'^/robots.txt$'), # re.compile(r'^/phpmyadmin/'), # re.compile(r'\.(cgi|php|pl)$'), # ] IGNORABLE_404_URLS: list[Pattern[str]] # `ROOT_URLCONF` is a string representing the full Python import path to the root `URLconf`. # Because Django doesn't define it, we can't provide its type here. Use `getattr` for type-safe access # e.g. `getattr(settings, "ROOT_URLCONF")` # A secret key for this particular Django installation. Used in secret-key # hashing algorithms. Set this in your settings, or Django will complain # loudly. SECRET_KEY: str | bytes # A list of fallback secret keys for a particular Django installation. These # are used to allow rotation of the SECRET_KEY. SECRET_KEY_FALLBACKS: list[str | bytes] STORAGES: dict[str, dict[str, Any]] # Absolute filesystem path to the directory that will hold user-uploaded files. # Example: "/var/www/example.com/media/" MEDIA_ROOT: str # URL that handles the media served from MEDIA_ROOT. # Examples: "http://example.com/media/", "http://media.example.com/" MEDIA_URL: str # `SITE_ID` is the ID, as an integer, of the current site in the `django_site` database table. # Because Django doesn't define it, we can't provide its type here. Use `getattr` for type-safe access # e.g. `getattr(settings, "SITE_ID")` # Absolute path to the directory static files should be collected to. # Example: "/var/www/example.com/static/" STATIC_ROOT: str | None # URL that handles the static files served from STATIC_ROOT. # Example: "http://example.com/static/", "http://static.example.com/" STATIC_URL: str | None # List of upload handler classes to be applied in order. FILE_UPLOAD_HANDLERS: list[str] # Maximum size, in bytes, of a request before it will be streamed to the # file system instead of into memory. FILE_UPLOAD_MAX_MEMORY_SIZE: int # i.e. 2.5 MB # Maximum size in bytes of request data (excluding file uploads) that will be # read before a SuspiciousOperation (RequestDataTooBig) is raised. DATA_UPLOAD_MAX_MEMORY_SIZE: int # i.e. 2.5 MB # Maximum number of GET/POST parameters that will be read before a # SuspiciousOperation (TooManyFieldsSent) is raised. DATA_UPLOAD_MAX_NUMBER_FIELDS: int # Maximum number of files encoded in a multipart upload that will be read # before a SuspiciousOperation (TooManyFilesSent) is raised. DATA_UPLOAD_MAX_NUMBER_FILES: int # Directory in which upload streamed files will be temporarily saved. A value of # `None` will make Django use the operating system's default temporary directory # (i.e. "/tmp" on *nix systems). FILE_UPLOAD_TEMP_DIR: str | None # The numeric mode to set newly-uploaded files to. The value should be a mode # you'd pass directly to os.chmod; see https://docs.python.org/library/os.html#files-and-directories. FILE_UPLOAD_PERMISSIONS: int # The numeric mode to assign to newly-created directories, when uploading files. # The value should be a mode as you'd pass to os.chmod; # see https://docs.python.org/library/os.html#files-and-directories. FILE_UPLOAD_DIRECTORY_PERMISSIONS: int | None # Python module path where user will place custom format definition. # The directory where this setting is pointing should contain subdirectories # named as the locales, containing a formats.py file # (i.e. "myproject.locale" for myproject/locale/en/formats.py etc. use) FORMAT_MODULE_PATH: str | None # Default formatting for date objects. See all available format strings here: # https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date DATE_FORMAT: str # Default formatting for datetime objects. See all available format strings here: # https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date DATETIME_FORMAT: str # Default formatting for time objects. See all available format strings here: # https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date TIME_FORMAT: str # Default formatting for date objects when only the year and month are relevant. # See all available format strings here: # https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date YEAR_MONTH_FORMAT: str # Default formatting for date objects when only the month and day are relevant. # See all available format strings here: # https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date MONTH_DAY_FORMAT: str # Default short formatting for date objects. See all available format strings here: # https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date SHORT_DATE_FORMAT: str # Default short formatting for datetime objects. # See all available format strings here: # https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date SHORT_DATETIME_FORMAT: str # Default formats to be used when parsing dates from input boxes, in order # See all available format string here: # https://docs.python.org/library/datetime.html#strftime-behavior # * Note that these format strings are different from the ones to display dates DATE_INPUT_FORMATS: list[str] # Default formats to be used when parsing times from input boxes, in order # See all available format string here: # https://docs.python.org/library/datetime.html#strftime-behavior # * Note that these format strings are different from the ones to display dates TIME_INPUT_FORMATS: list[str] # '14:30:59' # '14:30:59.000200' # '14:30' # Default formats to be used when parsing dates and times from input boxes, # in order # See all available format string here: # https://docs.python.org/library/datetime.html#strftime-behavior # * Note that these format strings are different from the ones to display dates DATETIME_INPUT_FORMATS: list[str] # First day of week, to be used on calendars # 0 means Sunday, 1 means Monday... FIRST_DAY_OF_WEEK: int # Decimal separator symbol DECIMAL_SEPARATOR: str # Boolean that sets whether to add thousand separator when formatting numbers USE_THOUSAND_SEPARATOR: bool # Number of digits that will be together, when splitting them by # THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands... NUMBER_GROUPING: int # Thousand separator symbol THOUSAND_SEPARATOR: str # The tablespaces to use for each model when not specified otherwise. DEFAULT_TABLESPACE: str DEFAULT_INDEX_TABLESPACE: str # Default primary key field type. DEFAULT_AUTO_FIELD: str # Default X-Frame-Options header value X_FRAME_OPTIONS: str USE_X_FORWARDED_HOST: bool USE_X_FORWARDED_PORT: bool # The Python dotted path to the WSGI application that Django's internal server # (runserver) will use. If `None`, the return value of # 'django.core.wsgi.get_wsgi_application' is used, thus preserving the same # behavior as previous versions of Django. Otherwise this should point to an # actual WSGI application object. WSGI_APPLICATION: str | None # If your Django app is behind a proxy that sets a header to specify secure # connections, AND that proxy ensures that user-submitted headers with the # same name are ignored (so that people can't spoof it), set this value to # a tuple of (header_name, header_value). For any requests that come in with # that header/value, request.is_secure() will return True. # WARNING! Only set this if you fully understand what you're doing. Otherwise, # you may be opening yourself up to a security risk. SECURE_PROXY_SSL_HEADER: tuple[str, str] | None ############## # MIDDLEWARE # ############## # List of middleware to use. Order is important; in the request phase, these # middleware will be applied in the order given, and in the response # phase the middleware will be applied in reverse order. MIDDLEWARE: list[str] ############ # SESSIONS # ############ # Cache to store session data if using the cache session backend. SESSION_CACHE_ALIAS: str # Cookie name. This can be whatever you want. SESSION_COOKIE_NAME: str # Age of cookie, in seconds (default: 2 weeks). SESSION_COOKIE_AGE: int # A string like "example.com", or None for standard domain cookie. SESSION_COOKIE_DOMAIN: str | None # Whether the session cookie should be secure (https:// only). SESSION_COOKIE_SECURE: bool # The path of the session cookie. SESSION_COOKIE_PATH: str # Whether to use the non-RFC standard httpOnly flag (IE, FF3+, others) SESSION_COOKIE_HTTPONLY: bool # Whether to set the flag restricting cookie leaks on cross-site requests. # This can be 'Lax', 'Strict', 'None', or False to disable the flag. SESSION_COOKIE_SAMESITE: Literal["Lax", "Strict", "None", False] # Whether to save the session data on every request. SESSION_SAVE_EVERY_REQUEST: bool # Whether a user's session cookie expires when the Web browser is closed. SESSION_EXPIRE_AT_BROWSER_CLOSE: bool # The module to store session data SESSION_ENGINE: str # Directory to store session files if using the file session module. If None, # the backend will use a sensible default. SESSION_FILE_PATH: str | None # class to serialize session data SESSION_SERIALIZER: str ######### # CACHE # ######### # The cache backends to use. CACHES: dict[str, dict[str, Any]] CACHE_MIDDLEWARE_KEY_PREFIX: str CACHE_MIDDLEWARE_SECONDS: int CACHE_MIDDLEWARE_ALIAS: str ################## # AUTHENTICATION # ################## AUTH_USER_MODEL: str AUTHENTICATION_BACKENDS: Sequence[str] LOGIN_URL: _StrOrPromise LOGIN_REDIRECT_URL: _StrOrPromise LOGOUT_REDIRECT_URL: _StrOrPromise | None # The number of seconds a password reset link is valid for PASSWORD_RESET_TIMEOUT: int # the first hasher in this list is the preferred algorithm. any # password using different algorithms will be converted automatically # upon login PASSWORD_HASHERS: list[str] @type_check_only class _AuthPasswordValidatorsDict(TypedDict): NAME: str OPTIONS: NotRequired[dict[str, Any]] AUTH_PASSWORD_VALIDATORS: list[_AuthPasswordValidatorsDict] ########### # SIGNING # ########### SIGNED_COOKIE_LEGACY_SALT_FALLBACK: bool SIGNING_BACKEND: str ######## # CSRF # ######## # Dotted path to callable to be used as view when a request is # rejected by the CSRF middleware. CSRF_FAILURE_VIEW: str # Settings for CSRF cookie. CSRF_COOKIE_NAME: str CSRF_COOKIE_AGE: int CSRF_COOKIE_DOMAIN: str | None CSRF_COOKIE_PATH: str CSRF_COOKIE_SECURE: bool CSRF_COOKIE_HTTPONLY: bool CSRF_COOKIE_SAMESITE: Literal["Lax", "Strict", "None", False] CSRF_HEADER_NAME: str CSRF_TRUSTED_ORIGINS: list[str] CSRF_USE_SESSIONS: bool ############ # MESSAGES # ############ # Class to use as messages backend MESSAGE_STORAGE: str # Default values of MESSAGE_LEVEL and MESSAGE_TAGS are defined within # django.contrib.messages to avoid imports in this settings file. ########### # LOGGING # ########### # The callable to use to configure logging LOGGING_CONFIG: str # Custom logging configuration. LOGGING: dict[str, Any] # Default exception reporter class used in case none has been # specifically assigned to the HttpRequest instance. DEFAULT_EXCEPTION_REPORTER: str # Default exception reporter filter class used in case none has been # specifically assigned to the HttpRequest instance. DEFAULT_EXCEPTION_REPORTER_FILTER: str ########### # TESTING # ########### # The name of the class to use to run the test suite TEST_RUNNER: str # Apps that don't need to be serialized at test database creation time # (only apps with migrations are to start with) TEST_NON_SERIALIZED_APPS: list[str] ############ # FIXTURES # ############ # The list of directories to search for fixtures FIXTURE_DIRS: list[str] ############### # STATICFILES # ############### # A list of locations of additional static files STATICFILES_DIRS: list[str] # List of finder classes that know how to find static files in # various locations. STATICFILES_FINDERS: list[str] ############## # MIGRATIONS # ############## # Migration module overrides for apps, by app label. MIGRATION_MODULES: dict[str, str | None] ################# # SYSTEM CHECKS # ################# # List of all issues generated by system checks that should be silenced. Light # issues like warnings, infos or debugs will not generate a message. Silencing # serious issues like errors and criticals does not result in hiding the # message, but Django will not stop you from e.g. running server. SILENCED_SYSTEM_CHECKS: list[str] ####################### # SECURITY MIDDLEWARE # ####################### SECURE_CONTENT_TYPE_NOSNIFF: bool SECURE_CROSS_ORIGIN_OPENER_POLICY: str SECURE_HSTS_INCLUDE_SUBDOMAINS: bool SECURE_HSTS_PRELOAD: bool SECURE_HSTS_SECONDS: int SECURE_REDIRECT_EXEMPT: list[str] SECURE_REFERRER_POLICY: str SECURE_SSL_HOST: str | None SECURE_SSL_REDIRECT: bool ################## # CSP MIDDLEWARE # ################## SECURE_CSP: Mapping[str, Collection[str] | str] SECURE_CSP_REPORT_ONLY: Mapping[str, Collection[str] | str] # RemovedInDjango70Warning: A transitional setting helpful in early adoption of # HTTPS as the default protocol in urlize and urlizetrunc when no protocol is # provided. Set to True to assume HTTPS during the Django 6.x release cycle. URLIZE_ASSUME_HTTPS: bool ######### # TASKS # ######### TASKS: dict[str, dict[str, Any]] typeddjango-django-stubs-fa03b48/django-stubs/conf/locale/000077500000000000000000000000001526064357400236315ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/conf/locale/__init__.pyi000066400000000000000000000000621526064357400261110ustar00rootroot00000000000000from typing import Any LANG_INFO: dict[str, Any] typeddjango-django-stubs-fa03b48/django-stubs/conf/urls/000077500000000000000000000000001526064357400233575ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/conf/urls/__init__.pyi000066400000000000000000000004571526064357400256470ustar00rootroot00000000000000from django.urls import include as include from django.views import defaults __all__ = ["handler400", "handler403", "handler404", "handler500", "include"] handler400 = defaults.bad_request handler403 = defaults.permission_denied handler404 = defaults.page_not_found handler500 = defaults.server_error typeddjango-django-stubs-fa03b48/django-stubs/conf/urls/i18n.pyi000066400000000000000000000003471526064357400246650ustar00rootroot00000000000000from django.urls import _AnyURL def i18n_patterns(*urls: _AnyURL, prefix_default_language: bool = ...) -> list[_AnyURL]: ... def is_language_prefix_patterns_used(urlconf: str) -> tuple[bool, bool]: ... urlpatterns: list[_AnyURL] typeddjango-django-stubs-fa03b48/django-stubs/conf/urls/static.pyi000066400000000000000000000004121526064357400253660ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from django.http.response import HttpResponseBase from django.urls.resolvers import URLPattern def static(prefix: str, view: Callable[..., HttpResponseBase] = ..., **kwargs: Any) -> list[URLPattern]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/000077500000000000000000000000001526064357400231055ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/__init__.pyi000066400000000000000000000000001526064357400253550ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/000077500000000000000000000000001526064357400241755ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/__init__.pyi000066400000000000000000000034441526064357400264640ustar00rootroot00000000000000from . import checks as checks from .decorators import action as action from .decorators import display as display from .decorators import register as register from .filters import AllValuesFieldListFilter as AllValuesFieldListFilter from .filters import BooleanFieldListFilter as BooleanFieldListFilter from .filters import ChoicesFieldListFilter as ChoicesFieldListFilter from .filters import DateFieldListFilter as DateFieldListFilter from .filters import EmptyFieldListFilter as EmptyFieldListFilter from .filters import FieldListFilter as FieldListFilter from .filters import ListFilter as ListFilter from .filters import RelatedFieldListFilter as RelatedFieldListFilter from .filters import RelatedOnlyFieldListFilter as RelatedOnlyFieldListFilter from .filters import SimpleListFilter as SimpleListFilter from .options import HORIZONTAL as HORIZONTAL from .options import VERTICAL as VERTICAL from .options import Action as Action from .options import ActionLocation as ActionLocation from .options import ModelAdmin as ModelAdmin from .options import ShowFacets as ShowFacets from .options import StackedInline as StackedInline from .options import TabularInline as TabularInline from .sites import AdminSite as AdminSite from .sites import site as site def autodiscover() -> None: ... __all__ = [ "HORIZONTAL", "VERTICAL", "Action", "ActionLocation", "AdminSite", "AllValuesFieldListFilter", "BooleanFieldListFilter", "ChoicesFieldListFilter", "DateFieldListFilter", "EmptyFieldListFilter", "FieldListFilter", "ListFilter", "ModelAdmin", "RelatedFieldListFilter", "RelatedOnlyFieldListFilter", "ShowFacets", "SimpleListFilter", "StackedInline", "TabularInline", "action", "autodiscover", "display", "register", "site", ] typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/actions.pyi000066400000000000000000000005411526064357400263600ustar00rootroot00000000000000from typing import Any from django.contrib.admin.options import ModelAdmin from django.db.models.query import QuerySet from django.http.request import HttpRequest from django.template.response import TemplateResponse def delete_selected( modeladmin: ModelAdmin[Any], request: HttpRequest, queryset: QuerySet[Any] ) -> TemplateResponse | None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/apps.pyi000066400000000000000000000002101526064357400256540ustar00rootroot00000000000000from django.apps import AppConfig class SimpleAdminConfig(AppConfig): default_site: str class AdminConfig(SimpleAdminConfig): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/checks.pyi000066400000000000000000000023011526064357400261540ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any from django.apps.config import AppConfig from django.contrib.admin.options import BaseModelAdmin from django.core.checks.messages import CheckMessage from typing_extensions import override def check_admin_app(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_dependencies(**kwargs: object) -> list[CheckMessage]: ... class BaseModelAdminChecks: def check(self, admin_obj: BaseModelAdmin[Any], **kwargs: object) -> list[CheckMessage]: ... class ModelAdminChecks(BaseModelAdminChecks): ... class InlineModelAdminChecks(BaseModelAdminChecks): # We need this override because `InlineModelAdminChecks` rename `admin_obj` to `inline_obj` here @override def check(self, inline_obj: BaseModelAdmin[Any], **kwargs: object) -> list[CheckMessage]: ... # type: ignore[override] def must_be(type: str, option: str, obj: BaseModelAdmin[Any], id: str) -> list[CheckMessage]: ... def must_inherit_from(parent: str, option: str, obj: BaseModelAdmin[Any], id: str) -> list[CheckMessage]: ... def refer_to_missing_field(field: str, option: str, obj: BaseModelAdmin[Any], id: str) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/decorators.pyi000066400000000000000000000041341526064357400270670ustar00rootroot00000000000000from collections.abc import Callable, Sequence from typing import Any, overload from django.contrib.admin import ActionLocation, ModelAdmin from django.contrib.admin.sites import AdminSite from django.db.models.base import Model from django.db.models.expressions import BaseExpression, Combinable from django.utils.functional import _StrOrPromise from typing_extensions import TypeVar _ModelAdmin = TypeVar("_ModelAdmin", bound=ModelAdmin[Any]) _F = TypeVar("_F", bound=Callable[..., Any]) @overload def action( function: _F, *, permissions: Sequence[str] | None = ..., description: _StrOrPromise | None = ..., description_plural: _StrOrPromise | None = ..., location: ActionLocation | Sequence[ActionLocation] = ..., ) -> _F: ... @overload def action( function: None = None, *, permissions: Sequence[str] | None = ..., description: _StrOrPromise | None = ..., description_plural: _StrOrPromise | None = ..., location: ActionLocation | Sequence[ActionLocation] = ..., ) -> Callable[[_F], _F]: ... @overload def display( function: _F, *, boolean: bool | None = ..., ordering: str | Combinable | BaseExpression | None = ..., description: _StrOrPromise | None = ..., empty_value: None = ..., ) -> _F: ... @overload def display( function: _F, *, boolean: None = ..., ordering: str | Combinable | BaseExpression | None = ..., description: _StrOrPromise | None = ..., empty_value: str | None = ..., ) -> _F: ... @overload def display( function: None = None, *, boolean: bool | None = ..., ordering: str | Combinable | BaseExpression | None = ..., description: _StrOrPromise | None = ..., empty_value: None = ..., ) -> Callable[[_F], _F]: ... @overload def display( function: None = None, *, boolean: None = ..., ordering: str | Combinable | BaseExpression | None = ..., description: _StrOrPromise | None = ..., empty_value: str | None = ..., ) -> Callable[[_F], _F]: ... def register( *models: type[Model], site: AdminSite | None = ... ) -> Callable[[type[_ModelAdmin]], type[_ModelAdmin]]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/exceptions.pyi000066400000000000000000000003731526064357400271040ustar00rootroot00000000000000from django.core.exceptions import SuspiciousOperation class DisallowedModelAdminLookup(SuspiciousOperation): ... class DisallowedModelAdminToField(SuspiciousOperation): ... class AlreadyRegistered(Exception): ... class NotRegistered(Exception): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/filters.pyi000066400000000000000000000112471526064357400263750ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Iterator, Mapping from datetime import date, datetime from typing import Any, ClassVar from django.contrib.admin.options import ModelAdmin from django.contrib.admin.views.main import ChangeList from django.db.models.aggregates import Count from django.db.models.base import Model from django.db.models.fields import Field from django.db.models.fields.related import RelatedField from django.db.models.query import QuerySet from django.db.models.query_utils import Q from django.http.request import HttpRequest from django.utils.datastructures import _ListOrTuple from django.utils.functional import _StrOrPromise from django.utils.safestring import SafeString from typing_extensions import TypedDict, override class _ListFilterChoices(TypedDict): selected: bool query_string: str display: _StrOrPromise class ListFilter: title: _StrOrPromise | None template: str request: HttpRequest used_parameters: dict[str, object] def __init__( self, request: HttpRequest, params: dict[str, list[str]], model: type[Model], model_admin: ModelAdmin[Any] ) -> None: ... def has_output(self) -> bool: ... def choices(self, changelist: ChangeList) -> Iterator[Mapping[str, object]]: ... def queryset(self, request: HttpRequest, queryset: QuerySet[Any]) -> QuerySet[Any] | None: ... def expected_parameters(self) -> list[str | None]: ... class FacetsMixin: def get_facet_counts(self, pk_attname: str, filtered_qs: QuerySet[Model]) -> dict[str, Count]: ... def get_facet_queryset(self, changelist: ChangeList) -> dict[str, int]: ... class SimpleListFilter(FacetsMixin, ListFilter): # SimpleListFilter stores scalar str values (see value() and get_facet_counts()) used_parameters: dict[str, str] # type: ignore[assignment] parameter_name: str | None lookup_choices: list[tuple[str, _StrOrPromise]] def value(self) -> str | None: ... def lookups( self, request: HttpRequest, model_admin: ModelAdmin[Any] ) -> Iterable[tuple[str, _StrOrPromise]] | None: ... @override def choices(self, changelist: ChangeList) -> Iterator[_ListFilterChoices]: ... class FieldListFilter(FacetsMixin, ListFilter): list_separator: ClassVar[str] field: Field[Any, Any] field_path: str def __init__( self, field: Field[Any, Any], request: HttpRequest, params: dict[str, list[str]], model: type[Model], model_admin: ModelAdmin[Any], field_path: str, ) -> None: ... @classmethod def register( cls, test: Callable[[Field[Any, Any]], Any], list_filter_class: type[FieldListFilter], take_priority: bool = ... ) -> None: ... @classmethod def create( cls, field: Field[Any, Any], request: HttpRequest, params: dict[str, list[str]], model: type[Model], model_admin: ModelAdmin[Any], field_path: str, ) -> FieldListFilter: ... @override def choices(self, changelist: ChangeList) -> Iterator[_ListFilterChoices]: ... class RelatedFieldListFilter(FieldListFilter): lookup_kwarg: str lookup_kwarg_isnull: str lookup_val: str | None lookup_val_isnull: str | None lookup_choices: list[tuple[str, _StrOrPromise]] lookup_title: _StrOrPromise empty_value_display: SafeString @property def include_empty_choice(self) -> bool: ... def field_admin_ordering( self, field: RelatedField[Any, Any], request: HttpRequest, model_admin: ModelAdmin[Any] ) -> _ListOrTuple[str]: ... def field_choices( self, field: RelatedField[Any, Any], request: HttpRequest, model_admin: ModelAdmin[Any] ) -> list[tuple[str, _StrOrPromise]]: ... class BooleanFieldListFilter(FieldListFilter): lookup_kwarg: str lookup_kwarg2: str lookup_val: str | None lookup_val2: str | None class ChoicesFieldListFilter(FieldListFilter): lookup_kwarg: str lookup_kwarg_isnull: str lookup_val: str | None lookup_val_isnull: str | None class DateFieldListFilter(FieldListFilter): field_generic: str date_params: dict[str, str] lookup_kwarg_since: str lookup_kwarg_until: str links: tuple[tuple[_StrOrPromise, dict[str, bool | date | datetime]], ...] lookup_kwarg_isnull: str class AllValuesFieldListFilter(FieldListFilter): lookup_kwarg: str lookup_kwarg_isnull: str lookup_val: str | None lookup_val_isnull: str | None empty_value_display: SafeString lookup_choices: QuerySet[Any] class RelatedOnlyFieldListFilter(RelatedFieldListFilter): ... class EmptyFieldListFilter(FieldListFilter): lookup_kwarg: str lookup_val: str | None def get_lookup_condition(self) -> Q: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/formfields.pyi000066400000000000000000000004211526064357400270470ustar00rootroot00000000000000from typing import Any from django.forms import NullBooleanField from typing_extensions import override class StrictBooleanField(NullBooleanField): @override def to_python(self, value: Any | None) -> bool: ... class StrictNullBooleanField(NullBooleanField): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/forms.pyi000066400000000000000000000003551526064357400260510ustar00rootroot00000000000000from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm class AdminAuthenticationForm(AuthenticationForm): required_css_class: str class AdminPasswordChangeForm(PasswordChangeForm): required_css_class: str typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/helpers.pyi000066400000000000000000000144071526064357400263700ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence from typing import Any, type_check_only from django import forms from django.contrib.admin.options import BaseModelAdmin, ModelAdmin from django.db.models import Model from django.db.models.fields import AutoField from django.db.models.fields.reverse_related import ForeignObjectRel from django.forms import BaseForm from django.forms.boundfield import BoundField from django.forms.fields import Field from django.forms.models import ModelForm from django.forms.utils import ErrorDict, ErrorList from django.forms.widgets import Media, Widget from django.utils.functional import cached_property from django.utils.safestring import SafeString from typing_extensions import TypedDict, override ACTION_CHECKBOX_NAME: str class ActionForm(forms.Form): action: Any select_across: Any @type_check_only class _PrepopulatedDict(TypedDict): field: BoundField dependencies: list[BoundField] class AdminForm: prepopulated_fields: list[_PrepopulatedDict] model_admin: BaseModelAdmin[Any] | None readonly_fields: Sequence[str] form: ModelForm[Any] fieldsets: list[tuple[Any, dict[str, list[str]]]] def __init__( self, form: ModelForm[Any], fieldsets: list[tuple[Any, dict[str, list[str]]]], prepopulated_fields: Mapping[str, Iterable[str]], readonly_fields: Sequence[str] | None = ..., model_admin: BaseModelAdmin[Any] | None = ..., ) -> None: ... def __iter__(self) -> Iterator[Fieldset]: ... @property def errors(self) -> ErrorDict: ... @property def non_field_errors(self) -> Callable[[], ErrorList]: ... @property def fields(self) -> dict[str, Field]: ... @property def is_bound(self) -> bool: ... @property def media(self) -> Media: ... class Fieldset: form: ModelForm[Any] classes: str description: str | None model_admin: BaseModelAdmin[Any] | None readonly_fields: Sequence[str] def __init__( self, form: ModelForm[Any], name: Any | None = ..., readonly_fields: Sequence[str] = ..., fields: Sequence[str] = ..., classes: Iterable[str] = ..., description: str | None = ..., model_admin: BaseModelAdmin[Any] | None = ..., ) -> None: ... @cached_property def is_collapsible(self) -> bool: ... @property def media(self) -> Media: ... def __iter__(self) -> Iterator[Fieldline]: ... class Fieldline: form: ModelForm[Any] fields: Sequence[str] has_visible_field: bool model_admin: BaseModelAdmin[Any] | None readonly_fields: Sequence[str] def __init__( self, form: ModelForm[Any], field: str | Sequence[str], readonly_fields: Sequence[str] | None = ..., model_admin: BaseModelAdmin[Any] | None = ..., ) -> None: ... def __iter__(self) -> Iterator[AdminField | AdminReadonlyField]: ... def errors(self) -> SafeString: ... class AdminField: field: BoundField is_first: bool is_checkbox: bool is_readonly: bool def __init__(self, form: ModelForm[Any], field: str, is_first: bool) -> None: ... def label_tag(self) -> SafeString: ... def errors(self) -> SafeString: ... @type_check_only class _FieldDictT(TypedDict): name: str label: str help_text: str field: Callable[[Model], Any] | str is_hidden: bool class AdminReadonlyField: field: _FieldDictT form: ModelForm[Any] model_admin: BaseModelAdmin[Any] | None is_first: bool is_checkbox: bool is_readonly: bool empty_value_display: Any def __init__( self, form: ModelForm[Any], field: Callable[[Model], Any] | str, is_first: bool, model_admin: BaseModelAdmin[Any] | None = ..., ) -> None: ... def label_tag(self) -> SafeString: ... def get_admin_url(self, remote_field: ForeignObjectRel, remote_obj: Model) -> str: ... def contents(self) -> SafeString: ... class InlineAdminFormSet: opts: Any formset: Any fieldsets: Any model_admin: ModelAdmin[Any] | None readonly_fields: Sequence[str] prepopulated_fields: dict[str, Any] classes: str has_add_permission: bool has_change_permission: bool has_delete_permission: bool has_view_permission: bool def __init__( self, inline: Any, formset: Any, fieldsets: Any, prepopulated_fields: dict[str, Any] | None = ..., readonly_fields: Sequence[str] | None = ..., model_admin: ModelAdmin[Any] | None = ..., has_add_permission: bool = ..., has_change_permission: bool = ..., has_delete_permission: bool = ..., has_view_permission: bool = ..., ) -> None: ... def __iter__(self) -> Iterator[InlineAdminForm]: ... def fields(self) -> Iterator[dict[str, dict[str, bool] | bool | Widget | str]]: ... def inline_formset_data(self) -> str: ... @property def forms(self) -> list[BaseForm]: ... @cached_property def is_collapsible(self) -> bool: ... def non_form_errors(self) -> ErrorList: ... @property def is_bound(self) -> bool: ... @property def total_form_count(self) -> Callable[[], int]: ... @property def media(self) -> Media: ... class InlineAdminForm(AdminForm): formset: Any original: bool | None show_url: bool absolute_url: str | None def __init__( self, formset: Any, form: ModelForm[Any], fieldsets: Any, prepopulated_fields: Any, original: bool | None, readonly_fields: Sequence[str] | None = ..., model_admin: BaseModelAdmin[Any] | None = ..., view_on_site_url: str | None = ..., ) -> None: ... @override def __iter__(self) -> Iterator[InlineFieldset]: ... def needs_explicit_pk_field(self) -> bool | AutoField[Any, Any]: ... def pk_field(self) -> AdminField: ... def fk_field(self) -> AdminField: ... def deletion_field(self) -> AdminField: ... class InlineFieldset(Fieldset): formset: Any def __init__(self, formset: Any, *args: Any, **kwargs: Any) -> None: ... @override def __iter__(self) -> Iterator[Fieldline]: ... class AdminErrorList(forms.utils.ErrorList): def __init__(self, form: ModelForm[Any], inline_formsets: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/migrations/000077500000000000000000000000001526064357400263515ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/migrations/__init__.pyi000066400000000000000000000000001526064357400306210ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/models.pyi000066400000000000000000000034751526064357400262140ustar00rootroot00000000000000import datetime as dt from collections.abc import Iterable from typing import Any, ClassVar, Literal, overload from uuid import UUID from django.contrib.auth.models import _User from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.models.base import Model from django.db.models.expressions import Combinable ADDITION: int CHANGE: int DELETION: int ACTION_FLAG_CHOICES: Any class LogEntryManager(models.Manager[LogEntry]): @overload def log_actions( self, user_id: int | str | UUID, queryset: Iterable[Model], action_flag: int, change_message: str | list[Any] = "", *, single_object: Literal[True], ) -> LogEntry: ... @overload def log_actions( self, user_id: int | str | UUID, queryset: Iterable[Model], action_flag: int, change_message: str | list[Any] = "", *, single_object: Literal[False] = ..., ) -> list[LogEntry]: ... class LogEntry(models.Model): action_time: models.DateTimeField[str | dt.datetime | dt.date | Combinable, dt.datetime] user: models.ForeignKey[_User | Combinable, _User] content_type: models.ForeignKey[ContentType | Combinable | None, ContentType | None] object_id: models.TextField[str | Combinable | None, str | None] object_repr: models.CharField[str | int | Combinable, str] action_flag: models.PositiveSmallIntegerField[float | int | str | Combinable, int] change_message: models.TextField[str | Combinable, str] objects: ClassVar[LogEntryManager] def is_addition(self) -> bool: ... def is_change(self) -> bool: ... def is_deletion(self) -> bool: ... def get_change_message(self) -> str: ... def get_edited_object(self) -> Model: ... def get_admin_url(self) -> str | None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/options.pyi000066400000000000000000000476751526064357400264360ustar00rootroot00000000000000import enum import sys from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence from dataclasses import dataclass from typing import Any, ClassVar, Generic, Literal, Self, TypeAlias, cast, type_check_only from django import forms from django.contrib.admin.filters import FieldListFilter, ListFilter from django.contrib.admin.models import LogEntry from django.contrib.admin.sites import AdminSite from django.contrib.admin.views.main import ChangeList from django.contrib.contenttypes.models import ContentType from django.core.checks.messages import CheckMessage from django.core.paginator import Paginator from django.db.models.base import Model from django.db.models.fields import Field from django.db.models.fields.related import ForeignKey, ManyToManyField, RelatedField from django.db.models.options import Options from django.db.models.query import QuerySet, _OrderByFieldName from django.forms.fields import Field as FormField from django.forms.fields import TypedChoiceField from django.forms.formsets import BaseFormSet from django.forms.models import ( BaseInlineFormSet, BaseModelFormSet, ModelChoiceField, ModelForm, ModelMultipleChoiceField, ) from django.forms.widgets import Media, MediaDefiningClass from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseBase, HttpResponseRedirect from django.template.response import _TemplateForResponseT from django.urls.resolvers import URLPattern from django.utils.datastructures import _ListOrTuple from django.utils.functional import _StrOrPromise from django.utils.safestring import SafeString from typing_extensions import TypedDict, TypeVar, deprecated, override IS_POPUP_VAR: Literal["_popup"] SOURCE_MODEL_VAR: Literal["_source_model"] TO_FIELD_VAR: Literal["_to_field"] IS_FACETS_VAR: Literal["_facets"] EMPTY_VALUE_STRING: Literal["-"] class ShowFacets(enum.Enum): NEVER = cast(str, ...) ALLOW = cast(str, ...) ALWAYS = cast(str, ...) class ActionLocation(enum.Enum): CHANGE_FORM = cast(str, ...) CHANGE_LIST = cast(str, ...) HORIZONTAL: Literal[1] VERTICAL: Literal[2] _Direction: TypeAlias = Literal[1, 2] @dataclass class Action: func: _ActionCallable[ModelAdmin[Any], Any] name: str description: str plural_description: str locations: list[ActionLocation] # RemovedInDjango70Warning. @deprecated("Unpacking an action tuple is deprecated. Use Action attributes instead.") def __iter__(self) -> Iterator[_ActionCallable[ModelAdmin[Any], Any] | str]: ... # RemovedInDjango70Warning. @deprecated("Using indexes on an action tuple is deprecated. Use Action attributes instead.") def __getitem__(self, index: int) -> _ActionCallable[ModelAdmin[Any], Any] | str: ... def get_content_type_for_model(obj: type[Model] | Model) -> ContentType: ... def get_ul_class(radio_style: int) -> str: ... class IncorrectLookupParameters(Exception): ... FORMFIELD_FOR_DBFIELD_DEFAULTS: Any csrf_protect_m: Any _FieldGroups: TypeAlias = _ListOrTuple[str | _ListOrTuple[str]] @type_check_only class _OptionalFieldOpts(TypedDict, total=False): classes: Sequence[str] description: _StrOrPromise @type_check_only class _FieldOpts(_OptionalFieldOpts, total=True): fields: _FieldGroups _FieldsetSpec: TypeAlias = _ListOrTuple[tuple[_StrOrPromise | None, _FieldOpts]] _ListFilterT: TypeAlias = ( type[ListFilter] | Field[Any, Any] | str | tuple[Field[Any, Any] | str, type[FieldListFilter]] | list[Field[Any, Any] | str | type[FieldListFilter]] ) # Generic type specifically for models, for use in BaseModelAdmin and subclasses # https://github.com/typeddjango/django-stubs/issues/482 _ModelT = TypeVar("_ModelT", bound=Model) _DisplayT: TypeAlias = str | Callable[[_ModelT], str | bool] _ListDisplayT: TypeAlias = _ListOrTuple[_DisplayT[_ModelT]] # Options `form`, `list_display`, `list_display_links` and `actions` are not marked as `ClassVar` due to the # limitations of the current type system: `ClassVar` cannot contain type variables. class BaseModelAdmin(Generic[_ModelT], metaclass=MediaDefiningClass): autocomplete_fields: ClassVar[_ListOrTuple[str]] raw_id_fields: ClassVar[_ListOrTuple[str]] fields: ClassVar[_FieldGroups | None] exclude: ClassVar[_ListOrTuple[str] | None] fieldsets: ClassVar[_FieldsetSpec | None] form: type[forms.ModelForm[_ModelT]] filter_vertical: ClassVar[_ListOrTuple[str]] filter_horizontal: ClassVar[_ListOrTuple[str]] radio_fields: ClassVar[Mapping[str, _Direction]] prepopulated_fields: ClassVar[dict[str, Sequence[str]]] formfield_overrides: ClassVar[Mapping[type[Field[Any, Any]], Mapping[str, Any]]] readonly_fields: ClassVar[_ListOrTuple[str]] ordering: ClassVar[_ListOrTuple[_OrderByFieldName] | None] sortable_by: ClassVar[_ListOrTuple[str] | None] show_full_result_count: ClassVar[bool] checks_class: ClassVar[Any] delete_confirmation_max_display: ClassVar[int | None] model: type[_ModelT] opts: Options[_ModelT] admin_site: AdminSite def __init__(self) -> None: ... def check(self, **kwargs: Any) -> list[CheckMessage]: ... def formfield_for_dbfield( self, db_field: Field[Any, Any], request: HttpRequest, **kwargs: Any ) -> FormField | None: ... def formfield_for_choice_field( self, db_field: Field[Any, Any], request: HttpRequest, **kwargs: Any ) -> TypedChoiceField | None: ... def get_field_queryset( self, db: str | None, db_field: RelatedField[Any, Any], request: HttpRequest ) -> QuerySet[Any] | None: ... def formfield_for_foreignkey( self, db_field: ForeignKey[Any, Any], request: HttpRequest, **kwargs: Any ) -> ModelChoiceField[Any] | None: ... def formfield_for_manytomany( self, db_field: ManyToManyField[Any, Any], request: HttpRequest, **kwargs: Any ) -> ModelMultipleChoiceField[Any] | None: ... def get_autocomplete_fields(self, request: HttpRequest) -> _ListOrTuple[str]: ... def get_view_on_site_url(self, obj: _ModelT | None = ...) -> str | None: ... def get_empty_value_display(self) -> SafeString: ... def get_exclude(self, request: HttpRequest, obj: _ModelT | None = ...) -> _ListOrTuple[str] | None: ... def get_fields(self, request: HttpRequest, obj: _ModelT | None = ...) -> _FieldGroups: ... def get_fieldsets(self, request: HttpRequest, obj: _ModelT | None = ...) -> _FieldsetSpec: ... def get_inlines( self, request: HttpRequest, obj: _ModelT | None ) -> _ListOrTuple[type[InlineModelAdmin[Any, Any]]]: ... def get_ordering(self, request: HttpRequest) -> _ListOrTuple[_OrderByFieldName]: ... def get_readonly_fields(self, request: HttpRequest, obj: _ModelT | None = ...) -> _ListOrTuple[str]: ... def get_prepopulated_fields(self, request: HttpRequest, obj: _ModelT | None = ...) -> dict[str, Sequence[str]]: ... def get_queryset(self, request: HttpRequest) -> QuerySet[_ModelT]: ... def get_sortable_by(self, request: HttpRequest) -> _ListDisplayT[_ModelT]: ... def lookup_allowed(self, lookup: str, value: str, request: HttpRequest) -> bool: ... def to_field_allowed(self, request: HttpRequest, to_field: str) -> bool: ... def has_add_permission(self, request: HttpRequest) -> bool: ... def has_change_permission(self, request: HttpRequest, obj: _ModelT | None = ...) -> bool: ... def has_delete_permission(self, request: HttpRequest, obj: _ModelT | None = ...) -> bool: ... def has_view_permission(self, request: HttpRequest, obj: _ModelT | None = ...) -> bool: ... def has_view_or_change_permission(self, request: HttpRequest, obj: _ModelT | None = ...) -> bool: ... def has_module_permission(self, request: HttpRequest) -> bool: ... view_on_site: Callable[[_ModelT], str | None] | bool @property def media(self) -> Media: ... _ModelAdmin = TypeVar("_ModelAdmin", bound=ModelAdmin[Any]) _ActionCallable: TypeAlias = Callable[[_ModelAdmin, HttpRequest, QuerySet[_ModelT]], HttpResponseBase | None] class ModelAdmin(BaseModelAdmin[_ModelT]): list_display: _ListDisplayT[_ModelT] list_display_links: _ListDisplayT[_ModelT] | None list_filter: ClassVar[_ListOrTuple[_ListFilterT]] list_select_related: ClassVar[bool | _ListOrTuple[str]] list_per_page: ClassVar[int] list_max_show_all: ClassVar[int] list_editable: ClassVar[_ListOrTuple[str]] search_fields: ClassVar[_ListOrTuple[str]] search_help_text: ClassVar[_StrOrPromise | None] date_hierarchy: ClassVar[str | None] save_as: ClassVar[bool] save_as_continue: ClassVar[bool] save_on_top: ClassVar[bool] paginator: ClassVar[type] preserve_filters: ClassVar[bool] show_facets: ClassVar[ShowFacets] inlines: ClassVar[_ListOrTuple[type[InlineModelAdmin[Any, Any]]]] add_form_template: ClassVar[_TemplateForResponseT | None] change_form_template: ClassVar[_TemplateForResponseT | None] change_list_template: ClassVar[_TemplateForResponseT | None] delete_confirmation_template: ClassVar[_TemplateForResponseT | None] delete_selected_confirmation_template: ClassVar[_TemplateForResponseT | None] object_history_template: ClassVar[_TemplateForResponseT | None] popup_response_template: ClassVar[_TemplateForResponseT | None] actions: Sequence[_ActionCallable[Self, _ModelT] | str] | None action_form: ClassVar[Any] actions_on_top: ClassVar[bool] actions_on_bottom: ClassVar[bool] actions_selection_counter: ClassVar[bool] model: type[_ModelT] opts: Options[_ModelT] admin_site: AdminSite def __init__(self, model: type[_ModelT], admin_site: AdminSite) -> None: ... def get_inline_instances( self, request: HttpRequest, obj: _ModelT | None = ... ) -> list[InlineModelAdmin[Any, Any]]: ... def get_urls(self) -> list[URLPattern]: ... @property def urls(self) -> list[URLPattern]: ... @property @override def media(self) -> Media: ... def get_model_perms(self, request: HttpRequest) -> dict[str, bool]: ... def get_form( self, request: HttpRequest, obj: _ModelT | None = ..., change: bool = ..., **kwargs: Any ) -> type[forms.ModelForm[_ModelT]]: ... def get_changelist(self, request: HttpRequest, **kwargs: Any) -> type[ChangeList]: ... def get_changelist_instance(self, request: HttpRequest) -> ChangeList: ... def get_object(self, request: HttpRequest, object_id: str, from_field: str | None = ...) -> _ModelT | None: ... def get_changelist_form(self, request: HttpRequest, **kwargs: Any) -> type[ModelForm[_ModelT]]: ... def get_changelist_formset( self, request: HttpRequest, **kwargs: Any ) -> type[BaseModelFormSet[_ModelT, ModelForm[_ModelT]]]: ... def get_formsets_with_inlines(self, request: HttpRequest, obj: _ModelT | None = ...) -> Iterator[Any]: ... def get_paginator( self, request: HttpRequest, queryset: QuerySet[Any], per_page: int, orphans: int = ..., allow_empty_first_page: bool = ..., ) -> Paginator[Any]: ... def log_addition(self, request: HttpRequest, obj: _ModelT, message: Any) -> LogEntry: ... def log_change(self, request: HttpRequest, obj: _ModelT, message: Any) -> LogEntry: ... def log_deletions(self, request: HttpRequest, queryset: QuerySet[_ModelT]) -> list[LogEntry]: ... def action_checkbox(self, obj: _ModelT) -> SafeString: ... # Django 6.0 requires Python 3.12, so the `else` branch can only ever meet # Django 5.x: it keeps the Django 5.x action signatures. if sys.version_info >= (3, 12): def get_actions( self, request: HttpRequest, action_location: ActionLocation = ... ) -> dict[str, Action | None]: ... def get_action_choices( self, request: HttpRequest, default_choices: list[tuple[str, str]] | None = ..., action_location: ActionLocation = ..., ) -> list[tuple[str, str]]: ... def get_action( self, action: _ActionCallable[Self, _ModelT] | str, action_location: ActionLocation = ..., ) -> Action | None: ... else: def get_actions(self, request: HttpRequest) -> dict[str, tuple[Callable[..., str], str, str] | None]: ... def get_action_choices( self, request: HttpRequest, default_choices: list[tuple[str, str]] = ... ) -> list[tuple[str, str]]: ... def get_action(self, action: Callable[..., Any] | str) -> tuple[Callable[..., str], str, str] | None: ... def get_list_display(self, request: HttpRequest) -> _ListDisplayT[_ModelT]: ... def get_list_display_links( self, request: HttpRequest, list_display: _ListDisplayT[_ModelT] ) -> _ListDisplayT[_ModelT]: ... def get_list_filter(self, request: HttpRequest) -> _ListOrTuple[_ListFilterT]: ... def get_list_select_related(self, request: HttpRequest) -> bool | _ListOrTuple[str]: ... def get_search_fields(self, request: HttpRequest) -> _ListOrTuple[str]: ... def get_search_results( self, request: HttpRequest, queryset: QuerySet[Any], search_term: str ) -> tuple[QuerySet[_ModelT], bool]: ... def get_preserved_filters(self, request: HttpRequest) -> str: ... def _get_edited_object_pks(self, request: HttpRequest, prefix: str) -> list[str]: ... def _get_list_editable_queryset(self, request: HttpRequest, prefix: str) -> QuerySet[_ModelT]: ... def construct_change_message( self, request: HttpRequest, form: forms.Form, formsets: Iterable[BaseFormSet[Any]], add: bool = ... ) -> list[dict[str, dict[str, list[str]]]]: ... def message_user( self, request: HttpRequest, message: _StrOrPromise, level: int | str = ..., extra_tags: str = ..., fail_silently: bool = ..., ) -> None: ... def save_form(self, request: HttpRequest, form: Any, change: Any) -> Any: ... def save_model(self, request: HttpRequest, obj: _ModelT, form: Any, change: Any) -> None: ... def delete_model(self, request: HttpRequest, obj: _ModelT) -> None: ... def delete_queryset(self, request: HttpRequest, queryset: QuerySet[Any]) -> None: ... def save_formset(self, request: HttpRequest, form: Any, formset: Any, change: Any) -> None: ... def save_related(self, request: HttpRequest, form: Any, formsets: Any, change: Any) -> None: ... def render_change_form( self, request: HttpRequest, context: dict[str, Any], add: bool = ..., change: bool = ..., form_url: str = ..., obj: _ModelT | None = ..., ) -> HttpResponse: ... def response_add(self, request: HttpRequest, obj: _ModelT, post_url_continue: str | None = ...) -> HttpResponse: ... def response_change(self, request: HttpRequest, obj: _ModelT) -> HttpResponse: ... def response_post_save_add(self, request: HttpRequest, obj: _ModelT) -> HttpResponseRedirect: ... def response_post_save_change(self, request: HttpRequest, obj: _ModelT) -> HttpResponseRedirect: ... # Probably FileResponse cannot come from ModelAdmin views def response_action( self, request: HttpRequest, queryset: QuerySet[Any], action_location: ActionLocation = ... ) -> HttpResponse | None: ... def response_delete(self, request: HttpRequest, obj_display: str, obj_id: int) -> HttpResponse: ... def render_delete_form(self, request: HttpRequest, context: dict[str, Any]) -> HttpResponse: ... def get_inline_formsets( self, request: HttpRequest, formsets: list[Any], inline_instances: list[Any], obj: _ModelT | None = ... ) -> list[Any]: ... def get_changeform_initial_data(self, request: HttpRequest) -> dict[str, str | list[str]]: ... def changeform_view( self, request: HttpRequest, object_id: str | None = ..., form_url: str = ..., extra_context: dict[str, Any] | None = ..., ) -> HttpResponse: ... def add_view( self, request: HttpRequest, form_url: str = ..., extra_context: dict[str, Any] | None = ... ) -> HttpResponse: ... def change_view( self, request: HttpRequest, object_id: str, form_url: str = ..., extra_context: dict[str, Any] | None = ... ) -> HttpResponse: ... def changelist_view(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse: ... def get_deleted_objects( self, objs: Sequence[_ModelT] | QuerySet[_ModelT], request: HttpRequest ) -> tuple[list[str], dict[str, int], set[str], list[str]]: ... def delete_view( self, request: HttpRequest, object_id: str, extra_context: dict[str, Any] | None = ... ) -> HttpResponse: ... def history_view( self, request: HttpRequest, object_id: str, extra_context: dict[str, Any] | None = ... ) -> HttpResponse: ... def get_formset_kwargs( self, request: HttpRequest, obj: _ModelT, inline: InlineModelAdmin[Any, _ModelT], prefix: str ) -> dict[str, Any]: ... _ChildModelT = TypeVar("_ChildModelT", bound=Model) _ParentModelT = TypeVar("_ParentModelT", bound=Model) class InlineModelAdmin(BaseModelAdmin[Any], Generic[_ChildModelT, _ParentModelT]): model: type[_ChildModelT] form: type[forms.ModelForm[_ChildModelT]] fk_name: str | None formset: type[BaseInlineFormSet[_ChildModelT, _ParentModelT, forms.ModelForm[_ChildModelT]]] extra: int min_num: int | None max_num: int | None template: str verbose_name: _StrOrPromise | None verbose_name_plural: _StrOrPromise | None can_delete: bool show_change_link: bool classes: Sequence[str] | None admin_site: AdminSite parent_model: type[_ParentModelT] opts: Options[_ChildModelT] has_registered_model: bool def __init__(self, parent_model: type[_ParentModelT], admin_site: AdminSite) -> None: ... @property @override def media(self) -> Media: ... def get_extra(self, request: HttpRequest, obj: _ParentModelT | None = ..., **kwargs: Any) -> int: ... def get_min_num(self, request: HttpRequest, obj: _ParentModelT | None = ..., **kwargs: Any) -> int | None: ... def get_max_num(self, request: HttpRequest, obj: _ParentModelT | None = ..., **kwargs: Any) -> int | None: ... def get_formset( self, request: HttpRequest, obj: _ParentModelT | None = ..., **kwargs: Any ) -> type[BaseInlineFormSet[_ChildModelT, _ParentModelT, forms.ModelForm[_ChildModelT]]]: ... @override def get_exclude(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> _ListOrTuple[str] | None: ... @override def get_fields(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> _FieldGroups: ... @override def get_fieldsets(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> _FieldsetSpec: ... @override def get_inlines( self, request: HttpRequest, obj: _ParentModelT | None ) -> _ListOrTuple[type[InlineModelAdmin[Any, Any]]]: ... @override def get_readonly_fields(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> _ListOrTuple[str]: ... @override def get_prepopulated_fields( self, request: HttpRequest, obj: _ParentModelT | None = ... ) -> dict[str, Sequence[str]]: ... @override def has_view_or_change_permission(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> bool: ... @override def get_view_on_site_url(self, obj: _ChildModelT | None = ...) -> str | None: ... view_on_site: Callable[[_ChildModelT], str | None] | bool @override def get_queryset(self, request: HttpRequest) -> QuerySet[_ChildModelT]: ... @override def has_add_permission(self, request: HttpRequest, obj: _ParentModelT | None) -> bool: ... # type: ignore[override] @override def has_change_permission(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> bool: ... @override def has_delete_permission(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> bool: ... @override def has_view_permission(self, request: HttpRequest, obj: _ParentModelT | None = ...) -> bool: ... class StackedInline(InlineModelAdmin[_ChildModelT, _ParentModelT]): template: str class TabularInline(InlineModelAdmin[_ChildModelT, _ParentModelT]): template: str typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/sites.pyi000066400000000000000000000105761526064357400260600ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Sequence from typing import Any from weakref import WeakSet from django.apps.config import AppConfig from django.contrib.admin.models import LogEntry from django.contrib.admin.options import ModelAdmin, _ActionCallable from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm from django.core.checks import CheckMessage from django.db.models.base import Model from django.db.models.query import QuerySet from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseBase from django.template.response import TemplateResponse from django.urls import URLPattern, URLResolver from django.utils.functional import LazyObject, _StrOrPromise from typing_extensions import TypeVar all_sites: WeakSet[AdminSite] _ViewType = TypeVar("_ViewType", bound=Callable[..., HttpResponseBase]) _ModelT = TypeVar("_ModelT", bound=Model) class AdminSite: site_title: _StrOrPromise site_header: _StrOrPromise index_title: _StrOrPromise site_url: str | None login_form: type[AuthenticationForm] | None password_change_form: type[PasswordChangeForm] | None index_template: str | None app_index_template: str | None login_template: str | None logout_template: str | None password_change_template: str | None password_change_done_template: str | None name: str enable_nav_sidebar: bool empty_value_display: str final_catch_all_view: bool _empty_value_display: str _registry: dict[type[Model], ModelAdmin[Any]] _global_actions: dict[str, _ActionCallable[ModelAdmin[Any], Any]] _actions: dict[str, _ActionCallable[ModelAdmin[Any], Any]] def __init__(self, name: str = ...) -> None: ... def check(self, app_configs: Sequence[AppConfig] | None) -> list[CheckMessage]: ... def register( self, model_or_iterable: type[_ModelT] | Iterable[type[_ModelT]], admin_class: type[ModelAdmin[_ModelT]] | None = ..., **options: Any, ) -> None: ... def unregister(self, model_or_iterable: type[Model] | Iterable[type[Model]]) -> None: ... def is_registered(self, model: type[Model]) -> bool: ... def get_model_admin(self, model: type[_ModelT]) -> ModelAdmin[_ModelT]: ... def add_action(self, action: _ActionCallable[ModelAdmin[_ModelT], _ModelT], name: str | None = ...) -> None: ... def disable_action(self, name: str) -> None: ... def get_action(self, name: str) -> _ActionCallable[ModelAdmin[_ModelT], _ModelT]: ... @property def actions(self) -> Iterable[tuple[str, _ActionCallable[ModelAdmin[_ModelT], _ModelT]]]: ... def has_permission(self, request: HttpRequest) -> bool: ... def admin_view(self, view: _ViewType, cacheable: bool = ...) -> _ViewType: ... def get_urls(self) -> list[URLResolver | URLPattern]: ... @property def urls(self) -> tuple[list[URLResolver | URLPattern], str, str]: ... def each_context(self, request: HttpRequest) -> dict[str, Any]: ... def password_change(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> TemplateResponse: ... def password_change_done( self, request: HttpRequest, extra_context: dict[str, Any] | None = ... ) -> TemplateResponse: ... def i18n_javascript(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse: ... def logout(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> TemplateResponse: ... def login(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> HttpResponse: ... def _build_app_dict(self, request: HttpRequest, label: _StrOrPromise | None = ...) -> dict[str, Any]: ... def get_app_list(self, request: HttpRequest, app_label: str | None = ...) -> list[Any]: ... def index(self, request: HttpRequest, extra_context: dict[str, Any] | None = ...) -> TemplateResponse: ... def app_index( self, request: HttpRequest, app_label: str, extra_context: dict[str, Any] | None = ... ) -> TemplateResponse: ... def autocomplete_view(self, request: HttpRequest) -> HttpResponse: ... def catch_all_view(self, request: HttpRequest, url: str) -> HttpResponse: ... def get_log_entries(self, request: HttpRequest) -> QuerySet[LogEntry]: ... class DefaultAdminSite(LazyObject[AdminSite]): ... # site is actually an instance of DefaultAdminSite, but it proxies through to a AdminSite site: AdminSite typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/000077500000000000000000000000001526064357400266675ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/__init__.pyi000066400000000000000000000000001526064357400311370ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/admin_filters.pyi000066400000000000000000000003571526064357400322370ustar00rootroot00000000000000from typing import Any from django.utils.safestring import SafeString register: Any def to_object_display_value(value: Any) -> str: ... def truncated_unordered_list(value: Any, max_items: int, autoescape: bool = ...) -> SafeString: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/admin_list.pyi000066400000000000000000000037101526064357400315360ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any from django.contrib.admin.filters import FieldListFilter from django.contrib.admin.views.main import ChangeList from django.db.models.base import Model from django.forms.boundfield import BoundField from django.forms.models import ModelForm from django.template.base import Parser, Token from django.template.context import RequestContext from django.utils.safestring import SafeString from .base import InclusionAdminNode register: Any def paginator_number(cl: ChangeList, i: int) -> SafeString: ... def pagination(cl: ChangeList) -> dict[str, Any]: ... def pagination_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def result_headers(cl: ChangeList) -> Iterator[dict[str, int | str | None]]: ... def items_for_result(cl: ChangeList, result: Model, form: ModelForm[Any] | None) -> Iterator[SafeString]: ... class ResultList(list[Any]): form: ModelForm[Any] | None def __init__(self, form: ModelForm[Any] | None, *items: Any) -> None: ... def results(cl: ChangeList) -> Iterator[ResultList]: ... def result_hidden_fields(cl: ChangeList) -> Iterator[BoundField]: ... def result_list( cl: ChangeList, ) -> dict[str, list[dict[str, int | str | None]] | list[ResultList] | list[BoundField] | ChangeList | int]: ... def result_list_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def date_hierarchy(cl: ChangeList) -> dict[str, Any] | None: ... def date_hierarchy_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def search_form(cl: ChangeList) -> dict[str, bool | ChangeList | str]: ... def search_form_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def admin_list_filter(cl: ChangeList, spec: FieldListFilter) -> SafeString: ... def admin_actions(context: RequestContext) -> RequestContext: ... def admin_actions_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def change_list_object_tools_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/admin_modify.pyi000066400000000000000000000014011526064357400320450ustar00rootroot00000000000000from typing import Any from django.contrib.admin.helpers import InlineAdminForm from django.template.base import Parser, Token from django.template.context import Context, RequestContext from .base import InclusionAdminNode register: Any def prepopulated_fields_js(context: RequestContext) -> RequestContext: ... def prepopulated_fields_js_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def submit_row(context: RequestContext) -> Context: ... def submit_row_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def change_form_object_tools_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... def cell_count(inline_admin_form: InlineAdminForm) -> int: ... def admin_actions_tag(parser: Parser, token: Token) -> InclusionAdminNode: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/admin_urls.pyi000066400000000000000000000010011526064357400315370ustar00rootroot00000000000000from typing import Any from uuid import UUID from django.db.models.options import Options from django.template.context import RequestContext from django.utils.safestring import SafeString register: Any def admin_urlname(value: Options[Any], arg: SafeString) -> str: ... def admin_urlquote(value: int | str | UUID) -> int | str | UUID: ... def add_preserved_filters( context: dict[str, Options[Any] | str] | RequestContext, url: str, popup: bool = ..., to_field: str | None = ..., ) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/base.pyi000066400000000000000000000013421526064357400303240ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from django.template.base import Parser, Token from django.template.context import Context from django.template.library import InclusionNode from django.utils.safestring import SafeString from typing_extensions import override class InclusionAdminNode(InclusionNode): args: list[Any] func: Callable[..., Any] kwargs: dict[str, Any] takes_context: bool template_name: str def __init__( self, name: str, parser: Parser, token: Token, func: Callable[..., Any], template_name: str, takes_context: bool = ..., ) -> None: ... @override def render(self, context: Context) -> SafeString: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/templatetags/log.pyi000066400000000000000000000007561526064357400302030ustar00rootroot00000000000000from typing import Any from django import template from django.template.base import Parser, Token from django.template.context import Context from typing_extensions import override register: Any class AdminLogNode(template.Node): limit: str user: str varname: str def __init__(self, limit: str, varname: str, user: str | None) -> None: ... @override def render(self, context: Context) -> str: ... def get_admin_log(parser: Parser, token: Token) -> AdminLogNode: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/tests.pyi000066400000000000000000000033301526064357400260610ustar00rootroot00000000000000from collections.abc import Callable from contextlib import AbstractContextManager from typing import Any from django.contrib.staticfiles.testing import StaticLiveServerTestCase from django.test.selenium import SeleniumTestCase from django.utils.csp import CSP as CSP from django.utils.functional import _StrOrPromise class AdminSeleniumTestCase(SeleniumTestCase, StaticLiveServerTestCase): def wait_until(self, callback: Callable[..., Any], timeout: int = 10) -> None: ... def wait_for_and_switch_to_popup(self, num_windows: int = 2, timeout: int = 10) -> None: ... def wait_for(self, css_selector: str, timeout: int = 10) -> None: ... def wait_for_text(self, css_selector: str, text: str, timeout: int = 10) -> None: ... def wait_for_value(self, css_selector: str, text: str, timeout: int = 10) -> None: ... def wait_until_visible(self, css_selector: str, timeout: int = 10) -> None: ... def wait_until_invisible(self, css_selector: str, timeout: int = 10) -> None: ... def wait_page_ready(self, timeout: int = 10) -> None: ... def wait_page_loaded(self, timeout: int = 10) -> AbstractContextManager[None]: ... def trigger_resize(self) -> None: ... def admin_login(self, username: str, password: str, login_url: _StrOrPromise = "/admin/") -> None: ... def select_option(self, selector: str, value: Any) -> None: ... def deselect_option(self, selector: str, value: Any) -> None: ... def assertCountSeleniumElements(self, selector: str, count: int, root_element: Any = None) -> None: ... def assertSelectOptions(self, selector: str, values: Any) -> None: ... def assertSelectedOptions(self, selector: str, values: Any) -> None: ... def is_disabled(self, selector: str) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/utils.pyi000066400000000000000000000115141526064357400260620ustar00rootroot00000000000000from collections import defaultdict from collections.abc import Callable, Iterable, Sequence from re import Pattern from typing import Any, Literal, overload, type_check_only from uuid import UUID from django.contrib.admin.options import BaseModelAdmin, _DisplayT, _FieldGroups, _FieldsetSpec, _ListDisplayT, _ModelT from django.contrib.admin.sites import AdminSite from django.db.models.base import Model from django.db.models.deletion import Collector from django.db.models.fields import Field, reverse_related from django.db.models.options import Options from django.db.models.query import QuerySet from django.db.models.query_utils import Q from django.forms.forms import BaseForm, Form from django.forms.formsets import BaseFormSet from django.http.request import HttpRequest from django.utils.datastructures import _IndexableCollection from typing_extensions import TypedDict, TypeVar, override _T = TypeVar("_T") QUOTE_MAP: dict[int, str] UNQUOTE_MAP: dict[str, str] UNQUOTE_RE: Pattern[str] class FieldIsAForeignKeyColumnName(Exception): ... def lookup_spawns_duplicates(opts: Options[Any], lookup_path: str) -> bool: ... def get_last_value_from_parameters(parameters: dict[str, list[str] | str], key: str) -> str | None: ... @overload def prepare_lookup_value(key: str, value: list[str], separator: str = ...) -> list[str] | list[bool]: ... @overload def prepare_lookup_value(key: str, value: str, separator: str = ...) -> str | bool | list[str]: ... @overload def prepare_lookup_value(key: str, value: _T, separator: str = ...) -> _T: ... def build_q_object_from_lookup_parameters(parameters: dict[str, Iterable[object]]) -> Q: ... def quote(s: int | str | UUID) -> str: ... def unquote(s: str) -> str: ... @overload def flatten(fields: _FieldGroups) -> list[str]: ... @overload def flatten(fields: _ListDisplayT[_ModelT]) -> list[_DisplayT[_ModelT]]: ... def flatten_fieldsets(fieldsets: _FieldsetSpec) -> list[str]: ... def get_deleted_objects( objs: Sequence[Model | None] | QuerySet[Model], request: HttpRequest, admin_site: AdminSite ) -> tuple[list[str], dict[str, int], set[str], list[str]]: ... class NestedObjects(Collector): edges: dict[Model, list[Model]] protected: set[Model] model_objs: defaultdict[str, set[Model]] @override def __init__(self, *args: object, force_collection: bool = ..., **kwargs: object) -> None: ... def add_edge(self, source: Model | None, target: Model) -> None: ... @override def collect( # type: ignore[override] self, objs: _IndexableCollection[Model | None], source: type[Model] | None = ..., source_attr: str | None = ..., *, nullable: bool = ..., collect_related: bool = ..., reverse_dependency: bool = ..., keep_parents: bool = ..., fail_on_restricted: bool = ..., ) -> None: ... @override def related_objects( self, related_model: type[Model], related_fields: Iterable[Field[Any, Any]], objs: _IndexableCollection[Model] ) -> QuerySet[Model]: ... @overload def nested(self, format_callback: None = None) -> list[Any]: ... @overload def nested(self, format_callback: Callable[[Model], _T]) -> list[Any]: ... @type_check_only class _ModelFormatDict(TypedDict): verbose_name: str verbose_name_plural: str def model_format_dict(obj: Model | type[Model] | QuerySet[Any] | Options[Model]) -> _ModelFormatDict: ... def model_ngettext(obj: Options[Any] | QuerySet[Any], n: int | None = ...) -> str: ... def lookup_field( name: Callable[..., Any] | str, obj: Model, model_admin: BaseModelAdmin[Any] | None = ... ) -> tuple[Field[Any, Any] | None, str | None, Any]: ... @overload def label_for_field( name: Callable[..., Any] | str, model: type[Model], model_admin: BaseModelAdmin[Any] | None = ..., return_attr: Literal[True] = True, form: BaseForm | None = ..., ) -> tuple[str, Callable[..., Any] | str | None]: ... @overload def label_for_field( name: Callable[..., Any] | str, model: type[Model], model_admin: BaseModelAdmin[Any] | None = ..., return_attr: Literal[False] = False, form: BaseForm | None = ..., ) -> str: ... def help_text_for_field(name: str, model: type[Model]) -> str: ... def display_for_field( value: Any, field: Field[Any, Any], empty_value_display: str, avoid_link: bool = False ) -> str: ... def display_for_value(value: Any, empty_value_display: str, boolean: bool = ...) -> str: ... class NotRelationField(Exception): ... def get_model_from_relation(field: Field[Any, Any] | reverse_related.ForeignObjectRel) -> type[Model]: ... def reverse_field_path(model: type[Model], path: str) -> tuple[type[Model], str]: ... def get_fields_from_path(model: type[Model], path: str) -> list[Field[Any, Any]]: ... def construct_change_message( form: Form, formsets: Iterable[BaseFormSet[Any]], add: bool ) -> list[dict[str, dict[str, list[str]]]]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/views/000077500000000000000000000000001526064357400253325ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/views/__init__.pyi000066400000000000000000000000001526064357400276020ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/views/autocomplete.pyi000066400000000000000000000013711526064357400305600ustar00rootroot00000000000000from typing import Any from django.contrib.admin.options import ModelAdmin from django.contrib.admin.sites import AdminSite from django.db.models import Model from django.db.models.fields.related import ForeignKey from django.http.request import HttpRequest from django.views.generic.list import BaseListView class AutocompleteJsonView(BaseListView[Any]): admin_site: AdminSite | None model_admin: ModelAdmin[Any] source_field: ForeignKey[Any, Any] term: str def serialize_result(self, obj: Model, to_field_name: str) -> dict[str, str]: ... def process_request(self, request: HttpRequest) -> tuple[str, ModelAdmin[Any], ForeignKey[Any, Any], str]: ... def has_perm(self, request: HttpRequest, obj: Model | None = ...) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/views/decorators.pyi000066400000000000000000000010031526064357400302140ustar00rootroot00000000000000from collections.abc import Callable from typing import Any, overload from django.utils.functional import _StrOrPromise from typing_extensions import TypeVar _C = TypeVar("_C", bound=Callable[..., Any]) @overload def staff_member_required( view_func: _C = ..., redirect_field_name: str | None = ..., login_url: _StrOrPromise = ... ) -> _C: ... @overload def staff_member_required( view_func: None = None, redirect_field_name: str | None = ..., login_url: _StrOrPromise = ... ) -> Callable[..., Any]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/views/main.pyi000066400000000000000000000066641526064357400270150ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Sequence from typing import Any, Literal from django import forms from django.contrib.admin.filters import ListFilter from django.contrib.admin.options import ModelAdmin, _ListDisplayT, _ListFilterT from django.db.models.base import Model from django.db.models.options import Options from django.db.models.query import QuerySet, _OrderByFieldName from django.forms.formsets import BaseFormSet from django.http.request import HttpRequest ALL_VAR: str ORDER_VAR: str PAGE_VAR: str SEARCH_VAR: str ERROR_FLAG: str IGNORED_PARAMS: tuple[str, ...] class ChangeListSearchForm(forms.Form): ... class ChangeList: search_form_class: type[forms.Form] model: type[Model] opts: Options[Any] lookup_opts: Options[Any] root_queryset: QuerySet[Any] list_display: _ListDisplayT[Any] list_display_links: _ListDisplayT[Any] list_filter: Sequence[_ListFilterT] date_hierarchy: Any search_fields: Sequence[str] search_help_text: str | None list_select_related: bool | Sequence[str] list_per_page: int list_max_show_all: int model_admin: ModelAdmin[Any] preserved_filters: str sortable_by: Sequence[str] | None page_num: int show_all: bool is_popup: bool add_facets: bool is_facets_optional: bool to_field: Any params: dict[str, Any] filter_params: dict[str, list[str]] remove_facet_link: str add_facet_link: str list_editable: Sequence[str] query: str queryset: Any title: str pk_attname: str formset: BaseFormSet[Any] | None def __init__( self, request: HttpRequest, model: type[Model], list_display: _ListDisplayT[Any], list_display_links: _ListDisplayT[Any], list_filter: Sequence[_ListFilterT], date_hierarchy: str | None, search_fields: Sequence[str], list_select_related: bool | Sequence[str], list_per_page: int, list_max_show_all: int, list_editable: Sequence[str], model_admin: ModelAdmin[Any], sortable_by: Sequence[str] | None, search_help_text: str | None, ) -> None: ... def get_filters_params(self, params: dict[str, Any] | None = ...) -> dict[str, Any]: ... def get_filters(self, request: HttpRequest) -> tuple[list[ListFilter], bool, dict[str, bool | str], bool, bool]: ... def get_query_string(self, new_params: dict[str, Any] | None = ..., remove: Iterable[str] | None = ...) -> str: ... result_count: int show_full_result_count: bool show_admin_actions: bool full_result_count: int | None result_list: Any can_show_all: bool multi_page: bool paginator: Any def get_results(self, request: HttpRequest) -> None: ... def get_ordering_field(self, field_name: Callable[..., Any] | str) -> _OrderByFieldName | None: ... def get_ordering(self, request: HttpRequest, queryset: QuerySet[Any]) -> list[_OrderByFieldName]: ... def get_ordering_field_columns(self) -> dict[int, Literal["desc", "asc"]]: ... def get_queryset( self, request: HttpRequest, exclude_parameters: list[str | None] | None = ... ) -> QuerySet[Any]: ... filter_specs: list[ListFilter] has_filters: bool has_active_filters: bool clear_all_filters_qs: str def apply_select_related(self, qs: QuerySet[Any]) -> QuerySet[Any]: ... def get_select_related_fields(self) -> list[str]: ... def url_for_result(self, result: Model) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admin/widgets.pyi000066400000000000000000000146741526064357400264020ustar00rootroot00000000000000from collections.abc import Iterable, Mapping, Sequence from typing import Any from django import forms from django.contrib.admin.sites import AdminSite from django.core.files.base import File from django.db.models.fields.reverse_related import ManyToManyRel, ManyToOneRel from django.forms.models import ModelChoiceIterator from django.forms.widgets import ChoiceWidget, Media, _OptAttrs from django.utils.choices import _Choices from django.utils.functional import _StrOrPromise from typing_extensions import override class FilteredSelectMultiple(forms.SelectMultiple): verbose_name: _StrOrPromise is_stacked: bool def __init__( self, verbose_name: _StrOrPromise, is_stacked: bool, attrs: _OptAttrs | None = ..., choices: _Choices = ..., ) -> None: ... class Media: js: list[str] class DateTimeWidgetContextMixin: def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... class BaseAdminDateWidget(DateTimeWidgetContextMixin, forms.DateInput): def __init__(self, attrs: _OptAttrs | None = ..., format: str | None = ...) -> None: ... class Media: js: list[str] class AdminDateWidget(BaseAdminDateWidget): template_name: str class BaseAdminTimeWidget(DateTimeWidgetContextMixin, forms.TimeInput): def __init__(self, attrs: _OptAttrs | None = ..., format: str | None = ...) -> None: ... class Media: js: list[str] class AdminTimeWidget(BaseAdminTimeWidget): template_name: str class AdminSplitDateTime(forms.SplitDateTimeWidget): template_name: str def __init__(self, attrs: _OptAttrs | None = ...) -> None: ... @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... class AdminRadioSelect(forms.RadioSelect): ... class AdminFileWidget(forms.ClearableFileInput): ... def url_params_from_lookup_dict(lookups: Any) -> dict[str, str]: ... class ForeignKeyRawIdWidget(forms.TextInput): rel: ManyToOneRel admin_site: AdminSite db: str | None def __init__( self, rel: ManyToOneRel, admin_site: AdminSite, attrs: _OptAttrs | None = ..., using: str | None = ..., ) -> None: ... def base_url_parameters(self) -> dict[str, str]: ... @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... def url_parameters(self) -> dict[str, str]: ... def label_and_url_for_value(self, value: Any) -> tuple[str, str]: ... class ManyToManyRawIdWidget(ForeignKeyRawIdWidget): rel: ManyToManyRel # type: ignore[assignment] def __init__( self, rel: ManyToManyRel, admin_site: AdminSite, attrs: _OptAttrs | None = ..., using: str | None = ..., ) -> None: ... @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... @override def url_parameters(self) -> dict[str, str]: ... @override def label_and_url_for_value(self, value: Any) -> tuple[str, str]: ... @override def format_value(self, value: Any) -> str: ... @override def value_from_datadict( self, data: Mapping[str, Any], files: Mapping[str, Iterable[File[Any]]], name: str ) -> Any: ... class RelatedFieldWidgetWrapper(forms.Widget): template_name: str widget: ChoiceWidget rel: ManyToOneRel can_add_related: bool can_change_related: bool can_delete_related: bool can_view_related: bool admin_site: AdminSite def __init__( self, widget: ChoiceWidget, rel: ManyToOneRel, admin_site: AdminSite, can_add_related: bool | None = ..., can_change_related: bool = ..., can_delete_related: bool = ..., can_view_related: bool = ..., ) -> None: ... @property @override def is_hidden(self) -> bool: ... @property def choices(self) -> ModelChoiceIterator[Any]: ... @choices.setter def choices(self, value: ModelChoiceIterator[Any]) -> None: ... def get_related_url(self, info: tuple[str, str], action: str, *args: Any) -> str: ... @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... @override def value_from_datadict( self, data: Mapping[str, Any], files: Mapping[str, Iterable[File[Any]]], name: str ) -> Any: ... @override def value_omitted_from_data( self, data: Mapping[str, Any], files: Mapping[str, Iterable[File[Any]]], name: str ) -> bool: ... @override def id_for_label(self, id_: str) -> str: ... class AdminTextareaWidget(forms.Textarea): def __init__(self, attrs: _OptAttrs | None = ...) -> None: ... class AdminTextInputWidget(forms.TextInput): def __init__(self, attrs: _OptAttrs | None = ...) -> None: ... class AdminEmailInputWidget(forms.EmailInput): def __init__(self, attrs: _OptAttrs | None = ...) -> None: ... class AdminURLFieldWidget(forms.URLInput): template_name: str def __init__(self, attrs: _OptAttrs | None = ..., validator_class: Any = ...) -> None: ... @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... class AdminIntegerFieldWidget(forms.NumberInput): def __init__(self, attrs: _OptAttrs | None = ...) -> None: ... class_name: str class AdminBigIntegerFieldWidget(AdminIntegerFieldWidget): class_name: str class AdminUUIDInputWidget(forms.TextInput): def __init__(self, attrs: _OptAttrs | None = ...) -> None: ... SELECT2_TRANSLATIONS: dict[str, str] def get_select2_language() -> str | None: ... class AutocompleteMixin: url_name: str field: Any admin_site: AdminSite db: str | None choices: Any attrs: _OptAttrs def __init__( self, field: Any, admin_site: AdminSite, attrs: _OptAttrs | None = ..., choices: Any = ..., using: str | None = ..., ) -> None: ... @property def media(self) -> Media: ... def get_url(self) -> str: ... def build_attrs(self, base_attrs: _OptAttrs, extra_attrs: _OptAttrs | None = ...) -> dict[str, Any]: ... # typo in source: `attr` instead of `attrs` def optgroups( self, name: str, value: Sequence[str], attr: _OptAttrs | None = ... ) -> list[tuple[str | None, list[dict[str, Any]], int | None]]: ... class AutocompleteSelect(AutocompleteMixin, forms.Select): ... class AutocompleteSelectMultiple(AutocompleteMixin, forms.SelectMultiple): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/000077500000000000000000000000001526064357400250465ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/__init__.pyi000066400000000000000000000000001526064357400273160ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/apps.pyi000066400000000000000000000002011526064357400265250ustar00rootroot00000000000000from typing import Any from django.apps import AppConfig class AdminDocsConfig(AppConfig): name: str verbose_name: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/middleware.pyi000066400000000000000000000007501526064357400277100ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseBase from django.utils.deprecation import MiddlewareMixin class XViewMiddleware(MiddlewareMixin): def process_view( self, request: HttpRequest, view_func: Callable[..., HttpResponseBase], view_args: tuple[Any, ...], view_kwargs: dict[str, Any], ) -> HttpResponse | None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/urls.pyi000066400000000000000000000000741526064357400265570ustar00rootroot00000000000000from django.urls import _AnyURL urlpatterns: list[_AnyURL] typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/utils.pyi000066400000000000000000000022461526064357400267350ustar00rootroot00000000000000from collections.abc import Callable from re import Pattern from typing import Any from django.utils.safestring import SafeString docutils_is_available: bool def get_view_name(view_func: Callable[..., Any]) -> str: ... def parse_docstring(docstring: str) -> tuple[str, str, dict[str, str]]: ... def parse_rst(text: str, default_reference_context: Any, thing_being_parsed: Any | None = ...) -> SafeString: ... ROLES: dict[str, str] explicit_title_re: Pattern[str] def split_explicit_title(text: str) -> tuple[bool, str, str]: ... def create_reference_role(rolename: str, urlbase: str) -> None: ... def default_reference_role( name: str, rawtext: str, text: str, lineno: Any, inliner: Any, options: Any | None = ..., content: Any | None = ..., ) -> tuple[list[Any], list[Any]]: ... named_group_matcher: Pattern[str] unnamed_group_matcher: Pattern[str] non_capturing_group_matcher: Pattern[str] def replace_metacharacters(pattern: str) -> str: ... def replace_named_groups(pattern: str) -> str: ... def replace_unnamed_groups(pattern: str) -> str: ... def remove_non_capturing_groups(pattern: str) -> str: ... def strip_p_tags(value: str) -> SafeString: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/admindocs/views.pyi000066400000000000000000000024251526064357400267310ustar00rootroot00000000000000from collections.abc import Callable, Iterable from re import Pattern from typing import Any from django.contrib.auth.models import AbstractBaseUser, AnonymousUser from django.db.models import Model from django.db.models.fields import Field from django.db.models.options import Options from django.urls import _AnyURL from django.views.generic import TemplateView MODEL_METHODS_EXCLUDE: Any class BaseAdminDocsView(TemplateView): ... class BookmarkletsView(BaseAdminDocsView): ... class TemplateTagIndexView(BaseAdminDocsView): ... class TemplateFilterIndexView(BaseAdminDocsView): ... class ViewIndexView(BaseAdminDocsView): ... class ViewDetailView(BaseAdminDocsView): ... def user_has_model_view_permission(user: AbstractBaseUser | AnonymousUser, opts: Options[Model]) -> bool: ... class ModelIndexView(BaseAdminDocsView): ... class ModelDetailView(BaseAdminDocsView): ... class TemplateDetailView(BaseAdminDocsView): ... def get_return_data_type(func_name: Any) -> str: ... def get_readable_field_data_type(field: Field[Any, Any] | str) -> str: ... def extract_views_from_urlpatterns( urlpatterns: Iterable[_AnyURL], base: str = ..., namespace: str | None = ... ) -> list[tuple[Callable[..., Any], Pattern[str], str | None, str | None]]: ... def simplify_regex(pattern: str) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/000077500000000000000000000000001526064357400240465ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/__init__.pyi000066400000000000000000000033471526064357400263370ustar00rootroot00000000000000from typing import Any from django.contrib.auth.backends import BaseBackend from django.contrib.auth.models import _AnyUser, _User, _UserModel from django.db.models.options import Options from django.http.request import HttpRequest from django.test.client import Client from .signals import user_logged_in as user_logged_in from .signals import user_logged_out as user_logged_out from .signals import user_login_failed as user_login_failed SESSION_KEY: str BACKEND_SESSION_KEY: str HASH_SESSION_KEY: str REDIRECT_FIELD_NAME: str def load_backend(path: str) -> BaseBackend: ... def get_backends() -> list[BaseBackend]: ... def authenticate(request: HttpRequest | None = ..., **credentials: Any) -> _User | None: ... async def aauthenticate(request: HttpRequest | None = ..., **credentials: Any) -> _User | None: ... def login(request: HttpRequest, user: _User | None, backend: type[BaseBackend] | str | None = ...) -> None: ... async def alogin(request: HttpRequest, user: _User | None, backend: type[BaseBackend] | str | None = ...) -> None: ... def logout(request: HttpRequest) -> None: ... async def alogout(request: HttpRequest) -> None: ... def get_user_model() -> _UserModel: ... def get_user(request: HttpRequest | Client) -> _AnyUser: ... async def aget_user(request: HttpRequest | Client) -> _AnyUser: ... def get_permission_codename(action: str, opts: Options[Any]) -> str: ... def update_session_auth_hash(request: HttpRequest, user: _User) -> None: ... async def aupdate_session_auth_hash(request: HttpRequest, user: _User) -> None: ... def check_password_with_timing_attack_mitigation(user: _User | None, password: str | None) -> bool: ... async def acheck_password_with_timing_attack_mitigation(user: _User | None, password: str | None) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/admin.pyi000066400000000000000000000022331526064357400256610ustar00rootroot00000000000000from typing import Any from django import forms from django.contrib import admin from django.contrib.auth.models import Group, _UserType from django.db.models.fields.related import ManyToManyField from django.forms.models import ModelMultipleChoiceField from django.http.request import HttpRequest from django.http.response import HttpResponse from typing_extensions import override class GroupAdmin(admin.ModelAdmin[Group]): @override def formfield_for_manytomany( self, db_field: ManyToManyField[Any, Any], request: HttpRequest | None = ..., **kwargs: Any ) -> ModelMultipleChoiceField[Any] | None: ... class UserAdmin(admin.ModelAdmin[_UserType]): change_user_password_template: Any add_fieldsets: Any add_form: Any change_password_form: Any @override def get_form( # type: ignore[override] self, request: HttpRequest, obj: _UserType | None = ..., **kwargs: Any ) -> type[forms.ModelForm[_UserType]]: ... @override def lookup_allowed(self, lookup: str, value: str, request: HttpRequest) -> bool: ... def user_change_password(self, request: HttpRequest, id: str, form_url: str = ...) -> HttpResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/apps.pyi000066400000000000000000000001041526064357400255270ustar00rootroot00000000000000from django.apps import AppConfig class AuthConfig(AppConfig): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/backends.pyi000066400000000000000000000057021526064357400263470ustar00rootroot00000000000000from typing import Any from django.contrib.auth.models import Permission, _AnyUser, _User, _UserModel, _UserType from django.db.models import QuerySet from django.db.models.base import Model from django.http.request import HttpRequest from typing_extensions import override UserModel = _UserModel class BaseBackend: def authenticate(self, request: HttpRequest | None, **kwargs: Any) -> _User | None: ... async def aauthenticate(self, request: HttpRequest | None, **kwargs: Any) -> _User | None: ... def get_user(self, user_id: Any) -> _User | None: ... async def aget_user(self, user_id: Any) -> _User | None: ... def get_user_permissions(self, user_obj: _AnyUser, obj: Model | None = ...) -> set[str]: ... async def aget_user_permissions(self, user_obj: _AnyUser, obj: Model | None = ...) -> set[str]: ... def get_group_permissions(self, user_obj: _AnyUser, obj: Model | None = ...) -> set[str]: ... async def aget_group_permissions(self, user_obj: _AnyUser, obj: Model | None = ...) -> set[str]: ... def get_all_permissions(self, user_obj: _AnyUser, obj: Model | None = ...) -> set[str]: ... async def aget_all_permissions(self, user_obj: _AnyUser, obj: Model | None = ...) -> set[str]: ... def has_perm(self, user_obj: _AnyUser, perm: str, obj: Model | None = ...) -> bool: ... async def ahas_perm(self, user_obj: _AnyUser, perm: str, obj: Model | None = ...) -> bool: ... class ModelBackend(BaseBackend): @override def authenticate( self, request: HttpRequest | None, username: str | None = ..., password: str | None = ..., **kwargs: Any ) -> _User | None: ... @override async def aauthenticate( self, request: HttpRequest | None, username: str | None = ..., password: str | None = ..., **kwargs: Any ) -> _User | None: ... def user_can_authenticate(self, user: _AnyUser | None) -> bool: ... def has_module_perms(self, user_obj: _AnyUser, app_label: str) -> bool: ... async def ahas_module_perms(self, user_obj: _AnyUser, app_label: str) -> bool: ... def with_perm( self, perm: str | Permission, is_active: bool = ..., include_superusers: bool = ..., obj: Model | None = ..., ) -> QuerySet[_User]: ... class AllowAllUsersModelBackend(ModelBackend): ... class RemoteUserBackend(ModelBackend): create_unknown_user: bool @override def authenticate(self, request: HttpRequest | None, remote_user: str) -> _User | None: ... # type: ignore[override] @override async def aauthenticate(self, request: HttpRequest | None, remote_user: str) -> _User | None: ... # type: ignore[override] def clean_username(self, username: str) -> str: ... def configure_user(self, request: HttpRequest | None, user: _UserType, created: bool = ...) -> _UserType: ... async def aconfigure_user(self, request: HttpRequest | None, user: _UserType, created: bool = ...) -> _UserType: ... class AllowAllUsersRemoteUserBackend(RemoteUserBackend): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/base_user.pyi000066400000000000000000000036051526064357400265450ustar00rootroot00000000000000import datetime as dt from collections.abc import Iterable from typing import Any, ClassVar, Literal, overload from django.db import models from django.db.models.base import Model from django.db.models.expressions import Combinable from django.db.models.fields import BooleanField from typing_extensions import TypeVar _T = TypeVar("_T", bound=Model) class BaseUserManager(models.Manager[_T]): @classmethod def normalize_email(cls, email: str | None) -> str: ... def get_by_natural_key(self, username: str | None) -> _T: ... async def aget_by_natural_key(self, username: str | None) -> _T: ... class AbstractBaseUser(models.Model): REQUIRED_FIELDS: ClassVar[list[str]] class Meta: abstract: ClassVar[bool] password: models.CharField[str | int | Combinable, str] last_login: models.DateTimeField[str | dt.datetime | dt.date | Combinable | None, dt.datetime | None] is_active: bool | BooleanField[bool | Combinable, bool] backend: str # Set dynamically by authenticate(), used by login() def get_username(self) -> str: ... def natural_key(self) -> tuple[str, ...]: ... @property def is_anonymous(self) -> Literal[False]: ... @property def is_authenticated(self) -> Literal[True]: ... def set_password(self, raw_password: str | None) -> None: ... def check_password(self, raw_password: str | None) -> bool: ... async def acheck_password(self, raw_password: str | None) -> bool: ... def set_unusable_password(self) -> None: ... def has_usable_password(self) -> bool: ... def get_session_auth_hash(self) -> str: ... def get_session_auth_fallback_hash(self) -> Iterable[str]: ... @classmethod def get_email_field_name(cls) -> str: ... @classmethod @overload def normalize_username(cls, username: str) -> str: ... @classmethod @overload def normalize_username(cls, username: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/checks.pyi000066400000000000000000000007161526064357400260350ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage def check_user_model(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_models_permissions(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_middleware(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/context_processors.pyi000066400000000000000000000012261526064357400305400ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any from django.http.request import HttpRequest class PermLookupDict: app_label: str user: Any def __init__(self, user: Any, app_label: str) -> None: ... def __getitem__(self, perm_name: str) -> bool: ... def __iter__(self) -> Iterator[Any]: ... def __bool__(self) -> bool: ... class PermWrapper: user: Any def __init__(self, user: Any) -> None: ... def __getitem__(self, app_label: str) -> PermLookupDict: ... def __iter__(self) -> Iterator[Any]: ... def __contains__(self, perm_name: Any) -> bool: ... def auth(request: HttpRequest) -> dict[str, Any]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/decorators.pyi000066400000000000000000000021131526064357400267330ustar00rootroot00000000000000from collections.abc import Awaitable, Callable, Iterable from typing import overload from django.contrib.auth.models import _AnyUser from django.http.response import HttpResponseBase from django.utils.functional import _StrOrPromise from typing_extensions import TypeVar _VIEW = TypeVar("_VIEW", bound=Callable[..., HttpResponseBase | Awaitable[HttpResponseBase]]) def user_passes_test( test_func: Callable[[_AnyUser], bool], login_url: _StrOrPromise | None = ..., redirect_field_name: str | None = ..., ) -> Callable[[_VIEW], _VIEW]: ... @overload def login_required( function: _VIEW, redirect_field_name: str | None = ..., login_url: _StrOrPromise | None = ..., ) -> _VIEW: ... @overload def login_required( function: None = None, redirect_field_name: str | None = ..., login_url: _StrOrPromise | None = ..., ) -> Callable[[_VIEW], _VIEW]: ... def login_not_required(view_func: _VIEW) -> _VIEW: ... def permission_required( perm: Iterable[str] | str, login_url: _StrOrPromise | None = ..., raise_exception: bool = ... ) -> Callable[[_VIEW], _VIEW]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/forms.pyi000066400000000000000000000131751526064357400257260ustar00rootroot00000000000000from collections.abc import Iterable from logging import Logger from typing import Any, ClassVar, Generic from django import forms from django.contrib.auth.models import _User, _UserModel, _UserType from django.contrib.auth.tokens import PasswordResetTokenGenerator from django.core.exceptions import ValidationError from django.db import models from django.db.models.fields import _ErrorMessagesDict from django.forms.fields import _ClassLevelWidgetT from django.forms.widgets import Widget from django.http.request import HttpRequest from django.utils.functional import _StrOrPromise from typing_extensions import override logger: Logger UserModel = _UserModel class ReadOnlyPasswordHashWidget(forms.Widget): template_name: str @override def get_context(self, name: str, value: Any, attrs: dict[str, Any] | None) -> dict[str, Any]: ... class ReadOnlyPasswordHashField(forms.Field): widget: _ClassLevelWidgetT def __init__(self, *args: Any, **kwargs: Any) -> None: ... class UsernameField(forms.CharField): @override def to_python(self, value: Any | None) -> Any | None: ... @override def widget_attrs(self, widget: Widget) -> dict[str, Any]: ... class SetPasswordMixin(Generic[_UserType]): error_messages: _ErrorMessagesDict @staticmethod def create_password_fields( label1: _StrOrPromise = ..., label2: _StrOrPromise = ... ) -> tuple[forms.CharField, forms.CharField]: ... def validate_passwords( self, password1_field_name: str = ..., password2_field_name: str = ..., ) -> None: ... def validate_password_for_user(self, user: _UserType, password_field_name: str = "password2") -> None: ... def set_password_and_save( self, user: _UserType, password_field_name: str = "password1", commit: bool = True ) -> _UserType: ... def __class_getitem__(cls, *args: Any, **kwargs: Any) -> Any: ... class SetUnusablePasswordMixin(Generic[_UserType]): usable_password_help_text: _StrOrPromise @staticmethod def create_usable_password_field(help_text: _StrOrPromise = ...) -> forms.ChoiceField: ... def validate_passwords( self, password1_field_name: str = ..., password2_field_name: str = ..., usable_password_field_name: str = ..., ) -> None: ... def validate_password_for_user(self, user: _UserType, **kwargs: Any) -> None: ... def set_password_and_save(self, user: _User, commit: bool = True, **kwargs: Any) -> _User: ... class BaseUserCreationForm(forms.ModelForm[_UserType], Generic[_UserType]): error_messages: _ErrorMessagesDict password1: forms.Field password2: forms.Field class Meta: model: ClassVar[type[_User]] fields: ClassVar[tuple[str, ...]] field_classes: ClassVar[dict[str, type[forms.Field]]] def __init__(self, *args: Any, **kwargs: Any) -> None: ... @override def save(self, commit: bool = ...) -> _UserType: ... class UserCreationForm(BaseUserCreationForm[_UserType]): def clean_username(self) -> str: ... class UserChangeForm(forms.ModelForm[_UserType]): password: forms.Field class Meta: model: ClassVar[type[_User]] fields: ClassVar[str] field_classes: ClassVar[dict[str, type[forms.Field]]] def __init__(self, *args: Any, **kwargs: Any) -> None: ... class AuthenticationForm(forms.Form): username: forms.Field password: forms.Field error_messages: _ErrorMessagesDict request: HttpRequest | None user_cache: _User | None username_field: models.Field[Any, Any] def __init__(self, request: HttpRequest | None = ..., *args: Any, **kwargs: Any) -> None: ... def confirm_login_allowed(self, user: _User) -> None: ... def get_user(self) -> _User: ... def get_invalid_login_error(self) -> ValidationError: ... @override def clean(self) -> dict[str, Any]: ... class PasswordResetForm(forms.Form): email: forms.Field def send_mail( self, subject_template_name: str, email_template_name: str, context: dict[str, Any], from_email: str | None, to_email: str, html_email_template_name: str | None = ..., ) -> None: ... def get_users(self, email: str) -> Iterable[_User]: ... def save( self, domain_override: str | None = ..., subject_template_name: str = ..., email_template_name: str = ..., use_https: bool = ..., token_generator: PasswordResetTokenGenerator = ..., from_email: str | None = ..., request: HttpRequest | None = ..., html_email_template_name: str | None = ..., extra_email_context: dict[str, str] | None = ..., ) -> None: ... class SetPasswordForm(SetPasswordMixin[_UserType], forms.Form, Generic[_UserType]): new_password1: forms.Field new_password2: forms.Field user: _UserType def __init__(self, user: _UserType, *args: Any, **kwargs: Any) -> None: ... def save(self, commit: bool = ...) -> _UserType: ... class PasswordChangeForm(SetPasswordForm[_User]): old_password: forms.Field def clean_old_password(self) -> str: ... class AdminPasswordChangeForm(forms.Form, Generic[_UserType]): error_messages: _ErrorMessagesDict required_css_class: str usable_password_help_text: str password1: forms.Field password2: forms.Field user: _UserType def __init__(self, user: _UserType, *args: Any, **kwargs: Any) -> None: ... def save(self, commit: bool = ...) -> _UserType: ... @property @override def changed_data(self) -> list[str]: ... class AdminUserCreationForm(SetUnusablePasswordMixin[_UserType], UserCreationForm[_UserType]): usable_password: forms.ChoiceField = ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/handlers/000077500000000000000000000000001526064357400256465ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/handlers/__init__.pyi000066400000000000000000000000001526064357400301160ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/handlers/modwsgi.pyi000066400000000000000000000003261526064357400300430ustar00rootroot00000000000000from typing import Any UserModel: Any def check_password(environ: dict[Any, Any], username: str, password: str) -> bool | None: ... def groups_for_user(environ: dict[Any, Any], username: str) -> list[bytes]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/hashers.pyi000066400000000000000000000055761526064357400262430ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from django.utils.functional import _StrOrPromise from typing_extensions import override UNUSABLE_PASSWORD_PREFIX: str UNUSABLE_PASSWORD_SUFFIX_LENGTH: int def is_password_usable(encoded: str | None) -> bool: ... def verify_password(password: str | None, encoded: str, preferred: str = ...) -> tuple[bool, bool]: ... def check_password( password: str | None, encoded: str, setter: Callable[[str], Any] | None = ..., preferred: str = ... ) -> bool: ... async def acheck_password( password: str | None, encoded: str, setter: Callable[[str], Any] | None = ..., preferred: str = ... ) -> bool: ... def make_password(password: str | None, salt: str | None = ..., hasher: str | BasePasswordHasher = ...) -> str: ... def get_hashers() -> list[BasePasswordHasher]: ... def get_hashers_by_algorithm() -> dict[str, BasePasswordHasher]: ... def reset_hashers(*, setting: str, **kwargs: Any) -> None: ... def get_hasher(algorithm: str | BasePasswordHasher = ...) -> BasePasswordHasher: ... def identify_hasher(encoded: str) -> BasePasswordHasher: ... def mask_hash(hash: str, show: int = ..., char: str = ...) -> str: ... def must_update_salt(salt: str, expected_entropy: int) -> bool: ... class BasePasswordHasher: algorithm: str | None library: str | tuple[str, str] | None salt_entropy: int def salt(self) -> str: ... def verify(self, password: str, encoded: str) -> bool: ... def encode(self, password: str, salt: str) -> str: ... def decode(self, encoded: str) -> dict[str, Any]: ... def safe_summary(self, encoded: str) -> dict[_StrOrPromise, Any]: ... def must_update(self, encoded: str) -> bool: ... def harden_runtime(self, password: str, encoded: str) -> None: ... class PBKDF2PasswordHasher(BasePasswordHasher): iterations: int digest: Any @override def encode(self, password: str, salt: str, iterations: int | None = ...) -> str: ... @override def decode(self, encoded: str) -> dict[str, str | int]: ... class PBKDF2SHA1PasswordHasher(PBKDF2PasswordHasher): ... class Argon2PasswordHasher(BasePasswordHasher): time_cost: int memory_cost: int parallelism: int def params(self) -> Any: ... class BCryptSHA256PasswordHasher(BasePasswordHasher): digest: Any rounds: int @override def decode(self, encoded: str) -> dict[str, str | int]: ... class BCryptPasswordHasher(BCryptSHA256PasswordHasher): ... class ScryptPasswordHasher(BasePasswordHasher): block_size: int maxmem: int parallelism: int work_factor: int @override def encode( self, password: str, salt: str, n: int | None = ..., r: int | None = ..., p: int | None = ... ) -> str: ... @override def decode(self, encoded: str) -> dict[str, str | int]: ... class MD5PasswordHasher(BasePasswordHasher): @override def decode(self, encoded: str) -> dict[str, str]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/management/000077500000000000000000000000001526064357400261625ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/management/__init__.pyi000066400000000000000000000013711526064357400304460ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any, TextIO from django.apps.config import AppConfig from django.apps.registry import Apps from django.db.migrations.migration import Migration def create_permissions( app_config: AppConfig, verbosity: int = ..., interactive: bool = ..., using: str = ..., apps: Apps = ..., **kwargs: Any, ) -> None: ... def rename_permissions_after_model_rename( app_config: AppConfig, verbosity: int = ..., plan: Sequence[tuple[Migration, bool]] | None = ..., using: str = ..., apps: Apps = ..., stdout: TextIO = ..., **kwargs: Any, ) -> None: ... def get_system_username() -> str: ... def get_default_username(check_db: bool = ..., database: str = ...) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/management/commands/000077500000000000000000000000001526064357400277635ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/management/commands/__init__.pyi000066400000000000000000000000001526064357400322330ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/management/commands/changepassword.pyi000066400000000000000000000001751526064357400335210ustar00rootroot00000000000000from typing import Any from django.core.management.base import BaseCommand UserModel: Any class Command(BaseCommand): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/management/commands/createsuperuser.pyi000066400000000000000000000012531526064357400337300ustar00rootroot00000000000000import getpass as getpass from typing import Any from django.contrib.auth.base_user import AbstractBaseUser from django.core.management.base import BaseCommand from django.db.models import Field from django.utils.functional import cached_property class NotRunningInTTYException(Exception): ... PASSWORD_FIELD: str class Command(BaseCommand): UserModel: type[AbstractBaseUser] username_field: Field[Any, Any] stdin: Any def get_input_data(self, field: Field[Any, Any], message: str, default: str | None = ...) -> str | None: ... @cached_property def username_is_unique(self) -> bool: ... @cached_property def natural_key_defined(self) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/middleware.pyi000066400000000000000000000041131526064357400267050ustar00rootroot00000000000000from collections.abc import Awaitable, Callable from typing import Any, ClassVar, Literal from django.contrib.auth.models import _AnyUser from django.http import HttpRequest, HttpResponseBase, HttpResponseRedirect from django.utils.deprecation import MiddlewareMixin, _AnyGetResponseCallable def get_user(request: HttpRequest) -> _AnyUser: ... async def auser(request: HttpRequest) -> _AnyUser: ... class AuthenticationMiddleware(MiddlewareMixin): def process_request(self, request: HttpRequest) -> None: ... class LoginRequiredMiddleware(MiddlewareMixin): redirect_field_name: ClassVar[str] def process_view( self, request: HttpRequest, view_func: Callable[..., HttpResponseBase], view_args: tuple[Any, ...], view_kwargs: dict[Any, Any], ) -> HttpResponseBase | None: ... def get_login_url(self, view_func: Callable[..., HttpResponseBase]) -> str: ... def get_redirect_field_name(self, view_func: Callable[..., HttpResponseBase]) -> str: ... def handle_no_permission( self, request: HttpRequest, view_func: Callable[..., HttpResponseBase] ) -> HttpResponseRedirect: ... class RemoteUserMiddleware: header: ClassVar[str] force_logout_if_no_header: ClassVar[bool] sync_capable: ClassVar[Literal[True]] async_capable: ClassVar[Literal[True]] get_response: _AnyGetResponseCallable is_async: bool def __init__(self, get_response: _AnyGetResponseCallable) -> None: ... def __call__(self, request: HttpRequest) -> HttpResponseBase | Awaitable[HttpResponseBase]: ... async def __acall__(self, request: HttpRequest) -> HttpResponseBase: ... def clean_username(self, username: str, request: HttpRequest) -> str: ... async def aclean_username(self, username: str, request: HttpRequest) -> str: ... def get_username(self, request: HttpRequest) -> str: ... def process_request(self, request: HttpRequest) -> None: ... async def aprocess_request(self, request: HttpRequest) -> None: ... class PersistentRemoteUserMiddleware(RemoteUserMiddleware): force_logout_if_no_header: ClassVar[bool] typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/migrations/000077500000000000000000000000001526064357400262225ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/migrations/__init__.pyi000066400000000000000000000000001526064357400304720ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/mixins.pyi000066400000000000000000000023471526064357400261060ustar00rootroot00000000000000from collections.abc import Callable, Sequence from typing import Any from django import http from django.http.response import HttpResponseBase, HttpResponseRedirect from django.utils.functional import _StrOrPromise class AccessMixin: login_url: _StrOrPromise | None permission_denied_message: _StrOrPromise raise_exception: bool redirect_field_name: Any def get_login_url(self) -> str: ... def get_permission_denied_message(self) -> _StrOrPromise: ... def get_redirect_field_name(self) -> str: ... def handle_no_permission(self) -> HttpResponseRedirect: ... class LoginRequiredMixin(AccessMixin): def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ... class PermissionRequiredMixin(AccessMixin): permission_required: Any def get_permission_required(self) -> Sequence[str]: ... def has_permission(self) -> bool: ... def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ... class UserPassesTestMixin(AccessMixin): def test_func(self) -> bool | None: ... def get_test_func(self) -> Callable[..., Any]: ... def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/models.pyi000066400000000000000000000157031526064357400260620ustar00rootroot00000000000000import datetime as dt from collections.abc import Iterable from typing import Any, ClassVar, Literal, Never, Self, TypeAlias from django.contrib.auth.base_user import AbstractBaseUser as AbstractBaseUser from django.contrib.auth.base_user import BaseUserManager as BaseUserManager from django.contrib.auth.validators import UnicodeUsernameValidator from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.models import QuerySet from django.db.models.base import Model from django.db.models.expressions import Combinable from django.db.models.manager import EmptyManager from django.utils.functional import _StrOrPromise from typing_extensions import TypeVar # This is our "placeholder" type the mypy plugin refines to configured 'AUTH_USER_MODEL' # wherever it is used as a type. The most recognised example of this is (probably) # `HttpRequest.user` _User: TypeAlias = AbstractBaseUser _UserModel: TypeAlias = type[_User] _AnyUser: TypeAlias = _User | AnonymousUser # These are only needed for generic classes in order to bind to a specific implementation _AnyUserType = TypeVar("_AnyUserType", bound=_AnyUser) # noqa: PYI018 # do not use the alias `_User` so the bound remains at `AbstractBaseUser` _UserType = TypeVar("_UserType", bound=AbstractBaseUser) def update_last_login(sender: _UserModel, user: _User, **kwargs: Any) -> None: ... class PermissionManager(models.Manager[Permission]): def get_by_natural_key(self, codename: str, app_label: str, model: str) -> Permission: ... class Permission(models.Model): content_type_id: int objects: ClassVar[PermissionManager] name: models.CharField[str | int | Combinable, str] content_type: models.ForeignKey[ContentType | Combinable, ContentType] codename: models.CharField[str | int | Combinable, str] @property def user_perm_str(self) -> str: ... def natural_key(self) -> tuple[str, str, str]: ... class GroupManager(models.Manager[Group]): def get_by_natural_key(self, name: str) -> Group: ... async def aget_by_natural_key(self, name: str) -> Group: ... class Group(models.Model): objects: ClassVar[GroupManager] name: models.CharField[str | int | Combinable, str] permissions = models.ManyToManyField(Permission) def natural_key(self) -> tuple[str]: ... class UserManager(BaseUserManager[_UserType]): def create_user( self, username: str, email: str | None = ..., password: str | None = ..., **extra_fields: Any ) -> _UserType: ... async def acreate_user( self, username: str, email: str | None = ..., password: str | None = ..., **extra_fields: Any ) -> _UserType: ... def create_superuser( self, username: str, email: str | None = ..., password: str | None = ..., **extra_fields: Any ) -> _UserType: ... async def acreate_superuser( self, username: str, email: str | None = ..., password: str | None = ..., **extra_fields: Any ) -> _UserType: ... def with_perm( self, perm: str | Permission, is_active: bool = ..., include_superusers: bool = ..., backend: str | None = ..., obj: Model | None = ..., ) -> QuerySet[_UserType]: ... class PermissionsMixin(models.Model): is_superuser: models.BooleanField[bool | Combinable, bool] groups = models.ManyToManyField(Group) user_permissions = models.ManyToManyField(Permission) class Meta: abstract: ClassVar[bool] def get_user_permissions(self, obj: Model | None = ...) -> set[str]: ... async def aget_user_permissions(self, obj: Model | None = ...) -> set[str]: ... def get_group_permissions(self, obj: Model | None = ...) -> set[str]: ... async def aget_group_permissions(self, obj: Model | None = ...) -> set[str]: ... def get_all_permissions(self, obj: Model | None = ...) -> set[str]: ... async def aget_all_permissions(self, obj: Model | None = ...) -> set[str]: ... def has_perm(self, perm: str, obj: Model | None = ...) -> bool: ... async def ahas_perm(self, perm: str, obj: Model | None = ...) -> bool: ... def has_perms(self, perm_list: Iterable[str], obj: Model | None = ...) -> bool: ... async def ahas_perms(self, perm_list: Iterable[str], obj: Model | None = ...) -> bool: ... def has_module_perms(self, app_label: str) -> bool: ... async def ahas_module_perms(self, app_label: str) -> bool: ... class AbstractUser(AbstractBaseUser, PermissionsMixin): username_validator: UnicodeUsernameValidator class Meta: abstract: ClassVar[bool] verbose_name: ClassVar[str] verbose_name_plural: ClassVar[str] username: models.CharField[str | int | Combinable, str] first_name: models.CharField[str | int | Combinable, str] last_name: models.CharField[str | int | Combinable, str] email: models.EmailField[str | Combinable, str] is_staff: models.BooleanField[bool | Combinable, bool] is_active: models.BooleanField[bool | Combinable, bool] date_joined: models.DateTimeField[str | dt.datetime | dt.date | Combinable, dt.datetime] objects: ClassVar[UserManager[Self]] EMAIL_FIELD: str USERNAME_FIELD: str def get_full_name(self) -> str: ... def get_short_name(self) -> str: ... def email_user( self, subject: _StrOrPromise, message: _StrOrPromise, from_email: str | None = ..., **kwargs: Any ) -> None: ... class User(AbstractUser): ... class AnonymousUser: id: None pk: None username: Literal[""] is_staff: Literal[False] is_active: Literal[False] is_superuser: Literal[False] def __int__(self) -> Never: ... def save(self) -> None: ... def delete(self) -> None: ... def set_password(self, raw_password: str | None) -> None: ... def check_password(self, raw_password: str | None) -> bool: ... @property def groups(self) -> EmptyManager[Group]: ... @property def user_permissions(self) -> EmptyManager[Permission]: ... def get_user_permissions(self, obj: Model | None = ...) -> set[str]: ... async def aget_user_permissions(self, obj: Model | None = ...) -> set[str]: ... def get_group_permissions(self, obj: Model | None = ...) -> set[Any]: ... async def aget_group_permissions(self, obj: Model | None = ...) -> set[Any]: ... def get_all_permissions(self, obj: Model | None = ...) -> set[str]: ... async def aget_all_permissions(self, obj: Model | None = ...) -> set[str]: ... def has_perm(self, perm: str, obj: Model | None = ...) -> bool: ... async def ahas_perm(self, perm: str, obj: Model | None = ...) -> bool: ... def has_perms(self, perm_list: Iterable[str], obj: Model | None = ...) -> bool: ... async def ahas_perms(self, perm_list: Iterable[str], obj: Model | None = ...) -> bool: ... def has_module_perms(self, module: str) -> bool: ... async def ahas_module_perms(self, module: str) -> bool: ... @property def is_anonymous(self) -> Literal[True]: ... @property def is_authenticated(self) -> Literal[False]: ... def get_username(self) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/password_validation.pyi000066400000000000000000000045101526064357400306450ustar00rootroot00000000000000from collections.abc import Mapping, Sequence from pathlib import Path, PosixPath from typing import Any, Protocol, type_check_only from django.contrib.auth.models import _User from django.utils.functional import cached_property @type_check_only class PasswordValidator(Protocol): def validate(self, password: str, user: _User | None = ..., /) -> None: ... def get_help_text(self) -> str: ... def get_default_password_validators() -> list[PasswordValidator]: ... def get_password_validators(validator_config: Sequence[Mapping[str, Any]]) -> list[PasswordValidator]: ... def validate_password( password: str, user: _User | None = ..., password_validators: Sequence[PasswordValidator] | None = ... ) -> None: ... def password_changed( password: str, user: _User | None = ..., password_validators: Sequence[PasswordValidator] | None = ... ) -> None: ... def password_validators_help_texts(password_validators: Sequence[PasswordValidator] | None = ...) -> list[str]: ... password_validators_help_text_html: Any class MinimumLengthValidator: min_length: int def __init__(self, min_length: int = ...) -> None: ... def validate(self, password: str, user: _User | None = ...) -> None: ... def get_help_text(self) -> str: ... def get_error_message(self) -> str: ... def exceeds_maximum_length_ratio(password: str, max_similarity: float, value: str) -> bool: ... class UserAttributeSimilarityValidator: DEFAULT_USER_ATTRIBUTES: Sequence[str] user_attributes: Sequence[str] max_similarity: float def __init__(self, user_attributes: Sequence[str] = ..., max_similarity: float = ...) -> None: ... def validate(self, password: str, user: _User | None = ...) -> None: ... def get_help_text(self) -> str: ... def get_error_message(self) -> str: ... class CommonPasswordValidator: @cached_property def DEFAULT_PASSWORD_LIST_PATH(self) -> Path: ... passwords: set[str] def __init__(self, password_list_path: Path | PosixPath | str = ...) -> None: ... def validate(self, password: str, user: _User | None = ...) -> None: ... def get_help_text(self) -> str: ... def get_error_message(self) -> str: ... class NumericPasswordValidator: def validate(self, password: str, user: _User | None = ...) -> None: ... def get_help_text(self) -> str: ... def get_error_message(self) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/signals.pyi000066400000000000000000000001701526064357400262270ustar00rootroot00000000000000from django.dispatch.dispatcher import Signal user_logged_in: Signal user_login_failed: Signal user_logged_out: Signal typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/templatetags/000077500000000000000000000000001526064357400265405ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/templatetags/__init__.pyi000066400000000000000000000000001526064357400310100ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/templatetags/auth.pyi000066400000000000000000000002511526064357400302220ustar00rootroot00000000000000from django.template import Library from django.utils.safestring import SafeString register: Library def render_password_as_hash(value: str | None) -> SafeString: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/tokens.pyi000066400000000000000000000012471526064357400261000ustar00rootroot00000000000000from datetime import date, datetime from django.contrib.auth.models import _User class PasswordResetTokenGenerator: key_salt: str secret: str | bytes secret_fallbacks: list[str | bytes] algorithm: str | None def make_token(self, user: _User) -> str: ... def check_token(self, user: _User | None, token: str | None) -> bool: ... def _make_token_with_timestamp(self, user: _User, timestamp: int, secret: str | bytes) -> str: ... def _make_hash_value(self, user: _User, timestamp: int) -> str: ... def _num_seconds(self, dt: datetime | date) -> int: ... def _now(self) -> datetime: ... default_token_generator: PasswordResetTokenGenerator typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/urls.pyi000066400000000000000000000000741526064357400255570ustar00rootroot00000000000000from django.urls import _AnyURL urlpatterns: list[_AnyURL] typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/validators.pyi000066400000000000000000000002311526064357400267350ustar00rootroot00000000000000from django.core.validators import RegexValidator class ASCIIUsernameValidator(RegexValidator): ... class UnicodeUsernameValidator(RegexValidator): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/auth/views.pyi000066400000000000000000000062541526064357400257350ustar00rootroot00000000000000from collections.abc import Mapping from typing import Any from django.contrib.auth.forms import AuthenticationForm, PasswordChangeForm, PasswordResetForm, SetPasswordForm from django.contrib.auth.models import _User, _UserModel from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseRedirect from django.utils.functional import _StrOrPromise from django.views.generic.base import TemplateView from django.views.generic.edit import FormView from typing_extensions import TypeVar, override UserModel = _UserModel _AuthForm = TypeVar("_AuthForm", bound=AuthenticationForm, default=AuthenticationForm) class RedirectURLMixin: next_page: str | None redirect_field_name: str success_url_allowed_hosts: set[str] def get_success_url(self) -> str: ... def get_redirect_url(self, request: HttpRequest | None = None) -> str: ... def get_success_url_allowed_hosts(self, request: HttpRequest | None = None) -> set[str]: ... def get_default_redirect_url(self) -> str: ... class LoginView(RedirectURLMixin, FormView[_AuthForm]): form_class: type[AuthenticationForm] # type: ignore[assignment] authentication_form: type[_AuthForm] | None redirect_field_name: str redirect_authenticated_user: bool extra_context: Mapping[str, Any] | None class LogoutView(RedirectURLMixin, TemplateView[HttpResponse]): next_page: str | None redirect_field_name: str extra_context: Mapping[str, Any] | None @override def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def logout_then_login(request: HttpRequest, login_url: str | None = ...) -> HttpResponseRedirect: ... def redirect_to_login( next: str, login_url: str | None = ..., redirect_field_name: str | None = ... ) -> HttpResponseRedirect: ... class PasswordContextMixin: extra_context: Mapping[str, Any] | None def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ... class PasswordResetView(PasswordContextMixin, FormView[PasswordResetForm]): email_template_name: str extra_email_context: Mapping[str, Any] | None form_class: type[PasswordResetForm] from_email: str | None html_email_template_name: str | None subject_template_name: str title: _StrOrPromise token_generator: Any INTERNAL_RESET_SESSION_TOKEN: str class PasswordResetDoneView(PasswordContextMixin, TemplateView): title: _StrOrPromise class PasswordResetConfirmView(PasswordContextMixin, FormView[SetPasswordForm[_User]]): form_class: type[SetPasswordForm[_User]] post_reset_login: bool post_reset_login_backend: str | None reset_url_token: str title: _StrOrPromise token_generator: Any validlink: bool user: _User | None def get_user(self, uidb64: str) -> _User | None: ... class PasswordResetCompleteView(PasswordContextMixin, TemplateView): title: _StrOrPromise class PasswordChangeView(PasswordContextMixin, FormView[PasswordChangeForm]): form_class: type[PasswordChangeForm] title: _StrOrPromise class PasswordChangeDoneView(PasswordContextMixin, TemplateView): title: _StrOrPromise typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/000077500000000000000000000000001526064357400256445ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/__init__.pyi000066400000000000000000000000001526064357400301140ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/admin.pyi000066400000000000000000000015441526064357400274630ustar00rootroot00000000000000from typing import Any from django.contrib.admin.checks import InlineModelAdminChecks from django.contrib.admin.options import InlineModelAdmin from django.contrib.contenttypes.forms import BaseGenericInlineFormSet from django.db.models.base import Model class GenericInlineModelAdminChecks(InlineModelAdminChecks): def _check_exclude_of_parent_model(self, obj: GenericInlineModelAdmin, parent_model: type[Model]) -> list[Any]: ... def _check_relation(self, obj: GenericInlineModelAdmin, parent_model: type[Model]) -> list[Any]: ... class GenericInlineModelAdmin(InlineModelAdmin[Any, Any]): ct_field: str ct_fk_field: str formset: type[BaseGenericInlineFormSet[Any, Any]] # type: ignore[assignment] class GenericStackedInline(GenericInlineModelAdmin): template: str class GenericTabularInline(GenericInlineModelAdmin): template: str typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/apps.pyi000066400000000000000000000001141526064357400273260ustar00rootroot00000000000000from django.apps import AppConfig class ContentTypesConfig(AppConfig): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/checks.pyi000066400000000000000000000007151526064357400276320ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage def check_generic_foreign_keys( app_configs: Sequence[AppConfig] | None, *, databases: Sequence[str] | None = ..., **kwargs: object ) -> list[CheckMessage]: ... def check_model_name_lengths( app_configs: Sequence[AppConfig] | None, *, databases: Sequence[str] | None = ..., **kwargs: object ) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/fields.pyi000066400000000000000000000122401526064357400276340ustar00rootroot00000000000000from collections.abc import Callable, Sequence from typing import Any, Self, overload from django.contrib.contenttypes.models import ContentType from django.core.checks.messages import CheckMessage from django.db.models.base import Model from django.db.models.expressions import Combinable from django.db.models.fields import Field, _AllLimitChoicesTo from django.db.models.fields.mixins import FieldCacheMixin from django.db.models.fields.related import ForeignObject from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor from django.db.models.fields.reverse_related import ForeignObjectRel from django.db.models.query import QuerySet from django.db.models.query_utils import FilteredRelation, PathInfo from django.db.models.sql.where import WhereNode from django.utils.functional import cached_property from typing_extensions import override class GenericForeignKey(FieldCacheMixin, Field[Any, Any]): # django-stubs implementation only fields _pyi_private_set_type: Any | Combinable _pyi_private_get_type: Any # attributes hidden: bool is_relation: bool many_to_many: bool many_to_one: bool one_to_many: bool one_to_one: bool related_model: Any ct_field: str fk_field: str for_concrete_model: bool column: None def __init__( self, ct_field: str = "content_type", fk_field: str = "object_id", for_concrete_model: bool = True ) -> None: ... # class access @overload @override def __get__(self, instance: None, owner: Any) -> GenericForeignKeyDescriptor: ... # Model instance access @overload @override def __get__(self, instance: Model, owner: Any) -> Any | None: ... # non-Model instances @overload @override def __get__(self, instance: Any, owner: Any) -> Self: ... name: Any model: Any @override def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override] @override def get_attname_column(self) -> tuple[str, None]: ... @cached_property def ct_field_attname(self) -> str: ... @override def get_filter_kwargs_for_object(self, obj: Model) -> dict[str, ContentType | None]: ... def get_forward_related_filter(self, obj: Model) -> dict[str, int]: ... @override def check(self, **kwargs: Any) -> list[CheckMessage]: ... def get_content_type( self, obj: Model | None = None, id: int | None = None, using: str | None = None, model: type[Model] | None = None, ) -> ContentType: ... class GenericForeignKeyDescriptor: field: GenericForeignKey def __init__(self, field: GenericForeignKey) -> None: ... def is_cached(self, instance: Model) -> bool: ... def get_prefetch_querysets( self, instances: Sequence[Model] | QuerySet[Any], querysets: Sequence[QuerySet[Any]] | None = None ) -> tuple[list[Model], Callable[..., Any], Callable[..., Any], bool, str, bool]: ... def __get__(self, instance: Model | None, cls: type[Model] | None = ...) -> Any | None: ... def fetch_one(self, instance: Model) -> None: ... def fetch_many(self, instances: Sequence[Model] | QuerySet[Any]) -> None: ... def __set__(self, instance: Model, value: Any | None) -> None: ... class GenericRel(ForeignObjectRel): field: GenericRelation def __init__( self, field: GenericRelation, to: type[Model] | str, related_name: str | None = None, related_query_name: str | None = None, limit_choices_to: _AllLimitChoicesTo | None = None, ) -> None: ... class GenericRelation(ForeignObject[Any, Any]): rel_class: type[GenericRel] mti_inherited: bool object_id_field_name: str content_type_field_name: str for_concrete_model: bool def __init__( self, to: type[Model] | str, object_id_field: str = "object_id", content_type_field: str = "content_type", for_concrete_model: bool = True, related_query_name: str | None = None, limit_choices_to: _AllLimitChoicesTo | None = None, **kwargs: Any, ) -> None: ... @override def resolve_related_fields(self) -> list[tuple[Field[Any, Any], Field[Any, Any]]]: ... @override def get_local_related_value(self, instance: Model) -> tuple[Any, ...]: ... @override def get_foreign_related_value(self, instance: Model) -> tuple[Any, ...]: ... @override def get_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ... @override def get_reverse_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ... @override def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override] def get_content_type(self) -> ContentType: ... @override def get_extra_restriction(self, alias: str | None, remote_alias: str) -> WhereNode: ... def bulk_related_objects(self, objs: list[Model], using: str = "default") -> QuerySet[Any]: ... class ReverseGenericManyToOneDescriptor(ReverseManyToOneDescriptor[Any]): ... def create_generic_related_manager(superclass: Any, rel: Any) -> type[Any]: ... # GenericRelatedObjectManager typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/forms.pyi000066400000000000000000000030741526064357400275210ustar00rootroot00000000000000from typing import Any from django.db.models import Model from django.forms.models import BaseModelFormSet, ModelForm from typing_extensions import TypeVar, override _M = TypeVar("_M", bound=Model) _ModelFormT = TypeVar("_ModelFormT", bound=ModelForm[Any], default=ModelForm[_M]) # ONLY use together with _M class BaseGenericInlineFormSet(BaseModelFormSet[_M, _ModelFormT]): instance: Any rel_name: Any save_as_new: Any def __init__( self, data: Any | None = ..., files: Any | None = ..., instance: Any | None = ..., save_as_new: bool = ..., prefix: Any | None = ..., queryset: Any | None = ..., **kwargs: Any, ) -> None: ... @override def initial_form_count(self) -> int: ... @classmethod @override def get_default_prefix(cls) -> str: ... @override def save_new(self, form: Any, commit: bool = ...) -> _M: ... def generic_inlineformset_factory( model: type[_M], form: type[_ModelFormT] = ..., formset: type[BaseGenericInlineFormSet[Any, Any]] = ..., ct_field: str = ..., fk_field: str = ..., fields: Any | None = ..., exclude: Any | None = ..., extra: int = ..., can_order: bool = ..., can_delete: bool = ..., max_num: Any | None = ..., formfield_callback: Any | None = ..., validate_max: bool = ..., for_concrete_model: bool = ..., min_num: Any | None = ..., validate_min: bool = ..., absolute_max: int | None = ..., can_delete_extra: bool = ..., ) -> type[BaseGenericInlineFormSet[_M, _ModelFormT]]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/management/000077500000000000000000000000001526064357400277605ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/management/__init__.pyi000066400000000000000000000020261526064357400322420ustar00rootroot00000000000000from typing import Any from django.apps.config import AppConfig from django.apps.registry import Apps from django.db import migrations from django.db.backends.sqlite3.schema import DatabaseSchemaEditor from django.db.migrations.migration import Migration from django.db.migrations.state import StateApps class RenameContentType(migrations.RunPython): app_label: str old_model: str new_model: str def __init__(self, app_label: str, old_model: str, new_model: str) -> None: ... def rename_forward(self, apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None: ... def rename_backward(self, apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None: ... def inject_rename_contenttypes_operations( plan: list[tuple[Migration, bool]] | None = None, apps: Apps = ..., using: str = "default", **kwargs: Any ) -> None: ... def create_contenttypes( app_config: AppConfig, verbosity: int = 2, interactive: bool = True, using: str = "default", apps: Apps = ..., **kwargs: Any, ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/management/commands/000077500000000000000000000000001526064357400315615ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/management/commands/__init__.pyi000066400000000000000000000000001526064357400340310ustar00rootroot00000000000000remove_stale_contenttypes.pyi000066400000000000000000000003131526064357400375260ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/management/commandsfrom typing import Any from django.core.management import BaseCommand from typing_extensions import override class Command(BaseCommand): @override def handle(self, **options: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/migrations/000077500000000000000000000000001526064357400300205ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/migrations/__init__.pyi000066400000000000000000000000001526064357400322700ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/models.pyi000066400000000000000000000024271526064357400276570ustar00rootroot00000000000000from typing import Any, ClassVar from django.db import models from django.db.models.base import Model from django.db.models.expressions import Combinable from django.db.models.query import QuerySet class ContentTypeManager(models.Manager[ContentType]): def __init__(self, *args: Any, **kwargs: Any) -> None: ... def get_by_natural_key(self, app_label: str, model: str) -> ContentType: ... def get_for_model(self, model: type[Model] | Model, for_concrete_model: bool = True) -> ContentType: ... def get_for_models(self, *models: Any, for_concrete_models: bool = True) -> dict[type[Model], ContentType]: ... def get_for_id(self, id: int) -> ContentType: ... def clear_cache(self) -> None: ... class ContentType(models.Model): id: int app_label: models.CharField[str | int | Combinable, str] model: models.CharField[str | int | Combinable, str] objects: ClassVar[ContentTypeManager] @property def name(self) -> str: ... @property def app_labeled_name(self) -> str: ... def model_class(self) -> type[Model] | None: ... def get_object_for_this_type(self, using: str | None = None, **kwargs: Any) -> Model: ... def get_all_objects_for_this_type(self, **kwargs: Any) -> QuerySet[Any]: ... def natural_key(self) -> tuple[str, str]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/prefetch.pyi000066400000000000000000000023351526064357400301720ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any, Generic from django.db.models import Model, Prefetch from django.db.models.query import QuerySet from typing_extensions import TypeVar, override # The type of the lookup passed to Prefetch(...) # This will be specialized to a `LiteralString` in the plugin for further processing and validation _LookupT = TypeVar("_LookupT", bound=str, covariant=True) # The type of the querysets passed to GenericPrefetch(...) _PrefetchedQuerySetsT = TypeVar( "_PrefetchedQuerySetsT", bound=Sequence[QuerySet[Model]], covariant=True, default=list[QuerySet[Model]] ) # The attribute name to store the prefetched list[_PrefetchedQuerySetT] # This will be specialized to a `LiteralString` in the plugin for further processing and validation _ToAttrT = TypeVar("_ToAttrT", bound=str, covariant=True, default=str) class GenericPrefetch(Prefetch[Any, Any, Any], Generic[_LookupT, _PrefetchedQuerySetsT, _ToAttrT]): def __init__(self, lookup: _LookupT, querysets: _PrefetchedQuerySetsT, to_attr: _ToAttrT | None = None) -> None: ... @override def __getstate__(self) -> dict[str, Any]: ... @override def get_current_querysets(self, level: int) -> _PrefetchedQuerySetsT | None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/contenttypes/views.pyi000066400000000000000000000003251526064357400275240ustar00rootroot00000000000000from django.http.request import HttpRequest from django.http.response import HttpResponseRedirect def shortcut(request: HttpRequest, content_type_id: int | str, object_id: int | str) -> HttpResponseRedirect: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/000077500000000000000000000000001526064357400250535ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/__init__.pyi000066400000000000000000000000001526064357400273230ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/admin.pyi000066400000000000000000000004531526064357400266700ustar00rootroot00000000000000from typing import Any, ClassVar from django.contrib import admin from django.contrib.flatpages.models import FlatPage class FlatPageAdmin(admin.ModelAdmin[FlatPage]): form: Any fieldsets: ClassVar[Any] list_display: Any list_filter: ClassVar[Any] search_fields: ClassVar[Any] typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/apps.pyi000066400000000000000000000002011526064357400265320ustar00rootroot00000000000000from typing import Any from django.apps import AppConfig class FlatPagesConfig(AppConfig): name: str verbose_name: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/forms.pyi000066400000000000000000000004511526064357400267240ustar00rootroot00000000000000from typing import Any, ClassVar from django import forms from django.contrib.flatpages.models import FlatPage class FlatpageForm(forms.ModelForm[FlatPage]): url: Any class Meta: model: ClassVar[type[FlatPage]] fields: ClassVar[str] def clean_url(self) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/middleware.pyi000066400000000000000000000004451526064357400277160ustar00rootroot00000000000000from django.http.request import HttpRequest from django.http.response import HttpResponse from django.utils.deprecation import MiddlewareMixin class FlatpageFallbackMiddleware(MiddlewareMixin): def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/migrations/000077500000000000000000000000001526064357400272275ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/migrations/__init__.pyi000066400000000000000000000000001526064357400314770ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/models.pyi000066400000000000000000000011411526064357400270560ustar00rootroot00000000000000from django.contrib.sites.models import Site from django.db import models from django.db.models.expressions import Combinable class FlatPage(models.Model): url: models.CharField[str | int | Combinable, str] title: models.CharField[str | int | Combinable, str] content: models.TextField[str | Combinable, str] enable_comments: models.BooleanField[bool | Combinable, bool] template_name: models.CharField[str | int | Combinable, str] registration_required: models.BooleanField[bool | Combinable, bool] sites = models.ManyToManyField(Site) def get_absolute_url(self) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/sitemaps.pyi000066400000000000000000000002201526064357400274150ustar00rootroot00000000000000from django.contrib.flatpages.models import FlatPage from django.contrib.sitemaps import Sitemap class FlatPageSitemap(Sitemap[FlatPage]): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/templatetags/000077500000000000000000000000001526064357400275455ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/templatetags/__init__.pyi000066400000000000000000000000001526064357400320150ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/templatetags/flatpages.pyi000066400000000000000000000010311526064357400322310ustar00rootroot00000000000000from typing import Any from django import template from django.template.base import Parser, Token from django.template.context import Context from typing_extensions import override register: Any class FlatpageNode(template.Node): context_name: str starts_with: None user: None def __init__(self, context_name: str, starts_with: str | None = ..., user: str | None = ...) -> None: ... @override def render(self, context: Context) -> str: ... def get_flatpages(parser: Parser, token: Token) -> FlatpageNode: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/urls.pyi000066400000000000000000000000741526064357400265640ustar00rootroot00000000000000from django.urls import _AnyURL urlpatterns: list[_AnyURL] typeddjango-django-stubs-fa03b48/django-stubs/contrib/flatpages/views.pyi000066400000000000000000000004651526064357400267400ustar00rootroot00000000000000from django.contrib.flatpages.models import FlatPage from django.http.request import HttpRequest from django.http.response import HttpResponse DEFAULT_TEMPLATE: str def flatpage(request: HttpRequest, url: str) -> HttpResponse: ... def render_flatpage(request: HttpRequest, f: FlatPage) -> HttpResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/000077500000000000000000000000001526064357400236675ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/__init__.pyi000066400000000000000000000000001526064357400261370ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/admin/000077500000000000000000000000001526064357400247575ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/admin/__init__.pyi000066400000000000000000000016261526064357400272460ustar00rootroot00000000000000from django.contrib.admin import HORIZONTAL as HORIZONTAL from django.contrib.admin import VERTICAL as VERTICAL from django.contrib.admin import AdminSite as AdminSite from django.contrib.admin import ModelAdmin as ModelAdmin from django.contrib.admin import StackedInline as StackedInline from django.contrib.admin import TabularInline as TabularInline from django.contrib.admin import action as action from django.contrib.admin import autodiscover as autodiscover from django.contrib.admin import display as display from django.contrib.admin import register as register from django.contrib.admin import site as site from django.contrib.gis.admin.options import GISModelAdmin as GISModelAdmin __all__ = [ "HORIZONTAL", "VERTICAL", "AdminSite", "GISModelAdmin", "ModelAdmin", "StackedInline", "TabularInline", "action", "autodiscover", "display", "register", "site", ] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/admin/options.pyi000066400000000000000000000012371526064357400272000ustar00rootroot00000000000000from typing import Any from django.contrib.admin import ModelAdmin from django.contrib.gis.forms import OSMWidget from django.db.models import Model from django.db.models.fields import Field from django.forms.fields import Field as FormField from django.http.request import HttpRequest from typing_extensions import TypeVar _ModelT = TypeVar("_ModelT", bound=Model) class GeoModelAdminMixin: gis_widget: type[OSMWidget] gis_widget_kwargs: dict[str, Any] def formfield_for_dbfield( self, db_field: Field[Any, Any], request: HttpRequest, **kwargs: Any ) -> FormField | None: ... class GISModelAdmin(GeoModelAdminMixin, ModelAdmin[_ModelT]): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/apps.pyi000066400000000000000000000001031526064357400253470ustar00rootroot00000000000000from django.apps import AppConfig class GISConfig(AppConfig): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/000077500000000000000000000000001526064357400242545ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/__init__.pyi000066400000000000000000000000001526064357400265240ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/000077500000000000000000000000001526064357400260265ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/__init__.pyi000066400000000000000000000000001526064357400302760ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/base/000077500000000000000000000000001526064357400267405ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/base/__init__.pyi000066400000000000000000000000001526064357400312100ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/base/adapter.pyi000066400000000000000000000004141526064357400311020ustar00rootroot00000000000000from typing import Any from typing_extensions import override class WKTAdapter: wkt: Any srid: Any def __init__(self, geom: Any) -> None: ... @override def __eq__(self, other: object) -> bool: ... @override def __hash__(self) -> int: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/base/features.pyi000066400000000000000000000025601526064357400313040ustar00rootroot00000000000000from typing import Any class BaseSpatialFeatures: gis_enabled: bool has_spatialrefsys_table: bool supports_add_srs_entry: bool supports_geometry_field_introspection: bool supports_geography: bool supports_3d_storage: bool supports_3d_functions: bool supports_transform: bool supports_null_geometries: bool supports_empty_geometries: bool supports_distance_geodetic: bool supports_length_geodetic: bool supports_perimeter_geodetic: bool supports_area_geodetic: bool supports_num_points_poly: bool supports_dwithin_distance_expr: bool supports_raster: bool supports_geometry_field_unique_index: bool can_alter_geometry_field: bool supports_tolerance_parameter: bool unsupported_geojson_options: set[str] empty_intersection_returns_none: bool @property def supports_crosses_lookup(self) -> bool: ... @property def supports_distances_lookups(self) -> bool: ... @property def supports_relate_lookup(self) -> bool: ... @property def supports_isvalid_lookup(self) -> bool: ... @property def supports_collect_aggr(self) -> bool: ... @property def supports_extent_aggr(self) -> bool: ... @property def supports_make_line_aggr(self) -> bool: ... @property def supports_union_aggr(self) -> bool: ... def __getattr__(self, name: Any) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/base/models.pyi000066400000000000000000000015041526064357400307460ustar00rootroot00000000000000from typing import Any class SpatialRefSysMixin: @property def srs(self) -> Any: ... @property def ellipsoid(self) -> Any: ... @property def name(self) -> Any: ... @property def spheroid(self) -> Any: ... @property def datum(self) -> Any: ... @property def projected(self) -> Any: ... @property def local(self) -> Any: ... @property def geographic(self) -> Any: ... @property def linear_name(self) -> Any: ... @property def linear_units(self) -> Any: ... @property def angular_name(self) -> Any: ... @property def angular_units(self) -> Any: ... @property def units(self) -> Any: ... @classmethod def get_units(cls, wkt: Any) -> Any: ... @classmethod def get_spheroid(cls, wkt: Any, string: bool = ...) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/base/operations.pyi000066400000000000000000000026531526064357400316540ustar00rootroot00000000000000from typing import Any from django.db.models.sql.compiler import _AsSqlType from django.utils.functional import cached_property class BaseSpatialOperations: postgis: bool spatialite: bool mariadb: bool mysql: bool oracle: bool spatial_version: Any select: str @cached_property def select_extent(self) -> str: ... disallowed_aggregates: Any geom_func_prefix: str function_names: Any unsupported_functions: set[str] from_text: bool def convert_extent(self, box: Any, srid: Any) -> Any: ... def convert_extent3d(self, box: Any, srid: Any) -> Any: ... def geo_quote_name(self, name: Any) -> Any: ... def geo_db_type(self, f: Any) -> Any: ... def get_distance(self, f: Any, value: Any, lookup_type: Any) -> Any: ... def get_geom_placeholder_sql(self, f: Any, value: Any, compiler: Any) -> _AsSqlType: ... def check_expression_support(self, expression: Any) -> None: ... def spatial_aggregate_name(self, agg_name: Any) -> Any: ... def spatial_function_name(self, func_name: Any) -> Any: ... def geometry_columns(self) -> Any: ... def spatial_ref_sys(self) -> Any: ... distance_expr_for_lookup: Any def get_db_converters(self, expression: Any) -> Any: ... def get_geometry_converter(self, expression: Any) -> Any: ... def get_area_att_for_field(self, field: Any) -> Any: ... def get_distance_att_for_field(self, field: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/000077500000000000000000000000001526064357400271735ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/__init__.pyi000066400000000000000000000000001526064357400314430ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/base.pyi000066400000000000000000000003731526064357400306330ustar00rootroot00000000000000from typing import Any from django.db.backends.mysql.base import DatabaseWrapper as MySQLDatabaseWrapper class DatabaseWrapper(MySQLDatabaseWrapper): SchemaEditorClass: Any features_class: Any introspection_class: Any ops_class: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/features.pyi000066400000000000000000000013211526064357400315310ustar00rootroot00000000000000from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures from django.db.backends.mysql.features import DatabaseFeatures as MySQLDatabaseFeatures from django.utils.functional import cached_property from typing_extensions import override class DatabaseFeatures(BaseSpatialFeatures, MySQLDatabaseFeatures): has_spatialrefsys_table: bool supports_add_srs_entry: bool supports_distance_geodetic: bool supports_length_geodetic: bool supports_area_geodetic: bool supports_transform: bool supports_null_geometries: bool supports_num_points_poly: bool @cached_property @override def supports_geometry_field_unique_index(self) -> bool: ... # type: ignore[override] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/introspection.pyi000066400000000000000000000005151526064357400326170ustar00rootroot00000000000000from typing import Any from django.db.backends.mysql.introspection import DatabaseIntrospection class MySQLIntrospection(DatabaseIntrospection): data_types_reverse: Any def get_geometry_type(self, table_name: Any, description: Any) -> Any: ... def supports_spatial_index(self, cursor: Any, table_name: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/operations.pyi000066400000000000000000000027341526064357400321070ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations from django.contrib.gis.db.backends.utils import SpatialOperator from django.contrib.gis.geos.geometry import GEOSGeometryBase from django.db.backends.mysql.operations import DatabaseOperations from django.utils.functional import cached_property from typing_extensions import override class MySQLOperations(BaseSpatialOperations, DatabaseOperations): name: str geom_func_prefix: str Adapter: Any @cached_property @override def mariadb(self) -> bool: ... # type: ignore[override] @cached_property @override def mysql(self) -> bool: ... # type: ignore[override] @cached_property @override def select(self) -> str: ... # type: ignore[override] @cached_property @override def from_text(self) -> str: ... # type: ignore[override] @cached_property def collect(self) -> str: ... @cached_property def gis_operators(self) -> dict[str, SpatialOperator]: ... disallowed_aggregates: Any @cached_property @override def unsupported_functions(self) -> set[str]: ... # type: ignore[override] @override def geo_db_type(self, f: Any) -> Any: ... @override def get_distance(self, f: Any, value: Any, lookup_type: Any) -> list[Any]: ... @override def get_geometry_converter(self, expression: Any) -> Callable[[Any, Any, Any], GEOSGeometryBase | None]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/mysql/schema.pyi000066400000000000000000000015301526064357400311550ustar00rootroot00000000000000from logging import Logger from typing import Any from django.db.backends.mysql.schema import DatabaseSchemaEditor from django.db.models.base import Model from django.db.models.fields import Field from typing_extensions import override logger: Logger class MySQLGISSchemaEditor(DatabaseSchemaEditor): sql_add_spatial_index: str @override def skip_default(self, field: Field[Any, Any]) -> bool: ... @override def column_sql( self, model: type[Model], field: Field[Any, Any], include_default: bool = ... ) -> tuple[None, None] | tuple[str, list[Any]]: ... @override def create_model(self, model: type[Model]) -> None: ... @override def add_field(self, model: type[Model], field: Field[Any, Any]) -> None: ... @override def remove_field(self, model: type[Model], field: Field[Any, Any]) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/000077500000000000000000000000001526064357400272735ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/__init__.pyi000066400000000000000000000000001526064357400315430ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/adapter.pyi000066400000000000000000000003421526064357400314350ustar00rootroot00000000000000from typing import Any from django.contrib.gis.db.backends.base.adapter import WKTAdapter class OracleSpatialAdapter(WKTAdapter): input_size: Any wkt: Any srid: Any def __init__(self, geom: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/base.pyi000066400000000000000000000003761526064357400307360ustar00rootroot00000000000000from typing import Any from django.db.backends.oracle.base import DatabaseWrapper as OracleDatabaseWrapper class DatabaseWrapper(OracleDatabaseWrapper): SchemaEditorClass: Any features_class: Any introspection_class: Any ops_class: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/features.pyi000066400000000000000000000012701526064357400316340ustar00rootroot00000000000000from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures from django.db.backends.oracle.features import DatabaseFeatures as OracleDatabaseFeatures from django.utils.functional import cached_property from typing_extensions import override class DatabaseFeatures(BaseSpatialFeatures, OracleDatabaseFeatures): supports_add_srs_entry: bool supports_geometry_field_introspection: bool supports_geometry_field_unique_index: bool supports_perimeter_geodetic: bool supports_dwithin_distance_expr: bool supports_tolerance_parameter: bool @cached_property @override def django_test_skips(self) -> dict[str, set[str]]: ... # type: ignore[override] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/introspection.pyi000066400000000000000000000006461526064357400327240ustar00rootroot00000000000000from functools import cached_property from typing import Any from django.db.backends.oracle.introspection import DatabaseIntrospection from typing_extensions import override class OracleIntrospection(DatabaseIntrospection): @cached_property @override def data_types_reverse(self) -> dict[int, str]: ... # type: ignore[override] def get_geometry_type(self, table_name: Any, description: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/models.pyi000066400000000000000000000012721526064357400313030ustar00rootroot00000000000000from typing import Any, ClassVar, Self from django.contrib.gis.db import models from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin from django.db.models.manager import Manager class OracleGeometryColumns(models.Model): table_name: Any column_name: Any srid: Any objects: ClassVar[Manager[Self]] @classmethod def table_name_col(cls) -> Any: ... @classmethod def geom_col_name(cls) -> Any: ... class OracleSpatialRefSys(models.Model, SpatialRefSysMixin): cs_name: Any srid: Any auth_srid: Any auth_name: Any wktext: Any cs_bounds: Any objects: ClassVar[Manager[Self]] @property def wkt(self) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/operations.pyi000066400000000000000000000035031526064357400322020ustar00rootroot00000000000000from typing import Any from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations from django.contrib.gis.db.backends.utils import SpatialOperator from django.db.backends.oracle.operations import DatabaseOperations from django.db.models.sql.compiler import _AsSqlType from typing_extensions import override DEFAULT_TOLERANCE: str class SDOOperator(SpatialOperator): sql_template: str class SDODWithin(SpatialOperator): sql_template: str class SDODisjoint(SpatialOperator): sql_template: Any class SDORelate(SpatialOperator): sql_template: str def check_relate_argument(self, arg: Any) -> None: ... class OracleOperations(BaseSpatialOperations, DatabaseOperations): name: str oracle: bool disallowed_aggregates: Any Adapter: Any extent: str unionagg: str from_text: str # type: ignore[assignment] function_names: Any select: str gis_operators: Any unsupported_functions: Any @override def geo_quote_name(self, name: Any) -> Any: ... @override def convert_extent(self, clob: Any) -> tuple[float, float, float, float] | None: ... # type: ignore[override] @override def geo_db_type(self, f: Any) -> Any: ... @override def get_distance(self, f: Any, value: Any, lookup_type: Any) -> Any: ... @override def get_geom_placeholder_sql(self, f: Any, value: Any, compiler: Any) -> _AsSqlType: ... @override def spatial_aggregate_name(self, agg_name: Any) -> Any: ... @override def geometry_columns(self) -> Any: ... @override def spatial_ref_sys(self) -> Any: ... @override def modify_insert_params(self, placeholder: Any, params: Any) -> Any: ... @override def get_geometry_converter(self, expression: Any) -> Any: ... @override def get_area_att_for_field(self, field: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/oracle/schema.pyi000066400000000000000000000021311526064357400312530ustar00rootroot00000000000000from typing import Any from django.db.backends.oracle.schema import DatabaseSchemaEditor from django.db.models.base import Model from django.db.models.fields import Field from typing_extensions import override class OracleGISSchemaEditor(DatabaseSchemaEditor): sql_add_geometry_metadata: str sql_add_spatial_index: str sql_clear_geometry_table_metadata: str sql_clear_geometry_field_metadata: str geometry_sql: Any def __init__(self, *args: Any, **kwargs: Any) -> None: ... def geo_quote_name(self, name: Any) -> Any: ... @override def column_sql( self, model: type[Model], field: Field[Any, Any], include_default: bool = ... ) -> tuple[None, None] | tuple[str, list[Any]]: ... @override def create_model(self, model: type[Model]) -> None: ... @override def delete_model(self, model: type[Model]) -> None: ... @override def add_field(self, model: type[Model], field: Field[Any, Any]) -> None: ... @override def remove_field(self, model: type[Model], field: Field[Any, Any]) -> None: ... def run_geometry_sql(self) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/000077500000000000000000000000001526064357400275165ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/__init__.pyi000066400000000000000000000000001526064357400317660ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/adapter.pyi000066400000000000000000000006451526064357400316660ustar00rootroot00000000000000from typing import Any from typing_extensions import override class PostGISAdapter: is_geometry: Any ewkb: Any srid: Any geography: Any def __init__(self, obj: Any, geography: bool = ...) -> None: ... def __conform__(self, proto: Any) -> Any: ... @override def __eq__(self, other: object) -> bool: ... @override def __hash__(self) -> int: ... def getquoted(self) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/base.pyi000066400000000000000000000022331526064357400311530ustar00rootroot00000000000000from typing import Any from django.db.backends.postgresql.base import DatabaseWrapper as Psycopg2DatabaseWrapper from psycopg import BaseConnection from psycopg.adapt import Dumper from psycopg.pq import Format from typing_extensions import override class BaseBinaryDumper(Dumper): format: Format @override def dump(self, obj: Any) -> bytes: ... class BaseTextDumper(Dumper): @override def dump(self, obj: Any) -> bytes: ... class DatabaseWrapper(Psycopg2DatabaseWrapper): SchemaEditorClass: Any features: Any ops: Any introspection: Any def __init__(self, *args: Any, **kwargs: Any) -> None: ... @override def prepare_database(self) -> None: ... def register_geometry_adapters(self, pg_connection: BaseConnection[bytes], clear_caches: bool = False) -> None: ... class GeometryType: ... class GeographyType: ... class RasterType: ... # Uses @functools.lru_cache, but that would prevent typechecking arguments. # typeshed issue: https://github.com/python/typeshed/issues/11280 def postgis_adapters( geo_oid: int | None, geog_oid: int | None, raster_oid: int | None, ) -> tuple[type[Dumper], type[Dumper]]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/const.pyi000066400000000000000000000002751526064357400313730ustar00rootroot00000000000000from typing import Any GDAL_TO_POSTGIS: Any POSTGIS_TO_GDAL: Any POSTGIS_HEADER_STRUCTURE: str GDAL_TO_STRUCT: Any STRUCT_SIZE: Any BANDTYPE_PIXTYPE_MASK: int BANDTYPE_FLAG_HASNODATA: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/features.pyi000066400000000000000000000005611526064357400320610ustar00rootroot00000000000000from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures from django.db.backends.postgresql.features import DatabaseFeatures as Psycopg2DatabaseFeatures class DatabaseFeatures(BaseSpatialFeatures, Psycopg2DatabaseFeatures): supports_3d_storage: bool supports_3d_functions: bool supports_raster: bool supports_empty_geometries: bool typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/introspection.pyi000066400000000000000000000006351526064357400331450ustar00rootroot00000000000000from typing import Any from django.db.backends.postgresql.introspection import DatabaseIntrospection from typing_extensions import override class PostGISIntrospection(DatabaseIntrospection): postgis_oid_lookup: Any ignored_tables: Any @override def get_field_type(self, data_type: Any, description: Any) -> Any: ... def get_geometry_type(self, table_name: Any, description: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/models.pyi000066400000000000000000000013401526064357400315220ustar00rootroot00000000000000from typing import Any, ClassVar, Self from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin from django.db import models class PostGISGeometryColumns(models.Model): f_table_catalog: Any f_table_schema: Any f_table_name: Any f_geometry_column: Any coord_dimension: Any srid: Any type: Any objects: ClassVar[models.Manager[Self]] @classmethod def table_name_col(cls) -> Any: ... @classmethod def geom_col_name(cls) -> Any: ... class PostGISSpatialRefSys(models.Model, SpatialRefSysMixin): srid: Any auth_name: Any auth_srid: Any srtext: Any proj4text: Any objects: ClassVar[models.Manager[Self]] @property def wkt(self) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/operations.pyi000066400000000000000000000060731526064357400324320ustar00rootroot00000000000000from collections.abc import MutableMapping from typing import Any, Literal from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations from django.contrib.gis.db.backends.utils import SpatialOperator from django.contrib.gis.db.models.fields import GeometryField from django.contrib.gis.db.models.lookups import GISLookup from django.db.backends.postgresql.operations import DatabaseOperations from django.db.models import Func from django.db.models.sql.compiler import _AsSqlType from django.utils.functional import cached_property from typing_extensions import override BILATERAL: Literal["bilateral"] class PostGISOperator(SpatialOperator): geography: Any raster: bool | Literal["bilateral"] def __init__(self, geography: bool = False, raster: bool | Literal["bilateral"] = False, **kwargs: Any) -> None: ... def check_raster(self, lookup: Any, template_params: Any) -> Any: ... def check_geography( self, lookup: GISLookup, template_params: MutableMapping[str, Any], ) -> MutableMapping[str, Any]: ... class ST_Polygon(Func): function: str def __init__(self, expr: Any) -> None: ... @cached_property @override def output_field(self) -> GeometryField[Any, Any]: ... class PostGISOperations(BaseSpatialOperations, DatabaseOperations): name: str postgis: bool geom_func_prefix: str Adapter: Any collect: Any extent: Any extent3d: Any length3d: Any makeline: Any perimeter3d: Any unionagg: Any gis_operators: Any unsupported_functions: Any select: str select_extent: Any @cached_property @override def function_names(self) -> Any: ... @cached_property @override def spatial_version(self) -> Any: ... @override def convert_extent(self, box: Any) -> tuple[float, float, float, float] | None: ... # type: ignore[override] @override def convert_extent3d(self, box3d: Any) -> tuple[float, float, float, float, float, float] | None: ... # type: ignore[override] @override def geo_db_type(self, f: Any) -> Any: ... @override def get_distance(self, f: Any, dist_val: Any, lookup_type: Any) -> Any: ... @override def get_geom_placeholder_sql(self, f: Any, value: Any, compiler: Any) -> _AsSqlType: ... def postgis_geos_version(self) -> Any: ... def postgis_lib_version(self) -> Any: ... def postgis_proj_version(self) -> Any: ... def postgis_version(self) -> Any: ... def postgis_full_version(self) -> Any: ... def postgis_version_tuple(self) -> Any: ... def proj_version_tuple(self) -> Any: ... @override def spatial_aggregate_name(self, agg_name: Any) -> Any: ... @override def geometry_columns(self) -> Any: ... @override def spatial_ref_sys(self) -> Any: ... def parse_raster(self, value: Any) -> Any: ... @override def distance_expr_for_lookup(self, lhs: Any, rhs: Any, **kwargs: Any) -> Any: ... @override def get_geometry_converter(self, expression: Any) -> Any: ... @override def get_area_att_for_field(self, field: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/pgraster.pyi000066400000000000000000000003671526064357400320760ustar00rootroot00000000000000from typing import Any def pack(structure: Any, data: Any) -> Any: ... def unpack(structure: Any, data: Any) -> Any: ... def chunk(data: Any, index: Any) -> Any: ... def from_pgraster(data: Any) -> Any: ... def to_pgraster(rast: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/postgis/schema.pyi000066400000000000000000000005251526064357400315030ustar00rootroot00000000000000from typing import Any from django.db.backends.postgresql.schema import DatabaseSchemaEditor class PostGISSchemaEditor(DatabaseSchemaEditor): geom_index_type: str geom_index_ops_nd: str rast_index_template: str sql_alter_column_to_3d: str sql_alter_column_to_2d: str def geo_quote_name(self, name: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/000077500000000000000000000000001526064357400301655ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/__init__.pyi000066400000000000000000000000001526064357400324350ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/adapter.pyi000066400000000000000000000002661526064357400323340ustar00rootroot00000000000000from typing import Any from django.contrib.gis.db.backends.base.adapter import WKTAdapter class SpatiaLiteAdapter(WKTAdapter): def __conform__(self, protocol: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/base.pyi000066400000000000000000000016061526064357400316250ustar00rootroot00000000000000from typing import Any from django.db.backends.sqlite3.base import DatabaseWrapper as SQLiteDatabaseWrapper from typing_extensions import override from .client import SpatiaLiteClient from .features import DatabaseFeatures from .introspection import SpatiaLiteIntrospection from .operations import SpatiaLiteOperations from .schema import SpatialiteSchemaEditor class DatabaseWrapper(SQLiteDatabaseWrapper): SchemaEditorClass: type[SpatialiteSchemaEditor] client_class: type[SpatiaLiteClient] features_class: type[DatabaseFeatures] introspection_class: type[SpatiaLiteIntrospection] ops_class: type[SpatiaLiteOperations] lib_spatialite_paths: str ops: SpatiaLiteOperations def __init__(self, *args: Any, **kwargs: Any) -> None: ... @override def get_new_connection(self, conn_params: Any) -> Any: ... @override def prepare_database(self) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/client.pyi000066400000000000000000000001771526064357400321730ustar00rootroot00000000000000from django.db.backends.sqlite3.client import DatabaseClient class SpatiaLiteClient(DatabaseClient): executable_name: str typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/features.pyi000066400000000000000000000007261526064357400325330ustar00rootroot00000000000000from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures from django.db.backends.sqlite3.features import DatabaseFeatures as SQLiteDatabaseFeatures from django.utils.functional import cached_property from typing_extensions import override class DatabaseFeatures(BaseSpatialFeatures, SQLiteDatabaseFeatures): supports_3d_storage: bool @cached_property @override def supports_area_geodetic(self) -> bool: ... # type: ignore[override] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/introspection.pyi000066400000000000000000000007701526064357400336140ustar00rootroot00000000000000from typing import Any from django.db.backends.sqlite3.introspection import DatabaseIntrospection, FlexibleFieldLookupDict from typing_extensions import override class GeoFlexibleFieldLookupDict(FlexibleFieldLookupDict): base_data_types_reverse: Any class SpatiaLiteIntrospection(DatabaseIntrospection): data_types_reverse: Any def get_geometry_type(self, table_name: Any, description: Any) -> Any: ... @override def get_constraints(self, cursor: Any, table_name: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/models.pyi000066400000000000000000000013521526064357400321740ustar00rootroot00000000000000from typing import Any, ClassVar, Self from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin from django.db import models class SpatialiteGeometryColumns(models.Model): f_table_name: Any f_geometry_column: Any coord_dimension: Any srid: Any spatial_index_enabled: Any type: Any objects: ClassVar[models.Manager[Self]] @classmethod def table_name_col(cls) -> Any: ... @classmethod def geom_col_name(cls) -> Any: ... class SpatialiteSpatialRefSys(models.Model, SpatialRefSysMixin): srid: Any auth_name: Any auth_srid: Any ref_sys_name: Any proj4text: Any srtext: Any objects: ClassVar[models.Manager[Self]] @property def wkt(self) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/operations.pyi000066400000000000000000000033601526064357400330750ustar00rootroot00000000000000from typing import Any from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations from django.contrib.gis.db.backends.utils import SpatialOperator from django.db.backends.sqlite3.operations import DatabaseOperations from django.utils.functional import cached_property from typing_extensions import override class SpatialiteNullCheckOperator(SpatialOperator): ... class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations): name: str spatialite: bool from_text: str # type: ignore[assignment] Adapter: Any collect: str extent: str makeline: str unionagg: str gis_operators: Any disallowed_aggregates: Any select: str function_names: Any @cached_property @override def unsupported_functions(self) -> set[str]: ... # type: ignore[override] @cached_property @override def spatial_version(self) -> Any: ... @override def convert_extent(self, box: Any) -> tuple[float, float, float, float] | None: ... # type: ignore[override] @override def geo_db_type(self, f: Any) -> None: ... @override def get_distance(self, f: Any, value: Any, lookup_type: Any) -> Any: ... def geos_version(self) -> Any: ... def proj_version(self) -> Any: ... def lwgeom_version(self) -> Any: ... def rttopo_version(self) -> str | None: ... def geom_lib_version(self) -> str | None: ... def spatialite_version(self) -> Any: ... def spatialite_version_tuple(self) -> Any: ... @override def spatial_aggregate_name(self, agg_name: Any) -> Any: ... @override def geometry_columns(self) -> Any: ... @override def spatial_ref_sys(self) -> Any: ... @override def get_geometry_converter(self, expression: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/spatialite/schema.pyi000066400000000000000000000027141526064357400321540ustar00rootroot00000000000000from typing import Any from django.db.backends.sqlite3.schema import DatabaseSchemaEditor from django.db.models.base import Model from django.db.models.fields import Field from typing_extensions import override class SpatialiteSchemaEditor(DatabaseSchemaEditor): sql_add_geometry_column: str sql_add_spatial_index: str sql_drop_spatial_index: str sql_recover_geometry_metadata: str sql_remove_geometry_metadata: str sql_discard_geometry_columns: str sql_update_geometry_columns: str geometry_tables: Any geometry_sql: Any def __init__(self, *args: Any, **kwargs: Any) -> None: ... def geo_quote_name(self, name: Any) -> Any: ... @override def column_sql( self, model: type[Model], field: Field[Any, Any], include_default: bool = False ) -> tuple[None, None] | tuple[str, list[Any]]: ... def remove_geometry_metadata(self, model: type[Model], field: Field[Any, Any]) -> None: ... @override def create_model(self, model: type[Model]) -> None: ... @override def delete_model(self, model: type[Model], **kwargs: Any) -> None: ... # type: ignore[override] @override def add_field(self, model: type[Model], field: Field[Any, Any]) -> None: ... @override def remove_field(self, model: type[Model], field: Field[Any, Any]) -> None: ... @override def alter_db_table( self, model: type[Model], old_db_table: str, new_db_table: str, ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/backends/utils.pyi000066400000000000000000000012401526064357400277060ustar00rootroot00000000000000from collections.abc import MutableMapping, Sequence from typing import Any from django.contrib.gis.db.models.lookups import GISLookup from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.sql.compiler import _AsSqlType class SpatialOperator: sql_template: Any op: Any func: Any def __init__(self, op: Any | None = None, func: Any | None = None) -> None: ... @property def default_template(self) -> Any: ... def as_sql( self, connection: BaseDatabaseWrapper, lookup: GISLookup, template_params: MutableMapping[str, Any], sql_params: Sequence[Any], ) -> _AsSqlType: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/000077500000000000000000000000001526064357400255375ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/__init__.pyi000066400000000000000000000067471526064357400300370ustar00rootroot00000000000000from django.contrib.gis.db.models.aggregates import Collect as Collect from django.contrib.gis.db.models.aggregates import Extent as Extent from django.contrib.gis.db.models.aggregates import Extent3D as Extent3D from django.contrib.gis.db.models.aggregates import MakeLine as MakeLine from django.contrib.gis.db.models.aggregates import Union as Union from django.contrib.gis.db.models.fields import GeometryCollectionField as GeometryCollectionField from django.contrib.gis.db.models.fields import GeometryField as GeometryField from django.contrib.gis.db.models.fields import LineStringField as LineStringField from django.contrib.gis.db.models.fields import MultiLineStringField as MultiLineStringField from django.contrib.gis.db.models.fields import MultiPointField as MultiPointField from django.contrib.gis.db.models.fields import MultiPolygonField as MultiPolygonField from django.contrib.gis.db.models.fields import PointField as PointField from django.contrib.gis.db.models.fields import PolygonField as PolygonField from django.contrib.gis.db.models.fields import RasterField as RasterField from django.db.models import * __all__ = [ "BLANK_CHOICE_DASH", "BLANK_CHOICE_LABEL", "CASCADE", "DB_CASCADE", "DB_SET_DEFAULT", "DB_SET_NULL", "DEFERRED", "DO_NOTHING", "FETCH_ONE", "FETCH_PEERS", "FETCH_RAISE", "NOT_PROVIDED", "PROTECT", "RESTRICT", "SET", "SET_DEFAULT", "SET_NULL", "Aggregate", "AnyValue", "AutoField", "Avg", "BaseConstraint", "BigAutoField", "BigIntegerField", "BinaryField", "BitAnd", "BitOr", "BitXor", "BooleanField", "Case", "CharField", "CheckConstraint", "Choices", "Collect", "CommaSeparatedIntegerField", "CompositePrimaryKey", "Count", "DateField", "DateTimeField", "DecimalField", "Deferrable", "DurationField", "EmailField", "Empty", "Exists", "Expression", "ExpressionList", "ExpressionWrapper", "Extent", "Extent3D", "F", "Field", "FileField", "FilePathField", "FilteredRelation", "FloatField", "ForeignKey", "ForeignObject", "ForeignObjectRel", "Func", "GeneratedField", "GenericIPAddressField", "GeometryCollectionField", "GeometryField", "IPAddressField", "ImageField", "Index", "IntegerChoices", "IntegerField", "JSONField", "JSONNull", "LineStringField", "Lookup", "MakeLine", "Manager", "ManyToManyField", "ManyToManyRel", "ManyToOneRel", "Max", "Min", "Model", "MultiLineStringField", "MultiPointField", "MultiPolygonField", "NullBooleanField", "ObjectDoesNotExist", "OneToOneField", "OneToOneRel", "OrderBy", "OrderWrt", "OuterRef", "PointField", "PolygonField", "PositiveBigIntegerField", "PositiveIntegerField", "PositiveSmallIntegerField", "Prefetch", "ProtectedError", "Q", "QuerySet", "RasterField", "RestrictedError", "RowRange", "SlugField", "SmallAutoField", "SmallIntegerField", "StdDev", "StringAgg", "Subquery", "Sum", "TextChoices", "TextField", "TimeField", "Transform", "URLField", "UUIDField", "Union", "UniqueConstraint", "Value", "ValueRange", "Variance", "When", "Window", "WindowFrame", "WindowFrameExclusion", "aprefetch_related_objects", "prefetch_related_objects", "signals", ] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/aggregates.pyi000066400000000000000000000021761526064357400304010ustar00rootroot00000000000000from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Aggregate from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override __all__ = ["Collect", "Extent", "Extent3D", "MakeLine", "Union"] class GeoAggregate(Aggregate): is_extent: bool | str @override def as_sql( # type: ignore[override] self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, function: str | None = None, **extra_context: Any ) -> _AsSqlType: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Collect(GeoAggregate): name: str output_field_class: Any class Extent(GeoAggregate): name: str is_extent: str def __init__(self, expression: Any, **extra: Any) -> None: ... class Extent3D(GeoAggregate): name: str is_extent: str def __init__(self, expression: Any, **extra: Any) -> None: ... class MakeLine(GeoAggregate): name: str output_field_class: Any class Union(GeoAggregate): name: str output_field_class: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/fields.pyi000066400000000000000000000165261526064357400275420ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any, NamedTuple from django.contrib.gis import forms from django.contrib.gis.geos import ( GeometryCollection, GEOSGeometry, LineString, MultiLineString, MultiPoint, MultiPolygon, Point, Polygon, ) from django.core.validators import _ValidatorCallable from django.db.models import Model from django.db.models.expressions import Combinable, Expression from django.db.models.fields import NOT_PROVIDED, Field, _ErrorMessagesMapping from django.db.models.sql.compiler import _AsSqlType from django.forms.widgets import Widget from django.utils.choices import _Choices from django.utils.functional import _StrOrPromise from typing_extensions import TypeVar, override # __set__ value type _ST = TypeVar("_ST", contravariant=True) # __get__ return type _GT = TypeVar("_GT", covariant=True) class SRIDCacheEntry(NamedTuple): units: Any units_name: str spheroid: str geodetic: bool def get_srid_info(srid: int, connection: Any) -> SRIDCacheEntry: ... class BaseSpatialField(Field[_ST, _GT]): form_class: type[forms.GeometryField] geom_type: str geom_class: type[GEOSGeometry] | None geography: bool spatial_index: bool srid: int def __init__( self, verbose_name: _StrOrPromise | None = None, srid: int = 4326, spatial_index: bool = True, *, name: str | None = ..., primary_key: bool = ..., max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _Choices | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., ) -> None: ... @override def db_type(self, connection: Any) -> Any: ... def spheroid(self, connection: Any) -> Any: ... def units(self, connection: Any) -> Any: ... def units_name(self, connection: Any) -> Any: ... def geodetic(self, connection: Any) -> Any: ... def get_placeholder_sql(self, value: Any, compiler: Any, connection: Any) -> _AsSqlType: ... def get_srid(self, obj: Any) -> Any: ... @override def get_db_prep_value(self, value: Any, connection: Any, *args: Any, **kwargs: Any) -> Any: ... def get_raster_prep_value(self, value: Any, is_candidate: Any) -> Any: ... @override def get_prep_value(self, value: Any) -> Any: ... class GeometryField(BaseSpatialField[_ST, _GT]): dim: int def __init__( self, verbose_name: _StrOrPromise | None = None, dim: int = 2, geography: bool = False, *, extent: tuple[float, float, float, float] = ..., tolerance: float = 0.05, max_geom_collections: int | None = ..., srid: int = 4326, spatial_index: bool = True, name: str | None = ..., primary_key: bool = ..., max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _Choices | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., ) -> None: ... @override def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override] @override def formfield( # type: ignore[override] self, *, form_class: type[forms.GeometryField] | None = ..., choices_form_class: type[forms.GeometryField] | None = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., # GeometryField adds `geom_type` and `srid` geom_type: str = ..., srid: Any = ..., **kwargs: Any, ) -> forms.GeometryField | None: ... class PointField(GeometryField[_ST, _GT]): _pyi_private_set_type: Point | Combinable _pyi_private_get_type: Point _pyi_lookup_exact_type: Point geom_class: type[Point] form_class: type[forms.PointField] class LineStringField(GeometryField[_ST, _GT]): _pyi_private_set_type: LineString | Combinable _pyi_private_get_type: LineString _pyi_lookup_exact_type: LineString geom_class: type[LineString] form_class: type[forms.LineStringField] class PolygonField(GeometryField[_ST, _GT]): _pyi_private_set_type: Polygon | Combinable _pyi_private_get_type: Polygon _pyi_lookup_exact_type: Polygon geom_class: type[Polygon] form_class: type[forms.PolygonField] class MultiPointField(GeometryField[_ST, _GT]): _pyi_private_set_type: MultiPoint | Combinable _pyi_private_get_type: MultiPoint _pyi_lookup_exact_type: MultiPoint geom_class: type[MultiPoint] form_class: type[forms.MultiPointField] class MultiLineStringField(GeometryField[_ST, _GT]): _pyi_private_set_type: MultiLineString | Combinable _pyi_private_get_type: MultiLineString _pyi_lookup_exact_type: MultiLineString geom_class: type[MultiLineString] form_class: type[forms.MultiLineStringField] class MultiPolygonField(GeometryField[_ST, _GT]): _pyi_private_set_type: MultiPolygon | Combinable _pyi_private_get_type: MultiPolygon _pyi_lookup_exact_type: MultiPolygon geom_class: type[MultiPolygon] form_class: type[forms.MultiPolygonField] class GeometryCollectionField(GeometryField[_ST, _GT]): _pyi_private_set_type: GeometryCollection | Combinable _pyi_private_get_type: GeometryCollection _pyi_lookup_exact_type: GeometryCollection geom_class: type[GeometryCollection] form_class: type[forms.GeometryCollectionField] class ExtentField(Field[Any, Any]): @override def get_internal_type(self) -> str: ... class RasterField(BaseSpatialField[_ST, _GT]): @override def db_type(self, connection: Any) -> Any: ... def from_db_value(self, value: Any, expression: Any, connection: Any) -> Any: ... @override def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override] @override def get_transform(self, name: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/functions.pyi000066400000000000000000000220071526064357400302730ustar00rootroot00000000000000from typing import Any, ClassVar from django.contrib.gis.db.models.fields import GeometryField from django.contrib.gis.db.models.sql.conversion import AreaField, DistanceField from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import BinaryField, BooleanField, CharField, FloatField, Func, IntegerField, TextField from django.db.models import Transform as StandardTransform from django.db.models.expressions import BaseExpression from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from django.utils.functional import cached_property from typing_extensions import override NUMERIC_TYPES: Any class GeoFuncMixin: function: str | None = None geom_param_pos: Any def __init__(self, *expressions: Any, **extra: Any) -> None: ... @property def name(self) -> str: ... @cached_property def geo_field(self) -> Any: ... # `as_sql` drops `template`/`arg_joiner` from `Func.as_sql`, matching runtime. def as_sql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, function: str | None = None, **extra_context: Any, ) -> _AsSqlType: ... def resolve_expression( self, *args: Any, **kwargs: Any, ) -> Any: ... class GeoFunc(GeoFuncMixin, Func): ... # type: ignore[misc] class GeomOutputGeoFunc(GeoFunc): @cached_property @override def output_field(self) -> GeometryField[Any, Any]: ... class SQLiteDecimalToFloatMixin: def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class OracleToleranceMixin: tolerance: float def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Area(OracleToleranceMixin, GeoFunc): arity: int @cached_property @override def output_field(self) -> AreaField[Any, Any]: ... @override def as_sql( # type: ignore[override] self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... @override def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Azimuth(GeoFunc): output_field: ClassVar[FloatField[Any, Any]] arity: int geom_param_pos: Any class AsGeoJSON(GeoFunc): output_field: ClassVar[TextField[Any, Any]] def __init__( self, expression: Any, bbox: bool = False, crs: bool = False, precision: int = 8, **extra: Any ) -> None: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class AsGML(GeoFunc): geom_param_pos: Any output_field: ClassVar[TextField[Any, Any]] def __init__(self, expression: Any, version: int = 2, precision: int = 8, **extra: Any) -> None: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class AsKML(GeoFunc): output_field: ClassVar[TextField[Any, Any]] def __init__(self, expression: Any, precision: int = 8, **extra: Any) -> None: ... class AsSVG(GeoFunc): output_field: ClassVar[TextField[Any, Any]] def __init__(self, expression: Any, relative: bool = False, precision: int = 8, **extra: Any) -> None: ... class AsWKB(GeoFunc): output_field: ClassVar[BinaryField[Any, Any]] arity: int class AsWKT(GeoFunc): output_field: ClassVar[TextField[Any, Any]] arity: int class BoundingCircle(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc] def __init__(self, expression: Any, num_seg: int = 48, **extra: Any) -> None: ... @override def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Centroid(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc] arity: int class ClosestPoint(GeomOutputGeoFunc): arity: int geom_param_pos: tuple[int, int] class Difference(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc] arity: int geom_param_pos: Any class DistanceResultMixin: @cached_property def output_field(self) -> DistanceField[Any, Any]: ... def source_is_geography(self) -> Any: ... class Distance(DistanceResultMixin, OracleToleranceMixin, GeoFunc): # type: ignore[misc] geom_param_pos: Any spheroid: Any def __init__(self, expr1: Any, expr2: Any, spheroid: Any | None = None, **extra: Any) -> None: ... def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... @override def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Envelope(GeomOutputGeoFunc): arity: int class ForcePolygonCW(GeomOutputGeoFunc): arity: int class FromWKB(GeoFunc): arity: int def __init__(self, expression: BaseExpression, srid: int = 0, **extra: Any) -> None: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class FromWKT(FromWKB): ... class GeoHash(GeoFunc): output_field: ClassVar[TextField[Any, Any]] def __init__(self, expression: Any, precision: Any | None = None, **extra: Any) -> None: ... def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class GeometryDistance(GeoFunc): output_field: ClassVar[FloatField[Any, Any]] arity: int function: str arg_joiner: str geom_param_pos: Any class Intersection(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc] arity: int geom_param_pos: Any class GeometryType(GeoFuncMixin, StandardTransform): # type: ignore[misc] lookup_name: str output_field: ClassVar[CharField[Any, Any]] def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class IsEmpty(GeoFuncMixin, StandardTransform): # type: ignore[misc] lookup_name: str output_field: ClassVar[BooleanField[Any, Any]] class IsValid(OracleToleranceMixin, GeoFuncMixin, StandardTransform): # type: ignore[misc] lookup_name: str output_field: ClassVar[BooleanField[Any, Any]] @override def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Length(DistanceResultMixin, OracleToleranceMixin, GeoFunc): spheroid: Any def __init__(self, expr1: Any, spheroid: bool = True, **extra: Any) -> None: ... @override def as_sql( # type: ignore[override] self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... @override def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class LineLocatePoint(GeoFunc): output_field: ClassVar[FloatField[Any, Any]] arity: int geom_param_pos: Any class MakeValid(GeomOutputGeoFunc): ... class MemSize(GeoFunc): output_field: ClassVar[IntegerField[Any, Any]] arity: int class NumDimensions(GeoFuncMixin, StandardTransform): # type: ignore[misc] lookup_name: str output_field: ClassVar[IntegerField[Any, Any]] arity: int class NumGeometries(GeoFunc): output_field: ClassVar[IntegerField[Any, Any]] arity: int class NumPoints(GeoFunc): output_field: ClassVar[IntegerField[Any, Any]] arity: int class Perimeter(DistanceResultMixin, OracleToleranceMixin, GeoFunc): # type: ignore[misc] arity: int def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... @override def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class PointOnSurface(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc] arity: int class Reverse(GeoFunc): arity: int class Rotate(GeomOutputGeoFunc): def __init__(self, expression: Any, angle: Any, origin: Any | None = None, **extra: Any) -> None: ... class Scale(SQLiteDecimalToFloatMixin, GeomOutputGeoFunc): # type: ignore[misc] def __init__(self, expression: Any, x: Any, y: Any, z: float = 0.0, **extra: Any) -> None: ... class SnapToGrid(SQLiteDecimalToFloatMixin, GeomOutputGeoFunc): # type: ignore[misc] def __init__(self, expression: Any, *args: Any, **extra: Any) -> None: ... class SymDifference(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc] arity: int geom_param_pos: Any class Transform(GeomOutputGeoFunc): def __init__(self, expression: Any, srid: Any, **extra: Any) -> None: ... class Translate(Scale): @override def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Union(OracleToleranceMixin, GeomOutputGeoFunc): # type: ignore[misc] arity: int geom_param_pos: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/lookups.pyi000066400000000000000000000064361526064357400277670ustar00rootroot00000000000000from re import Pattern from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Lookup, Transform from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override class RasterBandTransform(Transform): @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override] class GISLookup(Lookup): sql_template: Any transform_func: Any distance: bool band_rhs: Any band_lhs: Any template_params: Any def __init__(self, lhs: Any, rhs: Any) -> None: ... def process_rhs_params(self) -> None: ... def process_band_indices(self, only_lhs: bool = False) -> None: ... @override def get_db_prep_lookup(self, value: Any, connection: Any) -> Any: ... @override def process_rhs(self, compiler: Any, connection: Any) -> Any: ... def get_rhs_op(self, connection: Any, rhs: Any) -> Any: ... class OverlapsLeftLookup(GISLookup): lookup_name: str class OverlapsRightLookup(GISLookup): lookup_name: str class OverlapsBelowLookup(GISLookup): lookup_name: str class OverlapsAboveLookup(GISLookup): lookup_name: str class LeftLookup(GISLookup): lookup_name: str class RightLookup(GISLookup): lookup_name: str class StrictlyBelowLookup(GISLookup): lookup_name: str class StrictlyAboveLookup(GISLookup): lookup_name: str class SameAsLookup(GISLookup): lookup_name: str class BBContainsLookup(GISLookup): lookup_name: str class BBOverlapsLookup(GISLookup): lookup_name: str class ContainedLookup(GISLookup): lookup_name: str class ContainsLookup(GISLookup): lookup_name: str class ContainsProperlyLookup(GISLookup): lookup_name: str class CoveredByLookup(GISLookup): lookup_name: str class CoversLookup(GISLookup): lookup_name: str class CrossesLookup(GISLookup): lookup_name: str class DisjointLookup(GISLookup): lookup_name: str class EqualsLookup(GISLookup): lookup_name: str class IntersectsLookup(GISLookup): lookup_name: str class OverlapsLookup(GISLookup): lookup_name: str class RelateLookup(GISLookup): lookup_name: str sql_template: str pattern_regex: Pattern[str] @override def process_rhs(self, compiler: Any, connection: Any) -> Any: ... class TouchesLookup(GISLookup): lookup_name: str class WithinLookup(GISLookup): lookup_name: str class DistanceLookupBase(GISLookup): distance: bool sql_template: str @override def process_rhs_params(self) -> None: ... def process_distance(self, compiler: Any, connection: Any) -> Any: ... class DWithinLookup(DistanceLookupBase): lookup_name: str sql_template: str @override def process_distance(self, compiler: Any, connection: Any) -> Any: ... @override def process_rhs(self, compiler: Any, connection: Any) -> Any: ... class DistanceLookupFromFunction(DistanceLookupBase): ... class DistanceGTLookup(DistanceLookupFromFunction): lookup_name: str op: str class DistanceGTELookup(DistanceLookupFromFunction): lookup_name: str op: str class DistanceLTLookup(DistanceLookupFromFunction): lookup_name: str op: str class DistanceLTELookup(DistanceLookupFromFunction): lookup_name: str op: str typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/proxy.pyi000066400000000000000000000006161526064357400274460ustar00rootroot00000000000000from typing import Any from django.db.models.query_utils import DeferredAttribute from typing_extensions import override class SpatialProxy(DeferredAttribute): def __init__(self, klass: Any, field: Any, load_func: Any | None = ...) -> None: ... @override def __get__(self, instance: Any, cls: Any | None = ...) -> Any: ... def __set__(self, instance: Any, value: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/sql/000077500000000000000000000000001526064357400263365ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/sql/__init__.pyi000066400000000000000000000003201526064357400306130ustar00rootroot00000000000000from django.contrib.gis.db.models.sql.conversion import AreaField as AreaField from django.contrib.gis.db.models.sql.conversion import DistanceField as DistanceField __all__ = ["AreaField", "DistanceField"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/db/models/sql/conversion.pyi000066400000000000000000000024011526064357400312430ustar00rootroot00000000000000from typing import Any from django.contrib.gis.measure import Area, Distance from django.db import models from typing_extensions import TypeVar, override # __set__ value type _ST = TypeVar("_ST", contravariant=True) # __get__ return type _GT = TypeVar("_GT", covariant=True) class AreaField(models.FloatField[_ST, _GT]): _pyi_private_get_type: Area # type: ignore[assignment] geo_field: Any def __init__(self, geo_field: Any) -> None: ... @override def get_prep_value(self, value: Any) -> Any: ... @override def get_db_prep_value(self, value: Any, connection: Any, prepared: bool = ...) -> Any: ... def from_db_value(self, value: Any, expression: Any, connection: Any) -> Any: ... @override def get_internal_type(self) -> Any: ... class DistanceField(models.FloatField[_ST, _GT]): _pyi_private_get_type: Distance # type: ignore[assignment] geo_field: Any def __init__(self, geo_field: Any) -> None: ... @override def get_prep_value(self, value: Any) -> Any: ... @override def get_db_prep_value(self, value: Any, connection: Any, prepared: bool = ...) -> Any: ... def from_db_value(self, value: Any, expression: Any, connection: Any) -> Any: ... @override def get_internal_type(self) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/feeds.pyi000066400000000000000000000016571526064357400255110ustar00rootroot00000000000000from collections.abc import Iterable, Sequence from typing import Any from django.contrib.syndication.views import Feed as BaseFeed from django.utils.feedgenerator import Atom1Feed, Rss201rev2Feed from django.utils.xmlutils import SimplerXMLGenerator from typing_extensions import override class GeoFeedMixin: def georss_coords(self, coords: Iterable[Sequence[float]]) -> str: ... def add_georss_point(self, handler: SimplerXMLGenerator, coords: Sequence[float], w3c_geo: bool = ...) -> None: ... def add_georss_element(self, handler: SimplerXMLGenerator, item: dict[str, Any], w3c_geo: bool = ...) -> None: ... class GeoRSSFeed(Rss201rev2Feed, GeoFeedMixin): @override def rss_attributes(self) -> dict[str, str]: ... class GeoAtom1Feed(Atom1Feed, GeoFeedMixin): ... class W3CGeoFeed(Rss201rev2Feed, GeoFeedMixin): @override def rss_attributes(self) -> dict[str, str]: ... class Feed(BaseFeed[Any, Any]): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/forms/000077500000000000000000000000001526064357400250155ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/forms/__init__.pyi000066400000000000000000000012021526064357400272720ustar00rootroot00000000000000from django.forms import * from .fields import GeometryCollectionField as GeometryCollectionField from .fields import GeometryField as GeometryField from .fields import LineStringField as LineStringField from .fields import MultiLineStringField as MultiLineStringField from .fields import MultiPointField as MultiPointField from .fields import MultiPolygonField as MultiPolygonField from .fields import PointField as PointField from .fields import PolygonField as PolygonField from .widgets import BaseGeometryWidget as BaseGeometryWidget from .widgets import OpenLayersWidget as OpenLayersWidget from .widgets import OSMWidget as OSMWidget typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/forms/fields.pyi000066400000000000000000000017671526064357400270210ustar00rootroot00000000000000from typing import Any from django import forms from typing_extensions import override class GeometryField(forms.Field): widget: Any geom_type: str max_geom_collections: int srid: Any def __init__( self, *, srid: Any | None = ..., geom_type: Any | None = ..., max_geom_collections: int | None = None, **kwargs: Any, ) -> None: ... @override def to_python(self, value: Any) -> Any: ... @override def clean(self, value: Any) -> Any: ... @override def has_changed(self, initial: Any, data: Any) -> Any: ... class GeometryCollectionField(GeometryField): geom_type: str class PointField(GeometryField): geom_type: str class MultiPointField(GeometryField): geom_type: str class LineStringField(GeometryField): geom_type: str class MultiLineStringField(GeometryField): geom_type: str class PolygonField(GeometryField): geom_type: str class MultiPolygonField(GeometryField): geom_type: str typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/forms/widgets.pyi000066400000000000000000000021031526064357400272020ustar00rootroot00000000000000from logging import Logger from typing import Any from django.forms.widgets import Widget from typing_extensions import override logger: Logger class BaseGeometryWidget(Widget): base_layer: str | None geom_type: str map_srid: int display_raw: bool max_geom_collections: int supports_3d: bool template_name: str attrs: Any def __init__(self, attrs: Any | None = ...) -> None: ... def serialize(self, value: Any) -> Any: ... def deserialize(self, value: Any) -> Any: ... @override def get_context(self, name: Any, value: Any, attrs: Any) -> Any: ... class OpenLayersWidget(BaseGeometryWidget): base_layer: str template_name: str map_srid: int class Media: css: Any js: Any @override def serialize(self, value: Any) -> Any: ... @override def deserialize(self, value: Any) -> Any: ... class OSMWidget(OpenLayersWidget): base_layer: str template_name: str default_lon: int default_lat: int default_zoom: int def __init__(self, attrs: Any | None = ...) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/000077500000000000000000000000001526064357400245765ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/__init__.pyi000066400000000000000000000025371526064357400270670ustar00rootroot00000000000000from django.contrib.gis.gdal.datasource import DataSource as DataSource from django.contrib.gis.gdal.driver import Driver as Driver from django.contrib.gis.gdal.envelope import Envelope as Envelope from django.contrib.gis.gdal.error import GDALException as GDALException from django.contrib.gis.gdal.error import SRSException as SRSException from django.contrib.gis.gdal.error import check_err as check_err from django.contrib.gis.gdal.geometries import OGRGeometry as OGRGeometry from django.contrib.gis.gdal.geomtype import OGRGeomType as OGRGeomType from django.contrib.gis.gdal.libgdal import GDAL_VERSION as GDAL_VERSION from django.contrib.gis.gdal.libgdal import gdal_full_version as gdal_full_version from django.contrib.gis.gdal.libgdal import gdal_version as gdal_version from django.contrib.gis.gdal.raster.source import GDALRaster as GDALRaster from django.contrib.gis.gdal.srs import AxisOrder as AxisOrder from django.contrib.gis.gdal.srs import CoordTransform as CoordTransform from django.contrib.gis.gdal.srs import SpatialReference as SpatialReference __all__ = ( "GDAL_VERSION", "AxisOrder", "CoordTransform", "DataSource", "Driver", "Envelope", "GDALException", "GDALRaster", "OGRGeomType", "OGRGeometry", "SRSException", "SpatialReference", "check_err", "gdal_full_version", "gdal_version", ) typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/base.pyi000066400000000000000000000002111526064357400262250ustar00rootroot00000000000000from typing import Any from django.contrib.gis.ptr import CPointerBase class GDALBase(CPointerBase): null_ptr_exception_class: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/datasource.pyi000066400000000000000000000010761526064357400274570ustar00rootroot00000000000000from typing import Any from django.contrib.gis.gdal.base import GDALBase from django.contrib.gis.gdal.driver import Driver from django.contrib.gis.gdal.layer import Layer class DataSource(GDALBase): destructor: Any encoding: str ptr: Any driver: Driver def __init__(self, ds_input: Any, ds_driver: bool = ..., write: bool = ..., encoding: str = ...) -> None: ... def __getitem__(self, index: str | int) -> Layer: ... def __len__(self) -> int: ... @property def layer_count(self) -> int: ... @property def name(self) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/driver.pyi000066400000000000000000000005041526064357400266130ustar00rootroot00000000000000from typing import Any from django.contrib.gis.gdal.base import GDALBase class Driver(GDALBase): ptr: Any def __init__(self, dr_input: Any) -> None: ... @classmethod def ensure_registered(cls) -> None: ... @classmethod def driver_count(cls) -> int: ... @property def name(self) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/envelope.pyi000066400000000000000000000014421526064357400271370ustar00rootroot00000000000000from ctypes import Structure from typing import Any from typing_extensions import override class OGREnvelope(Structure): MinX: float MaxX: float MinY: float MaxY: float class Envelope: def __init__(self, *args: Any) -> None: ... @override def __eq__(self, other: object) -> bool: ... def expand_to_include(self, *args: Any) -> None: ... @property def min_x(self) -> float: ... @property def min_y(self) -> float: ... @property def max_x(self) -> float: ... @property def max_y(self) -> float: ... @property def ur(self) -> tuple[float, float]: ... @property def ll(self) -> tuple[float, float]: ... @property def tuple(self) -> tuple[float, float, float, float]: ... @property def wkt(self) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/error.pyi000066400000000000000000000003101526064357400264440ustar00rootroot00000000000000from typing import Any class GDALException(Exception): ... class SRSException(Exception): ... OGRERR_DICT: Any CPLERR_DICT: Any ERR_NONE: int def check_err(code: Any, cpl: bool = ...) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/feature.pyi000066400000000000000000000017501526064357400267570ustar00rootroot00000000000000from typing import Any from django.contrib.gis.gdal.base import GDALBase from django.contrib.gis.gdal.field import Field from django.contrib.gis.gdal.geometries import OGRGeometry from django.contrib.gis.gdal.geomtype import OGRGeomType from typing_extensions import override class Feature(GDALBase): destructor: Any ptr: Any def __init__(self, feat: Any, layer: Any) -> None: ... def __getitem__(self, index: str | int) -> Field: ... def __len__(self) -> int: ... @override def __eq__(self, other: object) -> bool: ... @property def encoding(self) -> str: ... @property def fid(self) -> int: ... @property def layer_name(self) -> str: ... @property def num_fields(self) -> int: ... @property def fields(self) -> list[str]: ... @property def geom(self) -> OGRGeometry: ... @property def geom_type(self) -> OGRGeomType: ... def get(self, field: str) -> Any: ... def index(self, field_name: str) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/field.pyi000066400000000000000000000030571526064357400264110ustar00rootroot00000000000000from typing import Any from django.contrib.gis.gdal.base import GDALBase from typing_extensions import override class Field(GDALBase): ptr: Any def __init__(self, feat: Any, index: Any) -> None: ... def as_double(self) -> float | None: ... def as_int(self, is_64: bool = ...) -> int | None: ... def as_string(self) -> str | None: ... def as_datetime(self) -> tuple[int, int, int, int, int, int, int] | None: ... @property def is_set(self) -> bool: ... @property def name(self) -> str: ... @property def precision(self) -> int: ... @property def type(self) -> int: ... @property def type_name(self) -> bytes: ... @property def value(self) -> Any: ... @property def width(self) -> int: ... class OFTInteger(Field): @property @override def value(self) -> Any: ... @property @override def type(self) -> Any: ... class OFTReal(Field): @property @override def value(self) -> Any: ... class OFTString(Field): ... class OFTWideString(Field): ... class OFTBinary(Field): ... class OFTDate(Field): @property @override def value(self) -> Any: ... class OFTDateTime(Field): @property @override def value(self) -> Any: ... class OFTTime(Field): @property @override def value(self) -> Any: ... class OFTInteger64(OFTInteger): ... class OFTIntegerList(Field): ... class OFTRealList(Field): ... class OFTStringList(Field): ... class OFTWideStringList(Field): ... class OFTInteger64List(Field): ... OGRFieldTypes: Any ROGRFieldTypes: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/geometries.pyi000066400000000000000000000133411526064357400274660ustar00rootroot00000000000000from typing import Any, AnyStr, ClassVar from django.contrib.gis.gdal import CoordTransform, SpatialReference from django.contrib.gis.gdal.base import GDALBase from django.contrib.gis.gdal.envelope import Envelope from django.contrib.gis.gdal.geomtype import OGRGeomType from django.contrib.gis.geos import GEOSGeometry from typing_extensions import override class OGRGeometry(GDALBase): destructor: Any geos_support: ClassVar[bool] ptr: Any srs: SpatialReference | None def __init__(self, geom_input: Any, srs: SpatialReference | None = ...) -> None: ... @classmethod def from_bbox(cls, bbox: tuple[float, float, float, float]) -> OGRGeometry: ... @staticmethod def from_json(geom_input: AnyStr) -> OGRGeometry: ... @classmethod def from_gml(cls, gml_string: AnyStr) -> OGRGeometry: ... def __or__(self, other: OGRGeometry) -> OGRGeometry: ... def __and__(self, other: OGRGeometry) -> OGRGeometry: ... def __sub__(self, other: OGRGeometry) -> OGRGeometry: ... def __xor__(self, other: OGRGeometry) -> OGRGeometry: ... @override def __eq__(self, other: object) -> bool: ... @property def dimension(self) -> int: ... @property def coord_dim(self) -> int: ... @property def geom_count(self) -> int: ... @property def point_count(self) -> int: ... @property def num_points(self) -> int: ... @property def num_coords(self) -> int: ... @property def geom_type(self) -> OGRGeomType: ... @property def geom_name(self) -> str: ... @property def area(self) -> float: ... @property def envelope(self) -> Envelope: ... @property def empty(self) -> bool: ... @property def extent(self) -> tuple[float, float, float, float]: ... @property def is_3d(self) -> bool: ... def set_3d(self, value: bool) -> None: ... @property def is_measured(self) -> bool: ... def set_measured(self, value: bool) -> None: ... @property def has_curve(self) -> bool: ... def get_linear_geometry(self) -> OGRGeometry: ... def get_curve_geometry(self) -> OGRGeometry: ... srid: int | None @property def geos(self) -> GEOSGeometry: ... @property def gml(self) -> str: ... @property def hex(self) -> bytes: ... @property def json(self) -> str: ... @property def geojson(self) -> str: ... @property def kml(self) -> str: ... @property def wkb_size(self) -> int: ... @property def wkb(self) -> memoryview: ... @property def wkt(self) -> str: ... @property def ewkt(self) -> str: ... def clone(self) -> Any: ... def close_rings(self) -> None: ... def transform(self, coord_trans: CoordTransform | SpatialReference | str | int, clone: bool = ...) -> Any: ... def intersects(self, other: OGRGeometry) -> bool: ... def equals(self, other: OGRGeometry) -> bool: ... def disjoint(self, other: OGRGeometry) -> bool: ... def touches(self, other: OGRGeometry) -> bool: ... def crosses(self, other: OGRGeometry) -> bool: ... def within(self, other: OGRGeometry) -> bool: ... def contains(self, other: OGRGeometry) -> bool: ... def overlaps(self, other: OGRGeometry) -> bool: ... @property def boundary(self) -> OGRGeometry: ... @property def convex_hull(self) -> OGRGeometry: ... def difference(self, other: OGRGeometry) -> OGRGeometry: ... def intersection(self, other: OGRGeometry) -> OGRGeometry: ... def sym_difference(self, other: OGRGeometry) -> OGRGeometry: ... def union(self, other: OGRGeometry) -> OGRGeometry: ... @property def centroid(self) -> Point: ... class Point(OGRGeometry): @property def x(self) -> float: ... @property def y(self) -> float: ... @property def z(self) -> float | None: ... @property def m(self) -> float | None: ... @property def coords(self) -> tuple[float, float] | tuple[float, float, float]: ... @property def tuple(self) -> tuple[float, float] | tuple[float, float, float]: ... class LineString(OGRGeometry): def __getitem__(self, index: int) -> tuple[float, ...]: ... def __len__(self) -> int: ... @property def coords(self) -> tuple[tuple[float, ...], ...]: ... @property def tuple(self) -> tuple[tuple[float, ...], ...]: ... @property def x(self) -> list[float]: ... @property def y(self) -> list[float]: ... @property def z(self) -> list[float] | None: ... @property def m(self) -> list[float] | None: ... class LinearRing(LineString): ... class Polygon(OGRGeometry): def __len__(self) -> int: ... def __getitem__(self, index: int) -> OGRGeometry: ... @property def shell(self) -> LinearRing: ... @property def exterior_ring(self) -> LinearRing: ... @property def coords(self) -> tuple[tuple[tuple[float, ...], ...], ...]: ... @property def tuple(self) -> tuple[tuple[tuple[float, ...]]]: ... @property @override def point_count(self) -> int: ... @property @override def centroid(self) -> Point: ... class GeometryCollection(OGRGeometry): def __getitem__(self, index: int) -> OGRGeometry: ... def __len__(self) -> int: ... def add(self, geom: OGRGeometry | str) -> None: ... @property @override def point_count(self) -> int: ... @property def coords(self) -> tuple[Any, ...]: ... @property def tuple(self) -> tuple[Any, ...]: ... class MultiPoint(GeometryCollection): ... class MultiLineString(GeometryCollection): ... class MultiPolygon(GeometryCollection): ... class CircularString(LineString): ... class CompoundCurve(OGRGeometry): ... class CurvePolygon(Polygon): ... class MultiCurve(GeometryCollection): ... class MultiSurface(GeometryCollection): ... GEO_CLASSES: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/geomtype.pyi000066400000000000000000000005461526064357400271570ustar00rootroot00000000000000from typing import Any from typing_extensions import override class OGRGeomType: wkb25bit: int num: int def __init__(self, type_input: Any) -> None: ... @override def __eq__(self, other: object) -> bool: ... @property def name(self) -> str: ... @property def django(self) -> str: ... def to_multi(self) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/layer.pyi000066400000000000000000000033171526064357400264410ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any, AnyStr, Literal, overload from django.contrib.gis.gdal.base import GDALBase from django.contrib.gis.gdal.envelope import Envelope from django.contrib.gis.gdal.feature import Feature from django.contrib.gis.gdal.field import Field from django.contrib.gis.gdal.geometries import OGRGeometry from django.contrib.gis.gdal.geomtype import OGRGeomType from django.contrib.gis.gdal.srs import SpatialReference from django.contrib.gis.geos.geometry import GEOSGeometry class Layer(GDALBase): ptr: Any def __init__(self, layer_ptr: Any, ds: Any) -> None: ... @overload def __getitem__(self, index: int) -> Feature: ... @overload def __getitem__(self, index: slice) -> list[Feature]: ... def __iter__(self) -> Iterator[Feature]: ... def __len__(self) -> int: ... @property def extent(self) -> Envelope: ... @property def name(self) -> str: ... @property def num_feat(self) -> int: ... @property def num_fields(self) -> int: ... @property def geom_type(self) -> OGRGeomType: ... @property def srs(self) -> SpatialReference: ... @property def fields(self) -> list[str]: ... @property def field_types(self) -> list[type[Field]]: ... @property def field_widths(self) -> list[int]: ... @property def field_precisions(self) -> list[int]: ... spatial_filter: OGRGeometry | None def get_fields(self, field_name: str) -> list[Any]: ... @overload def get_geoms(self, geos: Literal[False] = False) -> list[OGRGeometry]: ... @overload def get_geoms(self, geos: Literal[True]) -> list[GEOSGeometry]: ... def test_capability(self, capability: AnyStr) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/libgdal.pyi000066400000000000000000000015311526064357400267170ustar00rootroot00000000000000import sys from _ctypes import _CData from collections.abc import Callable, Sequence from ctypes import CDLL, _FuncPointer, _NamedFuncPointer from logging import Logger from typing import Any logger: Logger lib_path: str | None lib_names: list[str] | None lib_name: str lgdal: CDLL if sys.platform == "win32": from ctypes import WinDLL lwingdal: WinDLL def std_call(func: str) -> _NamedFuncPointer: ... def gdal_version() -> bytes: ... def gdal_full_version() -> bytes: ... def gdal_version_info() -> tuple[int, int, int]: ... GDAL_VERSION: tuple[int, int, int] CPLErrorHandler: type[_FuncPointer] def function( name: str, # Taken from _ctypes.CFuncPtr args: Sequence[type[_CData]], restype: type[_CData] | Callable[[int], Any] | None, ) -> _NamedFuncPointer: ... err_handler: _FuncPointer set_error_handler: _NamedFuncPointer typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/000077500000000000000000000000001526064357400270265ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/__init__.pyi000066400000000000000000000000001526064357400312760ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/ds.pyi000066400000000000000000000022621526064357400301610ustar00rootroot00000000000000from typing import Any, Final c_int_p: Any GDAL_OF_READONLY: Final = 0x00 GDAL_OF_UPDATE: Final = 0x01 GDAL_OF_ALL: Final = 0x00 GDAL_OF_RASTER: Final = 0x02 GDAL_OF_VECTOR: Final = 0x04 register_all: Any cleanup_all: Any get_driver: Any get_driver_by_name: Any get_driver_count: Any get_driver_description: Any open_ds: Any destroy_ds: Any get_ds_name: Any get_dataset_driver: Any get_layer: Any get_layer_by_name: Any get_layer_count: Any get_extent: Any get_feature: Any get_feature_count: Any get_layer_defn: Any get_layer_srs: Any get_next_feature: Any reset_reading: Any test_capability: Any get_spatial_filter: Any set_spatial_filter: Any set_spatial_filter_rect: Any get_fd_geom_type: Any get_fd_name: Any get_feat_name: Any get_field_count: Any get_field_defn: Any clone_feature: Any destroy_feature: Any feature_equal: Any get_feat_geom_ref: Any get_feat_field_count: Any get_feat_field_defn: Any get_fid: Any get_field_as_datetime: Any get_field_as_double: Any get_field_as_integer: Any get_field_as_integer64: Any is_field_set: Any get_field_as_string: Any get_field_index: Any get_field_name: Any get_field_precision: Any get_field_type: Any get_field_type_name: Any get_field_width: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/errcheck.pyi000066400000000000000000000017011526064357400313360ustar00rootroot00000000000000from typing import Any def arg_byref(args: Any, offset: int = ...) -> Any: ... def ptr_byref(args: Any, offset: int = ...) -> Any: ... def check_const_string(result: Any, func: Any, cargs: Any, offset: Any | None = ..., cpl: bool = ...) -> Any: ... def check_string(result: Any, func: Any, cargs: Any, offset: int = ..., str_result: bool = ...) -> Any: ... def check_envelope(result: Any, func: Any, cargs: Any, offset: int = ...) -> Any: ... def check_geom(result: Any, func: Any, cargs: Any) -> Any: ... def check_geom_offset(result: Any, func: Any, cargs: Any, offset: int = ...) -> Any: ... def check_srs(result: Any, func: Any, cargs: Any) -> Any: ... def check_arg_errcode(result: Any, func: Any, cargs: Any, cpl: bool = ...) -> Any: ... def check_errcode(result: Any, func: Any, cargs: Any, cpl: bool = ...) -> None: ... def check_pointer(result: Any, func: Any, cargs: Any) -> Any: ... def check_str_arg(result: Any, func: Any, cargs: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/generation.pyi000066400000000000000000000020651526064357400317070ustar00rootroot00000000000000from ctypes import c_char_p from typing import Any class gdal_char_p(c_char_p): ... def bool_output(func: Any, argtypes: Any, errcheck: Any | None = ...) -> Any: ... def double_output(func: Any, argtypes: Any, errcheck: bool = ..., strarg: bool = ..., cpl: bool = ...) -> Any: ... def geom_output(func: Any, argtypes: Any, offset: Any | None = ...) -> Any: ... def int_output(func: Any, argtypes: Any, errcheck: Any | None = ...) -> Any: ... def int64_output(func: Any, argtypes: Any) -> Any: ... def srs_output(func: Any, argtypes: Any) -> Any: ... def const_string_output( func: Any, argtypes: Any, offset: Any | None = ..., decoding: Any | None = ..., cpl: bool = ... ) -> Any: ... def string_output( func: Any, argtypes: Any, offset: int = ..., str_result: bool = ..., decoding: Any | None = ... ) -> Any: ... def void_output(func: Any, argtypes: Any, errcheck: bool = ..., cpl: bool = ...) -> Any: ... def voidptr_output(func: Any, argtypes: Any, errcheck: bool = ...) -> Any: ... def chararray_output(func: Any, argtypes: Any, errcheck: bool = ...) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/geom.pyi000066400000000000000000000021531526064357400305010ustar00rootroot00000000000000from typing import Any def env_func(f: Any, argtypes: Any) -> Any: ... def pnt_func(f: Any) -> Any: ... def topology_func(f: Any) -> Any: ... from_json: Any to_json: Any to_kml: Any getx: Any gety: Any getz: Any getm: Any from_wkb: Any from_wkt: Any from_gml: Any create_geom: Any clone_geom: Any get_geom_ref: Any get_boundary: Any geom_convex_hull: Any geom_diff: Any geom_intersection: Any geom_sym_diff: Any geom_union: Any is_3d: Any set_3d: Any is_measured: Any set_measured: Any has_curve_geom: Any get_linear_geom: Any get_curve_geom: Any add_geom: Any import_wkt: Any destroy_geom: Any to_wkb: Any to_iso_wkb: Any to_wkt: Any to_iso_wkt: Any to_gml: Any get_wkbsize: Any assign_srs: Any get_geom_srs: Any get_area: Any get_centroid: Any get_dims: Any get_coord_dim: Any set_coord_dim: Any is_empty: Any get_geom_count: Any get_geom_name: Any get_geom_type: Any get_point_count: Any get_point: Any geom_close_rings: Any ogr_contains: Any ogr_crosses: Any ogr_disjoint: Any ogr_equals: Any ogr_intersects: Any ogr_overlaps: Any ogr_touches: Any ogr_within: Any geom_transform: Any geom_transform_to: Any get_envelope: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/raster.pyi000066400000000000000000000016611526064357400310550ustar00rootroot00000000000000from typing import Any create_ds: Any open_ds: Any close_ds: Any flush_ds: Any copy_ds: Any add_band_ds: Any get_ds_description: Any get_ds_driver: Any get_ds_xsize: Any get_ds_ysize: Any get_ds_raster_count: Any get_ds_raster_band: Any get_ds_projection_ref: Any set_ds_projection_ref: Any get_ds_geotransform: Any set_ds_geotransform: Any get_ds_metadata: Any set_ds_metadata: Any get_ds_metadata_domain_list: Any get_ds_metadata_item: Any set_ds_metadata_item: Any free_dsl: Any get_ds_info: Any band_io: Any get_band_xsize: Any get_band_ysize: Any get_band_index: Any get_band_description: Any get_band_ds: Any get_band_datatype: Any get_band_color_interp: Any get_band_nodata_value: Any set_band_nodata_value: Any delete_band_nodata_value: Any get_band_statistics: Any compute_band_statistics: Any reproject_image: Any auto_create_warped_vrt: Any create_vsi_file_from_mem_buffer: Any get_mem_buffer_from_vsi_file: Any unlink_vsi_file: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/prototypes/srs.pyi000066400000000000000000000011461526064357400303620ustar00rootroot00000000000000from typing import Any def srs_double(f: Any) -> Any: ... def units_func(f: Any) -> Any: ... clone_srs: Any new_srs: Any release_srs: Any destroy_srs: Any srs_validate: Any set_axis_strategy: Any semi_major: Any semi_minor: Any invflattening: Any from_wkt: Any from_proj: Any from_epsg: Any from_xml: Any from_user_input: Any morph_to_esri: Any morph_from_esri: Any identify_epsg: Any linear_units: Any angular_units: Any to_wkt: Any to_proj: Any to_pretty_wkt: Any to_xml: Any get_attr_value: Any get_auth_name: Any get_auth_code: Any isgeographic: Any islocal: Any isprojected: Any new_ct: Any destroy_ct: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/raster/000077500000000000000000000000001526064357400260765ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/raster/__init__.pyi000066400000000000000000000000001526064357400303460ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/raster/band.pyi000066400000000000000000000030411526064357400275230ustar00rootroot00000000000000from typing import Any, Literal, overload from django.contrib.gis.gdal.raster.base import GDALRasterBase class GDALBand(GDALRasterBase): source: Any def __init__(self, source: Any, index: Any) -> None: ... @property def description(self) -> str: ... @property def width(self) -> int: ... @property def height(self) -> int: ... @property def pixel_count(self) -> int: ... def statistics( self, refresh: bool = ..., approximate: bool = ... ) -> tuple[float, float, float, float] | tuple[None, None, None, None]: ... @property def min(self) -> float | None: ... @property def max(self) -> float | None: ... @property def mean(self) -> float | None: ... @property def std(self) -> float | None: ... @property def nodata_value(self) -> float | None: ... @nodata_value.setter def nodata_value(self, value: float | None) -> None: ... @overload def datatype(self, as_string: Literal[False] = False) -> int: ... @overload def datatype(self, as_string: Literal[True]) -> str: ... @overload def color_interp(self, as_string: Literal[False] = False) -> int: ... @overload def color_interp(self, as_string: Literal[True]) -> str: ... def data( self, data: Any | None = ..., offset: Any | None = ..., size: Any | None = ..., shape: Any | None = ..., as_memoryview: bool = ..., ) -> Any: ... class BandList(list[GDALBand]): source: Any def __init__(self, source: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/raster/base.pyi000066400000000000000000000003411526064357400275310ustar00rootroot00000000000000from typing import Any from django.contrib.gis.gdal.base import GDALBase class GDALRasterBase(GDALBase): @property def metadata(self) -> Any: ... @metadata.setter def metadata(self, value: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/raster/const.pyi000066400000000000000000000004501526064357400277460ustar00rootroot00000000000000GDAL_PIXEL_TYPES: dict[int, str] GDAL_INTEGER_TYPES: list[int] GDAL_TO_CTYPES: list[type | None] GDAL_RESAMPLE_ALGORITHMS: dict[str, int] GDAL_COLOR_TYPES: dict[int, str] VSI_FILESYSTEM_PREFIX: str VSI_MEM_FILESYSTEM_BASE_PATH: str VSI_TAKE_BUFFER_OWNERSHIP: bool VSI_DELETE_BUFFER_ON_READ: bool typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/raster/source.pyi000066400000000000000000000051351526064357400301250ustar00rootroot00000000000000from collections.abc import Sequence from ctypes import c_void_p from pathlib import Path from typing import Any from django.contrib.gis.gdal.driver import Driver from django.contrib.gis.gdal.raster.band import BandList from django.contrib.gis.gdal.raster.base import GDALRasterBase from django.contrib.gis.gdal.srs import SpatialReference from django.core.exceptions import SuspiciousOperation from django.utils.functional import cached_property from typing_extensions import override class DisallowedRasterLookup(SuspiciousOperation): ... class TransformPoint(list[Sequence[float]]): indices: dict[str, tuple[int, int]] def __init__(self, raster: GDALRaster, prop: str) -> None: ... @property def x(self) -> float: ... @x.setter def x(self, value: float) -> None: ... @property def y(self) -> float: ... @y.setter def y(self, value: float) -> None: ... class GDALRaster(GDALRasterBase): destructor: Any def __init__(self, ds_input: str | Path | bytes | dict[str, Any] | c_void_p, write: bool = ...) -> None: ... @override def __del__(self) -> None: ... @classmethod def check_raster_lookup_value(cls, ds_input: Any) -> None: ... @property def vsi_buffer(self) -> bytes | None: ... @cached_property def is_vsi_based(self) -> bool: ... @property def name(self) -> str: ... @cached_property def driver(self) -> Driver: ... @property def width(self) -> int: ... @property def height(self) -> int: ... @property def srs(self) -> SpatialReference | None: ... @srs.setter def srs(self, value: SpatialReference | int | str) -> None: ... @property def srid(self) -> int: ... @srid.setter def srid(self, value: int) -> None: ... @property def geotransform(self) -> list[float]: ... @geotransform.setter def geotransform(self, values: list[float]) -> None: ... @property def origin(self) -> TransformPoint: ... @property def scale(self) -> TransformPoint: ... @property def skew(self) -> TransformPoint: ... @property def extent(self) -> tuple[float, float, float, float]: ... @property def bands(self) -> BandList: ... def warp(self, ds_input: Any, resampling: str = ..., max_error: float = ...) -> GDALRaster: ... def clone(self, name: str | None = ...) -> GDALRaster: ... def transform( self, srs: SpatialReference | int | str, driver: Any | None = ..., name: str | None = ..., resampling: str = ..., max_error: float = ..., ) -> GDALRaster: ... @property def info(self) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/gdal/srs.pyi000066400000000000000000000043611526064357400261340ustar00rootroot00000000000000from enum import IntEnum from typing import Any, AnyStr, Self, cast from django.contrib.gis.gdal.base import GDALBase class AxisOrder(IntEnum): TRADITIONAL = cast(int, ...) AUTHORITY = cast(int, ...) class SpatialReference(GDALBase): destructor: Any axis_order: AxisOrder ptr: Any def __init__(self, srs_input: str | int = ..., srs_type: str = ..., axis_order: AxisOrder | None = ...) -> None: ... def __getitem__(self, target: str | tuple[str, int]) -> str: ... def attr_value(self, target: AnyStr, index: int = ...) -> str: ... def auth_name(self, target: AnyStr) -> str: ... def auth_code(self, target: AnyStr) -> str: ... def clone(self) -> Self: ... def from_esri(self) -> None: ... def identify_epsg(self) -> None: ... def to_esri(self) -> None: ... def validate(self) -> None: ... @property def name(self) -> str | None: ... @property def srid(self) -> int | None: ... @property def linear_name(self) -> str: ... @property def linear_units(self) -> float: ... @property def angular_name(self) -> str: ... @property def angular_units(self) -> float: ... @property def units(self) -> tuple[float | None, str | None]: ... @property def ellipsoid(self) -> tuple[float, float, float]: ... @property def semi_major(self) -> float: ... @property def semi_minor(self) -> float: ... @property def inverse_flattening(self) -> float: ... @property def geographic(self) -> bool: ... @property def local(self) -> bool: ... @property def projected(self) -> bool: ... def import_epsg(self, epsg: int) -> None: ... def import_proj(self, proj: AnyStr) -> None: ... def import_user_input(self, user_input: AnyStr) -> None: ... def import_wkt(self, wkt: AnyStr) -> None: ... def import_xml(self, xml: AnyStr) -> None: ... @property def wkt(self) -> str: ... @property def pretty_wkt(self) -> str: ... @property def proj(self) -> str: ... @property def proj4(self) -> str: ... @property def xml(self) -> str: ... class CoordTransform(GDALBase): destructor: Any ptr: Any def __init__(self, source: SpatialReference, target: SpatialReference) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geoip2.pyi000066400000000000000000000037411526064357400256040ustar00rootroot00000000000000from ipaddress import IPv4Address, IPv6Address from typing import Final, TypeAlias, TypedDict from _typeshed import StrPath from django.contrib.gis.geos import Point from django.utils.functional import cached_property HAS_GEOIP2: bool SUPPORTED_DATABASE_TYPES: set[str] _CoordType: TypeAlias = tuple[float, float] | tuple[None, None] _QueryType: TypeAlias = str | IPv4Address | IPv6Address class _CityResponse(TypedDict): accuracy_radius: int | None city: str continent_code: str continent_name: str country_code: str country_name: str is_in_european_union: bool latitude: float longitude: float metro_code: int | None postal_code: str | None region_code: str | None region_name: str | None time_zone: str | None # Kept for backward compatibility. dma_code: int | None region: str | None class _CountryResponse(TypedDict): continent_code: str continent_name: str country_code: str country_name: str is_in_european_union: bool class GeoIP2Exception(Exception): ... class GeoIP2: MODE_AUTO: Final = 0 MODE_MMAP_EXT: Final = 1 MODE_MMAP: Final = 2 MODE_FILE: Final = 4 MODE_MEMORY: Final = 8 cache_options: Final[frozenset[int]] def __init__( self, path: StrPath | None = None, cache: int = 0, country: str | None = None, city: str | None = None, ) -> None: ... def __del__(self) -> None: ... @cached_property def is_city(self) -> bool: ... @cached_property def is_country(self) -> bool: ... def city(self, query: _QueryType) -> _CityResponse: ... def country_code(self, query: _QueryType) -> str: ... def country_name(self, query: _QueryType) -> str: ... def country(self, query: _QueryType) -> _CountryResponse: ... def lon_lat(self, query: _QueryType) -> _CoordType: ... def lat_lon(self, query: _QueryType) -> _CoordType: ... def geos(self, query: _QueryType) -> Point: ... __all__ = ["HAS_GEOIP2"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geometry.pyi000066400000000000000000000001411526064357400262410ustar00rootroot00000000000000from re import Pattern hex_regex: Pattern[str] wkt_regex: Pattern[str] json_regex: Pattern[str] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/000077500000000000000000000000001526064357400246245ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/__init__.pyi000066400000000000000000000015631526064357400271130ustar00rootroot00000000000000from ..geometry import hex_regex as hex_regex from ..geometry import wkt_regex as wkt_regex from .collections import GeometryCollection as GeometryCollection from .collections import MultiLineString as MultiLineString from .collections import MultiPoint as MultiPoint from .collections import MultiPolygon as MultiPolygon from .error import GEOSException as GEOSException from .factory import fromfile as fromfile from .factory import fromstr as fromstr from .geometry import GEOSGeometry as GEOSGeometry from .io import WKBReader as WKBReader from .io import WKBWriter as WKBWriter from .io import WKTReader as WKTReader from .io import WKTWriter as WKTWriter from .libgeos import geos_version as geos_version from .linestring import LinearRing as LinearRing from .linestring import LineString as LineString from .point import Point as Point from .polygon import Polygon as Polygon typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/base.pyi000066400000000000000000000002711526064357400262610ustar00rootroot00000000000000from django.contrib.gis.geos.error import GEOSException from django.contrib.gis.ptr import CPointerBase class GEOSBase(CPointerBase): null_ptr_exception_class: type[GEOSException] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/collections.pyi000066400000000000000000000011341526064357400276640ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any from django.contrib.gis.geos.geometry import GEOSGeometry, LinearGeometryMixin class GeometryCollection(GEOSGeometry): def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __iter__(self) -> Iterator[GEOSGeometry]: ... def __len__(self) -> int: ... @property def coords(self) -> tuple[Any, ...]: ... @property def tuple(self) -> tuple[Any, ...]: ... class MultiPoint(GeometryCollection): ... class MultiLineString(LinearGeometryMixin, GeometryCollection): ... class MultiPolygon(GeometryCollection): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/coordseq.pyi000066400000000000000000000025341526064357400271720ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any, Self from django.contrib.gis.geos.base import GEOSBase class GEOSCoordSeq(GEOSBase): ptr_type: Any def __init__(self, ptr: Any, z: bool = ...) -> None: ... def __iter__(self) -> Iterator[tuple[float, ...]]: ... def __len__(self) -> int: ... def __getitem__(self, index: int) -> Any: ... def __setitem__(self, index: int, value: Any) -> None: ... def getOrdinate(self, dimension: int, index: int) -> float: ... def setOrdinate(self, dimension: int, index: int, value: float) -> None: ... def getX(self, index: int) -> float: ... def setX(self, index: int, value: float) -> None: ... def getY(self, index: int) -> float: ... def setY(self, index: int, value: float) -> None: ... def getZ(self, index: int) -> float: ... def setZ(self, index: int, value: float) -> None: ... def getM(self, index: int) -> float: ... def setM(self, index: int, value: float) -> None: ... @property def size(self) -> int: ... @property def dims(self) -> int: ... @property def hasz(self) -> bool: ... @property def hasm(self) -> bool: ... def clone(self) -> Self: ... @property def kml(self) -> str: ... @property def tuple(self) -> tuple[Any, ...]: ... @property def is_counterclockwise(self) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/error.pyi000066400000000000000000000000441526064357400264760ustar00rootroot00000000000000class GEOSException(Exception): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/factory.pyi000066400000000000000000000004661526064357400270240ustar00rootroot00000000000000from typing import Any, Protocol, type_check_only from django.contrib.gis.geos.geometry import GEOSGeometry @type_check_only class _Reader(Protocol): def read(self) -> str | bytes: ... def fromfile(file_h: str | _Reader) -> GEOSGeometry: ... def fromstr(string: str, **kwargs: Any) -> GEOSGeometry: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/geometry.pyi000066400000000000000000000132151526064357400272040ustar00rootroot00000000000000from typing import Any, Literal, Self, overload from django.contrib.gis.gdal import CoordTransform, SpatialReference from django.contrib.gis.gdal.geometries import OGRGeometry from django.contrib.gis.geos.base import GEOSBase from django.contrib.gis.geos.coordseq import GEOSCoordSeq from django.contrib.gis.geos.mutable_list import ListMixin from django.contrib.gis.geos.point import Point from django.contrib.gis.geos.prepared import PreparedGeometry from django.utils.deconstruct import _Deconstructible from typing_extensions import override class GEOSGeometryBase(GEOSBase): ptr_type: Any destructor: Any has_cs: bool def __init__(self, ptr: Any, cls: Any) -> None: ... def __copy__(self) -> Self: ... def __deepcopy__(self, memodict: Any) -> Self: ... @staticmethod def from_ewkt(ewkt: str) -> GEOSGeometry: ... @classmethod def from_gml(cls, gml_string: str) -> GEOSGeometry: ... @override def __eq__(self, other: object) -> bool: ... @override def __hash__(self) -> int: ... def __or__(self, other: GEOSGeometry) -> GEOSGeometry: ... def __and__(self, other: GEOSGeometry) -> GEOSGeometry: ... def __sub__(self, other: GEOSGeometry) -> GEOSGeometry: ... def __xor__(self, other: GEOSGeometry) -> GEOSGeometry: ... @property def coord_seq(self) -> GEOSCoordSeq | None: ... @property def geom_type(self) -> str: ... @property def geom_typeid(self) -> int: ... @property def num_geom(self) -> int: ... @property def num_coords(self) -> int: ... @property def num_points(self) -> int: ... @property def dims(self) -> int: ... @overload def normalize(self, clone: Literal[False] = False) -> None: ... @overload def normalize(self, clone: Literal[True]) -> Self: ... def make_valid(self) -> GEOSGeometry: ... @property def empty(self) -> bool: ... @property def hasz(self) -> bool: ... @property def hasm(self) -> bool: ... @property def ring(self) -> bool: ... @property def simple(self) -> bool: ... @property def valid(self) -> bool: ... @property def valid_reason(self) -> str: ... def contains(self, other: GEOSGeometry) -> bool: ... def covers(self, other: GEOSGeometry) -> bool: ... def crosses(self, other: GEOSGeometry) -> bool: ... def disjoint(self, other: GEOSGeometry) -> bool: ... def equals(self, other: GEOSGeometry) -> bool: ... def equals_exact(self, other: GEOSGeometry, tolerance: float = ...) -> bool: ... def equals_identical(self, other: GEOSGeometry) -> bool: ... def intersects(self, other: GEOSGeometry) -> bool: ... def overlaps(self, other: GEOSGeometry) -> bool: ... def relate_pattern(self, other: GEOSGeometry, pattern: str) -> bool: ... def touches(self, other: GEOSGeometry) -> bool: ... def within(self, other: GEOSGeometry) -> bool: ... @property def srid(self) -> int | None: ... @srid.setter def srid(self, srid: int | None) -> None: ... @property def ewkt(self) -> str: ... @property def wkt(self) -> str: ... @property def hex(self) -> bytes: ... @property def hexewkb(self) -> bytes: ... @property def json(self) -> str: ... @property def geojson(self) -> str: ... @property def wkb(self) -> memoryview: ... @property def ewkb(self) -> memoryview: ... @property def kml(self) -> str: ... @property def prepared(self) -> PreparedGeometry: ... @property def ogr(self) -> OGRGeometry: ... @property def srs(self) -> SpatialReference | None: ... @property def crs(self) -> SpatialReference | None: ... ptr: Any def transform(self, ct: CoordTransform | SpatialReference | str | int, clone: bool = ...) -> GEOSGeometry: ... @property def boundary(self) -> GEOSGeometry: ... def buffer(self, width: float, quadsegs: int = ...) -> GEOSGeometry: ... def buffer_with_style( self, width: float, quadsegs: int = ..., end_cap_style: int = ..., join_style: int = ..., mitre_limit: float = ..., ) -> GEOSGeometry: ... @property def centroid(self) -> Point: ... @property def convex_hull(self) -> GEOSGeometry: ... def difference(self, other: GEOSGeometry) -> GEOSGeometry: ... @property def envelope(self) -> GEOSGeometry: ... def intersection(self, other: GEOSGeometry) -> GEOSGeometry: ... @property def point_on_surface(self) -> Point: ... def relate(self, other: GEOSGeometry) -> str: ... def simplify(self, tolerance: float = ..., preserve_topology: bool = ...) -> GEOSGeometry: ... def sym_difference(self, other: GEOSGeometry) -> GEOSGeometry: ... @property def unary_union(self) -> GEOSGeometry: ... def union(self, other: GEOSGeometry) -> GEOSGeometry: ... @property def area(self) -> float: ... def distance(self, other: GEOSGeometry) -> float: ... @property def extent(self) -> tuple[float, float, float, float]: ... @property def length(self) -> float: ... def clone(self) -> Self: ... class LinearGeometryMixin: def interpolate(self, distance: float) -> Point: ... def interpolate_normalized(self, distance: float) -> Point: ... def project(self, point: Point) -> float: ... def project_normalized(self, point: Point) -> float: ... @property def merged(self) -> GEOSGeometry: ... @property def closed(self) -> bool: ... class GEOSGeometry(_Deconstructible, GEOSGeometryBase, ListMixin): def __init__( self, geo_input: Any, srid: int | None = ..., *, max_geom_collections: int | None = ..., ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/io.pyi000066400000000000000000000011741526064357400257610ustar00rootroot00000000000000from django.contrib.gis.geos.geometry import GEOSGeometry from django.contrib.gis.geos.prototypes.io import WKBWriter as WKBWriter from django.contrib.gis.geos.prototypes.io import WKTWriter as WKTWriter from django.contrib.gis.geos.prototypes.io import _WKBReader, _WKTReader from typing_extensions import override class WKBReader(_WKBReader): @override def read(self, wkb: bytes | str) -> GEOSGeometry: ... # type: ignore[override] class WKTReader(_WKTReader): @override def read(self, wkt: bytes | str) -> GEOSGeometry: ... # type: ignore[override] __all__ = ["WKBReader", "WKBWriter", "WKTReader", "WKTWriter"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/libgeos.pyi000066400000000000000000000015721526064357400270000ustar00rootroot00000000000000from ctypes import Structure from logging import Logger from typing import Any from django.utils.functional import cached_property logger: Logger def load_geos() -> Any: ... NOTICEFUNC: Any notice_h: Any ERRORFUNC: Any error_h: Any class GEOSGeom_t(Structure): ... class GEOSPrepGeom_t(Structure): ... class GEOSCoordSeq_t(Structure): ... class GEOSContextHandle_t(Structure): ... GEOM_PTR: Any PREPGEOM_PTR: Any CS_PTR: Any CONTEXT_PTR: Any lgeos: Any class GEOSFuncFactory: argtypes: Any restype: Any errcheck: Any func_name: Any def __init__( self, func_name: Any, *, restype: Any | None = ..., errcheck: Any | None = ..., argtypes: Any | None = ... ) -> None: ... def __call__(self, *args: Any) -> Any: ... @cached_property def func(self) -> Any: ... def geos_version() -> bytes: ... def geos_version_tuple() -> tuple[int, ...]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/linestring.pyi000066400000000000000000000013761526064357400275340ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any from django.contrib.gis.geos.geometry import GEOSGeometry, LinearGeometryMixin class LineString(LinearGeometryMixin, GEOSGeometry): has_cs: bool def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __iter__(self) -> Iterator[tuple[float, ...]]: ... def __len__(self) -> int: ... @property def coords(self) -> tuple[tuple[float, ...]]: ... @property def tuple(self) -> tuple[tuple[float, ...]]: ... @property def array(self) -> Any: ... @property def x(self) -> Any: ... @property def y(self) -> Any: ... @property def z(self) -> Any: ... class LinearRing(LineString): @property def is_counterclockwise(self) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/mutable_list.pyi000066400000000000000000000024101526064357400300300ustar00rootroot00000000000000from typing import Any, Self from typing_extensions import override class ListMixin: def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __getitem__(self, index: int | slice) -> Any: ... def __delitem__(self, index: int | slice) -> None: ... def __setitem__(self, index: int | slice, val: Any) -> None: ... def __add__(self, other: Any) -> Self: ... def __radd__(self, other: Any) -> Any: ... def __iadd__(self, other: Any) -> Self: ... def __mul__(self, n: int) -> Self: ... def __rmul__(self, n: int) -> Self: ... def __imul__(self, n: int) -> Self: ... @override def __eq__(self, other: object) -> bool: ... def __lt__(self, other: Any) -> bool: ... def __le__(self, other: Any) -> bool: ... def __gt__(self, other: Any) -> bool: ... def __ge__(self, other: Any) -> bool: ... def count(self, val: Any) -> int: ... def index(self, val: Any) -> int: ... def append(self, val: Any) -> None: ... def extend(self, vals: Any) -> None: ... def insert(self, index: int, val: Any) -> None: ... def pop(self, index: int = ...) -> Any: ... def remove(self, val: Any) -> None: ... def reverse(self) -> None: ... def sort(self, key: Any | None = ..., reverse: bool = ...) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/point.pyi000066400000000000000000000016511526064357400265030ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any from django.contrib.gis.geos.geometry import GEOSGeometry class Point(GEOSGeometry): has_cs: bool def __init__( self, x: Any | None = ..., y: Any | None = ..., z: Any | None = ..., srid: Any | None = ... ) -> None: ... def __iter__(self) -> Iterator[float]: ... def __len__(self) -> int: ... @property def x(self) -> float: ... @x.setter def x(self, value: float) -> None: ... @property def y(self) -> float: ... @y.setter def y(self, value: float) -> None: ... @property def z(self) -> float | None: ... @z.setter def z(self, value: float) -> None: ... @property def coords(self) -> tuple[float, ...]: ... @coords.setter def coords(self, tup: Any) -> None: ... @property def tuple(self) -> tuple[float, ...]: ... @tuple.setter def tuple(self, tup: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/polygon.pyi000066400000000000000000000013111526064357400270320ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any from django.contrib.gis.geos.geometry import GEOSGeometry from django.contrib.gis.geos.linestring import LinearRing class Polygon(GEOSGeometry): def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __iter__(self) -> Iterator[LinearRing]: ... def __len__(self) -> int: ... @classmethod def from_bbox(cls, bbox: tuple[float, float, float, float]) -> Polygon: ... @property def num_interior_rings(self) -> int: ... exterior_ring: LinearRing shell: LinearRing @property def coords(self) -> tuple[tuple[tuple[float, ...]]]: ... @property def tuple(self) -> tuple[tuple[tuple[float, ...]]]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prepared.pyi000066400000000000000000000013411526064357400271500ustar00rootroot00000000000000from typing import Any from .base import GEOSBase from .geometry import GEOSGeometry class PreparedGeometry(GEOSBase): ptr_type: Any destructor: Any ptr: Any def __init__(self, geom: Any) -> None: ... def contains(self, other: GEOSGeometry) -> bool: ... def contains_properly(self, other: GEOSGeometry) -> bool: ... def covers(self, other: GEOSGeometry) -> bool: ... def intersects(self, other: GEOSGeometry) -> bool: ... def crosses(self, other: GEOSGeometry) -> bool: ... def disjoint(self, other: GEOSGeometry) -> bool: ... def overlaps(self, other: GEOSGeometry) -> bool: ... def touches(self, other: GEOSGeometry) -> bool: ... def within(self, other: GEOSGeometry) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/000077500000000000000000000000001526064357400270545ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/__init__.pyi000066400000000000000000000102311526064357400313330ustar00rootroot00000000000000from django.contrib.gis.geos.prototypes.coordseq import create_cs as create_cs from django.contrib.gis.geos.prototypes.coordseq import cs_clone as cs_clone from django.contrib.gis.geos.prototypes.coordseq import cs_getdims as cs_getdims from django.contrib.gis.geos.prototypes.coordseq import cs_getordinate as cs_getordinate from django.contrib.gis.geos.prototypes.coordseq import cs_getsize as cs_getsize from django.contrib.gis.geos.prototypes.coordseq import cs_getx as cs_getx from django.contrib.gis.geos.prototypes.coordseq import cs_gety as cs_gety from django.contrib.gis.geos.prototypes.coordseq import cs_getz as cs_getz from django.contrib.gis.geos.prototypes.coordseq import cs_is_ccw as cs_is_ccw from django.contrib.gis.geos.prototypes.coordseq import cs_setordinate as cs_setordinate from django.contrib.gis.geos.prototypes.coordseq import cs_setx as cs_setx from django.contrib.gis.geos.prototypes.coordseq import cs_sety as cs_sety from django.contrib.gis.geos.prototypes.coordseq import cs_setz as cs_setz from django.contrib.gis.geos.prototypes.coordseq import get_cs as get_cs from django.contrib.gis.geos.prototypes.geom import create_collection as create_collection from django.contrib.gis.geos.prototypes.geom import create_empty_polygon as create_empty_polygon from django.contrib.gis.geos.prototypes.geom import create_linearring as create_linearring from django.contrib.gis.geos.prototypes.geom import create_linestring as create_linestring from django.contrib.gis.geos.prototypes.geom import create_point as create_point from django.contrib.gis.geos.prototypes.geom import create_polygon as create_polygon from django.contrib.gis.geos.prototypes.geom import destroy_geom as destroy_geom from django.contrib.gis.geos.prototypes.geom import geom_clone as geom_clone from django.contrib.gis.geos.prototypes.geom import geos_get_srid as geos_get_srid from django.contrib.gis.geos.prototypes.geom import geos_normalize as geos_normalize from django.contrib.gis.geos.prototypes.geom import geos_set_srid as geos_set_srid from django.contrib.gis.geos.prototypes.geom import geos_type as geos_type from django.contrib.gis.geos.prototypes.geom import geos_typeid as geos_typeid from django.contrib.gis.geos.prototypes.geom import get_dims as get_dims from django.contrib.gis.geos.prototypes.geom import get_extring as get_extring from django.contrib.gis.geos.prototypes.geom import get_geomn as get_geomn from django.contrib.gis.geos.prototypes.geom import get_intring as get_intring from django.contrib.gis.geos.prototypes.geom import get_nrings as get_nrings from django.contrib.gis.geos.prototypes.geom import get_num_coords as get_num_coords from django.contrib.gis.geos.prototypes.geom import get_num_geoms as get_num_geoms from django.contrib.gis.geos.prototypes.predicates import geos_contains as geos_contains from django.contrib.gis.geos.prototypes.predicates import geos_covers as geos_covers from django.contrib.gis.geos.prototypes.predicates import geos_crosses as geos_crosses from django.contrib.gis.geos.prototypes.predicates import geos_disjoint as geos_disjoint from django.contrib.gis.geos.prototypes.predicates import geos_equals as geos_equals from django.contrib.gis.geos.prototypes.predicates import geos_equalsexact as geos_equalsexact from django.contrib.gis.geos.prototypes.predicates import geos_hasz as geos_hasz from django.contrib.gis.geos.prototypes.predicates import geos_intersects as geos_intersects from django.contrib.gis.geos.prototypes.predicates import geos_isclosed as geos_isclosed from django.contrib.gis.geos.prototypes.predicates import geos_isempty as geos_isempty from django.contrib.gis.geos.prototypes.predicates import geos_isring as geos_isring from django.contrib.gis.geos.prototypes.predicates import geos_issimple as geos_issimple from django.contrib.gis.geos.prototypes.predicates import geos_isvalid as geos_isvalid from django.contrib.gis.geos.prototypes.predicates import geos_overlaps as geos_overlaps from django.contrib.gis.geos.prototypes.predicates import geos_relatepattern as geos_relatepattern from django.contrib.gis.geos.prototypes.predicates import geos_touches as geos_touches from django.contrib.gis.geos.prototypes.predicates import geos_within as geos_within typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/coordseq.pyi000066400000000000000000000017261526064357400314240ustar00rootroot00000000000000from typing import Any from django.contrib.gis.geos.libgeos import GEOSFuncFactory from typing_extensions import override def check_cs_op(result: Any, func: Any, cargs: Any) -> Any: ... def check_cs_get(result: Any, func: Any, cargs: Any) -> Any: ... class CsInt(GEOSFuncFactory): argtypes: Any restype: Any errcheck: Any class CsOperation(GEOSFuncFactory): restype: Any def __init__(self, *args: Any, ordinate: bool = ..., get: bool = ..., **kwargs: Any) -> None: ... class CsOutput(GEOSFuncFactory): restype: Any @staticmethod @override def errcheck(result: Any, func: Any, cargs: Any) -> Any: ... class CsUnaryPredicate(GEOSFuncFactory): argtypes: Any restype: Any errcheck: Any cs_clone: Any create_cs: Any get_cs: Any cs_getordinate: Any cs_setordinate: Any cs_getx: Any cs_gety: Any cs_getz: Any cs_getm: Any cs_setx: Any cs_sety: Any cs_setz: Any cs_setm: Any cs_getsize: Any cs_getdims: Any cs_hasm: Any cs_is_ccw: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/errcheck.pyi000066400000000000000000000007321526064357400313670ustar00rootroot00000000000000from typing import Any free: Any def last_arg_byref(args: Any) -> Any: ... def check_dbl(result: Any, func: Any, cargs: Any) -> Any: ... def check_geom(result: Any, func: Any, cargs: Any) -> Any: ... def check_minus_one(result: Any, func: Any, cargs: Any) -> Any: ... def check_predicate(result: Any, func: Any, cargs: Any) -> Any: ... def check_sized_string(result: Any, func: Any, cargs: Any) -> Any: ... def check_string(result: Any, func: Any, cargs: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/geom.pyi000066400000000000000000000014541526064357400305320ustar00rootroot00000000000000from ctypes import c_char_p from typing import Any from django.contrib.gis.geos.libgeos import GEOSFuncFactory c_uchar_p: Any class geos_char_p(c_char_p): ... class GeomOutput(GEOSFuncFactory): restype: Any errcheck: Any class IntFromGeom(GEOSFuncFactory): argtypes: Any restype: Any errcheck: Any class StringFromGeom(GEOSFuncFactory): argtypes: Any restype: Any errcheck: Any geos_normalize: Any geos_type: Any geos_typeid: Any get_dims: Any get_num_coords: Any get_num_geoms: Any create_point: Any create_linestring: Any create_linearring: Any create_polygon: Any create_empty_polygon: Any create_collection: Any get_extring: Any get_intring: Any get_nrings: Any get_geomn: Any geom_clone: Any destroy_geom: Any geos_get_srid: Any geos_set_srid: Any geos_makevalid: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/io.pyi000066400000000000000000000064401526064357400302120ustar00rootroot00000000000000import threading from ctypes import Structure from typing import Any from django.contrib.gis.geos.base import GEOSBase from django.contrib.gis.geos.libgeos import GEOSFuncFactory class WKTReader_st(Structure): ... class WKTWriter_st(Structure): ... class WKBReader_st(Structure): ... class WKBWriter_st(Structure): ... WKT_READ_PTR: Any WKT_WRITE_PTR: Any WKB_READ_PTR: Any WKB_WRITE_PTR: Any wkt_reader_create: Any wkt_reader_destroy: Any wkt_reader_read: Any wkt_writer_create: Any wkt_writer_destroy: Any wkt_writer_write: Any wkt_writer_get_outdim: Any wkt_writer_set_outdim: Any wkt_writer_set_trim: Any wkt_writer_set_precision: Any wkb_reader_create: Any wkb_reader_destroy: Any class WKBReadFunc(GEOSFuncFactory): argtypes: Any restype: Any errcheck: Any wkb_reader_read: Any wkb_reader_read_hex: Any wkb_writer_create: Any wkb_writer_destroy: Any class WKBWriteFunc(GEOSFuncFactory): argtypes: Any restype: Any errcheck: Any wkb_writer_write: Any wkb_writer_write_hex: Any class WKBWriterGet(GEOSFuncFactory): argtypes: Any restype: Any class WKBWriterSet(GEOSFuncFactory): argtypes: Any wkb_writer_get_byteorder: Any wkb_writer_set_byteorder: Any wkb_writer_get_outdim: Any wkb_writer_set_outdim: Any wkb_writer_get_include_srid: Any wkb_writer_set_include_srid: Any class IOBase(GEOSBase): ptr: Any def __init__(self) -> None: ... MAX_GEOM_COLLECTIONS: int class _WKTReader(IOBase): ptr_type: Any destructor: Any def limit(self, wkt: Any, max_geom_collections: int | None) -> None: ... def read(self, wkt: Any, max_geom_collections: int | None = ...) -> Any: ... class _WKBReader(IOBase): ptr_type: Any destructor: Any def limit_wkb(self, wkb: Any, max_geom_collections: int | None) -> None: ... def limit_hex(self, wkb: Any, max_geom_collections: int | None) -> None: ... def read(self, wkb: Any, max_geom_collections: int | None = ...) -> Any: ... def default_trim_value() -> bool: ... class WKTWriter(IOBase): ptr_type: Any destructor: Any def __init__(self, dim: int = ..., trim: bool = ..., precision: Any | None = ...) -> None: ... def write(self, geom: Any) -> Any: ... @property def outdim(self) -> Any: ... @outdim.setter def outdim(self, new_dim: Any) -> None: ... @property def trim(self) -> Any: ... @trim.setter def trim(self, flag: Any) -> None: ... @property def precision(self) -> Any: ... @precision.setter def precision(self, precision: Any) -> None: ... class WKBWriter(IOBase): ptr_type: Any destructor: Any geos_version: Any def __init__(self, dim: int = ...) -> None: ... def write(self, geom: Any) -> Any: ... def write_hex(self, geom: Any) -> Any: ... byteorder: Any @property def outdim(self) -> Any: ... @outdim.setter def outdim(self, new_dim: Any) -> None: ... @property def srid(self) -> Any: ... @srid.setter def srid(self, include: Any) -> None: ... class ThreadLocalIO(threading.local): wkt_r: Any wkt_w: Any wkb_r: Any wkb_w: Any ewkb_w: Any thread_context: Any def wkt_r() -> Any: ... def wkt_w(dim: int = ..., trim: bool = ..., precision: Any | None = ...) -> Any: ... def wkb_r() -> Any: ... def wkb_w(dim: int = ...) -> Any: ... def ewkb_w(dim: int = ...) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/misc.pyi000066400000000000000000000004671526064357400305410ustar00rootroot00000000000000from typing import Any from django.contrib.gis.geos.libgeos import GEOSFuncFactory class DblFromGeom(GEOSFuncFactory): restype: Any errcheck: Any geos_area: Any geos_distance: Any geos_length: Any geos_isvalidreason: Any __all__ = ["geos_area", "geos_distance", "geos_isvalidreason", "geos_length"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/predicates.pyi000066400000000000000000000014571526064357400317310ustar00rootroot00000000000000from typing import Any from django.contrib.gis.geos.libgeos import GEOSFuncFactory class UnaryPredicate(GEOSFuncFactory): argtypes: Any restype: Any errcheck: Any class BinaryPredicate(UnaryPredicate): argtypes: Any geos_hasz: UnaryPredicate geos_hasm: UnaryPredicate geos_isclosed: UnaryPredicate geos_isempty: UnaryPredicate geos_isring: UnaryPredicate geos_issimple: UnaryPredicate geos_isvalid: UnaryPredicate geos_contains: BinaryPredicate geos_covers: BinaryPredicate geos_crosses: BinaryPredicate geos_disjoint: BinaryPredicate geos_equals: BinaryPredicate geos_equalsexact: BinaryPredicate geos_equalsidentical: BinaryPredicate geos_intersects: BinaryPredicate geos_overlaps: BinaryPredicate geos_relatepattern: BinaryPredicate geos_touches: BinaryPredicate geos_within: BinaryPredicate typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/prepared.pyi000066400000000000000000000006621526064357400314050ustar00rootroot00000000000000from typing import Any from django.contrib.gis.geos.libgeos import GEOSFuncFactory geos_prepare: Any prepared_destroy: Any class PreparedPredicate(GEOSFuncFactory): argtypes: Any restype: Any errcheck: Any prepared_contains: Any prepared_contains_properly: Any prepared_covers: Any prepared_crosses: Any prepared_disjoint: Any prepared_intersects: Any prepared_overlaps: Any prepared_touches: Any prepared_within: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/threadsafe.pyi000066400000000000000000000007601526064357400317100ustar00rootroot00000000000000import threading from typing import Any from django.contrib.gis.geos.base import GEOSBase class GEOSContextHandle(GEOSBase): ptr_type: Any destructor: Any ptr: Any def __init__(self) -> None: ... class GEOSContext(threading.local): handle: Any thread_context: Any class GEOSFunc: cfunc: Any thread_context: Any def __init__(self, func_name: Any) -> None: ... def __call__(self, *args: Any) -> Any: ... argtypes: Any restype: Any errcheck: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/geos/prototypes/topology.pyi000066400000000000000000000011411526064357400314500ustar00rootroot00000000000000from typing import Any from django.contrib.gis.geos.libgeos import GEOSFuncFactory class Topology(GEOSFuncFactory): argtypes: Any restype: Any errcheck: Any geos_boundary: Any geos_buffer: Any geos_bufferwithstyle: Any geos_centroid: Any geos_convexhull: Any geos_difference: Any geos_envelope: Any geos_intersection: Any geos_linemerge: Any geos_pointonsurface: Any geos_preservesimplify: Any geos_simplify: Any geos_symdifference: Any geos_union: Any geos_unary_union: Any geos_relate: Any geos_project: Any geos_interpolate: Any geos_project_normalized: Any geos_interpolate_normalized: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/management/000077500000000000000000000000001526064357400260035ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/management/__init__.pyi000066400000000000000000000000001526064357400302530ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/management/commands/000077500000000000000000000000001526064357400276045ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/management/commands/__init__.pyi000066400000000000000000000000001526064357400320540ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/management/commands/inspectdb.pyi000066400000000000000000000006231526064357400323030ustar00rootroot00000000000000from typing import Any from django.core.management.commands.inspectdb import Command as InspectDBCommand from django.db.backends.base.base import BaseDatabaseWrapper from typing_extensions import override class Command(InspectDBCommand): @override def get_field_type( self, connection: BaseDatabaseWrapper, table_name: str, row: Any ) -> tuple[str, dict[str, Any], list[str]]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/management/commands/ogrinspect.pyi000066400000000000000000000015611526064357400325070ustar00rootroot00000000000000from argparse import Action, ArgumentParser, Namespace from collections.abc import Sequence from typing import Any from django.core.management.base import BaseCommand from typing_extensions import override class LayerOptionAction(Action): @override def __call__( self, parser: ArgumentParser, namespace: Namespace, value: str | Sequence[Any] | None, option_string: str | None = None, ) -> None: ... class ListOptionAction(Action): @override def __call__( self, parser: ArgumentParser, namespace: Namespace, value: str | Sequence[Any] | None, option_string: str | None = None, ) -> None: ... class Command(BaseCommand): @override def add_arguments(self, parser: ArgumentParser) -> None: ... @override def handle(self, *args: Any, **options: Any) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/measure.pyi000066400000000000000000000030171526064357400260540ustar00rootroot00000000000000from decimal import Decimal from typing import Any, Self, TypeAlias from typing_extensions import override _NUMERIC_TYPES: TypeAlias = int | float | Decimal class MeasureBase: STANDARD_UNIT: str | None UNITS: dict[str, float] ALIAS: dict[str, str] LALIAS: dict[str, str] def __init__(self, default_unit: str | None = None, **kwargs: Any) -> None: ... standard: Any def __getattr__(self, name: str) -> float: ... @override def __eq__(self, other: object) -> bool: ... def __lt__(self, other: Self) -> bool: ... def __le__(self, other: Self) -> bool: ... def __gt__(self, other: Self) -> bool: ... def __ge__(self, other: Self) -> bool: ... def __add__(self, other: Self) -> Self: ... def __iadd__(self, other: Self) -> Self: ... def __sub__(self, other: Self) -> Self: ... def __isub__(self, other: Self) -> Self: ... def __mul__(self, other: _NUMERIC_TYPES) -> Any: ... def __imul__(self, other: _NUMERIC_TYPES) -> Self: ... def __rmul__(self, other: Any) -> Self: ... def __truediv__(self, other: _NUMERIC_TYPES) -> Self: ... def __itruediv__(self, other: _NUMERIC_TYPES) -> Self: ... def __bool__(self) -> bool: ... def default_units(self, kwargs: dict[str, Any]) -> tuple[float, str]: ... @classmethod def unit_attname(cls, unit_str: str) -> str: ... class Distance(MeasureBase): STANDARD_UNIT: str class Area(MeasureBase): STANDARD_UNIT: str D: TypeAlias = Distance A: TypeAlias = Area __all__ = ["A", "Area", "D", "Distance"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/ptr.pyi000066400000000000000000000003741526064357400252230ustar00rootroot00000000000000from typing import Any class CPointerBase: ptr_type: Any destructor: Any null_ptr_exception_class: Any @property def ptr(self) -> Any: ... @ptr.setter def ptr(self, ptr: Any) -> None: ... def __del__(self) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/serializers/000077500000000000000000000000001526064357400262235ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/serializers/__init__.pyi000066400000000000000000000000001526064357400304730ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/serializers/geojson.pyi000066400000000000000000000011321526064357400304070ustar00rootroot00000000000000from typing import Any from django.core.serializers.json import Serializer as JSONSerializer from typing_extensions import override class Serializer(JSONSerializer): @override def start_serialization(self) -> None: ... @override def end_serialization(self) -> None: ... geometry_field: Any @override def start_object(self, obj: Any) -> None: ... @override def get_dump_object(self, obj: Any) -> Any: ... @override def handle_field(self, obj: Any, field: Any) -> None: ... class Deserializer: def __init__(self, *args: Any, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/shortcuts.pyi000066400000000000000000000003641526064357400264530ustar00rootroot00000000000000from typing import Any from django.http.response import HttpResponse def compress_kml(kml: str) -> bytes: ... def render_to_kml(*args: Any, **kwargs: Any) -> HttpResponse: ... def render_to_kmz(*args: Any, **kwargs: Any) -> HttpResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/sitemaps/000077500000000000000000000000001526064357400255145ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/sitemaps/__init__.pyi000066400000000000000000000002621526064357400277760ustar00rootroot00000000000000from django.contrib.gis.sitemaps.kml import KMLSitemap as KMLSitemap from django.contrib.gis.sitemaps.kml import KMZSitemap as KMZSitemap __all__ = ["KMLSitemap", "KMZSitemap"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/sitemaps/kml.pyi000066400000000000000000000006201526064357400270200ustar00rootroot00000000000000from typing import Any from django.contrib.sitemaps import Sitemap from typing_extensions import override class KMLSitemap(Sitemap[Any]): geo_format: str locations: Any def __init__(self, locations: Any | None = ...) -> None: ... @override def items(self) -> Any: ... @override def location(self, obj: Any) -> Any: ... class KMZSitemap(KMLSitemap): geo_format: str typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/sitemaps/views.pyi000066400000000000000000000005401526064357400273730ustar00rootroot00000000000000from django.http import HttpRequest, HttpResponse def kml( request: HttpRequest, label: str, model: str, field_name: str | None = ..., compress: bool = ..., using: str = ..., ) -> HttpResponse: ... def kmz( request: HttpRequest, label: str, model: str, field_name: str | None = ..., using: str = ... ) -> HttpResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/utils/000077500000000000000000000000001526064357400250275ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/utils/__init__.pyi000066400000000000000000000010261526064357400273100ustar00rootroot00000000000000from django.contrib.gis.utils.layermapping import LayerMapError as LayerMapError from django.contrib.gis.utils.layermapping import LayerMapping as LayerMapping from django.contrib.gis.utils.ogrinfo import ogrinfo as ogrinfo from django.contrib.gis.utils.ogrinspect import mapping as mapping from django.contrib.gis.utils.ogrinspect import ogrinspect as ogrinspect from django.contrib.gis.utils.srs import add_srs_entry as add_srs_entry __all__ = ["LayerMapError", "LayerMapping", "add_srs_entry", "mapping", "ogrinfo", "ogrinspect"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/utils/layermapping.pyi000066400000000000000000000051071526064357400302450ustar00rootroot00000000000000from collections.abc import Mapping from pathlib import Path from typing import Any, Protocol, type_check_only from django.contrib.gis.gdal import DataSource, OGRGeomType from django.contrib.gis.gdal.field import Field as OGRField from django.contrib.gis.gdal.layer import Layer from django.db.backends.base.operations import BaseDatabaseOperations from django.db.models import Field, Model class LayerMapError(Exception): ... class InvalidString(LayerMapError): ... class InvalidDecimal(LayerMapError): ... class InvalidInteger(LayerMapError): ... class MissingForeignKey(LayerMapError): ... @type_check_only class _Writer(Protocol): def write(self, s: str, /) -> Any: ... class LayerMapping: MULTI_TYPES: dict[int, OGRGeomType] FIELD_TYPES: dict[Field[Any, Any], OGRField | tuple[OGRField, ...]] ds: DataSource layer: Layer using: str spatial_backend: BaseDatabaseOperations mapping: Mapping[str, str] model: type[Model] geo_field: Any source_srs: Any transform: Any encoding: str | None unique: list[str] | tuple[str, ...] | str | None transaction_mode: Any transaction_decorator: Any def __init__( self, model: type[Model], data: str | Path | DataSource, mapping: Mapping[str, str], layer: int = ..., source_srs: Any | None = ..., encoding: str = ..., transaction_mode: str = ..., transform: bool = ..., unique: list[str] | tuple[str, ...] | str | None = ..., using: str | None = ..., ) -> None: ... def check_fid_range(self, fid_range: Any) -> Any: ... geom_field: str fields: dict[str, Field[Any, Any]] coord_dim: int def check_layer(self) -> Any: ... def check_srs(self, source_srs: Any) -> Any: ... def check_unique(self, unique: Any) -> None: ... def feature_kwargs(self, feat: Any) -> Any: ... def unique_kwargs(self, kwargs: Any) -> Any: ... def verify_ogr_field(self, ogr_field: Any, model_field: Any) -> Any: ... def verify_fk(self, feat: Any, rel_model: Any, rel_mapping: Any) -> Any: ... def verify_geom(self, geom: Any, model_field: Any) -> Any: ... def coord_transform(self) -> Any: ... def geometry_field(self) -> Any: ... def make_multi(self, geom_type: Any, model_field: Any) -> Any: ... def save( self, verbose: bool = ..., fid_range: bool | tuple[int, int] | list[int] | slice = ..., step: bool | int = ..., progress: bool | int = ..., silent: bool = ..., stream: _Writer = ..., strict: bool = ..., ) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/utils/ogrinfo.pyi000066400000000000000000000002011526064357400272060ustar00rootroot00000000000000from django.contrib.gis.gdal import DataSource def ogrinfo(data_source: str | DataSource, num_features: int = ...) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/utils/ogrinspect.pyi000066400000000000000000000005001526064357400277220ustar00rootroot00000000000000from typing import Any from django.contrib.gis.gdal import DataSource def mapping( data_source: str | DataSource, geom_name: str = ..., layer_key: int | str = ..., multi_geom: bool = ... ) -> dict[str, str]: ... def ogrinspect(data_source: str | DataSource, model_name: str, *args: Any, **kwargs: Any) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/utils/srs.pyi000066400000000000000000000003071526064357400263610ustar00rootroot00000000000000from typing import Any def add_srs_entry( srs: Any, auth_name: str = ..., auth_srid: Any | None = ..., ref_sys_name: Any | None = ..., database: Any | None = ..., ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/gis/views.pyi000066400000000000000000000003121526064357400255430ustar00rootroot00000000000000from django.contrib.gis.feeds import Feed from django.http import HttpRequest, HttpResponse def feed(request: HttpRequest, url: str, feed_dict: dict[str, type[Feed]] | None = ...) -> HttpResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/humanize/000077500000000000000000000000001526064357400247255ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/humanize/__init__.pyi000066400000000000000000000000001526064357400271750ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/humanize/apps.pyi000066400000000000000000000002001526064357400264030ustar00rootroot00000000000000from typing import Any from django.apps import AppConfig class HumanizeConfig(AppConfig): name: str verbose_name: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/humanize/templatetags/000077500000000000000000000000001526064357400274175ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/humanize/templatetags/__init__.pyi000066400000000000000000000000001526064357400316670ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/humanize/templatetags/humanize.pyi000066400000000000000000000015561526064357400317710ustar00rootroot00000000000000from collections.abc import Callable from datetime import date, datetime from typing import Any, SupportsInt from django import template register: template.Library def ordinal(value: str | SupportsInt | None) -> str | None: ... def intcomma(value: str | SupportsInt | None, use_l10n: bool = True) -> str: ... intword_converters: tuple[tuple[int, Callable[[int], str]], ...] def intword(value: str | SupportsInt | None) -> int | str | None: ... def apnumber(value: str | SupportsInt | None) -> int | str | None: ... def naturalday(value: date | str | None, arg: str | None = None) -> str | None: ... def naturaltime(value: datetime) -> str: ... class NaturalTimeFormatter: time_strings: dict[str, str] past_substrings: dict[str, str] future_substrings: dict[str, str] @classmethod def string_for(cls: type[NaturalTimeFormatter], value: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/000077500000000000000000000000001526064357400247145ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/__init__.pyi000066400000000000000000000012621526064357400271770ustar00rootroot00000000000000from .api import MessageFailure as MessageFailure from .api import add_message as add_message from .api import debug as debug from .api import error as error from .api import get_level as get_level from .api import get_messages as get_messages from .api import info as info from .api import set_level as set_level from .api import success as success from .api import warning as warning from .constants import DEBUG as DEBUG from .constants import DEFAULT_LEVELS as DEFAULT_LEVELS from .constants import DEFAULT_TAGS as DEFAULT_TAGS from .constants import ERROR as ERROR from .constants import INFO as INFO from .constants import SUCCESS as SUCCESS from .constants import WARNING as WARNING typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/api.pyi000066400000000000000000000027061526064357400262150ustar00rootroot00000000000000from typing import Any from django.contrib.messages.storage.base import BaseStorage from django.http.request import HttpRequest from django.utils.functional import _StrOrPromise class MessageFailure(Exception): ... def add_message( request: HttpRequest | None, level: int, message: _StrOrPromise, extra_tags: str = "", fail_silently: bool | str = False, ) -> None: ... def get_messages(request: HttpRequest) -> list[Any] | BaseStorage: ... def get_level(request: HttpRequest) -> int: ... def set_level(request: HttpRequest, level: int) -> bool: ... def debug( request: HttpRequest, message: _StrOrPromise, extra_tags: str = "", fail_silently: bool | str = False, ) -> None: ... def info( request: HttpRequest, message: _StrOrPromise, extra_tags: str = "", fail_silently: bool | str = False, ) -> None: ... def success( request: HttpRequest, message: _StrOrPromise, extra_tags: str = "", fail_silently: bool | str = False, ) -> None: ... def warning( request: HttpRequest, message: _StrOrPromise, extra_tags: str = "", fail_silently: bool | str = False, ) -> None: ... def error( request: HttpRequest, message: _StrOrPromise, extra_tags: str = "", fail_silently: bool | str = False, ) -> None: ... __all__ = ( "MessageFailure", "add_message", "debug", "error", "get_level", "get_messages", "info", "set_level", "success", "warning", ) typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/apps.pyi000066400000000000000000000003011526064357400263740ustar00rootroot00000000000000from typing import Any from django.apps import AppConfig def update_level_tags(setting: str, **kwargs: Any) -> None: ... class MessagesConfig(AppConfig): name: str verbose_name: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/constants.pyi000066400000000000000000000001701526064357400274510ustar00rootroot00000000000000DEBUG: int INFO: int SUCCESS: int WARNING: int ERROR: int DEFAULT_TAGS: dict[int, str] DEFAULT_LEVELS: dict[str, int] typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/context_processors.pyi000066400000000000000000000003411526064357400314030ustar00rootroot00000000000000from typing import Any from django.contrib.messages.storage.base import BaseStorage from django.http.request import HttpRequest def messages(request: HttpRequest) -> dict[str, dict[str, int] | list[Any] | BaseStorage]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/middleware.pyi000066400000000000000000000005351526064357400275570ustar00rootroot00000000000000from django.http.request import HttpRequest from django.http.response import HttpResponse from django.utils.deprecation import MiddlewareMixin class MessageMiddleware(MiddlewareMixin): def process_request(self, request: HttpRequest) -> None: ... def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/storage/000077500000000000000000000000001526064357400263605ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/storage/__init__.pyi000066400000000000000000000002501526064357400306370ustar00rootroot00000000000000from django.contrib.messages.storage.base import BaseStorage from django.http.request import HttpRequest def default_storage(request: HttpRequest) -> BaseStorage: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/storage/base.pyi000066400000000000000000000016121526064357400300150ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any from django.http.request import HttpRequest from django.http.response import HttpResponseBase LEVEL_TAGS: Any class Message: level: int message: str extra_tags: str def __init__(self, level: int, message: str, extra_tags: str | None = None) -> None: ... @property def tags(self) -> str: ... @property def level_tag(self) -> str: ... class BaseStorage: request: HttpRequest used: bool added_new: bool def __init__(self, request: HttpRequest, *args: Any, **kwargs: Any) -> None: ... def __len__(self) -> int: ... def __iter__(self) -> Iterator[Message]: ... def __contains__(self, item: Any) -> bool: ... def update(self, response: HttpResponseBase) -> list[Message] | None: ... def add(self, level: int, message: str, extra_tags: str | None = "") -> None: ... level: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/storage/cookie.pyi000066400000000000000000000022031526064357400303510ustar00rootroot00000000000000import json from collections.abc import Callable, Sequence from typing import Any from django.contrib.messages.storage.base import BaseStorage from typing_extensions import override class MessageEncoder(json.JSONEncoder): allow_nan: bool check_circular: bool ensure_ascii: bool skipkeys: bool sort_keys: bool message_key: str @override def default(self, obj: Any) -> Any: ... class MessageDecoder(json.JSONDecoder): def process_messages(self, obj: Any) -> Any: ... @override def decode(self, s: str, **kwargs: Any) -> Any: ... # type: ignore[override] class MessagePartSerializer: def dumps(self, obj: Any) -> Sequence[str]: ... class MessagePartGatherSerializer: def dumps(self, obj: Any) -> bytes: ... class MessageSerializer: def loads(self, data: bytes | bytearray) -> Any: ... class CookieStorage(BaseStorage): cookie_name: str max_cookie_size: int not_finished: str not_finished_json: str key_salt: str def bisect_keep_left(a: list[int], fn: Callable[[list[int]], bool]) -> int: ... def bisect_keep_right(a: list[int], fn: Callable[[list[int]], bool]) -> int: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/storage/fallback.pyi000066400000000000000000000003441526064357400306430ustar00rootroot00000000000000from typing import Any from django.contrib.messages.storage.base import BaseStorage class FallbackStorage(BaseStorage): storage_classes: Any storages: Any def __init__(self, *args: Any, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/storage/session.pyi000066400000000000000000000007241526064357400305710ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any from django.contrib.messages.storage.base import BaseStorage from django.http.request import HttpRequest class SessionStorage(BaseStorage): session_key: str def __init__(self, request: HttpRequest, *args: Any, **kwargs: Any) -> None: ... def serialize_messages(self, messages: Sequence[Any]) -> str: ... def deserialize_messages(self, data: list[Any] | str | None) -> list[Any] | None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/test.pyi000066400000000000000000000004621526064357400264200ustar00rootroot00000000000000from typing import Any from django.contrib.messages.storage.base import BaseStorage from django.http.response import HttpResponse class MessagesTestMixin: def assertMessages( self, response: HttpResponse, expected_messages: list[Any] | BaseStorage, *, ordered: bool = True ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/utils.pyi000066400000000000000000000000541526064357400265760ustar00rootroot00000000000000def get_level_tags() -> dict[int, str]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/messages/views.pyi000066400000000000000000000007101526064357400265720ustar00rootroot00000000000000from typing import Generic from django.forms.forms import BaseForm from django.http.response import HttpResponse from django.utils.functional import _StrOrPromise from typing_extensions import TypeVar _F = TypeVar("_F", bound=BaseForm) class SuccessMessageMixin(Generic[_F]): success_message: _StrOrPromise def form_valid(self, form: _F) -> HttpResponse: ... def get_success_message(self, cleaned_data: dict[str, str]) -> _StrOrPromise: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/000077500000000000000000000000001526064357400247535ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/__init__.pyi000066400000000000000000000000001526064357400272230ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/aggregates/000077500000000000000000000000001526064357400270645ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/aggregates/__init__.pyi000066400000000000000000000015401526064357400313460ustar00rootroot00000000000000from .general import ArrayAgg as ArrayAgg from .general import BitAnd as BitAnd from .general import BitOr as BitOr from .general import BitXor as BitXor from .general import BoolAnd as BoolAnd from .general import BoolOr as BoolOr from .general import JSONBAgg as JSONBAgg from .general import StringAgg as StringAgg from .statistics import Corr as Corr from .statistics import CovarPop as CovarPop from .statistics import RegrAvgX as RegrAvgX from .statistics import RegrAvgY as RegrAvgY from .statistics import RegrCount as RegrCount from .statistics import RegrIntercept as RegrIntercept from .statistics import RegrR2 as RegrR2 from .statistics import RegrSlope as RegrSlope from .statistics import RegrSXX as RegrSXX from .statistics import RegrSXY as RegrSXY from .statistics import RegrSYY as RegrSYY from .statistics import StatAggregate as StatAggregate typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/aggregates/general.pyi000066400000000000000000000067371526064357400312410ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any, ClassVar, Self from django.contrib.postgres.fields import ArrayField from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Aggregate, BooleanField, JSONField, TextField from django.db.models.expressions import BaseExpression, Combinable from django.db.models.query import _OrderByFieldName from django.db.models.query_utils import Q from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import deprecated, override from .mixins import OrderableAggMixin class ArrayAgg(OrderableAggMixin, Aggregate): @property @override def output_field(self) -> ArrayField[Any, Any]: ... @override def resolve_expression( self, query: Any = ..., allow_joins: bool = ..., reuse: set[str] | None = ..., summarize: bool = ..., for_save: bool = ..., ) -> Self: ... @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override] class BitAnd(Aggregate): @override @deprecated( "The PostgreSQL-specific BitAnd function is deprecated. Use django.db.models.aggregates.BitAnd instead." ) def __init__(self, expression: Any, **extra: Any) -> None: ... class BitOr(Aggregate): @override @deprecated("The PostgreSQL-specific BitOr function is deprecated. Use django.db.models.aggregates.BitOr instead.") def __init__(self, expression: Any, **extra: Any) -> None: ... class BitXor(Aggregate): @override @deprecated( "The PostgreSQL-specific BitXor function is deprecated. Use django.db.models.aggregates.BitXor instead." ) def __init__(self, expression: Any, **extra: Any) -> None: ... class BoolAnd(Aggregate): output_field: ClassVar[BooleanField[Any, Any]] class BoolOr(Aggregate): output_field: ClassVar[BooleanField[Any, Any]] class JSONBAgg(OrderableAggMixin, Aggregate): output_field: ClassVar[JSONField[Any, Any]] @override def resolve_expression( self, query: Any = ..., allow_joins: bool = ..., reuse: set[str] | None = ..., summarize: bool = ..., for_save: bool = ..., ) -> Self: ... @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override] class StringAgg(OrderableAggMixin, Aggregate): output_field: ClassVar[TextField[Any, Any]] @deprecated( "The PostgreSQL specific StringAgg function is deprecated. Use django.db.models.aggregates.StringAgg instead." ) def __init__( self, expression: BaseExpression | Combinable | str, delimiter: Any, *, distinct: bool = False, filter: Q | BaseExpression | None = None, default: Any | None = None, ordering: _OrderByFieldName | Sequence[_OrderByFieldName] = ..., order_by: _OrderByFieldName | Sequence[_OrderByFieldName] = ..., **extra: Any, ) -> None: ... @override def resolve_expression( self, query: Any = ..., allow_joins: bool = ..., reuse: set[str] | None = ..., summarize: bool = ..., for_save: bool = ..., ) -> Self: ... @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override] __all__ = ["ArrayAgg", "BitAnd", "BitOr", "BitXor", "BoolAnd", "BoolOr", "JSONBAgg", "StringAgg"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/aggregates/mixins.pyi000066400000000000000000000003361526064357400311200ustar00rootroot00000000000000from typing import Any, ClassVar from typing_extensions import override class OrderableAggMixin: allow_order_by: ClassVar[bool] @override def __init_subclass__(cls, /, *args: Any, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/aggregates/statistics.pyi000066400000000000000000000021641526064357400320040ustar00rootroot00000000000000from typing import Any, ClassVar from django.db.models import Aggregate, FloatField, IntegerField class StatAggregate(Aggregate): output_field: ClassVar[FloatField[Any, Any]] def __init__( self, y: Any, x: Any, output_field: Any | None = ..., filter: Any | None = ..., default: Any | None = ... ) -> None: ... class Corr(StatAggregate): ... class CovarPop(StatAggregate): def __init__( self, y: Any, x: Any, sample: bool = ..., filter: Any | None = ..., default: Any | None = ... ) -> None: ... class RegrAvgX(StatAggregate): ... class RegrAvgY(StatAggregate): ... class RegrCount(StatAggregate): output_field: ClassVar[IntegerField[Any, Any]] # type: ignore[assignment] class RegrIntercept(StatAggregate): ... class RegrR2(StatAggregate): ... class RegrSlope(StatAggregate): ... class RegrSXX(StatAggregate): ... class RegrSXY(StatAggregate): ... class RegrSYY(StatAggregate): ... __all__ = [ "Corr", "CovarPop", "RegrAvgX", "RegrAvgY", "RegrCount", "RegrIntercept", "RegrR2", "RegrSXX", "RegrSXY", "RegrSYY", "RegrSlope", "StatAggregate", ] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/apps.pyi000066400000000000000000000005031526064357400264370ustar00rootroot00000000000000from typing import Any from django.apps import AppConfig from typing_extensions import override RANGE_TYPES: Any def uninstall_if_needed(setting: Any, value: Any, enter: Any, **kwargs: Any) -> None: ... class PostgresConfig(AppConfig): name: str verbose_name: Any @override def ready(self) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/constraints.pyi000066400000000000000000000030421526064357400300440ustar00rootroot00000000000000from collections.abc import Iterable, Sequence from django.core.checks import CheckMessage from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Deferrable from django.db.models.base import Model from django.db.models.constraints import BaseConstraint from django.db.models.expressions import Combinable from django.db.models.indexes import IndexExpression from django.db.models.query_utils import Q from django.utils.functional import _StrOrPromise from typing_extensions import override from .utils import CheckPostgresInstalledMixin class ExclusionConstraintExpression(IndexExpression): ... class ExclusionConstraint(CheckPostgresInstalledMixin, BaseConstraint): template: str expressions: Sequence[tuple[str | Combinable, str]] index_type: str condition: Q | None def __init__( self, *, name: str, expressions: Sequence[tuple[str | Combinable, str]], index_type: str | None = None, condition: Q | None = None, deferrable: Deferrable | None = None, include: list[str] | tuple[str, ...] | None = None, violation_error_code: str | None = None, violation_error_message: _StrOrPromise | None = None, ) -> None: ... @override def check(self, model: type[Model], connection: BaseDatabaseWrapper) -> list[CheckMessage]: ... @override def validate( self, model: type[Model], instance: Model, exclude: Iterable[str] | None = None, using: str = "default" ) -> None: ... __all__ = ["ExclusionConstraint"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/expressions.pyi000066400000000000000000000010251526064357400300560ustar00rootroot00000000000000from typing import Any from django.contrib.postgres.fields import ArrayField from django.db.models import Subquery from django.db.models.query import QuerySet from django.db.models.sql.query import Query from django.utils.functional import cached_property from typing_extensions import override class ArraySubquery(Subquery): template: str def __init__(self, queryset: Query | QuerySet[Any] | Subquery, **kwargs: Any) -> None: ... @cached_property @override def output_field(self) -> ArrayField[Any, Any]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/000077500000000000000000000000001526064357400262215ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/__init__.pyi000066400000000000000000000013221526064357400305010ustar00rootroot00000000000000from .array import ArrayField as ArrayField from .citext import CICharField as CICharField from .citext import CIEmailField as CIEmailField from .citext import CITextField as CITextField from .hstore import HStoreField as HStoreField from .jsonb import JSONField as JSONField from .ranges import BigIntegerRangeField as BigIntegerRangeField from .ranges import DateRangeField as DateRangeField from .ranges import DateTimeRangeField as DateTimeRangeField from .ranges import DecimalRangeField as DecimalRangeField from .ranges import IntegerRangeField as IntegerRangeField from .ranges import RangeBoundary as RangeBoundary from .ranges import RangeField as RangeField from .ranges import RangeOperators as RangeOperators typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/array.pyi000066400000000000000000000054561526064357400300740ustar00rootroot00000000000000from collections.abc import Iterable, Sequence from typing import Any, ClassVar from _typeshed import Unused from django.contrib.postgres.utils import CheckPostgresInstalledMixin from django.core.checks import CheckMessage from django.core.validators import _ValidatorCallable from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Field from django.db.models.expressions import Combinable, Expression from django.db.models.fields import NOT_PROVIDED, _ErrorMessagesDict, _ErrorMessagesMapping from django.db.models.fields.mixins import CheckFieldDefaultMixin from django.db.models.lookups import Transform from django.db.models.sql.compiler import _AsSqlType from django.utils.choices import _Choices from django.utils.functional import _StrOrPromise from typing_extensions import TypeVar, override # __set__ value type _ST = TypeVar("_ST", contravariant=True) # __get__ return type _GT = TypeVar("_GT", covariant=True) class ArrayField(CheckPostgresInstalledMixin, CheckFieldDefaultMixin, Field[_ST, _GT]): _pyi_private_set_type: Sequence[Any] | Combinable _pyi_private_get_type: list[Any] empty_strings_allowed: bool default_error_messages: ClassVar[_ErrorMessagesDict] base_field: Field[Any, Any] size: int | None default_validators: list[_ValidatorCallable] from_db_value: Any def __init__( self, base_field: Field[Any, Any], size: int | None = None, *, verbose_name: _StrOrPromise | None = ..., name: str | None = ..., primary_key: bool = ..., max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _Choices | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., ) -> None: ... @override def check(self, **kwargs: Any) -> list[CheckMessage]: ... @property @override def description(self) -> str: ... # type: ignore[override] @override def cast_db_type(self, connection: BaseDatabaseWrapper) -> str: ... def get_placeholder_sql(self, value: Unused, compiler: Unused, connection: BaseDatabaseWrapper) -> _AsSqlType: ... @override def get_transform(self, name: str) -> type[Transform] | None: ... __all__ = ["ArrayField"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/citext.pyi000066400000000000000000000006461526064357400302520ustar00rootroot00000000000000from django.db.models.fields import CharField, EmailField, TextField from typing_extensions import TypeVar # __set__ value type _ST = TypeVar("_ST", contravariant=True) # __get__ return type _GT = TypeVar("_GT", covariant=True) class CICharField(CharField[_ST, _GT]): ... class CIEmailField(EmailField[_ST, _GT]): ... class CITextField(TextField[_ST, _GT]): ... __all__ = ["CICharField", "CIEmailField", "CITextField"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/hstore.pyi000066400000000000000000000023361526064357400302540ustar00rootroot00000000000000from typing import Any, ClassVar from django.contrib.postgres.fields.array import ArrayField from django.contrib.postgres.utils import CheckPostgresInstalledMixin from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Field, TextField, Transform from django.db.models.fields.mixins import CheckFieldDefaultMixin from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override class HStoreField(CheckPostgresInstalledMixin, CheckFieldDefaultMixin, Field[Any, Any]): @override def get_transform(self, name: str) -> Any: ... class KeyTransform(Transform): output_field: ClassVar[TextField[Any, Any]] def __init__(self, key_name: str, *args: Any, **kwargs: Any) -> None: ... @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override] class KeyTransformFactory: def __init__(self, key_name: str) -> None: ... def __call__(self, *args: Any, **kwargs: Any) -> KeyTransform: ... class KeysTransform(Transform): output_field: ClassVar[ArrayField[Any, Any]] class ValuesTransform(Transform): output_field: ClassVar[ArrayField[Any, Any]] __all__ = ["HStoreField"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/jsonb.pyi000066400000000000000000000001741526064357400300610ustar00rootroot00000000000000from django.db.models import JSONField as BuiltinJSONField class JSONField(BuiltinJSONField): ... __all__ = ["JSONField"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/ranges.pyi000066400000000000000000000076761526064357400302430ustar00rootroot00000000000000from typing import Any, ClassVar, Literal from _typeshed import Unused from django.contrib.postgres import forms from django.contrib.postgres.utils import CheckPostgresInstalledMixin from django.db import models from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.lookups import PostgresOperatorLookup from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from psycopg2.extras import DateRange, DateTimeTZRange, NumericRange, Range # type: ignore[import-untyped] from typing_extensions import TypeVar, override class RangeBoundary(models.Expression): lower: str upper: str def __init__(self, inclusive_lower: bool = True, inclusive_upper: bool = False) -> None: ... class RangeOperators: EQUAL: Literal["="] NOT_EQUAL: Literal["<>"] CONTAINS: Literal["@>"] CONTAINED_BY: Literal["<@"] OVERLAPS: Literal["&&"] FULLY_LT: Literal["<<"] FULLY_GT: Literal[">>"] NOT_LT: Literal["&>"] NOT_GT: Literal["&<"] ADJACENT_TO: Literal["-|-"] _RangeT = TypeVar("_RangeT", bound=Range[Any]) class RangeField(CheckPostgresInstalledMixin, models.Field[Any, _RangeT]): empty_strings_allowed: bool base_field: type[models.Field[Any, Any]] range_type: type[_RangeT] def get_placeholder_sql(self, value: Unused, compiler: Unused, connection: BaseDatabaseWrapper) -> _AsSqlType: ... @override def get_prep_value(self, value: Any) -> Any | None: ... @override def to_python(self, value: Any) -> Any: ... @override def value_to_string(self, obj: models.Model) -> str | None: ... # type: ignore[override] class ContinuousRangeField(RangeField[_RangeT]): default_bounds: str def __init__(self, *args: Any, default_bounds: str = "[)", **kwargs: Any) -> None: ... class IntegerRangeField(RangeField[NumericRange]): base_field: type[models.IntegerField[Any, Any]] form_field: type[forms.IntegerRangeField] class BigIntegerRangeField(RangeField[NumericRange]): base_field: type[models.BigIntegerField[Any, Any]] form_field: type[forms.IntegerRangeField] class DecimalRangeField(ContinuousRangeField[NumericRange]): base_field: type[models.DecimalField[Any, Any]] form_field: type[forms.DecimalRangeField] class DateTimeRangeField(ContinuousRangeField[DateTimeTZRange]): base_field: type[models.DateTimeField[Any, Any]] form_field: type[forms.DateTimeRangeField] class DateRangeField(RangeField[DateRange]): base_field: type[models.DateField[Any, Any]] form_field: type[forms.DateRangeField] class DateTimeRangeContains(PostgresOperatorLookup): ... class RangeContainedBy(PostgresOperatorLookup): type_mapping: dict[str, str] @override def process_lhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override] class FullyLessThan(PostgresOperatorLookup): ... class FullGreaterThan(PostgresOperatorLookup): ... class NotLessThan(PostgresOperatorLookup): ... class NotGreaterThan(PostgresOperatorLookup): ... class AdjacentToLookup(PostgresOperatorLookup): ... class RangeStartsWith(models.Transform): @property @override def output_field(self) -> models.Field[Any, Any]: ... class RangeEndsWith(models.Transform): @property @override def output_field(self) -> models.Field[Any, Any]: ... class IsEmpty(models.Transform): output_field: ClassVar[models.BooleanField[Any, Any]] class LowerInclusive(models.Transform): output_field: ClassVar[models.BooleanField[Any, Any]] class LowerInfinite(models.Transform): output_field: ClassVar[models.BooleanField[Any, Any]] class UpperInclusive(models.Transform): output_field: ClassVar[models.BooleanField[Any, Any]] class UpperInfinite(models.Transform): output_field: ClassVar[models.BooleanField[Any, Any]] __all__ = [ "BigIntegerRangeField", "DateRangeField", "DateTimeRangeField", "DecimalRangeField", "IntegerRangeField", "RangeBoundary", "RangeField", "RangeOperators", ] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/fields/utils.pyi000066400000000000000000000001521526064357400301020ustar00rootroot00000000000000from typing import Any class AttributeSetter: def __init__(self, name: Any, value: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/forms/000077500000000000000000000000001526064357400261015ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/forms/__init__.pyi000066400000000000000000000011341526064357400303620ustar00rootroot00000000000000from .array import SimpleArrayField as SimpleArrayField from .array import SplitArrayField as SplitArrayField from .array import SplitArrayWidget as SplitArrayWidget from .hstore import HStoreField as HStoreField from .ranges import BaseRangeField as BaseRangeField from .ranges import DateRangeField as DateRangeField from .ranges import DateTimeRangeField as DateTimeRangeField from .ranges import DecimalRangeField as DecimalRangeField from .ranges import HiddenRangeWidget as HiddenRangeWidget from .ranges import IntegerRangeField as IntegerRangeField from .ranges import RangeWidget as RangeWidget typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/forms/array.pyi000066400000000000000000000050271526064357400277460ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any, ClassVar from django import forms from django.db.models.fields import _ErrorMessagesDict from django.forms.fields import _ClassLevelWidgetT from django.forms.utils import _DataT, _FilesT from django.forms.widgets import _OptAttrs from typing_extensions import override from ..utils import prefix_validation_error as prefix_validation_error class SimpleArrayField(forms.CharField): default_error_messages: ClassVar[_ErrorMessagesDict] base_field: forms.Field delimiter: str min_length: int | None max_length: int | None def __init__( self, base_field: forms.Field, *, delimiter: str = ",", max_length: int | None = None, min_length: int | None = None, **kwargs: Any, ) -> None: ... @override def clean(self, value: Any) -> Sequence[Any]: ... @override def prepare_value(self, value: Any) -> Any: ... @override def to_python(self, value: Any) -> Sequence[Any]: ... # type: ignore[override] @override def validate(self, value: Sequence[Any]) -> None: ... @override def run_validators(self, value: Sequence[Any]) -> None: ... @override def has_changed(self, initial: Any, data: Any) -> bool: ... class SplitArrayWidget(forms.Widget): template_name: str widget: _ClassLevelWidgetT size: int def __init__(self, widget: forms.Widget | type[forms.Widget], size: int, **kwargs: Any) -> None: ... @property @override def is_hidden(self) -> bool: ... @override def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ... @override def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ... @override def id_for_label(self, id_: str) -> str: ... @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None = None) -> dict[str, Any]: ... @property @override def needs_multipart_form(self) -> bool: ... # type: ignore[override] class SplitArrayField(forms.Field): default_error_messages: ClassVar[_ErrorMessagesDict] base_field: forms.Field size: int remove_trailing_nulls: bool def __init__( self, base_field: forms.Field, size: int, *, remove_trailing_nulls: bool = False, **kwargs: Any ) -> None: ... @override def to_python(self, value: Any) -> Sequence[Any]: ... @override def clean(self, value: Any) -> Sequence[Any]: ... @override def has_changed(self, initial: Any, data: Any) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/forms/hstore.pyi000066400000000000000000000011361526064357400301310ustar00rootroot00000000000000from typing import Any, ClassVar from django import forms from django.db.models.fields import _ErrorMessagesDict from django.forms.fields import _ClassLevelWidgetT from typing_extensions import override class HStoreField(forms.CharField): widget: _ClassLevelWidgetT default_error_messages: ClassVar[_ErrorMessagesDict] @override def prepare_value(self, value: Any) -> Any: ... @override def to_python(self, value: Any) -> dict[str, str | None]: ... # type: ignore[override] @override def has_changed(self, initial: Any, data: Any) -> bool: ... __all__ = ["HStoreField"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/forms/ranges.pyi000066400000000000000000000035031526064357400301040ustar00rootroot00000000000000from typing import Any, ClassVar from django import forms from django.db.models.fields import _ErrorMessagesDict from django.forms.widgets import MultiWidget, _OptAttrs from psycopg2.extras import Range # type: ignore [import-untyped] from typing_extensions import override class RangeWidget(MultiWidget): def __init__(self, base_widget: forms.Widget | type[forms.Widget], attrs: _OptAttrs | None = None) -> None: ... @override def decompress(self, value: Any) -> tuple[Any | None, Any | None]: ... class HiddenRangeWidget(RangeWidget): def __init__(self, attrs: _OptAttrs | None = None) -> None: ... class BaseRangeField(forms.MultiValueField): default_error_messages: ClassVar[_ErrorMessagesDict] base_field: type[forms.Field] range_type: type[Range] hidden_widget: type[forms.Widget] def __init__(self, **kwargs: Any) -> None: ... @override def prepare_value(self, value: Any) -> Any: ... @override def compress(self, values: tuple[Any | None, Any | None]) -> Range | None: ... class IntegerRangeField(BaseRangeField): default_error_messages: ClassVar[_ErrorMessagesDict] base_field: type[forms.Field] range_type: type[Range] class DecimalRangeField(BaseRangeField): default_error_messages: ClassVar[_ErrorMessagesDict] base_field: type[forms.Field] range_type: type[Range] class DateTimeRangeField(BaseRangeField): default_error_messages: ClassVar[_ErrorMessagesDict] base_field: type[forms.Field] range_type: type[Range] class DateRangeField(BaseRangeField): default_error_messages: ClassVar[_ErrorMessagesDict] base_field: type[forms.Field] range_type: type[Range] __all__ = [ "BaseRangeField", "DateRangeField", "DateTimeRangeField", "DecimalRangeField", "HiddenRangeWidget", "IntegerRangeField", "RangeWidget", ] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/functions.pyi000066400000000000000000000003701526064357400275060ustar00rootroot00000000000000from typing import Any, ClassVar from django.db.models import DateTimeField, Func, UUIDField class RandomUUID(Func): output_field: ClassVar[UUIDField[Any, Any]] class TransactionNow(Func): output_field: ClassVar[DateTimeField[Any, Any]] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/indexes.pyi000066400000000000000000000102551526064357400271400ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.backends.ddl_references import Statement from django.db.models import Func, Index, Model from django.db.models.expressions import BaseExpression, Combinable from django.db.models.query_utils import Q from django.utils.datastructures import _ListOrTuple from django.utils.functional import cached_property from typing_extensions import override class PostgresIndex(Index): @override @cached_property def max_name_length(self) -> int: ... # type: ignore[override] @override def create_sql( self, model: type[Model], schema_editor: BaseDatabaseSchemaEditor, using: str = "", **kwargs: Any ) -> Statement: ... def check_supported(self, schema_editor: BaseDatabaseSchemaEditor) -> None: ... def get_with_params(self) -> Sequence[str]: ... class BloomIndex(PostgresIndex): def __init__( self, *expressions: BaseExpression | Combinable | str, length: int | None = None, columns: _ListOrTuple[int] = (), fields: Sequence[str] = ..., name: str | None = ..., db_tablespace: str | None = ..., opclasses: Sequence[str] = ..., condition: Q | None = ..., include: Sequence[str] | None = ..., ) -> None: ... class BrinIndex(PostgresIndex): def __init__( self, *expressions: BaseExpression | Combinable | str, autosummarize: bool | None = None, pages_per_range: int | None = None, fields: Sequence[str] = ..., name: str | None = ..., db_tablespace: str | None = ..., opclasses: Sequence[str] = ..., condition: Q | None = ..., include: Sequence[str] | None = ..., ) -> None: ... class BTreeIndex(PostgresIndex): def __init__( self, *expressions: BaseExpression | Combinable | str, fillfactor: int | None = None, deduplicate_items: bool | None = None, fields: Sequence[str] = ..., name: str | None = ..., db_tablespace: str | None = ..., opclasses: Sequence[str] = ..., condition: Q | None = ..., include: Sequence[str] | None = ..., ) -> None: ... class GinIndex(PostgresIndex): def __init__( self, *expressions: BaseExpression | Combinable | str, fastupdate: bool | None = None, gin_pending_list_limit: int | None = None, fields: Sequence[str] = ..., name: str | None = ..., db_tablespace: str | None = ..., opclasses: Sequence[str] = ..., condition: Q | None = ..., include: Sequence[str] | None = ..., ) -> None: ... class GistIndex(PostgresIndex): def __init__( self, *expressions: BaseExpression | Combinable | str, buffering: bool | None = None, fillfactor: int | None = None, fields: Sequence[str] = ..., name: str | None = ..., db_tablespace: str | None = ..., opclasses: Sequence[str] = ..., condition: Q | None = ..., include: Sequence[str] | None = ..., ) -> None: ... class HashIndex(PostgresIndex): def __init__( self, *expressions: BaseExpression | Combinable | str, fillfactor: int | None = None, fields: Sequence[str] = ..., name: str | None = ..., db_tablespace: str | None = ..., opclasses: Sequence[str] = ..., condition: Q | None = ..., include: Sequence[str] | None = ..., ) -> None: ... class SpGistIndex(PostgresIndex): def __init__( self, *expressions: BaseExpression | Combinable | str, fillfactor: int | None = None, fields: Sequence[str] = ..., name: str | None = ..., db_tablespace: str | None = ..., opclasses: Sequence[str] = ..., condition: Q | None = ..., include: Sequence[str] | None = ..., ) -> None: ... class OpClass(Func): def __init__( self, expression: BaseExpression | Combinable | str, name: str, ) -> None: ... __all__ = ["BTreeIndex", "BloomIndex", "BrinIndex", "GinIndex", "GistIndex", "HashIndex", "SpGistIndex"] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/lookups.pyi000066400000000000000000000016421526064357400271750ustar00rootroot00000000000000from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Transform from django.db.models.lookups import PostgresOperatorLookup from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override from .search import SearchVectorExact class DataContains(PostgresOperatorLookup): ... class ContainedBy(PostgresOperatorLookup): ... class Overlap(PostgresOperatorLookup): ... class HasKey(PostgresOperatorLookup): ... class HasKeys(PostgresOperatorLookup): ... class HasAnyKeys(HasKeys): ... class Unaccent(Transform): ... class SearchLookup(SearchVectorExact): @override def process_lhs(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override] class TrigramSimilar(PostgresOperatorLookup): ... class TrigramWordSimilar(PostgresOperatorLookup): ... class TrigramStrictWordSimilar(PostgresOperatorLookup): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/operations.pyi000066400000000000000000000044401526064357400276630ustar00rootroot00000000000000from typing import Any from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.migrations import AddConstraint, AddIndex, RemoveIndex from django.db.migrations.operations.base import Operation class CreateExtension(Operation): name: str hints: dict[str, Any] def __init__(self, name: str, hints: dict[str, Any] | None = None) -> None: ... def extension_exists(self, schema_editor: BaseDatabaseSchemaEditor, extension: str) -> bool: ... class BloomExtension(CreateExtension): def __init__(self, hints: dict[str, Any] | None = None) -> None: ... class BtreeGinExtension(CreateExtension): def __init__(self, hints: dict[str, Any] | None = None) -> None: ... class BtreeGistExtension(CreateExtension): def __init__(self, hints: dict[str, Any] | None = None) -> None: ... class CITextExtension(CreateExtension): def __init__(self, hints: dict[str, Any] | None = None) -> None: ... class CryptoExtension(CreateExtension): def __init__(self, hints: dict[str, Any] | None = None) -> None: ... class HStoreExtension(CreateExtension): def __init__(self, hints: dict[str, Any] | None = None) -> None: ... class TrigramExtension(CreateExtension): def __init__(self, hints: dict[str, Any] | None = None) -> None: ... class UnaccentExtension(CreateExtension): def __init__(self, hints: dict[str, Any] | None = None) -> None: ... class NotInTransactionMixin: def _ensure_not_in_transaction(self, schema_editor: BaseDatabaseSchemaEditor) -> None: ... class AddIndexConcurrently(NotInTransactionMixin, AddIndex): ... class RemoveIndexConcurrently(NotInTransactionMixin, RemoveIndex): ... class CollationOperation(Operation): name: str locale: str provider: str deterministic: bool def __init__(self, name: str, locale: str, *, provider: str = "libc", deterministic: bool = True) -> None: ... def create_collation(self, schema_editor: BaseDatabaseSchemaEditor) -> None: ... def remove_collation(self, schema_editor: BaseDatabaseSchemaEditor) -> None: ... class CreateCollation(CollationOperation): ... class RemoveCollation(CollationOperation): ... class AddConstraintNotValid(AddConstraint): ... class ValidateConstraint(Operation): model_name: str name: str def __init__(self, model_name: str, name: str) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/search.pyi000066400000000000000000000145451526064357400267540ustar00rootroot00000000000000import re from typing import Any, ClassVar, Self, TypeAlias from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Expression, Field, FloatField, TextField from django.db.models.expressions import Combinable, CombinedExpression, Func, Value from django.db.models.lookups import Lookup from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from psycopg.adapt import Dumper from typing_extensions import TypeVar, override from .utils import CheckPostgresInstalledMixin _Expression: TypeAlias = str | Combinable | SearchQueryCombinable # __set__ value type _ST = TypeVar("_ST", contravariant=True) # __get__ return type _GT = TypeVar("_GT", covariant=True) class UTF8Dumper(Dumper): @override def dump(self, obj: object) -> bytes: ... def quote_lexeme(value: str) -> str: ... spec_chars_re: re.Pattern[str] multiple_spaces_re: re.Pattern[str] def normalize_spaces(val: str) -> str | None: ... def psql_escape(query: str) -> str | None: ... class SearchVectorExact(Lookup): @override def process_rhs(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... @override def as_sql(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class SearchVectorField(CheckPostgresInstalledMixin, Field[_ST, _GT]): ... class SearchQueryField(CheckPostgresInstalledMixin, Field[_ST, _GT]): ... class SearchConfig(Expression): config: _Expression | None def __init__(self, config: _Expression) -> None: ... @classmethod def from_parameter(cls, config: _Expression | None) -> SearchConfig: ... class SearchVectorCombinable: ADD: str class SearchVector(SearchVectorCombinable, Func): config: _Expression | None function: str arg_joiner: str output_field: ClassVar[SearchVectorField[Any, Any]] def __init__( self, *expressions: _Expression, config: _Expression | None = None, weight: Any | None = None ) -> None: ... @override def as_sql( # type: ignore[override] self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, function: str | None = None, template: str | None = None, ) -> _AsSqlType: ... class CombinedSearchVector(SearchVectorCombinable, CombinedExpression): def __init__( self, lhs: Combinable, connector: str, rhs: Combinable, config: _Expression | None, output_field: Field[Any, Any] | None = None, ) -> None: ... class SearchQueryCombinable: BITAND: str BITOR: str def __or__(self, other: SearchQueryCombinable) -> Self: ... def __ror__(self, other: SearchQueryCombinable) -> Self: ... def __and__(self, other: SearchQueryCombinable) -> Self: ... def __rand__(self, other: SearchQueryCombinable) -> Self: ... class SearchQuery(SearchQueryCombinable, Func): # type: ignore[misc] output_field: ClassVar[SearchQueryField[Any, Any]] SEARCH_TYPES: dict[str, str] def __init__( self, value: _Expression, output_field: Field[Any, Any] | None = None, *, config: _Expression | None = None, invert: bool = False, search_type: str = "plain", ) -> None: ... @override def as_sql( # type: ignore[override] self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, function: str | None = None, template: str | None = None, ) -> _AsSqlType: ... @override def __invert__(self) -> Self: ... # type: ignore[override] class CombinedSearchQuery(SearchQueryCombinable, CombinedExpression): # type: ignore[misc] def __init__( self, lhs: Combinable, connector: str, rhs: Combinable, config: _Expression | None, output_field: Field[Any, Any] | None = None, ) -> None: ... class SearchRank(Func): output_field: ClassVar[FloatField[Any, Any]] def __init__( self, vector: SearchVector | _Expression, query: SearchQuery | _Expression, weights: Any | None = None, normalization: Any | None = None, cover_density: bool = False, ) -> None: ... class SearchHeadline(Func): function: str template: str output_field: ClassVar[TextField[Any, Any]] def __init__( self, expression: _Expression, query: _Expression, *, config: _Expression | None = None, start_sel: Any | None = None, stop_sel: Any | None = None, max_words: int | None = None, min_words: int | None = None, short_word: str | None = None, highlight_all: bool | None = None, max_fragments: int | None = None, fragment_delimiter: str | None = None, ) -> None: ... @override def as_sql( # type: ignore[override] self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, function: str | None = None, template: str | None = None, ) -> _AsSqlType: ... class TrigramBase(Func): output_field: ClassVar[FloatField[Any, Any]] def __init__(self, expression: _Expression, string: str, **extra: Any) -> None: ... class TrigramWordBase(Func): output_field: ClassVar[FloatField[Any, Any]] def __init__(self, string: str, expression: _Expression, **extra: Any) -> None: ... class TrigramSimilarity(TrigramBase): ... class TrigramDistance(TrigramBase): ... class TrigramWordDistance(TrigramWordBase): ... class TrigramStrictWordDistance(TrigramWordBase): ... class TrigramWordSimilarity(TrigramWordBase): ... class TrigramStrictWordSimilarity(TrigramWordBase): ... class LexemeCombinable: BITAND: str BITOR: str def __or__(self, other: LexemeCombinable) -> CombinedLexeme: ... def __ror__(self, other: LexemeCombinable) -> CombinedLexeme: ... def __and__(self, other: LexemeCombinable) -> CombinedLexeme: ... def __rand__(self, other: LexemeCombinable) -> CombinedLexeme: ... class Lexeme(LexemeCombinable, Value): # type: ignore[misc] def __init__( self, value: Any, output_field: Any | None = None, *, invert: bool = False, prefix: bool = False, weight: Any | None = None, ) -> None: ... @override def __invert__(self) -> Self: ... # type: ignore[override] class CombinedLexeme(LexemeCombinable, CombinedExpression): # type: ignore[misc] @override def __invert__(self) -> Self: ... # type: ignore[override] typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/serializers.pyi000066400000000000000000000003151526064357400300310ustar00rootroot00000000000000from django.db.migrations.serializer import BaseSerializer from typing_extensions import override class RangeSerializer(BaseSerializer): @override def serialize(self) -> tuple[str, set[str]]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/signals.pyi000066400000000000000000000005771526064357400271470ustar00rootroot00000000000000from typing import Any def get_type_oids(connection_alias: str, type_name: str) -> tuple[tuple[Any, ...], tuple[Any, ...]]: ... def get_hstore_oids(connection_alias: str) -> tuple[tuple[Any, ...], tuple[Any, ...]]: ... def get_citext_oids(connection_alias: str) -> tuple[tuple[Any, ...], tuple[Any, ...]]: ... def register_type_handlers(connection: Any, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/utils.pyi000066400000000000000000000006321526064357400266370ustar00rootroot00000000000000from typing import Any from django.core.checks import CheckMessage from django.core.exceptions import ValidationError def prefix_validation_error(error: Any, prefix: Any, code: Any, params: Any) -> ValidationError: ... class CheckPostgresInstalledMixin: def _check_postgres_installed(self, *args: Any) -> list[CheckMessage]: ... def check(self, *args: Any, **kwargs: Any) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/postgres/validators.pyi000066400000000000000000000013241526064357400276460ustar00rootroot00000000000000from collections.abc import Iterable, Mapping from typing import Any from django.core.validators import MaxLengthValidator, MaxValueValidator, MinLengthValidator, MinValueValidator from django.utils.deconstruct import _Deconstructible class ArrayMaxLengthValidator(MaxLengthValidator): ... class ArrayMinLengthValidator(MinLengthValidator): ... class KeysValidator(_Deconstructible): messages: dict[str, str] strict: bool def __init__( self, keys: Iterable[str], strict: bool = False, messages: Mapping[str, str] | None = None ) -> None: ... def __call__(self, value: Any) -> None: ... class RangeMaxValueValidator(MaxValueValidator): ... class RangeMinValueValidator(MinValueValidator): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/000077500000000000000000000000001526064357400250715ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/__init__.pyi000066400000000000000000000000001526064357400273410ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/admin.pyi000066400000000000000000000004401526064357400267020ustar00rootroot00000000000000from typing import Any, ClassVar from django.contrib import admin from django.contrib.redirects.models import Redirect class RedirectAdmin(admin.ModelAdmin[Redirect]): list_display: Any list_filter: ClassVar[Any] search_fields: ClassVar[Any] radio_fields: ClassVar[Any] typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/apps.pyi000066400000000000000000000002011526064357400265500ustar00rootroot00000000000000from typing import Any from django.apps import AppConfig class RedirectsConfig(AppConfig): name: str verbose_name: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/middleware.pyi000066400000000000000000000007301526064357400277310ustar00rootroot00000000000000from typing import ClassVar from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseRedirectBase from django.utils.deprecation import MiddlewareMixin class RedirectFallbackMiddleware(MiddlewareMixin): response_gone_class: ClassVar[type[HttpResponse]] response_redirect_class: ClassVar[type[HttpResponseRedirectBase]] def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/migrations/000077500000000000000000000000001526064357400272455ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/migrations/__init__.pyi000066400000000000000000000000001526064357400315150ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/redirects/models.pyi000066400000000000000000000005121526064357400270750ustar00rootroot00000000000000from django.contrib.sites.models import Site from django.db import models from django.db.models.expressions import Combinable class Redirect(models.Model): site: models.ForeignKey[Site | Combinable, Site] old_path: models.CharField[str | int | Combinable, str] new_path: models.CharField[str | int | Combinable, str] typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/000077500000000000000000000000001526064357400247535ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/__init__.pyi000066400000000000000000000000001526064357400272230ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/apps.pyi000066400000000000000000000002001526064357400264310ustar00rootroot00000000000000from typing import Any from django.apps import AppConfig class SessionsConfig(AppConfig): name: str verbose_name: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/000077500000000000000000000000001526064357400265255ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/__init__.pyi000066400000000000000000000000001526064357400307750ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/base.pyi000066400000000000000000000104061526064357400301630ustar00rootroot00000000000000from _collections_abc import dict_items, dict_keys, dict_values from collections.abc import Iterable from datetime import datetime, timedelta from typing import Any, overload from _typeshed import SupportsKeysAndGetItem from typing_extensions import override VALID_KEY_CHARS: Any class CreateError(Exception): ... class UpdateError(Exception): ... class SessionBase(dict[str, Any]): TEST_COOKIE_NAME: str TEST_COOKIE_VALUE: str accessed: bool modified: bool serializer: Any def __init__(self, session_key: str | None = None) -> None: ... async def aset(self, key: str, value: Any) -> None: ... def __bool__(self) -> bool: ... @property def key_salt(self) -> str: ... @overload # type: ignore[override] def get(self, key: str) -> Any | None: ... @overload @override def get(self, key: str, default: Any) -> Any: ... @overload async def aget(self, key: str) -> Any | None: ... @overload async def aget(self, key: str, default: Any) -> Any: ... @overload @override def pop(self, key: str) -> Any: ... @overload @override def pop(self, key: str, default: Any) -> Any: ... @overload async def apop(self, key: str) -> Any: ... @overload async def apop(self, key: str, default: Any) -> Any: ... @override def setdefault(self, key: str, value: Any) -> Any: ... # type: ignore[override] async def asetdefault(self, key: str, value: Any) -> Any: ... def set_test_cookie(self) -> None: ... async def aset_test_cookie(self) -> None: ... def test_cookie_worked(self) -> bool: ... async def atest_cookie_worked(self) -> bool: ... def delete_test_cookie(self) -> None: ... async def adelete_test_cookie(self) -> None: ... def encode(self, session_dict: dict[str, Any]) -> str: ... def decode(self, session_data: bytes | str) -> dict[str, Any]: ... @overload # type: ignore[override] def update(self, dict_: SupportsKeysAndGetItem[str, Any]) -> None: ... @overload @override def update(self, dict_: Iterable[tuple[str, Any]]) -> None: ... @overload async def aupdate(self, dict_: SupportsKeysAndGetItem[str, Any]) -> None: ... @overload async def aupdate(self, dict_: Iterable[tuple[str, Any]]) -> None: ... def has_key(self, key: Any) -> bool: ... async def ahas_key(self, key: Any) -> bool: ... async def akeys(self) -> dict_keys[str, Any]: ... async def avalues(self) -> dict_values[str, Any]: ... async def aitems(self) -> dict_items[str, Any]: ... @override def clear(self) -> None: ... def is_empty(self) -> bool: ... def _get_session_key(self) -> str | None: ... def _set_session_key(self, value: str | None) -> None: ... @property def session_key(self) -> str | None: ... @property def _session_key(self) -> str | None: ... @_session_key.setter def _session_key(self, value: str | None) -> None: ... def get_session_cookie_age(self) -> int: ... def get_expiry_age(self, **kwargs: Any) -> int: ... async def aget_expiry_age(self, **kwargs: Any) -> int: ... def get_expiry_date(self, **kwargs: Any) -> datetime: ... async def aget_expiry_date(self, **kwargs: Any) -> datetime: ... def set_expiry(self, value: datetime | timedelta | int | None) -> None: ... async def aset_expiry(self, value: datetime | timedelta | int | None) -> None: ... def get_expire_at_browser_close(self) -> bool: ... async def aget_expire_at_browser_close(self) -> bool: ... def flush(self) -> None: ... async def aflush(self) -> None: ... def cycle_key(self) -> None: ... async def acycle_key(self) -> None: ... def exists(self, session_key: str) -> bool: ... async def aexists(self, session_key: str) -> bool: ... def create(self) -> None: ... async def acreate(self) -> None: ... def save(self, must_create: bool = False) -> None: ... async def asave(self, must_create: bool = False) -> None: ... def delete(self, session_key: str | None = None) -> None: ... async def adelete(self, session_key: str | None = None) -> None: ... def load(self) -> dict[str, Any]: ... async def aload(self) -> dict[str, Any]: ... @classmethod def clear_expired(cls) -> None: ... @classmethod async def aclear_expired(cls) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/cache.pyi000066400000000000000000000005041526064357400303120ustar00rootroot00000000000000from typing import Any from django.contrib.sessions.backends.base import SessionBase KEY_PREFIX: str class SessionStore(SessionBase): cache_key_prefix: Any def __init__(self, session_key: str | None = None) -> None: ... @property def cache_key(self) -> str: ... async def acache_key(self) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/cached_db.pyi000066400000000000000000000005651526064357400311320ustar00rootroot00000000000000from logging import Logger from typing import Any from django.contrib.sessions.backends.db import SessionStore as DBStore KEY_PREFIX: str logger: Logger class SessionStore(DBStore): cache_key_prefix: Any def __init__(self, session_key: str | None = None) -> None: ... @property def cache_key(self) -> str: ... async def acache_key(self) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/db.pyi000066400000000000000000000013161526064357400276360ustar00rootroot00000000000000from typing import Any, Generic from django.contrib.sessions.backends.base import SessionBase from django.contrib.sessions.base_session import AbstractBaseSession from django.utils.functional import cached_property from typing_extensions import TypeVar _ST = TypeVar("_ST", bound=AbstractBaseSession, default=AbstractBaseSession) class SessionStore(SessionBase, Generic[_ST]): def __init__(self, session_key: str | None = None) -> None: ... @classmethod def get_model_class(cls) -> type[_ST]: ... @cached_property def model(self) -> type[_ST]: ... def create_model_instance(self, data: dict[str, Any]) -> _ST: ... async def acreate_model_instance(self, data: dict[str, Any]) -> _ST: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/file.pyi000066400000000000000000000003171526064357400301700ustar00rootroot00000000000000from django.contrib.sessions.backends.base import SessionBase class SessionStore(SessionBase): storage_path: str file_prefix: str def __init__(self, session_key: str | None = None) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/backends/signed_cookies.pyi000066400000000000000000000004561526064357400322420ustar00rootroot00000000000000from django.contrib.sessions.backends.base import SessionBase from typing_extensions import override class SessionStore(SessionBase): @override def exists(self, session_key: str | None = None) -> bool: ... @override async def aexists(self, session_key: str | None = None) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/base_session.pyi000066400000000000000000000020621526064357400301530ustar00rootroot00000000000000import datetime as dt from typing import Any, ClassVar, Self from django.contrib.sessions.backends.base import SessionBase from django.db import models from django.db.models.expressions import Combinable from typing_extensions import TypeVar _T = TypeVar("_T", bound=AbstractBaseSession) class BaseSessionManager(models.Manager[_T]): def encode(self, session_dict: dict[str, Any]) -> str: ... def save(self, session_key: str, session_dict: dict[str, Any], expire_date: dt.datetime) -> _T: ... class AbstractBaseSession(models.Model): session_key: models.CharField[str | int | Combinable, str] session_data: models.TextField[str | Combinable, str] expire_date: models.DateTimeField[str | dt.datetime | dt.date | Combinable, dt.datetime] objects: ClassVar[BaseSessionManager[Self]] class Meta: abstract: ClassVar[bool] verbose_name: ClassVar[str] verbose_name_plural: ClassVar[str] @classmethod def get_session_store_class(cls) -> type[SessionBase] | None: ... def get_decoded(self) -> dict[str, Any]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/exceptions.pyi000066400000000000000000000003221526064357400276540ustar00rootroot00000000000000from django.core.exceptions import BadRequest, SuspiciousOperation class InvalidSessionKey(SuspiciousOperation): ... class SuspiciousSession(SuspiciousOperation): ... class SessionInterrupted(BadRequest): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/management/000077500000000000000000000000001526064357400270675ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/management/__init__.pyi000066400000000000000000000000001526064357400313370ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/management/commands/000077500000000000000000000000001526064357400306705ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/management/commands/__init__.pyi000066400000000000000000000000001526064357400331400ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/management/commands/clearsessions.pyi000066400000000000000000000003201526064357400342630ustar00rootroot00000000000000from typing import Any from django.core.management.base import BaseCommand from typing_extensions import override class Command(BaseCommand): @override def handle(self, **options: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/middleware.pyi000066400000000000000000000006771526064357400276250ustar00rootroot00000000000000from django.contrib.sessions.backends.base import SessionBase from django.http.request import HttpRequest from django.http.response import HttpResponse from django.utils.deprecation import MiddlewareMixin class SessionMiddleware(MiddlewareMixin): SessionStore: type[SessionBase] def process_request(self, request: HttpRequest) -> None: ... def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/migrations/000077500000000000000000000000001526064357400271275ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/migrations/__init__.pyi000066400000000000000000000000001526064357400313770ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/models.pyi000066400000000000000000000003751526064357400267660ustar00rootroot00000000000000from django.contrib.sessions.base_session import AbstractBaseSession, BaseSessionManager from typing_extensions import TypeVar _T = TypeVar("_T", bound=Session) class SessionManager(BaseSessionManager[_T]): ... class Session(AbstractBaseSession): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sessions/serializers.pyi000066400000000000000000000002231526064357400300270ustar00rootroot00000000000000from typing import TypeAlias from django.core.signing import JSONSerializer as BaseJSONSerializer JSONSerializer: TypeAlias = BaseJSONSerializer typeddjango-django-stubs-fa03b48/django-stubs/contrib/sitemaps/000077500000000000000000000000001526064357400247325ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sitemaps/__init__.pyi000066400000000000000000000034351526064357400272210ustar00rootroot00000000000000from collections.abc import Iterable, Mapping, Sequence from datetime import datetime from typing import Any, Generic from django.contrib.sites.models import Site from django.contrib.sites.requests import RequestSite from django.core.paginator import Paginator from django.db.models.base import Model from django.db.models.query import QuerySet from typing_extensions import TypeVar, override _ItemT = TypeVar("_ItemT") class Sitemap(Generic[_ItemT]): limit: int protocol: str | None i18n: bool languages: Sequence[str] | None alternates: bool x_default: bool def items(self) -> Iterable[_ItemT]: ... def location(self, item: _ItemT) -> str: ... @property def paginator(self) -> Paginator[_ItemT]: ... def get_languages_for_item(self, item: _ItemT) -> list[str]: ... def get_protocol(self, protocol: str | None = None) -> str: ... def get_domain(self, site: Site | RequestSite | None = None) -> str: ... def get_urls( self, page: int | str = 1, site: Site | RequestSite | None = None, protocol: str | None = None ) -> list[dict[str, Any]]: ... def get_latest_lastmod(self) -> datetime | None: ... _ModelT = TypeVar("_ModelT", bound=Model) class GenericSitemap(Sitemap[_ModelT]): priority: float | None changefreq: str | None queryset: QuerySet[_ModelT] date_field: str | None protocol: str | None def __init__( self, info_dict: Mapping[str, datetime | QuerySet[_ModelT] | str], priority: float | None = None, changefreq: str | None = None, protocol: str | None = None, ) -> None: ... @override def items(self) -> QuerySet[_ModelT]: ... def lastmod(self, item: _ModelT) -> datetime | None: ... @override def get_latest_lastmod(self) -> datetime | None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sitemaps/apps.pyi000066400000000000000000000002001526064357400264100ustar00rootroot00000000000000from typing import Any from django.apps import AppConfig class SiteMapsConfig(AppConfig): name: str verbose_name: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/sitemaps/views.pyi000066400000000000000000000015561526064357400266210ustar00rootroot00000000000000from collections.abc import Callable from dataclasses import dataclass from typing import Any from django.contrib.sitemaps import Sitemap from django.http.request import HttpRequest from django.template.response import TemplateResponse from typing_extensions import TypeVar _C = TypeVar("_C", bound=Callable[..., Any]) @dataclass class SitemapIndexItem: location: str last_mod: bool | None = ... def x_robots_tag(func: _C) -> _C: ... def index( request: HttpRequest, sitemaps: dict[str, type[Sitemap[Any]] | Sitemap[Any]], template_name: str = ..., content_type: str = ..., sitemap_url_name: str = ..., ) -> TemplateResponse: ... def sitemap( request: HttpRequest, sitemaps: dict[str, type[Sitemap[Any]] | Sitemap[Any]], section: str | None = ..., template_name: str = ..., content_type: str = ..., ) -> TemplateResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/000077500000000000000000000000001526064357400242345ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/__init__.pyi000066400000000000000000000000001526064357400265040ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/admin.pyi000066400000000000000000000003211526064357400260430ustar00rootroot00000000000000from typing import Any, ClassVar from django.contrib import admin from django.contrib.sites.models import Site class SiteAdmin(admin.ModelAdmin[Site]): list_display: Any search_fields: ClassVar[Any] typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/apps.pyi000066400000000000000000000001051526064357400257160ustar00rootroot00000000000000from django.apps import AppConfig class SitesConfig(AppConfig): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/checks.pyi000066400000000000000000000003551526064357400262220ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage def check_site_id(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/management.pyi000066400000000000000000000004461526064357400270770ustar00rootroot00000000000000from typing import Any from django.apps.config import AppConfig from django.apps.registry import Apps def create_default_site( app_config: AppConfig, verbosity: int = 2, interactive: bool = True, using: str = "default", apps: Apps = ..., **kwargs: Any, ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/managers.pyi000066400000000000000000000003351526064357400265550ustar00rootroot00000000000000from django.db import models from typing_extensions import TypeVar _T = TypeVar("_T", bound=models.Model) class CurrentSiteManager(models.Manager[_T]): def __init__(self, field_name: str | None = None) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/middleware.pyi000066400000000000000000000003211526064357400270700ustar00rootroot00000000000000from django.http.request import HttpRequest from django.utils.deprecation import MiddlewareMixin class CurrentSiteMiddleware(MiddlewareMixin): def process_request(self, request: HttpRequest) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/migrations/000077500000000000000000000000001526064357400264105ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/migrations/__init__.pyi000066400000000000000000000000001526064357400306600ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/models.pyi000066400000000000000000000012521526064357400262420ustar00rootroot00000000000000from typing import Any, ClassVar from django.db import models from django.db.models.expressions import Combinable from django.http.request import HttpRequest SITE_CACHE: Any class SiteManager(models.Manager[Site]): def get_current(self, request: HttpRequest | None = ...) -> Site: ... def clear_cache(self) -> None: ... def get_by_natural_key(self, domain: str) -> Site: ... class Site(models.Model): objects: ClassVar[SiteManager] domain: models.CharField[str | int | Combinable, str] name: models.CharField[str | int | Combinable, str] def natural_key(self) -> tuple[str]: ... def clear_site_cache(sender: type[Site], **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/requests.pyi000066400000000000000000000005731526064357400266370ustar00rootroot00000000000000from typing import NoReturn from django.db.models.base import ModelBase from django.http.request import HttpRequest class RequestSite: name: str domain: str def __init__(self, request: HttpRequest) -> None: ... def save(self, force_insert: bool | tuple[ModelBase, ...] = False, force_update: bool = False) -> NoReturn: ... def delete(self) -> NoReturn: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/sites/shortcuts.pyi000066400000000000000000000003351526064357400270160ustar00rootroot00000000000000from django.contrib.sites.models import Site from django.contrib.sites.requests import RequestSite from django.http.request import HttpRequest def get_current_site(request: HttpRequest | None) -> Site | RequestSite: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/000077500000000000000000000000001526064357400254175ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/__init__.pyi000066400000000000000000000000001526064357400276670ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/apps.pyi000066400000000000000000000001701526064357400271030ustar00rootroot00000000000000from typing import Any from django.apps import AppConfig class StaticFilesConfig(AppConfig): ignore_patterns: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/checks.pyi000066400000000000000000000005521526064357400274040ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage, Error E005: Error def check_finders(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_storages(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/finders.pyi000066400000000000000000000040601526064357400275740ustar00rootroot00000000000000from collections.abc import Iterable, Iterator, Sequence from typing import Any, Literal, overload from django.core.checks.messages import CheckMessage from django.core.files.storage import FileSystemStorage, Storage from typing_extensions import override searched_locations: Any class BaseFinder: def check(self, **kwargs: Any) -> list[CheckMessage]: ... @overload def find(self, path: str, find_all: Literal[False] = False) -> str | None: ... @overload def find(self, path: str, find_all: Literal[True]) -> list[str]: ... def list(self, ignore_patterns: Iterable[str] | None) -> Iterable[Any]: ... class FileSystemFinder(BaseFinder): locations: list[tuple[str, str]] storages: dict[str, Any] def __init__(self, app_names: Sequence[str] | None = None, *args: Any, **kwargs: Any) -> None: ... def find_location(self, root: str, path: str, prefix: str | None = None) -> str | None: ... @override def list(self, ignore_patterns: Iterable[str] | None) -> Iterable[Any]: ... class AppDirectoriesFinder(BaseFinder): storage_class: type[FileSystemStorage] source_dir: str apps: list[str] storages: dict[str, FileSystemStorage] def __init__(self, app_names: Iterable[str] | None = None, *args: Any, **kwargs: Any) -> None: ... def find_in_app(self, app: str, path: str) -> str | None: ... @override def list(self, ignore_patterns: Iterable[str] | None) -> Iterable[Any]: ... class BaseStorageFinder(BaseFinder): storage: Storage | None def __init__(self, storage: Storage | None = None, *args: Any, **kwargs: Any) -> None: ... @override def list(self, ignore_patterns: Iterable[str] | None) -> Iterable[Any]: ... class DefaultStorageFinder(BaseStorageFinder): storage: Storage def __init__(self, *args: Any, **kwargs: Any) -> None: ... @overload def find(path: str, find_all: Literal[False] = False) -> str | None: ... @overload def find(path: str, find_all: Literal[True]) -> list[str]: ... def get_finders() -> Iterator[BaseFinder]: ... def get_finder(import_path: str) -> BaseFinder: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/handlers.pyi000066400000000000000000000034031526064357400277420ustar00rootroot00000000000000from collections.abc import Awaitable, Callable, Mapping from typing import Any from urllib.parse import ParseResult from wsgiref.types import StartResponse, WSGIEnvironment from django.core.handlers.asgi import ASGIHandler from django.core.handlers.base import BaseHandler from django.core.handlers.wsgi import WSGIHandler from django.http import HttpRequest from django.http.response import FileResponse, HttpResponse, HttpResponseBase from typing_extensions import override class StaticFilesHandlerMixin: handles_files: bool application: BaseHandler base_url: ParseResult def load_middleware(self) -> None: ... def get_base_url(self) -> str: ... def _should_handle(self, path: str) -> bool: ... def file_path(self, url: str) -> str: ... def serve(self, request: HttpRequest) -> HttpResponse | FileResponse: ... def get_response(self, request: HttpRequest) -> HttpResponseBase: ... async def get_response_async(self, request: HttpRequest) -> HttpResponseBase: ... class StaticFilesHandler(StaticFilesHandlerMixin, WSGIHandler): # type: ignore[misc] application: WSGIHandler base_url: ParseResult def __init__(self, application: WSGIHandler) -> None: ... @override def __call__( self, environ: WSGIEnvironment, start_response: StartResponse, ) -> HttpResponseBase: ... class ASGIStaticFilesHandler(StaticFilesHandlerMixin, ASGIHandler): # type: ignore[misc] application: ASGIHandler base_url: ParseResult def __init__(self, application: ASGIHandler) -> None: ... @override async def __call__( self, scope: dict[str, Any], receive: Callable[[], Awaitable[Mapping[str, Any]]], send: Callable[[Mapping[str, Any]], Awaitable[None]], ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/000077500000000000000000000000001526064357400275335ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/__init__.pyi000066400000000000000000000000001526064357400320030ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/commands/000077500000000000000000000000001526064357400313345ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/commands/__init__.pyi000066400000000000000000000000001526064357400336040ustar00rootroot00000000000000collectstatic.pyi000066400000000000000000000023051526064357400346350ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/commandsfrom typing import Any from django.core.files.storage import Storage from django.core.management.base import BaseCommand from django.utils.functional import cached_property from typing_extensions import override class Command(BaseCommand): copied_files: Any symlinked_files: Any unmodified_files: Any post_processed_files: Any storage: Any def __init__(self, *args: Any, **kwargs: Any) -> None: ... @cached_property def local(self) -> bool: ... interactive: Any verbosity: Any symlink: Any clear: Any dry_run: Any ignore_patterns: Any post_process: Any def set_options(self, **options: Any) -> None: ... def collect(self) -> dict[str, list[str]]: ... @override def handle(self, **options: Any) -> str | None: ... def log(self, msg: str, level: int = 2) -> None: ... def is_local_storage(self) -> bool: ... def clear_dir(self, path: str) -> None: ... def delete_file(self, path: str, prefixed_path: str, source_storage: Storage) -> bool: ... def link_file(self, path: str, prefixed_path: str, source_storage: Storage) -> None: ... def copy_file(self, path: str, prefixed_path: str, source_storage: Storage) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/commands/findstatic.pyi000066400000000000000000000004031526064357400342040ustar00rootroot00000000000000from typing import Any from django.core.management.base import LabelCommand from typing_extensions import override class Command(LabelCommand): @override def handle_label(self, path: str, **options: Any) -> str | None: ... # type: ignore[override] typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/management/commands/runserver.pyi000066400000000000000000000001701526064357400341100ustar00rootroot00000000000000from django.core.management.commands.runserver import Command as RunserverCommand class Command(RunserverCommand): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/storage.pyi000066400000000000000000000052161526064357400276120ustar00rootroot00000000000000from collections.abc import Callable, Iterator from re import Match, Pattern from typing import Any, TypeAlias from _typeshed import StrPath from django.core.files.base import File from django.core.files.storage import FileSystemStorage, Storage from django.utils.functional import LazyObject from typing_extensions import override _PostProcessT: TypeAlias = Iterator[tuple[str, str, bool] | tuple[str, None, RuntimeError]] class StaticFilesStorage(FileSystemStorage): def __init__( self, location: StrPath | None = None, base_url: str | None = None, *args: Any, **kwargs: Any ) -> None: ... @override def path(self, name: StrPath) -> str: ... class HashedFilesMixin: default_template: str max_post_process_passes: int support_js_module_import_aggregation: bool patterns: Any hashed_files: Any keep_intermediate_files: bool def __init__(self, *args: Any, **kwargs: Any) -> None: ... def file_hash(self, name: str, content: File[Any] | None = None) -> str | None: ... def hashed_name(self, name: str, content: File[Any] | None = None, filename: str | None = None) -> str: ... def url(self, name: str, force: bool = False) -> str: ... def get_ignored_blocks(self, content: str, pattern: Pattern[str]) -> list[tuple[int, int]]: ... def is_in_ignored_block(self, pos: int, ignored_blocks: list[tuple[int, int]]) -> bool: ... def url_converter( self, name: str, hashed_files: dict[str, Any], template: str | None = None, ignored_blocks: list[tuple[int, int]] | None = None, ) -> Callable[[Match[str]], str]: ... def post_process(self, paths: dict[str, Any], dry_run: bool = False, **options: Any) -> _PostProcessT: ... def clean_name(self, name: str) -> str: ... def hash_key(self, name: str) -> str: ... def stored_name(self, name: str) -> str: ... class ManifestFilesMixin(HashedFilesMixin): manifest_version: str manifest_name: str manifest_strict: bool keep_intermediate_files: bool manifest_storage: Storage | None hashed_files: dict[str, str] manifest_hash: str def __init__(self, *args: Any, manifest_storage: Storage | None = None, **kwargs: Any) -> None: ... def read_manifest(self) -> str: ... def load_manifest(self) -> dict[str, Any]: ... def save_manifest(self) -> None: ... @override def post_process(self, *args: Any, **kwargs: Any) -> _PostProcessT: ... @override def stored_name(self, name: str) -> str: ... class ManifestStaticFilesStorage(ManifestFilesMixin, StaticFilesStorage): ... # type: ignore[misc] class ConfiguredStorage(LazyObject[Storage]): ... staticfiles_storage: Storage typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/testing.pyi000066400000000000000000000001441526064357400276160ustar00rootroot00000000000000from django.test import LiveServerTestCase class StaticLiveServerTestCase(LiveServerTestCase): ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/urls.pyi000066400000000000000000000002301526064357400271220ustar00rootroot00000000000000from django.urls import URLPattern, _AnyURL urlpatterns: list[_AnyURL] def staticfiles_urlpatterns(prefix: str | None = ...) -> list[URLPattern]: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/utils.pyi000066400000000000000000000005321526064357400273020ustar00rootroot00000000000000from collections.abc import Iterable, Iterator from django.core.files.storage import Storage def matches_patterns(path: str, patterns: Iterable[str]) -> bool: ... def get_files(storage: Storage, ignore_patterns: Iterable[str] | None = None, location: str = "") -> Iterator[str]: ... def check_settings(base_url: str | None = None) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/staticfiles/views.pyi000066400000000000000000000003671526064357400273050ustar00rootroot00000000000000from typing import Any from django.http.request import HttpRequest from django.http.response import FileResponse, HttpResponse def serve(request: HttpRequest, path: str, insecure: bool = False, **kwargs: Any) -> HttpResponse | FileResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/contrib/syndication/000077500000000000000000000000001526064357400254315ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/syndication/__init__.pyi000066400000000000000000000000001526064357400277010ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/contrib/syndication/apps.pyi000066400000000000000000000002031526064357400271120ustar00rootroot00000000000000from typing import Any from django.apps import AppConfig class SyndicationConfig(AppConfig): name: str verbose_name: Any typeddjango-django-stubs-fa03b48/django-stubs/contrib/syndication/views.pyi000066400000000000000000000035761526064357400273240ustar00rootroot00000000000000from typing import Any, Generic from django.core.exceptions import ObjectDoesNotExist from django.http.request import HttpRequest from django.http.response import HttpResponse from django.utils.feedgenerator import Enclosure, SyndicationFeed from typing_extensions import TypeVar def add_domain(domain: str, url: str, secure: bool = ...) -> str: ... class FeedDoesNotExist(ObjectDoesNotExist): ... _Item = TypeVar("_Item") _Object = TypeVar("_Object") class Feed(Generic[_Item, _Object]): feed_type: type[SyndicationFeed] title_template: str | None description_template: str | None language: str | None # Dynamic attributes: title: Any link: Any feed_url: Any feed_guid: Any description: Any author_name: Any author_email: Any author_link: Any categories: Any feed_copyright: Any ttl: Any items: Any item_guid: Any item_guid_is_permalink: Any item_author_name: Any item_author_email: Any item_author_link: Any item_enclosure_url: Any item_enclosure_length: Any item_enclosure_mime_type: Any item_pubdate: Any item_updateddate: Any item_categories: Any item_copyright: Any item_comments: Any def __call__(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def get_object(self, request: HttpRequest, *args: Any, **kwargs: Any) -> _Object | None: ... def feed_extra_kwargs(self, obj: _Object) -> dict[Any, Any]: ... def item_extra_kwargs(self, item: _Item) -> dict[Any, Any]: ... def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ... def get_feed(self, obj: _Object, request: HttpRequest) -> SyndicationFeed: ... def item_title(self, item: _Item) -> str: ... def item_description(self, item: _Item) -> str: ... def item_link(self, item: _Item) -> str: ... def item_enclosures(self, item: _Item) -> list[Enclosure]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/000077500000000000000000000000001526064357400223755ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/__init__.pyi000066400000000000000000000000001526064357400246450ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/asgi.pyi000066400000000000000000000001421526064357400240400ustar00rootroot00000000000000from django.core.handlers.asgi import ASGIHandler def get_asgi_application() -> ASGIHandler: ... typeddjango-django-stubs-fa03b48/django-stubs/core/cache/000077500000000000000000000000001526064357400234405ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/cache/__init__.pyi000066400000000000000000000020101526064357400257130ustar00rootroot00000000000000from typing import Any from django.utils.connection import BaseConnectionHandler from typing_extensions import override from .backends.base import BaseCache as BaseCache from .backends.base import CacheKeyWarning as CacheKeyWarning from .backends.base import InvalidCacheBackendError as InvalidCacheBackendError from .backends.base import InvalidCacheKey as InvalidCacheKey DEFAULT_CACHE_ALIAS: str class CacheHandler(BaseConnectionHandler[BaseCache]): settings_name: str exception_class: type[Exception] @override def create_connection(self, alias: str) -> BaseCache: ... @override def all(self, initialized_only: bool = False) -> list[BaseCache]: ... def close_caches(**kwargs: Any) -> None: ... caches: CacheHandler # Actually ConnectionProxy, but quacks exactly like BaseCache, it's not worth distinguishing the two. cache: BaseCache __all__ = [ "DEFAULT_CACHE_ALIAS", "BaseCache", "CacheKeyWarning", "InvalidCacheBackendError", "InvalidCacheKey", "cache", "caches", ] typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/000077500000000000000000000000001526064357400252125ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/__init__.pyi000066400000000000000000000000001526064357400274620ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/base.pyi000066400000000000000000000102061526064357400266460ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Iterator from re import Pattern from typing import Any from django.core.exceptions import ImproperlyConfigured class InvalidCacheBackendError(ImproperlyConfigured): ... class CacheKeyWarning(RuntimeWarning): ... class InvalidCacheKey(ValueError): ... DEFAULT_TIMEOUT: Any MEMCACHE_MAX_KEY_LENGTH: int def default_key_func(key: Any, key_prefix: str, version: Any) -> str: ... def get_key_func(key_func: Callable[..., Any] | str | None) -> Callable[..., Any]: ... class BaseCache: _missing_key: object default_timeout: float | None _max_entries: int _cull_frequency: int key_prefix: str version: int key_func: Callable[..., Any] def __init__(self, params: dict[str, Any]) -> None: ... def get_backend_timeout(self, timeout: float | None = ...) -> float | None: ... def make_key(self, key: Any, version: int | None = None) -> str: ... def validate_key(self, key: Any) -> None: ... def make_and_validate_key(self, key: Any, version: int | None = None) -> str: ... def add(self, key: Any, value: Any, timeout: float | None = ..., version: int | None = None) -> bool: ... async def aadd(self, key: Any, value: Any, timeout: float | None = ..., version: int | None = None) -> bool: ... def get(self, key: Any, default: Any | None = None, version: int | None = None) -> Any: ... async def aget(self, key: Any, default: Any | None = None, version: int | None = None) -> Any: ... def set(self, key: Any, value: Any, timeout: float | None = ..., version: int | None = None) -> None: ... async def aset(self, key: Any, value: Any, timeout: float | None = ..., version: int | None = None) -> None: ... def touch(self, key: Any, timeout: float | None = ..., version: int | None = None) -> bool: ... async def atouch(self, key: Any, timeout: float | None = ..., version: int | None = None) -> bool: ... def delete(self, key: Any, version: int | None = None) -> bool: ... async def adelete(self, key: Any, version: int | None = None) -> bool: ... def get_many(self, keys: Iterable[Any], version: int | None = None) -> dict[Any, Any]: ... async def aget_many(self, keys: Iterable[Any], version: int | None = None) -> dict[Any, Any]: ... def get_or_set( self, key: Any, default: Any | None, timeout: float | None = ..., version: int | None = None ) -> Any | None: ... async def aget_or_set( self, key: Any, default: Any | None, timeout: float | None = ..., version: int | None = None ) -> Any | None: ... def has_key(self, key: Any, version: int | None = None) -> bool: ... async def ahas_key(self, key: Any, version: int | None = None) -> bool: ... def incr(self, key: Any, delta: int = 1, version: int | None = None) -> int: ... async def aincr(self, key: Any, delta: int = 1, version: int | None = None) -> int: ... def decr(self, key: Any, delta: int = 1, version: int | None = None) -> int: ... async def adecr(self, key: Any, delta: int = 1, version: int | None = None) -> int: ... def __contains__(self, key: Any) -> bool: ... def set_many(self, data: dict[Any, Any], timeout: float | None = ..., version: int | None = None) -> list[Any]: ... async def aset_many( self, data: dict[Any, Any], timeout: float | None = ..., version: int | None = None ) -> list[Any]: ... def delete_many(self, keys: Iterable[Any], version: int | None = None) -> None: ... async def adelete_many(self, keys: Iterable[Any], version: int | None = None) -> None: ... def clear(self) -> None: ... async def aclear(self) -> None: ... def incr_version(self, key: Any, delta: int = 1, version: int | None = None) -> int: ... async def aincr_version(self, key: Any, delta: int = 1, version: int | None = None) -> int: ... def decr_version(self, key: Any, delta: int = 1, version: int | None = None) -> int: ... async def adecr_version(self, key: Any, delta: int = 1, version: int | None = None) -> int: ... def close(self, **kwargs: Any) -> None: ... async def aclose(self, **kwargs: Any) -> None: ... memcached_error_chars_re: Pattern[str] def memcache_key_warnings(key: str) -> Iterator[str]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/db.pyi000066400000000000000000000011721526064357400263230ustar00rootroot00000000000000from typing import Any, ClassVar from django.core.cache.backends.base import BaseCache from django.utils.functional import _StrOrPromise class Options: db_table: str app_label: str model_name: str verbose_name: _StrOrPromise verbose_name_plural: _StrOrPromise object_name: str abstract: bool managed: bool proxy: bool swapped: bool def __init__(self, table: str) -> None: ... class BaseDatabaseCache(BaseCache): cache_model_class: Any def __init__(self, table: str, params: dict[str, Any]) -> None: ... class DatabaseCache(BaseDatabaseCache): pickle_protocol: ClassVar[int] typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/dummy.pyi000066400000000000000000000002661526064357400270740ustar00rootroot00000000000000from typing import Any from django.core.cache.backends.base import BaseCache class DummyCache(BaseCache): def __init__(self, host: str, *args: Any, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/filebased.pyi000066400000000000000000000004031526064357400276500ustar00rootroot00000000000000from typing import Any, ClassVar from django.core.cache.backends.base import BaseCache class FileBasedCache(BaseCache): cache_suffix: ClassVar[str] pickle_protocol: ClassVar[int] def __init__(self, dir: str, params: dict[str, Any]) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/locmem.pyi000066400000000000000000000003421526064357400272100ustar00rootroot00000000000000from typing import Any, ClassVar from django.core.cache.backends.base import BaseCache class LocMemCache(BaseCache): pickle_protocol: ClassVar[int] def __init__(self, name: str, params: dict[str, Any]) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/memcached.pyi000066400000000000000000000014751526064357400276520ustar00rootroot00000000000000from collections.abc import Sequence from types import ModuleType from typing import Any from django.core.cache.backends.base import BaseCache from typing_extensions import override class BaseMemcachedCache(BaseCache): def __init__( self, server: str | Sequence[str], params: dict[str, Any], library: ModuleType, value_not_found_exception: type[BaseException], ) -> None: ... @property def client_servers(self) -> Sequence[str]: ... class PyLibMCCache(BaseMemcachedCache): def __init__(self, server: str | Sequence[str], params: dict[str, Any]) -> None: ... @property @override def client_servers(self) -> list[str]: ... class PyMemcacheCache(BaseMemcachedCache): def __init__(self, server: str | Sequence[str], params: dict[str, Any]) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/cache/backends/redis.pyi000066400000000000000000000046561526064357400270560ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Mapping from datetime import timedelta from typing import Any, Protocol, SupportsInt, TypeAlias, overload, type_check_only from _typeshed import ReadableBuffer from django.core.cache.backends.base import BaseCache from django.utils.functional import cached_property from redis._parsers import BaseParser from redis.client import Redis from redis.connection import ConnectionPool @type_check_only class _RedisCacheClientSerializer(Protocol): def dumps(self, obj: Any) -> bytes: ... @overload def loads(self, data: SupportsInt) -> int: ... @overload def loads(self, data: ReadableBuffer) -> Any: ... class RedisSerializer: def __init__(self, protocol: int | None = None) -> None: ... def dumps(self, obj: Any) -> bytes: ... @overload def loads(self, data: SupportsInt) -> int: ... @overload def loads(self, data: ReadableBuffer) -> Any: ... # Taken from https://github.com/redis/redis-py/blob/6b8978/redis/typing.py _Key: TypeAlias = str | bytes | memoryview _Expiry: TypeAlias = int | timedelta class RedisCacheClient: def __init__( self, servers: list[str], serializer: str | Callable[[], _RedisCacheClientSerializer] | _RedisCacheClientSerializer | None = None, pool_class: str | type[ConnectionPool] | None = None, parser_class: str | type[BaseParser] | None = None, **options: Any, ) -> None: ... def get_client(self, key: _Key | None = None, *, write: bool = False) -> Redis[Any]: ... def add(self, key: _Key, value: Any, timeout: _Expiry | None) -> bool: ... def get(self, key: _Key, default: Any) -> Any: ... def set(self, key: _Key, value: Any, timeout: _Expiry | None) -> None: ... def touch(self, key: _Key, timeout: _Expiry) -> bool: ... def delete(self, key: _Key) -> bool: ... def get_many(self, keys: Iterable[_Key]) -> dict[_Key, Any]: ... def has_key(self, key: _Key) -> bool: ... def incr(self, key: _Key, delta: int) -> Any: ... def set_many(self, data: Mapping[_Key, Any], timeout: _Expiry) -> None: ... def delete_many(self, keys: Iterable[_Key]) -> None: ... def clear(self) -> bool: ... class RedisCache(BaseCache): def __init__(self, server: str | list[str], params: dict[str, Any]) -> None: ... # We need this, because it is the only way to get the Redis connection from cache: @cached_property def _cache(self) -> RedisCacheClient: ... typeddjango-django-stubs-fa03b48/django-stubs/core/cache/utils.pyi000066400000000000000000000003071526064357400253230ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any TEMPLATE_FRAGMENT_KEY_TEMPLATE: str def make_template_fragment_key(fragment_name: str, vary_on: Iterable[Any] | None = None) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/000077500000000000000000000000001526064357400236355ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/checks/__init__.pyi000066400000000000000000000015711526064357400261230ustar00rootroot00000000000000from . import model_checks as model_checks from .messages import CRITICAL as CRITICAL from .messages import DEBUG as DEBUG from .messages import ERROR as ERROR from .messages import INFO as INFO from .messages import WARNING as WARNING from .messages import CheckMessage as CheckMessage from .messages import Critical as Critical from .messages import Debug as Debug from .messages import Error as Error from .messages import Info as Info from .messages import Warning as Warning from .registry import Tags as Tags from .registry import register as register from .registry import run_checks as run_checks from .registry import tag_exists as tag_exists __all__ = [ "CRITICAL", "DEBUG", "ERROR", "INFO", "WARNING", "CheckMessage", "Critical", "Debug", "Error", "Info", "Tags", "Warning", "register", "run_checks", "tag_exists", ] typeddjango-django-stubs-fa03b48/django-stubs/core/checks/async_checks.pyi000066400000000000000000000004061526064357400270150ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage, Error E001: Error def check_async_unsafe(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/caches.pyi000066400000000000000000000010371526064357400256070ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage, Error E001: Error def check_default_cache_is_configured( app_configs: Sequence[AppConfig] | None, **kwargs: object ) -> list[CheckMessage]: ... def check_cache_location_not_exposed( app_configs: Sequence[AppConfig] | None, **kwargs: object ) -> list[CheckMessage]: ... def check_file_based_cache_is_absolute( app_configs: Sequence[AppConfig] | None, **kwargs: object ) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/commands.pyi000066400000000000000000000002171526064357400261610ustar00rootroot00000000000000from django.core.checks.messages import CheckMessage def migrate_and_makemigrations_autodetector(**kwargs: object) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/compatibility/000077500000000000000000000000001526064357400265065ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/checks/compatibility/__init__.pyi000066400000000000000000000000001526064357400307560ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/checks/compatibility/django_4_0.pyi000066400000000000000000000003721526064357400311370ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage def check_csrf_trusted_origins(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/database.pyi000066400000000000000000000003041526064357400261210ustar00rootroot00000000000000from collections.abc import Iterable from django.core.checks import CheckMessage def check_database_backends(databases: Iterable[str] | None = None, **kwargs: object) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/files.pyi000066400000000000000000000004101526064357400254550ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage def check_setting_file_upload_temp_dir( app_configs: Sequence[AppConfig] | None, **kwargs: object ) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/mail.pyi000066400000000000000000000006351526064357400253060ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks import CheckMessage def check_mailers_default_alias(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... NON_PRODUCTION_EMAIL_BACKENDS: set[str] def check_mailers_production_backend( app_configs: Sequence[AppConfig] | None, **kwargs: object ) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/messages.pyi000066400000000000000000000021231526064357400261650ustar00rootroot00000000000000from typing import Any DEBUG: int INFO: int WARNING: int ERROR: int CRITICAL: int class CheckMessage: level: int msg: str hint: str | None obj: Any id: str | None def __init__( self, level: int, msg: str, hint: str | None = None, obj: Any | None = None, id: str | None = None ) -> None: ... def is_serious(self, level: int = 40) -> bool: ... def is_silenced(self) -> bool: ... class Debug(CheckMessage): def __init__(self, msg: str, hint: str | None = ..., obj: Any = ..., id: str | None = ...) -> None: ... class Info(CheckMessage): def __init__(self, msg: str, hint: str | None = ..., obj: Any = ..., id: str | None = ...) -> None: ... class Warning(CheckMessage): def __init__(self, msg: str, hint: str | None = ..., obj: Any = ..., id: str | None = ...) -> None: ... class Error(CheckMessage): def __init__(self, msg: str, hint: str | None = ..., obj: Any = ..., id: str | None = ...) -> None: ... class Critical(CheckMessage): def __init__(self, msg: str, hint: str | None = ..., obj: Any = ..., id: str | None = ...) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/model_checks.pyi000066400000000000000000000005401526064357400267770ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage def check_all_models(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_lazy_references(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/registry.pyi000066400000000000000000000040311526064357400262260ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Sequence from typing import Any, Protocol, overload, type_check_only from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage from typing_extensions import TypeVar class Tags: admin: str async_support: str caches: str commands: str compatibility: str database: str files: str mail: str models: str security: str signals: str sites: str staticfiles: str templates: str translation: str urls: str @type_check_only class _CheckCallable(Protocol): def __call__( self, *, app_configs: Sequence[AppConfig] | None, databases: Sequence[str] | None, **kwargs: Any, ) -> Iterable[CheckMessage]: ... _C = TypeVar("_C", bound=_CheckCallable) @type_check_only class _ProcessedCheckCallable(Protocol[_C]): tags: Sequence[str] __call__: _C class CheckRegistry: registered_checks: set[_ProcessedCheckCallable[_CheckCallable]] deployment_checks: set[_ProcessedCheckCallable[_CheckCallable]] def __init__(self) -> None: ... @overload def register(self, check: _C, *tags: str, **kwargs: Any) -> _ProcessedCheckCallable[_C]: ... @overload def register( self, check: str | None = None, *tags: str, **kwargs: Any ) -> Callable[[_C], _ProcessedCheckCallable[_C]]: ... def run_checks( self, app_configs: Sequence[AppConfig] | None = None, tags: Sequence[str] | None = None, include_deployment_checks: bool = False, databases: Sequence[str] | None = None, ) -> list[CheckMessage]: ... def tag_exists(self, tag: str, include_deployment_checks: bool = False) -> bool: ... def tags_available(self, deployment_checks: bool = False) -> set[str]: ... def get_checks(self, include_deployment_checks: bool = False) -> list[_ProcessedCheckCallable[_CheckCallable]]: ... registry: CheckRegistry = ... register = registry.register run_checks = registry.run_checks tag_exists = registry.tag_exists typeddjango-django-stubs-fa03b48/django-stubs/core/checks/security/000077500000000000000000000000001526064357400255045ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/checks/security/__init__.pyi000066400000000000000000000000001526064357400277540ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/checks/security/base.pyi000066400000000000000000000045451526064357400271510ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage, Error, Warning CROSS_ORIGIN_OPENER_POLICY_VALUES: set[str] REFERRER_POLICY_VALUES: set[str] SECRET_KEY_INSECURE_PREFIX: str SECRET_KEY_MIN_LENGTH: int SECRET_KEY_MIN_UNIQUE_CHARACTERS: int SECRET_KEY_WARNING_MSG: str W001: Warning W002: Warning W004: Warning W005: Warning W006: Warning W008: Warning W009: Warning W018: Warning W019: Warning W020: Warning W021: Warning W022: Warning E023: Error E024: Error W025: Warning E026: Error W027: Warning def check_security_middleware(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_xframe_options_middleware( app_configs: Sequence[AppConfig] | None, **kwargs: object ) -> list[CheckMessage]: ... def check_sts(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_sts_include_subdomains(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_sts_preload(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_content_type_nosniff(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_ssl_redirect(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_secret_key(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_secret_key_fallbacks(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_debug(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_xframe_deny(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_allowed_hosts(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_referrer_policy(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_cross_origin_opener_policy( app_configs: Sequence[AppConfig] | None, **kwargs: object ) -> list[CheckMessage]: ... def check_csp_settings(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_csp_nonce_context_processor( app_configs: Sequence[AppConfig] | None, **kwargs: object ) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/security/csrf.pyi000066400000000000000000000010001526064357400271530ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage, Warning W003: Warning W016: Warning def check_csrf_middleware(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_csrf_cookie_secure(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_csrf_failure_view(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/security/sessions.pyi000066400000000000000000000011001526064357400300650ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage, Warning def add_session_cookie_message(message: str) -> str: ... W010: Warning W011: Warning W012: Warning def add_httponly_message(message: str) -> str: ... W013: Warning W014: Warning W015: Warning def check_session_cookie_secure(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_session_cookie_httponly(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/templates.pyi000066400000000000000000000003571526064357400263630ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage def check_templates(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/translation.pyi000066400000000000000000000012371526064357400267210ustar00rootroot00000000000000from collections.abc import Sequence from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage, Error E001: Error E002: Error E003: Error E004: Error def check_setting_language_code(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_setting_languages(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_setting_languages_bidi(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_language_settings_consistent( app_configs: Sequence[AppConfig] | None, **kwargs: object ) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/checks/urls.pyi000066400000000000000000000014671526064357400253550ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage, Error from django.urls import _AnyURL def check_url_config(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def check_resolver(resolver: _AnyURL) -> list[CheckMessage]: ... def check_url_namespaces_unique(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def get_warning_for_invalid_pattern(pattern: Any) -> list[CheckMessage]: ... def check_url_settings(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... def E006(name: str) -> Error: ... def check_custom_error_handlers(app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/exceptions.pyi000066400000000000000000000040011526064357400252740ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any, Literal from django.utils.functional import _StrOrPromise class FieldDoesNotExist(Exception): ... class AppRegistryNotReady(Exception): ... class ObjectDoesNotExist(Exception): silent_variable_failure: bool class ObjectNotUpdated(Exception): ... class MultipleObjectsReturned(Exception): ... class SuspiciousOperation(Exception): ... class SuspiciousMultipartForm(SuspiciousOperation): ... class SuspiciousFileOperation(SuspiciousOperation): ... class DisallowedHost(SuspiciousOperation): ... class DisallowedRedirect(SuspiciousOperation): ... class TooManyFieldsSent(SuspiciousOperation): ... class TooManyFilesSent(SuspiciousOperation): ... class RequestDataTooBig(SuspiciousOperation): ... class RequestAborted(Exception): ... class BadRequest(Exception): ... class PermissionDenied(Exception): ... class ViewDoesNotExist(Exception): ... class MiddlewareNotUsed(Exception): ... class ImproperlyConfigured(Exception): ... class FieldError(Exception): ... class FieldFetchBlocked(Exception): ... NON_FIELD_ERRORS: Literal["__all__"] class ValidationError(Exception): error_dict: dict[str, list[ValidationError]] error_list: list[ValidationError] message: _StrOrPromise code: str | None params: dict[str, Any] | None def __init__( self, # Accepts arbitrarily nested data structure, mypy doesn't allow describing it accurately. message: _StrOrPromise | ValidationError | dict[str, Any] | list[Any], code: str | None = None, params: dict[str, Any] | None = None, ) -> None: ... @property def message_dict(self) -> dict[str, list[str]]: ... @property def messages(self) -> list[str]: ... def update_error_dict(self, error_dict: dict[str, list[ValidationError]]) -> dict[str, list[ValidationError]]: ... def __iter__(self) -> Iterator[tuple[str, list[str]] | str]: ... class EmptyResultSet(Exception): ... class FullResultSet(Exception): ... class SynchronousOnlyOperation(Exception): ... typeddjango-django-stubs-fa03b48/django-stubs/core/files/000077500000000000000000000000001526064357400234775ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/files/__init__.pyi000066400000000000000000000001041526064357400257540ustar00rootroot00000000000000from django.core.files.base import File as File __all__ = ["File"] typeddjango-django-stubs-fa03b48/django-stubs/core/files/base.pyi000066400000000000000000000037661526064357400251500ustar00rootroot00000000000000from collections.abc import Callable, Iterator from types import TracebackType from typing import IO, AnyStr, Self, type_check_only from django.core.files.utils import FileProxyMixin from django.utils.functional import cached_property from typing_extensions import override class File(FileProxyMixin[AnyStr], IO[AnyStr]): DEFAULT_CHUNK_SIZE: int file: IO[AnyStr] | None name: str | None mode: str def __init__(self, file: IO[AnyStr] | None, name: str | None = None) -> None: ... def __bool__(self) -> bool: ... def __len__(self) -> int: ... @cached_property def size(self) -> int: ... def chunks(self, chunk_size: int | None = None) -> Iterator[AnyStr]: ... def multiple_chunks(self, chunk_size: int | None = None) -> bool | None: ... @override def __iter__(self) -> Iterator[AnyStr]: ... @override def __enter__(self) -> Self: ... @override def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, exc_tb: TracebackType | None, ) -> None: ... def open( self, mode: str | None = None, buffering: int = -1, encoding: str | None = None, errors: str | None = None, newline: str | None = None, closefd: bool = True, opener: Callable[[str, int], int] | None = None, ) -> Self: ... @override def close(self) -> None: ... @type_check_only @override def __next__(self) -> AnyStr: ... class ContentFile(File[AnyStr]): file: IO[AnyStr] def __init__(self, content: AnyStr, name: str | None = None) -> None: ... @override def __bool__(self) -> bool: ... @override def open(self, mode: str | None = None) -> Self: ... # type: ignore[override] @override def close(self) -> None: ... @override def write(self, data: AnyStr) -> int: ... def endswith_cr(line: bytes | str) -> bool: ... def endswith_lf(line: bytes | str) -> bool: ... def equals_lf(line: bytes | str) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/core/files/images.pyi000066400000000000000000000005141526064357400254670ustar00rootroot00000000000000from typing import IO from _typeshed import StrPath from django.core.files import File class ImageFile(File[bytes]): @property def width(self) -> int: ... @property def height(self) -> int: ... def get_image_dimensions(file_or_path: StrPath | IO[bytes], close: bool = False) -> tuple[int | None, int | None]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/files/locks.pyi000066400000000000000000000006421526064357400253370ustar00rootroot00000000000000import sys from ctypes import Structure, Union from typing import Any LOCK_SH: int LOCK_NB: int LOCK_EX: int if sys.platform == "win32": ULONG_PTR: Any PVOID: Any class _OFFSET(Structure): ... class _OFFSET_UNION(Union): ... class OVERLAPPED(Structure): ... def lock(f: Any, flags: int) -> bool: ... def unlock(f: Any) -> bool: ... __all__ = ("LOCK_EX", "LOCK_NB", "LOCK_SH", "lock", "unlock") typeddjango-django-stubs-fa03b48/django-stubs/core/files/move.pyi000066400000000000000000000002441526064357400251700ustar00rootroot00000000000000def file_move_safe( old_file_name: str, new_file_name: str, chunk_size: int = 65536, allow_overwrite: bool = False ) -> None: ... __all__ = ["file_move_safe"] typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/000077500000000000000000000000001526064357400251435ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/__init__.pyi000066400000000000000000000011211526064357400274200ustar00rootroot00000000000000from django.utils.functional import LazyObject from .base import Storage from .filesystem import FileSystemStorage from .handler import InvalidStorageError, StorageHandler from .memory import InMemoryStorage __all__ = ( "DefaultStorage", "FileSystemStorage", "InMemoryStorage", "InvalidStorageError", "Storage", "StorageHandler", "default_storage", "storages", ) class DefaultStorage(LazyObject[Storage]): ... storages: StorageHandler # default_storage is actually an instance of DefaultStorage, but it proxies through to a Storage default_storage: Storage typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/base.pyi000066400000000000000000000021711526064357400266010ustar00rootroot00000000000000from datetime import datetime from typing import IO, Any from _typeshed import StrPath from django.core.files.base import File class Storage: def open(self, name: str, mode: str = "rb") -> File[Any]: ... def save(self, name: str | None, content: IO[Any], max_length: int | None = None) -> str: ... def is_name_available(self, name: str, max_length: int | None = None) -> bool: ... def get_valid_name(self, name: str) -> str: ... def get_alternative_name(self, file_root: str, file_ext: str) -> str: ... def get_available_name(self, name: str, max_length: int | None = None) -> str: ... def generate_filename(self, filename: StrPath) -> str: ... def path(self, name: str) -> str: ... def delete(self, name: str) -> None: ... def exists(self, name: str) -> bool: ... def listdir(self, path: str) -> tuple[list[str], list[str]]: ... def size(self, name: str) -> int: ... def url(self, name: str | None) -> str: ... def get_accessed_time(self, name: str) -> datetime: ... def get_created_time(self, name: str) -> datetime: ... def get_modified_time(self, name: str) -> datetime: ... typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/filesystem.pyi000066400000000000000000000015721526064357400300570ustar00rootroot00000000000000from _typeshed import StrPath from django.utils.deconstruct import _Deconstructible from django.utils.functional import cached_property from .base import Storage from .mixins import StorageSettingsMixin class FileSystemStorage(_Deconstructible, Storage, StorageSettingsMixin): def __init__( self, location: StrPath | None = None, base_url: str | None = None, file_permissions_mode: int | None = None, directory_permissions_mode: int | None = None, allow_overwrite: bool = False, ) -> None: ... @cached_property def base_location(self) -> StrPath: ... @cached_property def location(self) -> StrPath: ... @cached_property def base_url(self) -> str: ... @cached_property def file_permissions_mode(self) -> int | None: ... @cached_property def directory_permissions_mode(self) -> int | None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/handler.pyi000066400000000000000000000007761526064357400273150ustar00rootroot00000000000000from typing import Any from django.core.exceptions import ImproperlyConfigured from django.utils.functional import cached_property from .base import Storage class InvalidStorageError(ImproperlyConfigured): ... class StorageHandler: def __init__(self, backends: dict[str, Storage] | None = None) -> None: ... @cached_property def backends(self) -> dict[str, Storage]: ... def __getitem__(self, alias: str) -> Storage: ... def create_storage(self, params: dict[str, Any]) -> Storage: ... typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/memory.pyi000066400000000000000000000015611526064357400272010ustar00rootroot00000000000000from _typeshed import StrPath from django.utils.deconstruct import _Deconstructible from django.utils.functional import cached_property from .base import Storage from .mixins import StorageSettingsMixin class InMemoryStorage(_Deconstructible, Storage, StorageSettingsMixin): def __init__( self, location: StrPath | None = None, base_url: str | None = None, file_permissions_mode: int | None = None, directory_permissions_mode: int | None = None, ) -> None: ... @cached_property def base_location(self) -> StrPath: ... @cached_property def location(self) -> StrPath: ... @cached_property def base_url(self) -> str: ... @cached_property def file_permissions_mode(self) -> int | None: ... @cached_property def directory_permissions_mode(self) -> int | None: ... __all__ = ("InMemoryStorage",) typeddjango-django-stubs-fa03b48/django-stubs/core/files/storage/mixins.pyi000066400000000000000000000005221526064357400271740ustar00rootroot00000000000000from typing import Any, Literal class StorageSettingsMixin: def _clear_cached_properties( self, setting: Literal["MEDIA_ROOT", "MEDIA_URL", "FILE_UPLOAD_PERMISSIONS", "FILE_UPLOAD_DIRECTORY_PERMISSIONS"], **kwargs: Any, ) -> None: ... def _value_or_setting(self, value: Any, setting: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/core/files/temp.pyi000066400000000000000000000002241526064357400251650ustar00rootroot00000000000000import tempfile NamedTemporaryFile = tempfile.NamedTemporaryFile gettempdir = tempfile.gettempdir __all__ = ("NamedTemporaryFile", "gettempdir") typeddjango-django-stubs-fa03b48/django-stubs/core/files/uploadedfile.pyi000066400000000000000000000037071526064357400266660ustar00rootroot00000000000000from typing import IO, Any, Self from django.core.files.base import File from django.utils.functional import cached_property from typing_extensions import TypeVar, override # `typing.AnyStr` is deprecated from 3.16+, so we define our own equivalent constrained TypeVar. _AnyStr = TypeVar("_AnyStr", str, bytes) class UploadedFile(File[_AnyStr]): content_type: str | None charset: str | None content_type_extra: dict[str, bytes] | None @override @cached_property def size(self) -> int | None: ... # type: ignore[override] name: str | None def __init__( self, file: IO[_AnyStr] | None = None, name: str | None = None, content_type: str | None = None, size: int | None = None, charset: str | None = None, content_type_extra: dict[str, bytes] | None = None, ) -> None: ... class TemporaryUploadedFile(UploadedFile[Any]): def __init__( self, name: str, content_type: str | None, size: int | None, charset: str | None, content_type_extra: dict[str, bytes] | None = None, ) -> None: ... def temporary_file_path(self) -> str: ... class InMemoryUploadedFile(UploadedFile[Any]): field_name: str | None def __init__( self, file: IO[Any], field_name: str | None, name: str | None, content_type: str | None, size: int | None, charset: str | None, content_type_extra: dict[str, bytes] | None = None, ) -> None: ... @override def open(self, mode: str | None = None) -> Self: ... # type: ignore[override] class SimpleUploadedFile(InMemoryUploadedFile): def __init__(self, name: str, content: bytes | None, content_type: str = "text/plain") -> None: ... @classmethod def from_dict(cls, file_dict: dict[str, str | bytes]) -> Self: ... __all__ = ( "InMemoryUploadedFile", "SimpleUploadedFile", "TemporaryUploadedFile", "UploadedFile", ) typeddjango-django-stubs-fa03b48/django-stubs/core/files/uploadhandler.pyi000066400000000000000000000064421526064357400270520ustar00rootroot00000000000000from typing import IO, Any from django.core.files.uploadedfile import TemporaryUploadedFile, UploadedFile from django.http.request import HttpRequest, QueryDict from django.utils.datastructures import MultiValueDict from typing_extensions import override class UploadFileException(Exception): ... class StopUpload(UploadFileException): connection_reset: bool def __init__(self, connection_reset: bool = False) -> None: ... class SkipFile(UploadFileException): ... class StopFutureHandlers(UploadFileException): ... class FileUploadHandler: chunk_size: int file_name: str | None content_type: str | None content_length: int | None charset: str | None content_type_extra: dict[str, bytes] | None request: HttpRequest | None field_name: str def __init__(self, request: HttpRequest | None = None) -> None: ... def handle_raw_input( self, input_data: IO[bytes], META: dict[str, str], content_length: int, boundary: str, encoding: str | None = None, ) -> tuple[QueryDict, MultiValueDict[str, UploadedFile[Any]]] | None: ... def new_file( self, field_name: str, file_name: str, content_type: str, content_length: int | None, charset: str | None = None, content_type_extra: dict[str, bytes] | None = None, ) -> None: ... def receive_data_chunk(self, raw_data: bytes, start: int) -> bytes | None: ... def file_complete(self, file_size: int) -> UploadedFile[Any] | None: ... def upload_complete(self) -> None: ... def upload_interrupted(self) -> None: ... class TemporaryFileUploadHandler(FileUploadHandler): file: TemporaryUploadedFile @override def new_file( self, field_name: str, file_name: str, content_type: str, content_length: int | None, charset: str | None = ..., content_type_extra: dict[str, bytes] | None = ..., ) -> None: ... @override def receive_data_chunk(self, raw_data: bytes, start: int) -> bytes | None: ... @override def file_complete(self, file_size: int) -> UploadedFile[Any] | None: ... @override def upload_interrupted(self) -> None: ... class MemoryFileUploadHandler(FileUploadHandler): activated: bool file: IO[bytes] @override def handle_raw_input( self, input_data: IO[bytes], META: dict[str, str], content_length: int, boundary: str, encoding: str | None = None, ) -> tuple[QueryDict, MultiValueDict[str, UploadedFile[Any]]] | None: ... @override def new_file( self, field_name: str, file_name: str, content_type: str, content_length: int | None, charset: str | None = ..., content_type_extra: dict[str, bytes] | None = ..., ) -> None: ... @override def receive_data_chunk(self, raw_data: bytes, start: int) -> bytes | None: ... @override def file_complete(self, file_size: int) -> UploadedFile[Any] | None: ... def load_handler(path: str, *args: Any, **kwargs: Any) -> FileUploadHandler: ... __all__ = [ "FileUploadHandler", "MemoryFileUploadHandler", "SkipFile", "StopFutureHandlers", "StopUpload", "TemporaryFileUploadHandler", "UploadFileException", "load_handler", ] typeddjango-django-stubs-fa03b48/django-stubs/core/files/utils.pyi000066400000000000000000000021651526064357400253660ustar00rootroot00000000000000from collections.abc import Iterator from typing import IO, Any, AnyStr, Generic from _typeshed import StrPath def validate_file_name(name: StrPath, allow_relative_path: bool = False) -> StrPath: ... class FileProxyMixin(Generic[AnyStr]): file: IO[AnyStr] | None @property def encoding(self) -> Any: ... @property def fileno(self) -> Any: ... @property def flush(self) -> Any: ... @property def isatty(self) -> Any: ... @property def newlines(self) -> Any: ... @property def read(self) -> Any: ... @property def readinto(self) -> Any: ... @property def readline(self) -> Any: ... @property def readlines(self) -> Any: ... @property def seek(self) -> Any: ... @property def tell(self) -> Any: ... @property def truncate(self) -> Any: ... @property def write(self) -> Any: ... @property def writelines(self) -> Any: ... @property def closed(self) -> bool: ... def readable(self) -> bool: ... def writable(self) -> bool: ... def seekable(self) -> bool: ... def __iter__(self) -> Iterator[AnyStr]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/handlers/000077500000000000000000000000001526064357400241755ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/handlers/__init__.pyi000066400000000000000000000000001526064357400264450ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/handlers/asgi.pyi000066400000000000000000000052101526064357400256410ustar00rootroot00000000000000from collections.abc import Awaitable, Callable, Iterator, Mapping, Sequence from logging import Logger from typing import IO, Any, TypeAlias from _typeshed import ExcInfo from django.core.files import uploadedfile from django.core.handlers import base from django.http.request import HttpRequest, _ImmutableQueryDict from django.http.response import HttpResponseBase from django.urls.resolvers import ResolverMatch, URLResolver from django.utils.datastructures import MultiValueDict from django.utils.functional import cached_property from typing_extensions import TypeVar, override _ReceiveCallback: TypeAlias = Callable[[], Awaitable[Mapping[str, Any]]] _SendCallback: TypeAlias = Callable[[Mapping[str, Any]], Awaitable[None]] logger: Logger def get_script_prefix(scope: Mapping[str, Any]) -> str: ... class ASGIRequest(HttpRequest): body_receive_timeout: int scope: Mapping[str, Any] resolver_match: ResolverMatch | None script_name: str | None path_info: str path: str method: str META: dict[str, Any] def __init__(self, scope: Mapping[str, Any], body_file: IO[bytes]) -> None: ... @cached_property @override def GET(self) -> _ImmutableQueryDict: ... # type: ignore[override] POST: _ImmutableQueryDict @property @override def FILES(self) -> MultiValueDict[str, uploadedfile.UploadedFile[Any]]: ... # type: ignore[override] @cached_property @override def COOKIES(self) -> dict[str, str]: ... # type: ignore[override] _T = TypeVar("_T") class ASGIHandler(base.BaseHandler): request_class: type[ASGIRequest] chunk_size: int def __init__(self) -> None: ... async def __call__( self, scope: dict[str, Any], receive: _ReceiveCallback, send: _SendCallback, ) -> None: ... async def handle( self, scope: dict[str, Any], receive: _ReceiveCallback, send: _SendCallback ) -> HttpResponseBase | None: ... async def listen_for_disconnect(self, receive: _ReceiveCallback) -> None: ... async def run_get_response(self, request: HttpRequest) -> HttpResponseBase: ... async def read_body(self, receive: _ReceiveCallback) -> IO[bytes]: ... def create_request( self, scope: Mapping[str, Any], body_file: IO[bytes] ) -> tuple[ASGIRequest, None] | tuple[None, HttpResponseBase]: ... def handle_uncaught_exception( self, request: HttpRequest, resolver: URLResolver, exc_info: ExcInfo ) -> HttpResponseBase: ... async def send_response(self, response: HttpResponseBase, send: _SendCallback) -> None: ... @classmethod def chunk_bytes(cls, data: Sequence[_T]) -> Iterator[tuple[Sequence[_T], bool]]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/handlers/base.pyi000066400000000000000000000025111526064357400256310ustar00rootroot00000000000000from collections.abc import Awaitable, Callable from logging import Logger from typing import Any import _typeshed from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseBase from django.urls.resolvers import ResolverMatch logger: Logger class BaseHandler: def load_middleware(self, is_async: bool = ...) -> None: ... def adapt_method_mode( self, is_async: bool, method: Callable[[HttpRequest], HttpResponseBase | Awaitable[HttpResponseBase]], method_is_async: bool | None = ..., debug: bool = ..., name: str | None = ..., ) -> Callable[[HttpRequest], HttpResponseBase | Awaitable[HttpResponseBase]]: ... def get_response(self, request: HttpRequest) -> HttpResponseBase: ... async def get_response_async(self, request: HttpRequest) -> HttpResponseBase: ... def resolve_request(self, request: HttpRequest) -> ResolverMatch: ... def check_response(self, response: HttpResponseBase, callback: Any, name: str | None = ...) -> None: ... def make_view_atomic(self, view: Callable[..., HttpResponseBase]) -> Callable[..., HttpResponseBase]: ... def process_exception_by_middleware(self, exception: Exception, request: HttpRequest) -> HttpResponse: ... def reset_urlconf(sender: _typeshed.Unused, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/handlers/exception.pyi000066400000000000000000000014161526064357400267200ustar00rootroot00000000000000from collections.abc import Awaitable, Callable from _typeshed import ExcInfo from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseBase from django.urls.resolvers import URLResolver def convert_exception_to_response( get_response: Callable[[HttpRequest], HttpResponseBase | Awaitable[HttpResponseBase]], ) -> Callable[[HttpRequest], HttpResponseBase | Awaitable[HttpResponseBase]]: ... def response_for_exception(request: HttpRequest, exc: Exception) -> HttpResponse: ... def get_exception_response( request: HttpRequest, resolver: URLResolver, status_code: int, exception: Exception ) -> HttpResponse: ... def handle_uncaught_exception(request: HttpRequest, resolver: URLResolver, exc_info: ExcInfo) -> HttpResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/core/handlers/wsgi.pyi000066400000000000000000000033511526064357400256730ustar00rootroot00000000000000from io import BytesIO, IOBase from typing import Any from wsgiref.types import StartResponse, WSGIEnvironment from django.core.files import uploadedfile from django.core.handlers import base from django.http import HttpRequest from django.http.request import _ImmutableQueryDict from django.http.response import HttpResponseBase from django.utils.datastructures import MultiValueDict from django.utils.functional import cached_property from typing_extensions import override class LimitedStream(IOBase): limit: int def __init__(self, stream: BytesIO, limit: int) -> None: ... @override def read(self, size: int | None = -1, /) -> bytes: ... @override def readline(self, size: int | None = -1, /) -> bytes: ... class WSGIRequest(HttpRequest): environ: WSGIEnvironment def __init__(self, environ: WSGIEnvironment) -> None: ... @cached_property @override def GET(self) -> _ImmutableQueryDict: ... # type: ignore[override] @cached_property @override def COOKIES(self) -> dict[str, str]: ... # type: ignore[override] @property @override def FILES(self) -> MultiValueDict[str, uploadedfile.UploadedFile[Any]]: ... # type: ignore[override] class WSGIHandler(base.BaseHandler): request_class: type[WSGIRequest] def __init__(self, *args: Any, **kwargs: Any) -> None: ... def __call__( self, environ: WSGIEnvironment, start_response: StartResponse, ) -> HttpResponseBase: ... def get_path_info(environ: WSGIEnvironment) -> str: ... def get_script_name(environ: WSGIEnvironment) -> str: ... def get_bytes_from_wsgi(environ: WSGIEnvironment, key: str, default: str) -> bytes: ... def get_str_from_wsgi(environ: WSGIEnvironment, key: str, default: str) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/core/mail/000077500000000000000000000000001526064357400233175ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/mail/__init__.pyi000066400000000000000000000054141526064357400256050ustar00rootroot00000000000000from collections.abc import Iterable, Sequence from typing import Any from django.utils.functional import _StrOrPromise from .backends.base import BaseEmailBackend from .exceptions import InvalidMailer as InvalidMailer from .exceptions import MailerDoesNotExist as MailerDoesNotExist from .handler import MailersHandler from .message import DEFAULT_ATTACHMENT_MIME_TYPE as DEFAULT_ATTACHMENT_MIME_TYPE from .message import BadHeaderError as BadHeaderError from .message import EmailAlternative as EmailAlternative from .message import EmailAttachment as EmailAttachment from .message import EmailMessage as EmailMessage from .message import EmailMultiAlternatives as EmailMultiAlternatives from .message import SafeMIMEMultipart as SafeMIMEMultipart from .message import SafeMIMEText as SafeMIMEText from .message import forbid_multi_line_headers as forbid_multi_line_headers from .message import make_msgid as make_msgid from .utils import DNS_NAME as DNS_NAME from .utils import CachedDnsName as CachedDnsName mailers: MailersHandler def get_connection(backend: str | None = None, *, fail_silently: bool = False, **kwds: Any) -> BaseEmailBackend: ... def send_mail( subject: _StrOrPromise, message: _StrOrPromise, from_email: str | None, recipient_list: Sequence[str], *, fail_silently: bool = False, auth_user: str | None = None, auth_password: str | None = None, connection: BaseEmailBackend | None = None, html_message: str | None = None, using: str | None = None, ) -> int: ... def send_mass_mail( datatuple: Iterable[tuple[str, str, str | None, list[str]]], *, fail_silently: bool = False, auth_user: str | None = None, auth_password: str | None = None, connection: BaseEmailBackend | None = None, using: str | None = None, ) -> int: ... def mail_admins( subject: _StrOrPromise, message: _StrOrPromise, *, fail_silently: bool = False, connection: BaseEmailBackend | None = None, html_message: str | None = None, using: str | None = None, ) -> None: ... def mail_managers( subject: _StrOrPromise, message: _StrOrPromise, *, fail_silently: bool = False, connection: BaseEmailBackend | None = None, html_message: str | None = None, using: str | None = None, ) -> None: ... outbox: list[EmailMessage | EmailMultiAlternatives] __all__ = [ "DEFAULT_ATTACHMENT_MIME_TYPE", "DNS_NAME", "BadHeaderError", "CachedDnsName", "EmailAlternative", "EmailAttachment", "EmailMessage", "EmailMultiAlternatives", "InvalidMailer", "MailerDoesNotExist", "SafeMIMEMultipart", "SafeMIMEText", "forbid_multi_line_headers", "get_connection", "mail_admins", "mail_managers", "mailers", "make_msgid", "send_mail", "send_mass_mail", ] typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/000077500000000000000000000000001526064357400250715ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/__init__.pyi000066400000000000000000000000001526064357400273410ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/base.pyi000066400000000000000000000014161526064357400265300ustar00rootroot00000000000000from collections.abc import Sequence from types import TracebackType from typing import Any, Self from django.core.mail.message import EmailMessage class BaseEmailBackend: fail_silently: bool def __init__( self, fail_silently: bool | object = ..., *, alias: str | None = None, _ignore_unknown_kwargs: set[str] | None = None, **kwargs: Any, ) -> None: ... def open(self) -> bool | None: ... def close(self) -> None: ... def __enter__(self) -> Self: ... def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, exc_tb: TracebackType | None, ) -> None: ... def send_messages(self, email_messages: Sequence[EmailMessage]) -> int: ... typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/console.pyi000066400000000000000000000004571526064357400272640ustar00rootroot00000000000000import threading from typing import TextIO from django.core.mail.backends.base import BaseEmailBackend from django.core.mail.message import EmailMessage class EmailBackend(BaseEmailBackend): stream: TextIO _lock: threading.RLock def write_message(self, message: EmailMessage) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/dummy.pyi000066400000000000000000000001471526064357400267510ustar00rootroot00000000000000from django.core.mail.backends.base import BaseEmailBackend class EmailBackend(BaseEmailBackend): ... typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/filebased.pyi000066400000000000000000000004251526064357400275330ustar00rootroot00000000000000from typing import Any from django.core.mail.backends.console import EmailBackend as ConsoleEmailBackend class EmailBackend(ConsoleEmailBackend): file_path: str def __init__(self, fail_silently: bool = False, file_path: str | None = None, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/locmem.pyi000066400000000000000000000004721526064357400270730ustar00rootroot00000000000000from collections.abc import Sequence from django.core.mail.backends.base import BaseEmailBackend from django.core.mail.message import EmailMessage from typing_extensions import override class EmailBackend(BaseEmailBackend): @override def send_messages(self, messages: Sequence[EmailMessage]) -> int: ... typeddjango-django-stubs-fa03b48/django-stubs/core/mail/backends/smtp.pyi000066400000000000000000000023401526064357400265760ustar00rootroot00000000000000import smtplib import ssl import threading from typing import Any from _typeshed import StrOrBytesPath from django.core.mail.backends.base import BaseEmailBackend from django.utils.functional import cached_property class EmailBackend(BaseEmailBackend): host: str port: int username: str password: str use_tls: bool use_ssl: bool timeout: float | None ssl_keyfile: StrOrBytesPath | None ssl_certfile: StrOrBytesPath | None connection: smtplib.SMTP_SSL | smtplib.SMTP | None _lock: threading.RLock def __init__( self, host: str | None = None, port: int | None = None, username: str | None = None, password: str | None = None, use_tls: bool | None = None, fail_silently: bool = False, use_ssl: bool | None = None, timeout: float | None = None, ssl_keyfile: StrOrBytesPath | None = None, ssl_certfile: StrOrBytesPath | None = None, **kwargs: Any, ) -> None: ... @property def connection_class(self) -> type[smtplib.SMTP_SSL | smtplib.SMTP]: ... @cached_property def ssl_context(self) -> ssl.SSLContext: ... def prep_address(self, address: str, force_ascii: bool = True) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/core/mail/deprecation.pyi000066400000000000000000000007401526064357400263400ustar00rootroot00000000000000# RemovedInDjango70Warning: this entire file. from django.core.mail.backends.base import BaseEmailBackend FAIL_SILENTLY_ARG_WARNING: str AUTH_ARGS_WARNING: str CONNECTION_ARG_WARNING: str NO_DEFAULT_MAILER_WARNING: str def report_using_incompatibility( connection: BaseEmailBackend | None = None, fail_silently: bool = False, auth_user: str | None = None, auth_password: str | None = None, ) -> None: ... def warn_about_default_mailers_if_needed() -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/mail/exceptions.pyi000066400000000000000000000004261526064357400262250ustar00rootroot00000000000000from django.core.exceptions import ImproperlyConfigured class InvalidMailer(ImproperlyConfigured): def __init__(self, msg: str, *, alias: str | None = None) -> None: ... class MailerDoesNotExist(InvalidMailer, KeyError): def __init__(self, *, alias: str) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/mail/handler.pyi000066400000000000000000000015431526064357400254620ustar00rootroot00000000000000from collections.abc import Iterator, Mapping from typing import Any, Literal, TypeAlias from django.core.mail.backends.base import BaseEmailBackend DEFAULT_MAILER_ALIAS: Literal["default"] DEFAULT_MAILER_BACKEND: Literal["django.core.mail.backends.smtp.EmailBackend"] _MailerSetting: TypeAlias = Mapping[str, Any] class MailersHandler: def __getitem__(self, /, alias: str) -> BaseEmailBackend: ... def __contains__(self, /, alias: str) -> bool: ... def __iter__(self) -> Iterator[_MailerSetting]: ... def get(self, alias: str, /, default: Any | None = None) -> BaseEmailBackend: ... @property def default(self) -> BaseEmailBackend: ... @property def settings(self) -> _MailerSetting: ... def create_connection( self, alias: str, /, *, _deprecated_kwargs: Mapping[str, Any] | None = None ) -> BaseEmailBackend: ... typeddjango-django-stubs-fa03b48/django-stubs/core/mail/message.pyi000066400000000000000000000107171526064357400254740ustar00rootroot00000000000000from collections.abc import Sequence from email.message import EmailMessage as _StdlibEmailMessage from email.message import Message, MIMEPart from email.mime.base import MIMEBase from email.mime.message import MIMEMessage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.policy import Policy from email.utils import make_msgid as make_msgid from typing import Any, NamedTuple, TypeAlias, overload from django.core.mail.backends.base import BaseEmailBackend from django.utils.functional import _StrOrPromise utf8_charset: Any utf8_charset_qp: Any DEFAULT_ATTACHMENT_MIME_TYPE: str RFC5322_EMAIL_LINE_LENGTH_LIMIT: int class BadHeaderError(ValueError): ... ADDRESS_HEADERS: set[str] def forbid_multi_line_headers(name: str, val: str, encoding: str) -> tuple[str, str]: ... def sanitize_address(addr: tuple[str, str] | str, encoding: str) -> str: ... class MIMEMixin: def as_string(self, unixfrom: bool = False, linesep: str = "\n") -> str: ... def as_bytes(self, unixfrom: bool = False, linesep: str = "\n") -> bytes: ... class SafeMIMEMessage(MIMEMixin, MIMEMessage): ... # type: ignore[misc] class SafeMIMEText(MIMEMixin, MIMEText): # type: ignore[misc] encoding: str def __init__(self, _text: str, _subtype: str = "plain", _charset: str | None = None) -> None: ... class SafeMIMEMultipart(MIMEMixin, MIMEMultipart): # type: ignore[misc] encoding: str def __init__( self, _subtype: str = "mixed", boundary: Any | None = None, _subparts: Any | None = None, encoding: str | None = None, **_params: Any, ) -> None: ... _AttachmentContent: TypeAlias = bytes | EmailMessage | Message | SafeMIMEText | str _AttachmentTuple: TypeAlias = ( tuple[str, _AttachmentContent] | tuple[str | None, _AttachmentContent, str] | tuple[str, _AttachmentContent, None] ) class EmailAlternative(NamedTuple): content: _AttachmentContent mimetype: str class EmailAttachment(NamedTuple): filename: str | None content: _AttachmentContent mimetype: str class EmailMessage: content_subtype: str encoding: Any to: list[str] cc: list[Any] bcc: list[Any] reply_to: list[Any] from_email: str subject: _StrOrPromise body: _StrOrPromise attachments: list[Any] extra_headers: dict[Any, Any] connection: BaseEmailBackend | None def __init__( self, subject: _StrOrPromise = "", body: _StrOrPromise | None = "", from_email: str | None = None, to: Sequence[str] | None = None, *, bcc: Sequence[str] | None = None, connection: BaseEmailBackend | None = None, attachments: Sequence[MIMEBase | _AttachmentTuple] | None = None, headers: dict[str, str] | None = None, cc: Sequence[str] | None = None, reply_to: Sequence[str] | None = None, ) -> None: ... def message(self, *, policy: Policy | None = ...) -> _StdlibEmailMessage: ... def recipients(self) -> list[str]: ... def send(self, fail_silently: bool = False, *, using: str | None = None) -> int: ... @overload def attach(self, filename: MIMEBase | None = None, content: None = None, mimetype: None = None) -> None: ... @overload def attach( self, filename: None = None, content: _AttachmentContent | None = None, mimetype: str | None = None ) -> None: ... @overload def attach( self, filename: str | None = None, content: _AttachmentContent | None = None, mimetype: str | None = None ) -> None: ... @overload def attach(self, filename: MIMEPart) -> None: ... def attach_file(self, path: str, mimetype: str | None = None) -> None: ... class EmailMultiAlternatives(EmailMessage): alternatives: list[tuple[_AttachmentContent, str]] def __init__( self, subject: _StrOrPromise = "", body: _StrOrPromise | None = "", from_email: str | None = None, to: Sequence[str] | None = None, *, bcc: Sequence[str] | None = None, connection: Any | None = None, attachments: Sequence[MIMEBase | _AttachmentTuple] | None = None, headers: dict[str, str] | None = None, alternatives: list[tuple[_AttachmentContent, str]] | None = None, cc: Sequence[str] | None = None, reply_to: Sequence[str] | None = None, ) -> None: ... def attach_alternative(self, content: _AttachmentContent, mimetype: str) -> None: ... def body_contains(self, text: str) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/core/mail/utils.pyi000066400000000000000000000001371526064357400252030ustar00rootroot00000000000000from typing import Any class CachedDnsName: def get_fqdn(self) -> str: ... DNS_NAME: Any typeddjango-django-stubs-fa03b48/django-stubs/core/management/000077500000000000000000000000001526064357400245115ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/management/__init__.pyi000066400000000000000000000016651526064357400270030ustar00rootroot00000000000000from typing import Any from .base import BaseCommand as BaseCommand from .base import CommandError as CommandError from .base import CommandParser as CommandParser from .base import handle_default_options as handle_default_options def find_commands(management_dir: str) -> list[str]: ... def load_command_class(app_name: str, name: str) -> BaseCommand: ... def get_commands() -> dict[str, str]: ... def call_command(command_name: BaseCommand | str, *args: Any, **options: Any) -> str: ... class ManagementUtility: argv: list[str] prog_name: str settings_exception: Exception | None def __init__(self, argv: list[str] | None = None) -> None: ... def main_help_text(self, commands_only: bool = False) -> str: ... def fetch_command(self, subcommand: str) -> BaseCommand: ... def autocomplete(self) -> None: ... def execute(self) -> None: ... def execute_from_command_line(argv: list[str] | None = None) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/base.pyi000066400000000000000000000100601526064357400261430ustar00rootroot00000000000000from argparse import ArgumentParser, HelpFormatter, Namespace from collections.abc import Callable, Iterable, Sequence from io import TextIOBase from typing import Any, Literal, TextIO from django.apps.config import AppConfig from django.core.management.color import Style from django.utils.datastructures import _ListOrTuple from typing_extensions import override ALL_CHECKS: Literal["__all__"] class CommandError(Exception): returncode: int def __init__(self, *args: Any, returncode: int = 1, **kwargs: Any) -> None: ... class SystemCheckError(CommandError): ... class CommandParser(ArgumentParser): missing_args_message: str | None called_from_command_line: bool | None def __init__( self, *, missing_args_message: str | None = None, called_from_command_line: bool | None = None, **kwargs: Any ) -> None: ... @override def error(self, message: str) -> Any: ... def handle_default_options(options: Namespace) -> None: ... def no_translations(handle_func: Callable[..., Any]) -> Callable[..., Any]: ... class DjangoHelpFormatter(HelpFormatter): show_last: set[str] @override def add_usage(self, usage: str | None, actions: Iterable[Any], *args: Any, **kwargs: Any) -> Any: ... @override def add_arguments(self, actions: Any) -> Any: ... class OutputWrapper(TextIOBase): @property def style_func(self) -> Callable[[str], str]: ... @style_func.setter def style_func(self, style_func: Callable[[str], str] | None) -> None: ... ending: str def __init__(self, out: TextIO, ending: str = "\n") -> None: ... def __getattr__(self, name: str) -> Callable[..., Any]: ... @override def flush(self) -> None: ... @override def isatty(self) -> bool: ... @override def write( # type: ignore[override] self, msg: str = "", style_func: Callable[[str], str] | None = None, ending: str | None = None ) -> None: ... class BaseCommand: help: str output_transaction: bool requires_migrations_checks: bool requires_system_checks: _ListOrTuple[str] | Literal["__all__"] base_stealth_options: tuple[str, ...] stealth_options: tuple[str, ...] suppressed_base_arguments: set[str] stdout: OutputWrapper stderr: OutputWrapper style: Style def __init__( self, stdout: TextIO | None = None, stderr: TextIO | None = None, no_color: bool = False, force_color: bool = False, ) -> None: ... def get_version(self) -> str: ... def create_parser(self, prog_name: str, subcommand: str, **kwargs: Any) -> CommandParser: ... def add_arguments(self, parser: CommandParser) -> None: ... def add_base_argument(self, parser: CommandParser, *args: Any, **kwargs: Any) -> None: ... def print_help(self, prog_name: str, subcommand: str) -> None: ... def run_from_argv(self, argv: list[str]) -> None: ... def execute(self, *args: Any, **options: Any) -> str | None: ... def get_check_kwargs(self, options: Any) -> dict[str | None, _ListOrTuple[str] | Literal["__all__"] | None]: ... def check( self, app_configs: Sequence[AppConfig] | None = None, tags: Sequence[str] | None = None, display_num_errors: bool = False, include_deployment_checks: bool = False, fail_level: int = 40, databases: Sequence[str] | None = None, ) -> None: ... def check_migrations(self) -> None: ... def handle(self, *args: Any, **options: Any) -> str | None: ... class AppCommand(BaseCommand): missing_args_message: str @override def add_arguments(self, parser: CommandParser) -> None: ... @override def handle(self, *app_labels: str, **options: Any) -> str | None: ... def handle_app_config(self, app_config: Any, **options: Any) -> str | None: ... class LabelCommand(BaseCommand): label: str missing_args_message: Any @override def add_arguments(self, parser: CommandParser) -> None: ... @override def handle(self, *labels: str, **options: Any) -> str | None: ... def handle_label(self, label: str, **options: Any) -> str | None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/color.pyi000066400000000000000000000022331526064357400263520ustar00rootroot00000000000000HAS_COLORAMA: bool def supports_color() -> bool: ... class Style: # set by make_style. Method names are keys in django.utils.termcolors.PALETTES def ERROR(self, text: str) -> str: ... def SUCCESS(self, text: str) -> str: ... def WARNING(self, text: str) -> str: ... def NOTICE(self, text: str) -> str: ... def SQL_FIELD(self, text: str) -> str: ... def SQL_COLTYPE(self, text: str) -> str: ... def SQL_KEYWORD(self, text: str) -> str: ... def SQL_TABLE(self, text: str) -> str: ... def HTTP_INFO(self, text: str) -> str: ... def HTTP_SUCCESS(self, text: str) -> str: ... def HTTP_REDIRECT(self, text: str) -> str: ... def HTTP_NOT_MODIFIED(self, text: str) -> str: ... def HTTP_BAD_REQUEST(self, text: str) -> str: ... def HTTP_NOT_FOUND(self, text: str) -> str: ... def HTTP_SERVER_ERROR(self, text: str) -> str: ... def MIGRATE_HEADING(self, text: str) -> str: ... def MIGRATE_LABEL(self, text: str) -> str: ... def ERROR_OUTPUT(self, text: str) -> str: ... def make_style(config_string: str = "") -> Style: ... def no_style() -> Style: ... def color_style(force_color: bool = False) -> Style: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/000077500000000000000000000000001526064357400263125ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/__init__.pyi000066400000000000000000000000001526064357400305620ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/check.pyi000066400000000000000000000003501526064357400301100ustar00rootroot00000000000000from typing import Any from django.core.management.base import BaseCommand from typing_extensions import override class Command(BaseCommand): @override def handle(self, *app_labels: list[str], **options: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/compilemessages.pyi000066400000000000000000000010111526064357400322060ustar00rootroot00000000000000from pathlib import Path from typing import Any from _typeshed import StrPath from django.core.management.base import BaseCommand from typing_extensions import override def has_bom(fn: Path) -> bool: ... def is_dir_writable(path: StrPath) -> bool: ... class Command(BaseCommand): program: str program_options: list[str] verbosity: int has_errors: bool @override def handle(self, **options: Any) -> None: ... def compile_messages(self, locations: list[tuple[StrPath, StrPath]]) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/createcachetable.pyi000066400000000000000000000005211526064357400322720ustar00rootroot00000000000000from typing import Any from django.core.management.base import BaseCommand from typing_extensions import override class Command(BaseCommand): verbosity: int @override def handle(self, *tablenames: list[str], **options: Any) -> None: ... def create_table(self, database: str, tablename: str, dry_run: bool) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/dbshell.pyi000066400000000000000000000003201526064357400304450ustar00rootroot00000000000000from typing import Any from django.core.management.base import BaseCommand from typing_extensions import override class Command(BaseCommand): @override def handle(self, **options: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/diffsettings.pyi000066400000000000000000000011551526064357400315300ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from django.core.management.base import BaseCommand from typing_extensions import override def module_to_dict(module: Any, omittable: Callable[[str], bool] = ...) -> dict[str, str]: ... class Command(BaseCommand): @override def handle(self, **options: Any) -> str: ... def output_hash( self, user_settings: dict[str, str], default_settings: dict[str, str], **options: Any ) -> list[str]: ... def output_unified( self, user_settings: dict[str, str], default_settings: dict[str, str], **options: Any ) -> list[str]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/dumpdata.pyi000066400000000000000000000002311526064357400306300ustar00rootroot00000000000000from django.core.management.base import BaseCommand has_bz2: bool has_lzma: bool class ProxyModelWarning(Warning): ... class Command(BaseCommand): ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/flush.pyi000066400000000000000000000004211526064357400301530ustar00rootroot00000000000000from typing import Any from django.core.management.base import BaseCommand from django.core.management.color import Style from typing_extensions import override class Command(BaseCommand): style: Style @override def handle(self, **options: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/inspectdb.pyi000066400000000000000000000017451526064357400310170ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any from django.core.management.base import BaseCommand from django.db.backends.base.base import BaseDatabaseWrapper from typing_extensions import override class Command(BaseCommand): db_module: str @override def handle(self, **options: Any) -> None: ... def handle_inspection(self, options: dict[str, Any]) -> Iterable[str]: ... def normalize_col_name( self, col_name: str, used_column_names: list[str], is_relation: bool ) -> tuple[str, dict[str, str], list[str]]: ... def normalize_table_name(self, table_name: str) -> str: ... def get_field_type( self, connection: BaseDatabaseWrapper, table_name: str, row: Any ) -> tuple[str, dict[str, Any], list[str]]: ... def get_meta( self, table_name: str, constraints: Any, column_to_field_name: Any, is_view: bool, is_partition: bool, comment: str | None, ) -> list[str]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/loaddata.pyi000066400000000000000000000044631526064357400306150ustar00rootroot00000000000000import zipfile from collections.abc import Callable, Sequence from io import BufferedReader from typing import Literal, TypeAlias from django.apps.config import AppConfig from django.core.management.base import BaseCommand from django.core.serializers.base import DeserializedObject from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.base import Model from django.utils.functional import cached_property from typing_extensions import override has_bz2: bool has_lzma: bool READ_STDIN: str _ReadBinaryMode: TypeAlias = Literal["r", "rb"] class Command(BaseCommand): missing_args_message: str ignore: bool using: str app_label: str verbosity: int excluded_models: set[type[Model]] excluded_apps: set[AppConfig] format: str fixture_count: int loaded_object_count: int fixture_object_count: int models: set[type[Model]] serialization_formats: list[str] objs_with_deferred_fields: list[DeserializedObject] @cached_property def compression_formats(self) -> dict[str | None, tuple[Callable[[str, _ReadBinaryMode], BufferedReader]]]: ... def reset_sequences(self, connection: BaseDatabaseWrapper, models: set[type[Model]]) -> None: ... def loaddata(self, fixture_labels: Sequence[str]) -> None: ... def save_obj(self, obj: DeserializedObject) -> bool: ... def load_label(self, fixture_label: str) -> None: ... def get_fixture_name_and_dirs(self, fixture_name: str) -> tuple[str, list[str]]: ... def get_targets(self, fixture_name: str, ser_fmt: str | None, cmp_fmt: str | None) -> set[str]: ... def find_fixture_files_in_dir( self, fixture_dir: str, fixture_name: str, targets: set[str] ) -> list[tuple[str, str, str]]: ... def find_fixtures(self, fixture_label: str) -> list[tuple[str, str | None, str | None]]: ... @cached_property def fixture_dirs(self) -> list[str]: ... def parse_name(self, fixture_name: str) -> tuple[str, str | None, str | None]: ... class SingleZipReader(zipfile.ZipFile): # Incompatible override # zipfile.ZipFile.read( # self, # name: typing.Text | zipfile.ZipInfo, # pwd: bytes | None = ..., # ) -> bytes: ... @override def read(self) -> bytes: ... # type: ignore[override] def humanize(dirname: str) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/makemessages.pyi000066400000000000000000000051511526064357400315040ustar00rootroot00000000000000from re import Match, Pattern from typing import Any from django.core.management.base import BaseCommand from django.utils.functional import cached_property from typing_extensions import override plural_forms_re: Pattern[str] STATUS_OK: int NO_LOCALE_DIR: Any def check_programs(*programs: str) -> None: ... def is_valid_locale(locale: str) -> Match[str] | None: ... class TranslatableFile: dirpath: str file: str locale_dir: str | None def __init__(self, dirpath: str, file_name: str, locale_dir: str | None) -> None: ... @override def __eq__(self, other: object) -> bool: ... def __ge__(self, other: object) -> bool: ... def __gt__(self, other: object) -> bool: ... def __le__(self, other: object) -> bool: ... def __lt__(self, other: object) -> bool: ... @property def path(self) -> str: ... class BuildFile: """ Represent the state of a translatable file during the build process. """ command: BaseCommand domain: str translatable: TranslatableFile def __init__(self, command: BaseCommand, domain: str, translatable: TranslatableFile) -> None: ... @cached_property def is_templatized(self) -> bool: ... @cached_property def path(self) -> str: ... @cached_property def work_path(self) -> str: ... def preprocess(self) -> None: ... def postprocess_messages(self, msgs: str) -> str: ... def cleanup(self) -> None: ... def normalize_eols(raw_contents: str) -> str: ... def write_pot_file(potfile: str, msgs: str) -> None: ... class Command(BaseCommand): translatable_file_class: type[TranslatableFile] build_file_class: type[BuildFile] msgmerge_options: list[str] msguniq_options: list[str] msgattrib_options: list[str] xgettext_options: list[str] domain: str verbosity: int symlinks: bool ignore_patterns: list[str] no_obsolete: bool keep_pot: bool extensions: set[str] invoked_for_django: bool locale_paths: list[str] default_locale_path: str | None @cached_property def gettext_version(self) -> tuple[int, int] | tuple[int, int, int]: ... @cached_property def settings_available(self) -> bool: ... def build_potfiles(self) -> list[str]: ... def remove_potfiles(self) -> None: ... def find_files(self, root: str) -> list[TranslatableFile]: ... def process_files(self, file_list: list[TranslatableFile]) -> None: ... def process_locale_dir(self, locale_dir: str, files: list[TranslatableFile]) -> None: ... def write_po_file(self, potfile: str, locale: str) -> None: ... def copy_plural_forms(self, msgs: str, locale: str) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/makemigrations.pyi000066400000000000000000000017261526064357400320550ustar00rootroot00000000000000from typing import Any, ClassVar from django.core.management.base import BaseCommand, OutputWrapper from django.db.migrations.autodetector import MigrationAutodetector from django.db.migrations.loader import MigrationLoader class Command(BaseCommand): autodetector: ClassVar[type[MigrationAutodetector]] verbosity: int interactive: bool dry_run: bool merge: bool empty: bool migration_name: str include_header: bool scriptable: bool update: bool @property def log_output(self) -> OutputWrapper: ... def log(self, msg: str) -> None: ... def write_to_last_migration_files(self, changes: dict[str, Any]) -> None: ... def write_migration_files( self, changes: dict[str, Any], update_previous_migration_paths: dict[str, str] | None = None ) -> None: ... @staticmethod def get_relative_path(path: str) -> str: ... def handle_merge(self, loader: MigrationLoader, conflicts: dict[str, Any]) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/migrate.pyi000066400000000000000000000014141526064357400304650ustar00rootroot00000000000000from collections.abc import Container from typing import Any, ClassVar from django.core.management.base import BaseCommand from django.db.backends.base.base import BaseDatabaseWrapper from django.db.migrations.autodetector import MigrationAutodetector from django.db.migrations.operations.base import Operation class Command(BaseCommand): autodetector: ClassVar[type[MigrationAutodetector]] verbosity: int interactive: bool start: float def migration_progress_callback(self, action: str, migration: Any | None = None, fake: bool = False) -> None: ... def sync_apps(self, connection: BaseDatabaseWrapper, app_labels: Container[str]) -> None: ... @staticmethod def describe_operation(operation: Operation, backwards: bool) -> tuple[str, bool]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/optimizemigration.pyi000066400000000000000000000001251526064357400326050ustar00rootroot00000000000000from django.core.management.base import BaseCommand class Command(BaseCommand): ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/runserver.pyi000066400000000000000000000011511526064357400310660ustar00rootroot00000000000000from re import Pattern from typing import Any from django.core.handlers.wsgi import WSGIHandler from django.core.management.base import BaseCommand from django.core.servers.basehttp import WSGIServer naiveip_re: Pattern[str] class Command(BaseCommand): default_addr: str default_addr_ipv6: str default_port: str protocol: str server_cls: type[WSGIServer] def run(self, **options: Any) -> None: ... def get_handler(self, *args: Any, **options: Any) -> WSGIHandler: ... def inner_run(self, *args: Any, **options: Any) -> None: ... def on_bind(self, server_port: int) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/sendtestemail.pyi000066400000000000000000000004231526064357400316750ustar00rootroot00000000000000from typing import Any from django.core.management.base import BaseCommand from typing_extensions import override class Command(BaseCommand): missing_args_message: str @override def handle(self, *args: Any, using: str | None = None, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/shell.pyi000066400000000000000000000007571526064357400301550ustar00rootroot00000000000000from typing import Any from django.core.management import BaseCommand from typing_extensions import override class Command(BaseCommand): shells: list[str] @override def handle(self, **options: Any) -> None: ... def ipython(self, options: Any) -> None: ... def bpython(self, options: Any) -> None: ... def python(self, options: Any) -> None: ... def get_auto_imports(self) -> list[str] | None: ... def get_namespace(self, **options: Any) -> dict[str, Any]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/showmigrations.pyi000066400000000000000000000005651526064357400321200ustar00rootroot00000000000000from django.core.management.base import BaseCommand from django.db.backends.base.base import BaseDatabaseWrapper class Command(BaseCommand): verbosity: int def show_list(self, connection: BaseDatabaseWrapper, app_names: list[str] | None = None) -> None: ... def show_plan(self, connection: BaseDatabaseWrapper, app_names: list[str] | None = None) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/sqlflush.pyi000066400000000000000000000003551526064357400307010ustar00rootroot00000000000000from typing import Any from django.core.management.base import BaseCommand from typing_extensions import override class Command(BaseCommand): output_transaction: bool @override def handle(self, **options: Any) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/sqlmigrate.pyi000066400000000000000000000004001526064357400311770ustar00rootroot00000000000000from typing import Any from django.core.management.base import BaseCommand from typing_extensions import override class Command(BaseCommand): output_transaction: bool @override def execute(self, *args: Any, **options: Any) -> str | None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/sqlsequencereset.pyi000066400000000000000000000001231526064357400324240ustar00rootroot00000000000000from django.core.management.base import AppCommand class Command(AppCommand): ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/squashmigrations.pyi000066400000000000000000000007121526064357400324360ustar00rootroot00000000000000from typing import Any from django.core.management.base import BaseCommand from django.db.migrations.loader import MigrationLoader from django.db.migrations.migration import Migration from typing_extensions import override class Command(BaseCommand): verbosity: int interactive: bool @override def handle(self, **options: Any) -> None: ... def find_migration(self, loader: MigrationLoader, app_label: str, name: str) -> Migration: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/startapp.pyi000066400000000000000000000004261526064357400306750ustar00rootroot00000000000000from typing import Any from django.core.management.templates import TemplateCommand from typing_extensions import override class Command(TemplateCommand): missing_args_message: str @override def handle(self, **options: Any) -> None: ... # type: ignore[override] typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/startproject.pyi000066400000000000000000000004261526064357400315630ustar00rootroot00000000000000from typing import Any from django.core.management.templates import TemplateCommand from typing_extensions import override class Command(TemplateCommand): missing_args_message: str @override def handle(self, **options: Any) -> None: ... # type: ignore[override] typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/test.pyi000066400000000000000000000004531526064357400300160ustar00rootroot00000000000000from typing import Any from django.core.management.base import BaseCommand from typing_extensions import override class Command(BaseCommand): test_runner: Any @override def run_from_argv(self, argv: Any) -> None: ... @override def add_arguments(self, parser: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/commands/testserver.pyi000066400000000000000000000001251526064357400312410ustar00rootroot00000000000000from django.core.management.base import BaseCommand class Command(BaseCommand): ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/sql.pyi000066400000000000000000000007531526064357400260400ustar00rootroot00000000000000from typing import Any from django.core.management.color import Style from django.db.backends.base.base import BaseDatabaseWrapper def sql_flush( style: Style, connection: BaseDatabaseWrapper, reset_sequences: bool = True, allow_cascade: bool = False, ) -> list[str]: ... def emit_pre_migrate_signal(verbosity: int, interactive: bool, db: str, **kwargs: Any) -> None: ... def emit_post_migrate_signal(verbosity: int, interactive: bool, db: str, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/templates.pyi000066400000000000000000000021141526064357400272300ustar00rootroot00000000000000from argparse import ArgumentParser from collections.abc import Sequence from typing import Any from django.core.management.base import BaseCommand from typing_extensions import override class TemplateCommand(BaseCommand): url_schemes: Sequence[str] rewrite_template_suffixes: Sequence[tuple[str, str]] app_or_project: str a_or_an: str paths_to_remove: Sequence[Any] verbosity: Any @override def add_arguments(self, parser: ArgumentParser) -> None: ... @override def handle(self, app_or_project: str, name: str, target: str | None = ..., **options: Any) -> None: ... def handle_template(self, template: str | None, subdir: str | None) -> str: ... def validate_name(self, name: str, name_or_dir: str = ...) -> None: ... def download(self, url: str) -> str: ... def splitext(self, the_path: str) -> tuple[str, str]: ... def extract(self, filename: str) -> str: ... def is_url(self, template: str) -> bool: ... def apply_umask(self, old_path: str, new_path: str) -> None: ... def make_writeable(self, filename: str) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/management/utils.pyi000066400000000000000000000020751526064357400264000ustar00rootroot00000000000000from collections.abc import Iterable, Sequence from typing import Any from _typeshed import StrOrBytesPath, StrPath, SupportsWrite from django.apps.config import AppConfig from django.db.models.base import Model def popen_wrapper(args: list[str], stdout_encoding: str = "utf-8") -> tuple[str, str, int]: ... def handle_extensions(extensions: Iterable[str]) -> set[str]: ... def find_command( cmd: str, path: str | Iterable[str] | None = None, pathext: str | Iterable[str] | None = None, ) -> str | None: ... def get_random_secret_key() -> str: ... def parse_apps_and_model_labels(labels: Iterable[str]) -> tuple[set[type[Model]], set[AppConfig]]: ... def get_command_line_option(argv: Sequence[Any], option: Any) -> Any | None: ... def normalize_path_patterns(patterns: Iterable[str]) -> list[str]: ... def is_ignored_path(path: StrPath, ignore_patterns: Iterable[str]) -> bool: ... def find_formatters() -> dict[str, str | None]: ... def run_formatters( written_files: Iterable[StrOrBytesPath], black_path: str = ..., stderr: SupportsWrite[str] = ... ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/paginator.pyi000066400000000000000000000101671526064357400251110ustar00rootroot00000000000000from collections.abc import AsyncIterator, Iterable, Iterator, Sequence, Sized from typing import ClassVar, Generic, Protocol, overload, type_check_only from django.db.models.fields import _ErrorMessagesDict from django.utils.functional import _StrPromise, cached_property from typing_extensions import TypeVar, override class UnorderedObjectListWarning(RuntimeWarning): ... class InvalidPage(Exception): ... class PageNotAnInteger(InvalidPage): ... class EmptyPage(InvalidPage): ... _T = TypeVar("_T") @type_check_only class _SupportsPagination(Protocol[_T], Sized, Iterable[_T]): @overload def __getitem__(self, index: int, /) -> _T: ... @overload def __getitem__(self, index: slice, /) -> _SupportsPagination[_T]: ... class BasePaginator(Generic[_T]): ELLIPSIS: ClassVar[_StrPromise] default_error_messages: ClassVar[_ErrorMessagesDict] error_messages: _ErrorMessagesDict object_list: _SupportsPagination[_T] per_page: int orphans: int allow_empty_first_page: bool def __init__( self, object_list: _SupportsPagination[_T], per_page: int | str, orphans: int = 0, allow_empty_first_page: bool = True, error_messages: _ErrorMessagesDict | None = None, ) -> None: ... class Paginator(BasePaginator[_T]): def __iter__(self) -> Iterator[Page[_T]]: ... def validate_number(self, number: int | float | str) -> int: ... def get_page(self, number: int | float | str | None) -> Page[_T]: ... def page(self, number: int | str) -> Page[_T]: ... @cached_property def count(self) -> int: ... @cached_property def num_pages(self) -> int: ... @property def page_range(self) -> range: ... def get_elided_page_range( self, number: int | float | str = 1, *, on_each_side: int = 3, on_ends: int = 2 ) -> Iterator[str | int]: ... class AsyncPaginator(BasePaginator[_T]): def __aiter__(self) -> AsyncIterator[AsyncPage[_T]]: ... async def avalidate_number(self, number: int | float | str) -> int: ... async def aget_page(self, number: int | float | str | None) -> AsyncPage[_T]: ... async def apage(self, number: int | str) -> AsyncPage[_T]: ... async def acount(self) -> int: ... async def anum_pages(self) -> int: ... async def apage_range(self) -> range: ... async def aget_elided_page_range( self, number: int | float | str = 1, *, on_each_side: int = 3, on_ends: int = 2 ) -> AsyncIterator[str | int]: ... class Page(Sequence[_T]): object_list: _SupportsPagination[_T] number: int paginator: Paginator[_T] def __init__( self, object_list: _SupportsPagination[_T], number: int, paginator: Paginator[_T], ) -> None: ... @overload @override def __getitem__(self, index: int) -> _T: ... @overload @override def __getitem__(self, index: slice) -> Sequence[_T]: ... # Avoid override error @override def __len__(self) -> int: ... def has_next(self) -> bool: ... def has_previous(self) -> bool: ... def has_other_pages(self) -> bool: ... def next_page_number(self) -> int: ... def previous_page_number(self) -> int: ... def start_index(self) -> int: ... def end_index(self) -> int: ... class AsyncPage(Generic[_T]): object_list: _SupportsPagination[_T] number: int paginator: AsyncPaginator[_T] def __init__( self, object_list: _SupportsPagination[_T], number: int, paginator: AsyncPaginator[_T], ) -> None: ... def __aiter__(self) -> AsyncIterator[_T]: ... def __len__(self) -> int: ... def __reversed__(self) -> Iterator[_T]: ... @overload def __getitem__(self, index: int) -> _T: ... @overload def __getitem__(self, index: slice) -> list[_T]: ... async def aget_object_list(self) -> list[_T]: ... async def ahas_next(self) -> bool: ... async def ahas_previous(self) -> bool: ... async def ahas_other_pages(self) -> bool: ... async def anext_page_number(self) -> int: ... async def aprevious_page_number(self) -> int: ... async def astart_index(self) -> int: ... async def aend_index(self) -> int: ... typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/000077500000000000000000000000001526064357400247315ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/__init__.pyi000066400000000000000000000022661526064357400272210ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Iterator from typing import Any from django.db.models.base import Model from .base import DeserializedObject, Deserializer, Serializer from .base import SerializerDoesNotExist as SerializerDoesNotExist BUILTIN_SERIALIZERS: dict[str, str] class BadSerializer: internal_use_only: bool exception: BaseException def __init__(self, exception: BaseException) -> None: ... def __call__(self, *args: Any, **kwargs: Any) -> Any: ... def register_serializer(format: str, serializer_module: str, serializers: dict[str, Any] | None = None) -> None: ... def unregister_serializer(format: str) -> None: ... def get_serializer(format: str) -> type[Serializer] | BadSerializer: ... def get_serializer_formats() -> list[str]: ... def get_public_serializer_formats() -> list[str]: ... def get_deserializer(format: str) -> Callable[..., Any] | type[Deserializer]: ... def serialize(format: str, queryset: Iterable[Model], **options: Any) -> Any: ... def deserialize(format: str, stream_or_string: Any, **options: Any) -> Iterator[DeserializedObject]: ... def sort_dependencies(app_list: Iterable[Any], allow_cycles: bool = False) -> list[type[Model]]: ... typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/base.pyi000066400000000000000000000062551526064357400263760ustar00rootroot00000000000000from collections.abc import Collection, Iterable, Sequence from typing import IO, Any from django.db.models.base import Model from django.db.models.fields import Field from django.db.models.fields.related import ForeignKey, ManyToManyField DEFER_FIELD: object class SerializerDoesNotExist(KeyError): ... class SerializationError(Exception): ... class DeserializationError(Exception): @classmethod def WithData( cls, original_exc: Exception, model: str, fk: int | str, field_value: Sequence[str] | str | None ) -> DeserializationError: ... class M2MDeserializationError(Exception): original_exc: Exception pk: Any def __init__(self, original_exc: Exception, pk: Any) -> None: ... class ProgressBar: progress_width: int output: IO[str] | None total_count: int prev_done: int def __init__(self, output: IO[str] | None, total_count: int) -> None: ... def update(self, count: int) -> None: ... class Serializer: internal_use_only: bool progress_class: type[ProgressBar] stream_class: type[IO[str]] options: dict[str, Any] stream: IO[str] selected_fields: Collection[str] | None use_natural_foreign_keys: bool use_natural_primary_keys: bool first: bool def serialize( self, queryset: Iterable[Model], *, stream: IO[str] | None = None, fields: Collection[str] | None = None, use_natural_foreign_keys: bool = False, use_natural_primary_keys: bool = False, progress_output: IO[str] | None = None, object_count: int = 0, **options: Any, ) -> Any: ... def start_serialization(self) -> None: ... def end_serialization(self) -> None: ... def start_object(self, obj: Any) -> None: ... def end_object(self, obj: Any) -> None: ... def handle_field(self, obj: Any, field: Any) -> None: ... def handle_fk_field(self, obj: Any, field: Any) -> None: ... def handle_m2m_field(self, obj: Any, field: Any) -> None: ... def getvalue(self) -> bytes | str | None: ... class Deserializer: options: dict[str, Any] stream: IO[str] | IO[bytes] def __init__(self, stream_or_string: bytes | str | IO[bytes] | IO[str], **options: Any) -> None: ... def __iter__(self) -> Deserializer: ... def __next__(self) -> Any: ... class DeserializedObject: object: Model m2m_data: dict[str, Sequence[Any]] | None deferred_fields: dict[Field[Any, Any], Any] def __init__( self, obj: Model, m2m_data: dict[str, Sequence[Any]] | None = None, deferred_fields: dict[Field[Any, Any], Any] | None = None, ) -> None: ... def save(self, save_m2m: bool = True, using: str | None = None, **kwargs: Any) -> None: ... def save_deferred_fields(self, using: str | None = None) -> None: ... def build_instance(Model: type[Model], data: dict[str, Any], db: str) -> Model: ... def deserialize_m2m_values( field: ManyToManyField[Any, Any], field_value: Iterable[Any], using: str | None, handle_forward_references: bool ) -> Sequence[Any] | object: ... def deserialize_fk_value( field: ForeignKey[Any, Any], field_value: Any, using: str | None, handle_forward_references: bool ) -> Any | object: ... typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/json.pyi000066400000000000000000000012321526064357400264230ustar00rootroot00000000000000import json from typing import Any, TypeAlias import _typeshed from django.core.serializers.python import Deserializer as PythonDeserializer from django.core.serializers.python import Serializer as PythonSerializer _DeserializerInput: TypeAlias = _typeshed.SupportsRead[bytes | str] | bytes | str class Serializer(PythonSerializer): json_kwargs: dict[str, Any] class Deserializer(PythonDeserializer): def __init__(self, stream_or_string: _DeserializerInput, **options: Any) -> None: ... class DjangoJSONEncoder(json.JSONEncoder): allow_nan: bool check_circular: bool ensure_ascii: bool indent: int skipkeys: bool sort_keys: bool typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/jsonl.pyi000066400000000000000000000006641526064357400266070ustar00rootroot00000000000000from typing import Any from django.core.serializers.json import _DeserializerInput from django.core.serializers.python import Deserializer as PythonDeserializer from django.core.serializers.python import Serializer as PythonSerializer class Serializer(PythonSerializer): json_kwargs: dict[str, Any] class Deserializer(PythonDeserializer): def __init__(self, stream_or_string: _DeserializerInput, **options: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/python.pyi000066400000000000000000000007721526064357400270030ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any from django.core.serializers import base from django.db.models.base import Model class Serializer(base.Serializer): objects: list[Any] def get_dump_object(self, obj: Model) -> dict[str, Any]: ... class Deserializer(base.Deserializer): def __init__( self, object_list: Iterable[dict[str, Any]], *, using: str = ..., ignorenonexistent: bool = False, **options: Any, ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/pyyaml.pyi000066400000000000000000000015771526064357400270010ustar00rootroot00000000000000from typing import IO, Any from django.core.serializers.base import Deserializer as PythonDeserializer from django.core.serializers.python import Serializer as PythonSerializer from django.db.models.fields import Field from typing_extensions import override from yaml import CSafeDumper as SafeDumper from yaml import ScalarNode class DjangoSafeDumper(SafeDumper): def represent_decimal(self, data: Any) -> ScalarNode: ... def represent_time(self, data: Any) -> ScalarNode: ... class Serializer(PythonSerializer): internal_use_only: bool @override def handle_field(self, obj: Any, field: Field[Any, Any]) -> None: ... @override def end_serialization(self) -> None: ... @override def getvalue(self) -> Any: ... class Deserializer(PythonDeserializer): def __init__(self, stream_or_string: bytes | str | IO[bytes] | IO[str], **options: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/serializers/xml_serializer.pyi000066400000000000000000000050701526064357400305070ustar00rootroot00000000000000from typing import IO, Any from xml.sax.expatreader import ExpatParser from django.core.serializers import base from typing_extensions import override class Serializer(base.Serializer): def indent(self, level: int) -> None: ... xml: Any @override def start_serialization(self) -> None: ... @override def end_serialization(self) -> None: ... @override def start_object(self, obj: Any) -> None: ... @override def end_object(self, obj: Any) -> None: ... @override def handle_field(self, obj: Any, field: Any) -> None: ... @override def handle_fk_field(self, obj: Any, field: Any) -> None: ... @override def handle_m2m_field(self, obj: Any, field: Any) -> None: ... class Deserializer(base.Deserializer): handle_forward_references: bool event_stream: Any db: str ignore: bool def __init__( self, stream_or_string: bytes | str | IO[bytes] | IO[str], *, using: str = ..., ignorenonexistent: bool = ..., **options: Any, ) -> None: ... @override def __next__(self) -> base.DeserializedObject: ... def check_element_type(element: Any) -> bool: ... def getChildrenByTagName(node: Any, tag_name: str) -> list[Any]: ... def getInnerText(node: Any) -> str: ... class DefusedExpatParser(ExpatParser): def __init__(self, *args: Any, **kwargs: Any) -> None: ... @override def start_doctype_decl(self, name: Any, sysid: Any, pubid: Any, has_internal_subset: Any) -> None: ... def entity_decl( self, name: Any, is_parameter_entity: Any, value: Any, base: Any, sysid: Any, pubid: Any, notation_name: Any ) -> None: ... @override def unparsed_entity_decl(self, name: Any, base: Any, sysid: Any, pubid: Any, notation_name: Any) -> None: ... def external_entity_ref_handler(self, context: Any, base: Any, sysid: Any, pubid: Any) -> None: ... @override def reset(self) -> None: ... class DefusedXmlException(ValueError): ... class DTDForbidden(DefusedXmlException): name: Any sysid: Any pubid: Any def __init__(self, name: Any, sysid: Any, pubid: Any) -> None: ... class EntitiesForbidden(DefusedXmlException): name: Any value: Any base: Any sysid: Any pubid: Any notation_name: Any def __init__(self, name: Any, value: Any, base: Any, sysid: Any, pubid: Any, notation_name: Any) -> None: ... class ExternalReferenceForbidden(DefusedXmlException): context: Any base: Any sysid: Any pubid: Any def __init__(self, context: Any, base: Any, sysid: Any, pubid: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/servers/000077500000000000000000000000001526064357400240665ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/servers/__init__.pyi000066400000000000000000000000001526064357400263360ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/core/servers/basehttp.pyi000066400000000000000000000035451526064357400264320ustar00rootroot00000000000000import socketserver from collections.abc import Callable from io import BytesIO from typing import Any from wsgiref import simple_server from django.core.handlers.wsgi import WSGIHandler, WSGIRequest from typing_extensions import override def get_internal_wsgi_application() -> WSGIHandler: ... def is_broken_pipe_error() -> bool: ... class WSGIServer(simple_server.WSGIServer): request_queue_size: int address_family: Any allow_reuse_address: Any def __init__(self, *args: Any, ipv6: bool = ..., allow_reuse_address: bool = ..., **kwargs: Any) -> None: ... @override def handle_error(self, request: Any, client_address: Any) -> None: ... class ThreadedWSGIServer(socketserver.ThreadingMixIn, WSGIServer): connections_override: Any def __init__(self, *args: Any, connections_override: Any = ..., **kwargs: Any) -> None: ... class ServerHandler(simple_server.ServerHandler): def __init__(self, stdin: Any, stdout: Any, stderr: Any, environ: dict[str, Any], **kwargs: Any) -> None: ... @override def handle_error(self) -> None: ... class WSGIRequestHandler(simple_server.WSGIRequestHandler): close_connection: bool connection: WSGIRequest request: WSGIRequest rfile: BytesIO wfile: BytesIO protocol_version: str @override def address_string(self) -> str: ... @override def log_message(self, format: str, *args: Any) -> None: ... @override def get_environ(self) -> dict[str, str]: ... raw_requestline: bytes requestline: str request_version: str @override def handle(self) -> None: ... def run( addr: str | bytes | bytearray, port: int, wsgi_handler: WSGIHandler, ipv6: bool = ..., threading: bool = ..., on_bind: Callable[[str], None] | None = ..., server_cls: type[WSGIServer] = ..., ) -> None: ... __all__ = ("WSGIRequestHandler", "WSGIServer") typeddjango-django-stubs-fa03b48/django-stubs/core/signals.pyi000066400000000000000000000002131526064357400245540ustar00rootroot00000000000000from django.dispatch import Signal request_started: Signal request_finished: Signal got_request_exception: Signal setting_changed: Signal typeddjango-django-stubs-fa03b48/django-stubs/core/signing.pyi000066400000000000000000000044771526064357400245720ustar00rootroot00000000000000from datetime import timedelta from typing import Any, Protocol, type_check_only from typing_extensions import override BASE62_ALPHABET: str class BadSignature(Exception): ... class SignatureExpired(BadSignature): ... def b62_encode(s: int) -> str: ... def b62_decode(s: str) -> int: ... def b64_encode(s: bytes) -> bytes: ... def b64_decode(s: bytes) -> bytes: ... def base64_hmac(salt: bytes | str, value: bytes | str, key: bytes | str, algorithm: str | None = None) -> str: ... def get_cookie_signer(salt: str = "django.core.signing.get_cookie_signer") -> TimestampSigner: ... @type_check_only class Serializer(Protocol): def dumps(self, obj: Any) -> bytes: ... def loads(self, data: bytes) -> Any: ... class JSONSerializer: def dumps(self, obj: Any) -> bytes: ... def loads(self, data: bytes) -> Any: ... def dumps( obj: Any, key: bytes | str | None = None, salt: bytes | str = "django.core.signing", serializer: type[Serializer] = ..., compress: bool = False, ) -> str: ... def loads( s: str, key: bytes | str | None = None, salt: bytes | str = "django.core.signing", serializer: type[Serializer] = ..., max_age: int | timedelta | None = None, fallback_keys: list[str | bytes] | None = None, ) -> Any: ... class Signer: key: bytes | str fallback_keys: list[bytes | str] sep: str salt: bytes | str algorithm: str def __init__( self, *, key: bytes | str | None = None, sep: str = ":", salt: bytes | str | None = None, algorithm: str | None = None, fallback_keys: list[bytes | str] | None = None, ) -> None: ... def signature(self, value: bytes | str, key: bytes | str | None = None) -> str: ... def sign(self, value: str) -> str: ... def unsign(self, signed_value: str) -> str: ... def sign_object( self, obj: Any, serializer: type[Serializer] = ..., compress: bool = False, ) -> str: ... def unsign_object( self, signed_obj: str, serializer: type[Serializer] = ..., **kwargs: Any, ) -> Any: ... class TimestampSigner(Signer): def timestamp(self) -> str: ... @override def sign(self, value: str) -> str: ... @override def unsign(self, value: str, max_age: int | timedelta | None = None) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/core/validators.pyi000066400000000000000000000121671526064357400252770ustar00rootroot00000000000000from collections.abc import Callable, Collection, Sequence, Sized from decimal import Decimal from re import Pattern, RegexFlag from typing import Any, TypeAlias from django.core.files.base import File from django.utils.deconstruct import _Deconstructible from django.utils.functional import _StrOrPromise from typing_extensions import override EMPTY_VALUES: Any _Regex: TypeAlias = str | Pattern[str] _ValidatorCallable: TypeAlias = Callable[[Any], None] # noqa: PYI047 class RegexValidator(_Deconstructible): regex: _Regex # Pattern[str] on instance, but may be str on class definition message: _StrOrPromise code: str inverse_match: bool flags: int def __init__( self, regex: _Regex | None = None, message: _StrOrPromise | None = None, code: str | None = None, inverse_match: bool | None = None, flags: RegexFlag | None = None, ) -> None: ... def __call__(self, value: Any) -> None: ... class DomainNameValidator(RegexValidator): ul: str hostname_re: str domain_re: str tld_no_fqdn_re: str tld_re: str ascii_only_hostname_re: str ascii_only_domain_re: str ascii_only_tld_re: str max_length: int def __init__(self, *, accept_idna: bool = True, **kwargs: Any) -> None: ... @override def __call__(self, value: Any) -> None: ... validate_domain_name: DomainNameValidator class URLValidator(RegexValidator): ipv4_re: str ipv6_re: str hostname_re: str domain_re: str tld_re: str host_re: str schemes: Sequence[str] unsafe_chars: frozenset[str] max_length: int def __init__(self, schemes: Sequence[str] | None = None, **kwargs: Any) -> None: ... @override def __call__(self, value: Any) -> None: ... integer_validator: RegexValidator def validate_integer(value: float | str | None) -> None: ... class EmailValidator(_Deconstructible): message: _StrOrPromise code: str domain_re: str hostname_re: str tld_no_fqdn_re: str user_regex: Pattern[str] domain_regex: Pattern[str] literal_regex: Pattern[str] domain_allowlist: Sequence[str] def __init__( self, message: _StrOrPromise | None = None, code: str | None = None, allowlist: Sequence[str] | None = None, ) -> None: ... def __call__(self, value: str | None) -> None: ... def validate_domain_part(self, domain_part: str) -> bool: ... @override def __eq__(self, other: object) -> bool: ... validate_email: EmailValidator slug_re: Pattern[str] validate_slug: RegexValidator slug_unicode_re: Pattern[str] validate_unicode_slug: RegexValidator def validate_ipv4_address(value: str) -> None: ... def validate_ipv6_address(value: str) -> None: ... def validate_ipv46_address(value: str) -> None: ... _IPValidator: TypeAlias = tuple[list[Callable[[Any], None]], str] ip_address_validator_map: dict[str, _IPValidator] def ip_address_validators(protocol: str, unpack_ipv4: bool) -> _IPValidator: ... def int_list_validator( sep: str = ",", message: _StrOrPromise | None = None, code: str = "invalid", allow_negative: bool = False ) -> RegexValidator: ... validate_comma_separated_integer_list: RegexValidator class BaseValidator(_Deconstructible): message: _StrOrPromise code: str limit_value: Any def __init__(self, limit_value: Any | Callable[[], Any], message: _StrOrPromise | None = None) -> None: ... def __call__(self, value: Any) -> None: ... def compare(self, a: Any, b: Any) -> bool: ... def clean(self, x: Any) -> Any: ... @override def __eq__(self, other: object) -> bool: ... class MaxValueValidator(BaseValidator): ... class MinValueValidator(BaseValidator): ... class StepValueValidator(BaseValidator): offset: int | None def __init__( self, limit_value: Any | Callable[[], Any], message: _StrOrPromise | None = None, offset: int | None = None ) -> None: ... class MinLengthValidator(BaseValidator): @override def clean(self, x: Sized) -> int: ... class MaxLengthValidator(BaseValidator): @override def clean(self, x: Sized) -> int: ... class DecimalValidator(_Deconstructible): messages: dict[str, str] max_digits: int | None decimal_places: int | None def __init__(self, max_digits: int | None, decimal_places: int | None) -> None: ... def __call__(self, value: Decimal) -> None: ... @override def __eq__(self, other: object) -> bool: ... class FileExtensionValidator(_Deconstructible): message: _StrOrPromise code: str allowed_extensions: Collection[str] | None def __init__( self, allowed_extensions: Collection[str] | None = None, message: _StrOrPromise | None = None, code: str | None = None, ) -> None: ... def __call__(self, value: File[Any]) -> None: ... def get_available_image_extensions() -> Sequence[str]: ... def validate_image_file_extension(value: File[Any]) -> None: ... class ProhibitNullCharactersValidator(_Deconstructible): message: _StrOrPromise code: str def __init__(self, message: _StrOrPromise | None = None, code: str | None = None) -> None: ... def __call__(self, value: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/core/wsgi.pyi000066400000000000000000000001421526064357400240660ustar00rootroot00000000000000from django.core.handlers.wsgi import WSGIHandler def get_wsgi_application() -> WSGIHandler: ... typeddjango-django-stubs-fa03b48/django-stubs/db/000077500000000000000000000000001526064357400220325ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/__init__.pyi000066400000000000000000000025721526064357400243220ustar00rootroot00000000000000from typing import Any from .backends.base.base import BaseDatabaseWrapper from .utils import DEFAULT_DB_ALIAS as DEFAULT_DB_ALIAS # Not exported in __all__ from .utils import DJANGO_VERSION_PICKLE_KEY as DJANGO_VERSION_PICKLE_KEY from .utils import ConnectionHandler, ConnectionRouter from .utils import DatabaseError as DatabaseError from .utils import DataError as DataError from .utils import Error as Error from .utils import IntegrityError as IntegrityError from .utils import InterfaceError as InterfaceError from .utils import InternalError as InternalError from .utils import NotSupportedError as NotSupportedError from .utils import OperationalError as OperationalError from .utils import ProgrammingError as ProgrammingError connections: ConnectionHandler router: ConnectionRouter # Actually ConnectionProxy, but quacks exactly like BaseDatabaseWrapper, it's not worth distinguishing the two. connection: BaseDatabaseWrapper def close_old_connections(**kwargs: Any) -> None: ... def reset_queries(**kwargs: Any) -> None: ... __all__ = [ "DEFAULT_DB_ALIAS", "DJANGO_VERSION_PICKLE_KEY", "DataError", "DatabaseError", "Error", "IntegrityError", "InterfaceError", "InternalError", "NotSupportedError", "OperationalError", "ProgrammingError", "close_old_connections", "connection", "connections", "reset_queries", "router", ] typeddjango-django-stubs-fa03b48/django-stubs/db/backends/000077500000000000000000000000001526064357400236045ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/__init__.pyi000066400000000000000000000000001526064357400260540ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/000077500000000000000000000000001526064357400245165ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/__init__.pyi000066400000000000000000000000001526064357400267660ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/base.pyi000066400000000000000000000126121526064357400261550ustar00rootroot00000000000000from collections import deque from collections.abc import Callable, Iterable from contextlib import AbstractContextManager from datetime import tzinfo from logging import Logger from typing import Any, Self, TypeAlias from django.db.backends.base.client import BaseDatabaseClient from django.db.backends.base.creation import BaseDatabaseCreation from django.db.backends.base.features import BaseDatabaseFeatures from django.db.backends.base.introspection import BaseDatabaseIntrospection from django.db.backends.base.operations import BaseDatabaseOperations from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.backends.base.validation import BaseDatabaseValidation from django.db.backends.utils import CursorDebugWrapper, CursorWrapper from django.db.transaction import Atomic from django.db.utils import DatabaseErrorWrapper from django.utils.functional import cached_property NO_DB_ALIAS: str RAN_DB_VERSION_CHECK: set[str] logger: Logger _ExecuteWrapper: TypeAlias = Callable[ [Callable[[str, Any, bool, dict[str, Any]], Any], str, Any, bool, dict[str, Any]], Any ] class BaseDatabaseWrapper: data_types: dict[str, str] data_types_suffix: dict[str, str] data_type_check_constraints: dict[str, str] vendor: str display_name: str SchemaEditorClass: type[BaseDatabaseSchemaEditor] client_class: type[BaseDatabaseClient] creation_class: type[BaseDatabaseCreation] features_class: type[BaseDatabaseFeatures] introspection_class: type[BaseDatabaseIntrospection] ops_class: type[BaseDatabaseOperations] validation_class: type[BaseDatabaseValidation] queries_limit: int connection: Any settings_dict: dict[str, Any] alias: str queries_log: deque[dict[str, str]] force_debug_cursor: bool autocommit: bool in_atomic_block: bool savepoint_state: int savepoint_ids: list[str] commit_on_exit: bool needs_rollback: bool close_at: float | None closed_in_transaction: bool errors_occurred: bool run_on_commit: list[tuple[set[str], Callable[[], None]]] run_commit_hooks_on_set_autocommit_on: bool execute_wrappers: list[_ExecuteWrapper] client: BaseDatabaseClient creation: BaseDatabaseCreation features: BaseDatabaseFeatures introspection: BaseDatabaseIntrospection ops: BaseDatabaseOperations validation: BaseDatabaseValidation atomic_blocks: list[Atomic] def __init__(self, settings_dict: dict[str, Any], alias: str = "default") -> None: ... def ensure_timezone(self) -> bool: ... @cached_property def timezone(self) -> tzinfo | None: ... @cached_property def timezone_name(self) -> str: ... @property def queries_logged(self) -> bool: ... @property def queries(self) -> list[dict[str, str]]: ... def get_database_version(self) -> tuple[int, ...]: ... def check_database_version_supported(self) -> None: ... def get_connection_params(self) -> dict[str, Any]: ... def get_new_connection(self, conn_params: Any) -> Any: ... def init_connection_state(self) -> None: ... def create_cursor(self, name: str | None = None) -> Any: ... def connect(self) -> None: ... def check_settings(self) -> None: ... def ensure_connection(self) -> None: ... def cursor(self) -> CursorWrapper: ... def commit(self) -> None: ... def rollback(self) -> None: ... def close(self) -> None: ... def savepoint(self) -> str | None: ... def savepoint_rollback(self, sid: str) -> None: ... def savepoint_commit(self, sid: str) -> None: ... def clean_savepoints(self) -> None: ... def get_autocommit(self) -> bool: ... def set_autocommit( self, autocommit: bool, force_begin_transaction_with_broken_autocommit: bool = False ) -> None: ... def get_rollback(self) -> bool: ... def set_rollback(self, rollback: bool) -> None: ... def validate_no_atomic_block(self) -> None: ... def validate_no_broken_transaction(self) -> None: ... def constraint_checks_disabled(self) -> AbstractContextManager[None]: ... def disable_constraint_checking(self) -> bool: ... def enable_constraint_checking(self) -> None: ... def check_constraints(self, table_names: Iterable[str] | None = None) -> None: ... def is_usable(self) -> bool: ... def close_if_health_check_failed(self) -> None: ... def close_if_unusable_or_obsolete(self) -> None: ... @property def allow_thread_sharing(self) -> bool: ... def inc_thread_sharing(self) -> None: ... def dec_thread_sharing(self) -> None: ... def validate_thread_sharing(self) -> None: ... def prepare_database(self) -> None: ... @cached_property def wrap_database_errors(self) -> DatabaseErrorWrapper: ... def chunked_cursor(self) -> CursorWrapper: ... def make_debug_cursor(self, cursor: CursorWrapper) -> CursorDebugWrapper: ... def make_cursor(self, cursor: CursorWrapper) -> CursorWrapper: ... def temporary_connection(self) -> AbstractContextManager[CursorWrapper]: ... def _nodb_cursor(self) -> AbstractContextManager[CursorWrapper]: ... def schema_editor(self, *args: Any, **kwargs: Any) -> BaseDatabaseSchemaEditor: ... def on_commit(self, func: Callable[[], object], robust: bool = False) -> None: ... def run_and_clear_commit_hooks(self) -> None: ... def execute_wrapper(self, wrapper: _ExecuteWrapper) -> AbstractContextManager[None]: ... def copy(self, alias: str | None = None) -> Self: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/client.pyi000066400000000000000000000011161526064357400265160ustar00rootroot00000000000000from collections.abc import Iterable, Sequence from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper class BaseDatabaseClient: executable_name: str | None connection: BaseDatabaseWrapper def __init__(self, connection: BaseDatabaseWrapper) -> None: ... def __del__(self) -> None: ... @classmethod def settings_to_cmd_args_env( cls, settings_dict: dict[str, Any], parameters: Iterable[str], ) -> tuple[Sequence[str], dict[str, str] | None]: ... def runshell(self, parameters: Iterable[str]) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/creation.pyi000066400000000000000000000035461526064357400270550ustar00rootroot00000000000000from typing import Any, ClassVar, overload from django.db.backends.base.base import BaseDatabaseWrapper from typing_extensions import deprecated TEST_DATABASE_PREFIX: str class BaseDatabaseCreation: destroy_test_db_connection_close_method: ClassVar[str | None] connection: BaseDatabaseWrapper def __init__(self, connection: BaseDatabaseWrapper) -> None: ... def __del__(self) -> None: ... def log(self, msg: str) -> None: ... @overload @deprecated( "DatabaseCreation.create_test_db(serialize) is deprecated. Call DatabaseCreation.serialize_test_db() once all " "test databases are set up instead if you need fixtures persistence between tests." ) def create_test_db( self, verbosity: int = 1, autoclobber: bool = False, serialize: bool = ..., keepdb: bool = False ) -> str: ... @overload def create_test_db( self, verbosity: int = 1, autoclobber: bool = False, serialize: None = None, keepdb: bool = False ) -> str: ... def set_as_test_mirror(self, primary_settings_dict: dict[str, dict[str, None] | int | str | None]) -> None: ... def serialize_db_to_string(self) -> str: ... def deserialize_db_from_string(self, data: str) -> None: ... def clone_test_db( self, suffix: Any, verbosity: int = 1, autoclobber: bool = False, keepdb: bool = False ) -> None: ... def get_test_db_clone_settings(self, suffix: str) -> dict[str, Any]: ... def destroy_test_db( self, old_database_name: str | None = None, verbosity: int = 1, keepdb: bool = False, suffix: str | None = None, ) -> None: ... def mark_expected_failures_and_skips(self) -> None: ... def sql_table_creation_suffix(self) -> str: ... def test_db_signature(self) -> tuple[str, str, str, str]: ... def setup_worker_connection(self, _worker_id: int) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/features.pyi000066400000000000000000000155731526064357400270720ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.base import Model from django.db.utils import DatabaseError, DataError from django.utils.functional import cached_property class BaseDatabaseFeatures: minimum_database_version: tuple[int, ...] | None gis_enabled: bool allows_group_by_lob: bool allows_group_by_selected_pks: bool allows_group_by_select_index: bool empty_fetchmany_value: Sequence[Any] update_can_self_select: bool delete_can_self_reference_subquery: bool interprets_empty_strings_as_nulls: bool supports_nullable_unique_constraints: bool supports_partially_nullable_unique_constraints: bool supports_deferrable_unique_constraints: bool can_use_chunked_reads: bool can_return_columns_from_insert: bool can_return_rows_from_bulk_insert: bool can_return_rows_from_update: bool has_bulk_insert: bool uses_savepoints: bool can_release_savepoints: bool related_fields_match_type: bool allow_sliced_subqueries_with_in: bool has_select_for_update: bool has_select_for_update_nowait: bool has_select_for_update_skip_locked: bool has_select_for_update_of: bool has_select_for_no_key_update: bool select_for_update_of_column: bool test_db_allows_multiple_connections: bool supports_unspecified_pk: bool supports_forward_references: bool truncates_names: bool has_real_datatype: bool supports_subqueries_in_group_by: bool ignores_unnecessary_order_by_in_subqueries: bool has_native_boolean_field: bool has_native_uuid_field: bool has_native_duration_field: bool supports_temporal_subtraction: bool supports_regex_backreferencing: bool supports_date_lookup_using_string: bool supports_timezones: bool has_zoneinfo_database: bool requires_explicit_null_ordering_when_grouping: bool nulls_order_largest: bool supports_order_by_nulls_modifier: bool order_by_nulls_first: bool max_query_params: int | None allows_auto_pk_0: bool can_defer_constraint_checks: bool supports_tablespaces: bool supports_sequence_reset: bool can_introspect_default: bool can_introspect_foreign_keys: bool introspected_field_types: dict[str, str] supports_index_column_ordering: bool can_introspect_materialized_views: bool can_distinct_on_fields: bool atomic_transactions: bool can_rollback_ddl: bool schema_editor_uses_clientside_param_binding: bool supports_combined_alters: bool supports_foreign_keys: bool can_create_inline_fk: bool can_rename_index: bool indexes_foreign_keys: bool supports_column_check_constraints: bool supports_table_check_constraints: bool can_introspect_check_constraints: bool supports_paramstyle_pyformat: bool requires_literal_defaults: bool supports_expression_defaults: bool supports_default_keyword_in_insert: bool supports_default_keyword_in_bulk_insert: bool connection_persists_old_columns: bool closed_cursor_error_class: type[DatabaseError] has_case_insensitive_like: bool bare_select_suffix: str implied_column_null: bool supports_select_for_update_with_limit: bool greatest_least_ignores_nulls: bool can_clone_databases: bool ignores_table_name_case: bool for_update_after_from: bool supports_select_union: bool supports_select_intersection: bool supports_select_difference: bool supports_slicing_ordering_in_compound: bool supports_parentheses_in_compound: bool supports_nulls_distinct_unique_constraints: bool requires_compound_order_by_subquery: bool supports_aggregate_filter_clause: bool supports_aggregate_order_by_clause: bool supports_aggregate_distinct_multiple_argument: bool supports_any_value: bool supports_bit_aggregations: bool supports_default_in_bit_aggregations: bool supports_index_on_text_field: bool supports_over_clause: bool supports_frame_range_fixed_distance: bool supports_frame_exclusion: bool only_supports_unbounded_with_preceding_and_following: bool supports_cast_with_precision: bool time_cast_precision: int create_test_procedure_without_params_sql: str | None create_test_procedure_with_int_param_sql: str | None supports_callproc_kwargs: bool supported_explain_formats: set[str] supports_default_in_lead_lag: bool supports_ignore_conflicts: bool supports_update_conflicts: bool supports_update_conflicts_with_target: bool requires_casted_case_in_updates: bool supports_partial_indexes: bool supports_functions_in_partial_indexes: bool supports_covering_indexes: bool supports_expression_indexes: bool collate_as_index_expression: bool allows_multiple_constraints_on_same_fields: bool supports_comparing_boolean_expr: bool supports_json_field: bool can_introspect_json_field: bool supports_primitives_in_json_field: bool has_native_json_field: bool has_json_operators: bool supports_json_field_contains: bool json_key_contains_list_matching_requires_list: bool has_json_object_function: bool supports_json_negative_indexing: bool supports_collation_on_charfield: bool supports_collation_on_textfield: bool supports_non_deterministic_collations: bool supports_comments: bool supports_comments_inline: bool supports_stored_generated_columns: bool supports_virtual_generated_columns: bool supports_alter_generated_column_data_type: bool supports_logical_xor: bool prohibits_null_characters_in_text_exception: tuple[ValueError | DataError] | None supports_unlimited_charfield: bool supports_tuple_comparison_against_subquery: bool rounds_to_even: bool pattern_lookup_needs_param_pattern: bool supports_no_precision_decimalfield: bool supports_tuple_lookups: bool supports_on_delete_db_cascade: bool supports_on_delete_db_default: bool supports_on_delete_db_null: bool supports_inspectdb: bool test_collations: dict[str, str | None] test_now_utc_template: str | None insert_test_table_with_defaults: str | None django_test_expected_failures: set[str] django_test_skips: dict[str, set[str]] disallowed_simple_test_case_connection_methods: list[tuple[str, str]] supports_uuid4_function: bool supports_uuid4_function_in_default: bool supports_uuid7_function: bool supports_uuid7_function_shift: bool connection: BaseDatabaseWrapper def __init__(self, connection: BaseDatabaseWrapper) -> None: ... def __del__(self) -> None: ... @cached_property def supports_explaining_query_execution(self) -> bool: ... @cached_property def supports_transactions(self) -> bool: ... @cached_property def supports_boolean_expr_in_select_clause(self) -> bool: ... def allows_group_by_selected_pks_on_model(self, model: type[Model]) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/introspection.pyi000066400000000000000000000051721526064357400301460ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any, Literal, NamedTuple, NotRequired, type_check_only from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.utils import CursorWrapper from django.db.models.base import Model from django.db.models.deletion import DatabaseOnDelete, _Collector from django.db.models.fields import Field from typing_extensions import TypedDict class TableInfo(NamedTuple): name: str type: str class FieldInfo(NamedTuple): name: str type_code: int display_size: int internal_size: int precision: int scale: int null_ok: bool default: str collation: str @type_check_only class _ConstraintDict(TypedDict): columns: list[str] primary_key: bool unique: bool foreign_key: tuple[str, str] | None check: bool index: bool orders: NotRequired[list[Literal["ASC", "DESC"]]] type: NotRequired[str] definition: NotRequired[str | None] options: NotRequired[dict[str, str] | None] @type_check_only class _SequenceDict(TypedDict): table: str column: str name: NotRequired[str] class BaseDatabaseIntrospection: data_types_reverse: Any on_delete_types: dict[str, _Collector | DatabaseOnDelete] connection: BaseDatabaseWrapper def __init__(self, connection: BaseDatabaseWrapper) -> None: ... def __del__(self) -> None: ... def get_field_type(self, data_type: str, description: FieldInfo) -> str: ... def identifier_converter(self, name: str) -> str: ... def table_names(self, cursor: CursorWrapper | None = None, include_views: bool = False) -> list[str]: ... def get_table_list(self, cursor: CursorWrapper) -> list[TableInfo]: ... def get_table_description(self, cursor: CursorWrapper, table_name: str) -> list[Any]: ... def get_migratable_models(self) -> Iterable[type[Model]]: ... def django_table_names(self, only_existing: bool = False, include_views: bool = True) -> list[str]: ... def installed_models(self, tables: list[str]) -> set[type[Model]]: ... def sequence_list(self) -> list[dict[str, str]]: ... def get_sequences( self, cursor: CursorWrapper, table_name: str, table_fields: Iterable[Field[Any, Any]] = () ) -> list[_SequenceDict]: ... def get_relations(self, cursor: CursorWrapper, table_name: str) -> dict[str, tuple[str, str]]: ... def get_primary_key_column(self, cursor: CursorWrapper, table_name: str) -> str | None: ... def get_primary_key_columns(self, cursor: CursorWrapper, table_name: str) -> list[str] | None: ... def get_constraints(self, cursor: CursorWrapper, table_name: str) -> dict[str, _ConstraintDict]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/operations.pyi000066400000000000000000000175401526064357400274330ustar00rootroot00000000000000import json from collections.abc import Iterable, Sequence from datetime import date, time, timedelta from datetime import datetime as real_datetime from decimal import Decimal from typing import Any from django.core.management.color import Style from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.utils import CursorWrapper from django.db.models.base import Model from django.db.models.constants import OnConflict from django.db.models.expressions import Case, Col, Expression from django.db.models.fields import Field from django.db.models.sql.compiler import SQLCompiler class BaseDatabaseOperations: compiler_module: str integer_field_ranges: dict[str, tuple[int, int]] set_operators: dict[str, str] cast_data_types: dict[Any, Any] cast_char_field_without_max_length: Any PRECEDING: str FOLLOWING: str UNBOUNDED_PRECEDING: str UNBOUNDED_FOLLOWING: str CURRENT_ROW: str explain_prefix: str | None connection: BaseDatabaseWrapper def __init__(self, connection: BaseDatabaseWrapper) -> None: ... def __del__(self) -> None: ... def autoinc_sql(self, table: str, column: str) -> str | None: ... def bulk_batch_size(self, fields: Any, objs: Any) -> int: ... def format_for_duration_arithmetic(self, sql: str) -> str: ... def cache_key_culling_sql(self) -> str: ... def unification_cast_sql(self, output_field: Field[Any, Any]) -> str: ... def date_extract_sql(self, lookup_type: str, sql: Any, params: Any) -> tuple[str, Any]: ... # def date_interval_sql(self, timedelta: None) -> Any: ... def date_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = None) -> tuple[str, Any]: ... def datetime_cast_date_sql(self, sql: str, params: Any, tzname: str | None) -> tuple[str, Any]: ... def datetime_cast_time_sql(self, sql: str, params: Any, tzname: str | None) -> tuple[str, Any]: ... def datetime_extract_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> tuple[str, Any]: ... def datetime_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> str: ... def time_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = None) -> str: ... def time_extract_sql(self, lookup_type: str, sql: str, params: Any) -> str: ... def deferrable_sql(self) -> str: ... def distinct_sql(self, fields: list[str], params: list[Any] | None) -> tuple[list[str], list[str]]: ... def force_group_by(self) -> list[str]: ... def force_no_ordering(self) -> list[Any]: ... def for_update_sql( self, nowait: bool = False, skip_locked: bool = False, of: Any = (), no_key: bool = False ) -> str: ... def limit_offset_sql(self, low_mark: int, high_mark: int | None) -> str: ... def fk_on_delete_sql(self, operation: str) -> str: ... def bulk_insert_sql(self, fields: Iterable[Field[Any, Any]], placeholder_rows: Iterable[str]) -> str: ... def last_executed_query(self, cursor: Any, sql: Any, params: Any) -> str: ... def last_insert_id(self, cursor: CursorWrapper, table_name: str, pk_name: str) -> int: ... def lookup_cast(self, lookup_type: str, internal_type: str | None = None) -> str: ... def max_in_list_size(self) -> int | None: ... def max_name_length(self) -> int | None: ... def no_limit_value(self) -> str | None: ... def pk_default_value(self) -> str: ... def prepare_sql_script(self, sql: Any) -> list[str]: ... def process_clob(self, value: str) -> str: ... def returning_columns(self, fields: Iterable[Field[Any, Any]]) -> tuple[str, tuple[()]]: ... def fetch_returned_rows(self, cursor: CursorWrapper, returning_params: tuple[()]) -> list[tuple[Any, ...]]: ... def compiler(self, compiler_name: str) -> type[SQLCompiler]: ... def quote_name(self, name: str) -> str: ... def regex_lookup(self, lookup_type: str) -> str: ... def savepoint_create_sql(self, sid: str) -> str: ... def savepoint_commit_sql(self, sid: str) -> str: ... def savepoint_rollback_sql(self, sid: str) -> str: ... def set_time_zone_sql(self) -> str: ... def sql_flush( self, style: Style, tables: Sequence[str], *, reset_sequences: bool = False, allow_cascade: bool = False ) -> list[str]: ... def execute_sql_flush(self, sql_list: Iterable[str]) -> None: ... def sequence_reset_by_name_sql(self, style: Style, sequences: list[Any]) -> list[Any]: ... def sequence_reset_sql(self, style: Style, model_list: Sequence[type[Model]]) -> list[Any]: ... def start_transaction_sql(self) -> str: ... def end_transaction_sql(self, success: bool = True) -> str: ... def tablespace_sql(self, tablespace: str | None, inline: bool = False) -> str: ... def prep_for_like_query(self, x: str) -> str: ... prep_for_iexact_query: Any def validate_autopk_value(self, value: int) -> int: ... def adapt_unknown_value(self, value: Any) -> Any: ... def adapt_integerfield_value(self, value: Any, internal_type: Any) -> Any: ... def adapt_datefield_value(self, value: date | None) -> str | None: ... def adapt_datetimefield_value(self, value: real_datetime | None) -> str | None: ... def adapt_durationfield_value(self, value: timedelta | None) -> int | None: ... def adapt_timefield_value(self, value: real_datetime | time | None) -> str | None: ... def adapt_decimalfield_value( self, value: Decimal | None, max_digits: int | None = None, decimal_places: int | None = None ) -> str | None: ... def adapt_ipaddressfield_value(self, value: str | None) -> str | None: ... def adapt_json_value(self, value: Any, encoder: type[json.JSONEncoder] | None) -> str: ... def year_lookup_bounds_for_date_field(self, value: int, iso_year: bool = False) -> list[str]: ... def year_lookup_bounds_for_datetime_field(self, value: int, iso_year: bool = False) -> list[str]: ... def get_db_converters(self, expression: Expression) -> list[Any]: ... def convert_durationfield_value( self, value: float | None, expression: Expression, connection: BaseDatabaseWrapper ) -> timedelta | None: ... def convert_trunc_expression( self, value: real_datetime | None, expression: Expression ) -> real_datetime | date | time | None: ... def check_expression_support(self, expression: Any) -> None: ... def conditional_expression_supported_in_where_clause(self, expression: Any) -> bool: ... def combine_expression(self, connector: str, sub_expressions: list[str]) -> str: ... def combine_duration_expression(self, connector: Any, sub_expressions: Any) -> str: ... def binary_placeholder_sql(self, value: Case | None, compiler: SQLCompiler) -> str: ... def modify_insert_params(self, placeholder: str, params: Any) -> Any: ... def integer_field_range(self, internal_type: Any) -> tuple[int, int]: ... def subtract_temporals(self, internal_type: Any, lhs: Any, rhs: Any) -> tuple[str, tuple[Any, ...]]: ... def window_frame_value(self, value: int | None) -> str: ... def window_frame_rows_start_end(self, start: int | None = None, end: int | None = None) -> tuple[str, str]: ... def window_frame_range_start_end(self, start: int | None = None, end: int | None = None) -> tuple[str, str]: ... def explain_query_prefix(self, format: str | None = None, **options: Any) -> str: ... def insert_statement(self, on_conflict: OnConflict | None = None) -> str: ... def on_conflict_suffix_sql( self, fields: Any, on_conflict: Any, update_fields: Any, unique_fields: Any ) -> str | Any: ... def prepare_join_on_clause( self, lhs_table: str, lhs_field: Field[Any, Any], rhs_table: str, rhs_field: Field[Any, Any] ) -> tuple[Col, Col]: ... def format_debug_sql(self, sql: str) -> str: ... def format_json_path_numeric_index(self, num: int) -> str: ... def compile_json_path(self, key_transforms: Iterable[str], include_root: bool = True) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/schema.pyi000066400000000000000000000111351526064357400265020ustar00rootroot00000000000000from collections.abc import Sequence from contextlib import AbstractContextManager from logging import Logger from types import TracebackType from typing import Any, Self from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.ddl_references import Statement from django.db.models.base import Model from django.db.models.constraints import BaseConstraint from django.db.models.fields import Field from django.db.models.indexes import Index from django.db.models.sql.compiler import _AsSqlType from typing_extensions import override logger: Logger class BaseDatabaseSchemaEditor(AbstractContextManager[Any]): sql_create_table: str sql_rename_table: str sql_retablespace_table: str sql_delete_table: str sql_create_column: str sql_alter_column: str sql_alter_column_type: str sql_alter_column_null: str sql_alter_column_not_null: str sql_alter_column_default: str sql_alter_column_no_default: str sql_alter_column_no_default_null: str sql_delete_column: str sql_rename_column: str sql_update_with_default: str sql_unique_constraint: str sql_check_constraint: str sql_delete_constraint: str sql_constraint: str sql_create_check: str sql_delete_check: str sql_create_unique: str sql_delete_unique: str sql_create_fk: str sql_create_inline_fk: str | None sql_create_column_inline_fk: str | None sql_delete_fk: str sql_create_index: str sql_create_unique_index: str sql_rename_index: str sql_delete_index: str sql_create_pk: str sql_delete_pk: str sql_pk_constraint: str sql_delete_procedure: str sql_alter_table_comment: str sql_alter_column_comment: str connection: BaseDatabaseWrapper collect_sql: bool collected_sql: Any atomic_migration: Any def __init__(self, connection: BaseDatabaseWrapper, collect_sql: bool = False, atomic: bool = True) -> None: ... deferred_sql: Any atomic: Any @override def __enter__(self) -> Self: ... @override def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None, ) -> None: ... def execute(self, sql: Statement | str, params: Sequence[Any] | None = ()) -> None: ... def quote_name(self, name: str) -> str: ... def table_sql(self, model: type[Model]) -> tuple[str, list[Any]]: ... def column_sql( self, model: type[Model], field: Field[Any, Any], include_default: bool = False ) -> tuple[None, None] | tuple[str, list[Any]]: ... def skip_default(self, field: Field[Any, Any]) -> bool: ... def skip_default_on_alter(self, field: Field[Any, Any]) -> bool: ... def prepare_default(self, value: Any) -> Any: ... def db_default_sql(self, field: Field[Any, Any]) -> _AsSqlType: ... def effective_default(self, field: Field[Any, Any]) -> int | str: ... def quote_value(self, value: Any) -> str: ... def create_model(self, model: type[Model]) -> None: ... def delete_model(self, model: type[Model]) -> None: ... def add_index(self, model: type[Model], index: Index) -> None: ... def remove_index(self, model: type[Model], index: Index) -> None: ... def rename_index(self, model: type[Model], old_index: Index, new_index: Index) -> None: ... def add_constraint(self, model: type[Model], constraint: BaseConstraint) -> None: ... def remove_constraint(self, model: type[Model], constraint: BaseConstraint) -> None: ... def alter_unique_together( self, model: type[Model], old_unique_together: Sequence[Sequence[str]], new_unique_together: Sequence[Sequence[str]], ) -> None: ... def alter_index_together( self, model: type[Model], old_index_together: Sequence[Sequence[str]], new_index_together: Sequence[Sequence[str]], ) -> None: ... def alter_db_table(self, model: type[Model], old_db_table: str, new_db_table: str) -> None: ... def alter_db_table_comment( self, model: type[Model], old_db_table_comment: str, new_db_table_comment: str ) -> None: ... def alter_db_tablespace(self, model: type[Model], old_db_tablespace: str, new_db_tablespace: str) -> None: ... def add_field(self, model: type[Model], field: Field[Any, Any]) -> None: ... def remove_field(self, model: type[Model], field: Field[Any, Any]) -> None: ... def alter_field( self, model: type[Model], old_field: Field[Any, Any], new_field: Field[Any, Any], strict: bool = False ) -> None: ... def remove_procedure(self, procedure_name: Any, param_types: Any = ()) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/base/validation.pyi000066400000000000000000000007711526064357400274000ustar00rootroot00000000000000from typing import Any from django.core.checks.messages import CheckMessage from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.fields import Field class BaseDatabaseValidation: connection: BaseDatabaseWrapper def __init__(self, connection: BaseDatabaseWrapper) -> None: ... def __del__(self) -> None: ... def check(self, **kwargs: Any) -> list[CheckMessage]: ... def check_field(self, field: Field[Any, Any], **kwargs: Any) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/ddl_references.pyi000066400000000000000000000070231526064357400272750ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any, Protocol, type_check_only from typing_extensions import override @type_check_only class _QuoteCallable(Protocol): def __call__(self, column: str, /) -> str: ... class Reference: def references_table(self, table: Any) -> bool: ... def references_column(self, table: Any, column: Any) -> bool: ... def references_index(self, table: Any, index: Any) -> bool: ... def rename_table_references(self, old_table: Any, new_table: Any) -> None: ... def rename_column_references(self, table: Any, old_column: Any, new_column: Any) -> None: ... class Table(Reference): table: str quote_name: _QuoteCallable def __init__(self, table: str, quote_name: _QuoteCallable) -> None: ... @override def references_table(self, table: str) -> bool: ... @override def references_index(self, table: Any, index: Any) -> bool: ... @override def rename_table_references(self, old_table: str, new_table: str) -> None: ... class TableColumns(Table): table: str columns: list[str] def __init__(self, table: str, columns: list[str]) -> None: ... @override def references_column(self, table: str, column: str) -> bool: ... @override def rename_column_references(self, table: str, old_column: str, new_column: str) -> None: ... class Columns(TableColumns): quote_name: _QuoteCallable col_suffixes: Sequence[str] def __init__( self, table: str, columns: list[str], quote_name: _QuoteCallable, col_suffixes: Sequence[str] = () ) -> None: ... @type_check_only class _NameCallable(Protocol): def __call__(self, table: str, columns: list[str], suffix: str, /) -> str: ... class IndexName(TableColumns): suffix: str create_index_name: _NameCallable def __init__(self, table: str, columns: list[str], suffix: str, create_index_name: _NameCallable) -> None: ... class IndexColumns(Columns): opclasses: Any def __init__( self, table: Any, columns: Any, quote_name: Any, col_suffixes: Any = (), opclasses: Any = () ) -> None: ... class ForeignKeyName(TableColumns): to_reference: TableColumns suffix_template: str create_fk_name: _NameCallable def __init__( self, from_table: str, from_columns: list[str], to_table: str, to_columns: list[str], suffix_template: str, create_fk_name: _NameCallable, ) -> None: ... @override def references_table(self, table: str) -> bool: ... @override def references_column(self, table: str, column: str) -> bool: ... @override def rename_table_references(self, old_table: str, new_table: str) -> None: ... @override def rename_column_references(self, table: str, old_column: str, new_column: str) -> None: ... class Expressions(TableColumns): compiler: Any expressions: Any quote_value: Any def __init__(self, table: str, expressions: Any, compiler: Any, quote_value: Any) -> None: ... class Statement(Reference): template: str parts: dict[str, Table] def __init__(self, template: str, **parts: Any) -> None: ... @override def references_table(self, table: str) -> bool: ... @override def references_column(self, table: str, column: str) -> bool: ... @override def references_index(self, table: Any, index: Any) -> bool: ... @override def rename_table_references(self, old_table: str, new_table: str) -> None: ... @override def rename_column_references(self, table: str, old_column: str, new_column: str) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/dummy/000077500000000000000000000000001526064357400247375ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/dummy/__init__.pyi000066400000000000000000000000001526064357400272070ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/dummy/base.pyi000066400000000000000000000016341526064357400264000ustar00rootroot00000000000000from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.base.client import BaseDatabaseClient from django.db.backends.base.creation import BaseDatabaseCreation from django.db.backends.base.introspection import BaseDatabaseIntrospection from django.db.backends.base.operations import BaseDatabaseOperations def complain(*args: Any, **kwargs: Any) -> Any: ... def ignore(*args: Any, **kwargs: Any) -> None: ... class DatabaseOperations(BaseDatabaseOperations): quote_name: Any class DatabaseClient(BaseDatabaseClient): ... class DatabaseCreation(BaseDatabaseCreation): create_test_db: Any destroy_test_db: Any class DatabaseIntrospection(BaseDatabaseIntrospection): get_table_list: Any get_table_description: Any get_relations: Any get_indexes: Any class DatabaseWrapper(BaseDatabaseWrapper): operators: Any ensure_connection: Any typeddjango-django-stubs-fa03b48/django-stubs/db/backends/dummy/features.pyi000066400000000000000000000002601526064357400272760ustar00rootroot00000000000000from django.db.backends.base.features import BaseDatabaseFeatures class DummyDatabaseFeatures(BaseDatabaseFeatures): supports_transactions: bool uses_savepoints: bool typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/000077500000000000000000000000001526064357400247515ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/__init__.pyi000066400000000000000000000000001526064357400272210ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/base.pyi000066400000000000000000000052161526064357400264120ustar00rootroot00000000000000from collections.abc import Container, Iterator from re import Pattern from typing import Any, Literal from django.db.backends.base.base import BaseDatabaseWrapper from typing_extensions import override from .client import DatabaseClient from .creation import DatabaseCreation from .features import DatabaseFeatures from .introspection import DatabaseIntrospection from .operations import DatabaseOperations from .validation import DatabaseValidation version: Any django_conversions: Any server_version_re: Pattern[str] class CursorWrapper: codes_for_integrityerror: Any cursor: Any def __init__(self, cursor: Any) -> None: ... def execute(self, query: Any, args: Any | None = ...) -> Any: ... def executemany(self, query: Any, args: Any) -> Any: ... def __getattr__(self, attr: Any) -> Any: ... def __iter__(self) -> Iterator[Any]: ... class DatabaseWrapper(BaseDatabaseWrapper): client: DatabaseClient creation: DatabaseCreation features: DatabaseFeatures introspection: DatabaseIntrospection validation: DatabaseValidation ops: DatabaseOperations client_class: type[DatabaseClient] creation_class: type[DatabaseCreation] features_class: type[DatabaseFeatures] introspection_class: type[DatabaseIntrospection] ops_class: type[DatabaseOperations] validation_class: type[DatabaseValidation] vendor: str data_types: Any operators: Any pattern_esc: str pattern_ops: Any isolation_levels: Any Database: Any SchemaEditorClass: Any isolation_level: Any @override def get_connection_params(self) -> dict[str, Any]: ... @override def get_new_connection(self, conn_params: Any) -> Any: ... @override def init_connection_state(self) -> None: ... @override def create_cursor(self, name: Any | None = ...) -> CursorWrapper: ... @override def disable_constraint_checking(self) -> Literal[True]: ... needs_rollback: Any @override def enable_constraint_checking(self) -> None: ... @override def check_constraints(self, table_names: Any | None = ...) -> None: ... @override def is_usable(self) -> bool: ... @property @override def display_name(self) -> str: ... # type: ignore[override] @property @override def data_type_check_constraints(self) -> dict[str, str]: ... # type: ignore[override] @property def mysql_server_data(self) -> dict[str, Any]: ... @property def mysql_server_info(self) -> str: ... @property def mysql_version(self) -> tuple[int, ...]: ... @property def mysql_is_mariadb(self) -> bool: ... @property def sql_mode(self) -> Container[str]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/client.pyi000066400000000000000000000010161526064357400267500ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any from django.db.backends.base.client import BaseDatabaseClient from django.db.backends.mysql.base import DatabaseWrapper from typing_extensions import override class DatabaseClient(BaseDatabaseClient): connection: DatabaseWrapper executable_name: str @classmethod @override def settings_to_cmd_args_env( cls, settings_dict: dict[str, Any], parameters: Iterable[str], ) -> tuple[list[str], dict[str, str] | None]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/compiler.pyi000066400000000000000000000014201526064357400273030ustar00rootroot00000000000000from django.db.models.sql import compiler from django.db.models.sql.compiler import _AsSqlType from typing_extensions import override class SQLCompiler(compiler.SQLCompiler): ... class SQLInsertCompiler(compiler.SQLInsertCompiler, SQLCompiler): ... class SQLDeleteCompiler(compiler.SQLDeleteCompiler, SQLCompiler): # https://github.com/django/django/blob/242499f2dc2bf24a9a5c855690a2e13d3303581a/django/db/backends/mysql/compiler.py#L26 @override def as_sql(self) -> _AsSqlType: ... # type: ignore[override] class SQLUpdateCompiler(compiler.SQLUpdateCompiler, SQLCompiler): ... class SQLAggregateCompiler(compiler.SQLAggregateCompiler, SQLCompiler): ... __all__ = ["SQLAggregateCompiler", "SQLCompiler", "SQLDeleteCompiler", "SQLInsertCompiler", "SQLUpdateCompiler"] typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/creation.pyi000066400000000000000000000004641526064357400273040ustar00rootroot00000000000000from django.db.backends.base.creation import BaseDatabaseCreation from django.db.backends.mysql.base import DatabaseWrapper from typing_extensions import override class DatabaseCreation(BaseDatabaseCreation): connection: DatabaseWrapper @override def sql_table_creation_suffix(self) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/features.pyi000066400000000000000000000114571526064357400273220ustar00rootroot00000000000000from typing import Any from django.db.backends.base.features import BaseDatabaseFeatures from django.db.backends.mysql.base import DatabaseWrapper from django.utils.functional import cached_property from typing_extensions import override class DatabaseFeatures(BaseDatabaseFeatures): connection: DatabaseWrapper empty_fetchmany_value: Any related_fields_match_type: bool allow_sliced_subqueries_with_in: bool has_select_for_update: bool has_select_for_update_nowait: bool has_select_for_update_skip_locked: bool supports_forward_references: bool supports_regex_backreferencing: bool supports_date_lookup_using_string: bool supports_timezones: bool requires_explicit_null_ordering_when_grouping: bool atomic_transactions: bool can_clone_databases: bool supports_temporal_subtraction: bool supports_slicing_ordering_in_compound: bool supports_index_on_text_field: bool supports_over_clause: bool supports_frame_range_fixed_distance: bool create_test_procedure_without_params_sql: str create_test_procedure_with_int_param_sql: str supports_partial_indexes: bool supports_order_by_nulls_modifier: bool order_by_nulls_first: bool supports_aggregate_order_by_clause: bool supports_json_negative_indexing: bool @cached_property @override def minimum_database_version(self) -> tuple[int, ...]: ... # type: ignore[override] @cached_property @override def test_collations(self) -> dict[str, str]: ... # type: ignore[override] @cached_property @override def django_test_skips(self) -> dict[str, set[str]]: ... # type: ignore[override] @cached_property @override def allows_auto_pk_0(self) -> bool: ... # type: ignore[override] @cached_property @override def update_can_self_select(self) -> bool: ... # type: ignore[override] @cached_property @override def can_introspect_foreign_keys(self) -> bool: ... # type: ignore[override] @cached_property @override def introspected_field_types(self) -> dict[str, str]: ... # type: ignore[override] @cached_property @override def can_return_columns_from_insert(self) -> bool: ... # type: ignore[override] @property @override def can_return_rows_from_bulk_insert(self) -> bool: ... # type: ignore[override] @cached_property @override def has_zoneinfo_database(self) -> bool: ... # type: ignore[override] @cached_property def is_sql_auto_is_null_enabled(self) -> bool: ... @cached_property @override def supports_column_check_constraints(self) -> bool: ... # type: ignore[override] @property @override def supports_table_check_constraints(self) -> bool: ... # type: ignore[override] @cached_property @override def can_introspect_check_constraints(self) -> bool: ... # type: ignore[override] @cached_property @override def has_select_for_update_of(self) -> bool: ... # type: ignore[override] @cached_property @override def supported_explain_formats(self) -> set[str]: ... # type: ignore[override] @cached_property @override def supports_transactions(self) -> bool: ... @cached_property @override def ignores_table_name_case(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_default_in_lead_lag(self) -> bool: ... # type: ignore[override] @property @override def supports_json_field(self) -> bool: ... # type: ignore[override] @cached_property @override def can_introspect_json_field(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_index_column_ordering(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_expression_indexes(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_select_intersection(self) -> bool: ... # type: ignore[override] @property @override def supports_select_difference(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_expression_defaults(self) -> bool: ... # type: ignore[override] @cached_property @override def has_native_uuid_field(self) -> bool: ... # type: ignore[override] @cached_property @override def allows_group_by_selected_pks(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_any_value(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_uuid4_function(self) -> bool: ... # type: ignore[override] @property @override def supports_uuid4_function_in_default(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_uuid7_function(self) -> bool: ... # type: ignore[override] typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/introspection.pyi000066400000000000000000000016151526064357400303770ustar00rootroot00000000000000from typing import Any, NamedTuple from django.db.backends.base.introspection import BaseDatabaseIntrospection from django.db.backends.mysql.base import DatabaseWrapper from django.db.backends.utils import CursorWrapper from typing_extensions import override FieldInfo: Any class InfoLine(NamedTuple): col_name: str data_type: str max_len: int | None num_prec: int | None num_scale: int | None extra: str column_default: str | None collation: str | None is_unsigned: bool comment: str class TableInfo(NamedTuple): name: str type: str comment: str class DatabaseIntrospection(BaseDatabaseIntrospection): connection: DatabaseWrapper data_types_reverse: Any def get_storage_engine(self, cursor: Any, table_name: str) -> str: ... @override def get_table_description(self, cursor: CursorWrapper, table_name: str) -> list[FieldInfo]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/operations.pyi000066400000000000000000000061631526064357400276650ustar00rootroot00000000000000from typing import Any from django.core.management.color import Style from django.db.backends.base.operations import BaseDatabaseOperations from django.db.backends.mysql.base import DatabaseWrapper from django.db.models.constants import OnConflict from django.db.models.sql.compiler import SQLCompiler from typing_extensions import override class DatabaseOperations(BaseDatabaseOperations): connection: DatabaseWrapper compiler_module: str integer_field_ranges: dict[str, tuple[int, int]] cast_data_types: dict[str, str] cast_char_field_without_max_length: str explain_prefix: str @override def date_extract_sql(self, lookup_type: str, sql: str, params: Any) -> tuple[str, Any]: ... @override def date_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = None) -> Any: ... @override def datetime_cast_date_sql(self, sql: str, params: Any, tzname: str | None) -> Any: ... @override def datetime_cast_time_sql(self, sql: str, params: Any, tzname: str | None) -> Any: ... @override def datetime_extract_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> Any: ... @override def datetime_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> Any: ... @override def time_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = None) -> Any: ... @override def format_for_duration_arithmetic(self, sql: Any) -> Any: ... @override def force_no_ordering(self) -> Any: ... @override def last_executed_query(self, cursor: Any, sql: Any, params: Any) -> Any: ... @override def no_limit_value(self) -> Any: ... @override def quote_name(self, name: str) -> Any: ... @override def sequence_reset_by_name_sql(self, style: Style, sequences: Any) -> Any: ... @override def validate_autopk_value(self, value: Any) -> Any: ... @override def adapt_datetimefield_value(self, value: Any) -> Any: ... @override def adapt_timefield_value(self, value: Any) -> Any: ... @override def max_name_length(self) -> Any: ... @override def combine_expression(self, connector: Any, sub_expressions: Any) -> Any: ... @override def get_db_converters(self, expression: Any) -> Any: ... def convert_booleanfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... def convert_datetimefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... def convert_uuidfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... @override def binary_placeholder_sql(self, value: Any, compiler: SQLCompiler) -> Any: ... @override def subtract_temporals(self, internal_type: Any, lhs: Any, rhs: Any) -> Any: ... @override def explain_query_prefix(self, format: Any | None = None, **options: Any) -> Any: ... @override def regex_lookup(self, lookup_type: str) -> Any: ... @override def insert_statement(self, on_conflict: OnConflict | None = None) -> str: ... @override def lookup_cast(self, lookup_type: str, internal_type: Any | None = None) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/schema.pyi000066400000000000000000000022441526064357400267360ustar00rootroot00000000000000from typing import Any from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.backends.mysql.base import DatabaseWrapper from django.db.models.base import Model from django.db.models.fields import Field from typing_extensions import override class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): connection: DatabaseWrapper sql_rename_table: str sql_alter_column_null: str sql_alter_column_not_null: str sql_alter_column_type: str sql_delete_column: str sql_delete_unique: str sql_create_column_inline_fk: str sql_delete_fk: str sql_delete_index: str sql_create_pk: str sql_delete_pk: str sql_create_index: str sql_alter_column_comment: None # type: ignore[assignment] @property @override def sql_delete_check(self) -> str: ... # type: ignore[override] @property @override def sql_rename_column(self) -> str: ... # type: ignore[override] @override def quote_value(self, value: Any) -> str: ... @override def skip_default(self, field: Field[Any, Any]) -> bool: ... @override def add_field(self, model: type[Model], field: Field[Any, Any]) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/mysql/validation.pyi000066400000000000000000000010401526064357400276210ustar00rootroot00000000000000from typing import Any from django.core.checks.messages import CheckMessage from django.db.backends.base.validation import BaseDatabaseValidation from django.db.backends.mysql.base import DatabaseWrapper from django.db.models.fields import Field from typing_extensions import override class DatabaseValidation(BaseDatabaseValidation): connection: DatabaseWrapper @override def check(self, **kwargs: Any) -> list[CheckMessage]: ... def check_field_type(self, field: Field[Any, Any], field_type: str) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/000077500000000000000000000000001526064357400250515ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/__init__.pyi000066400000000000000000000000001526064357400273210ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/base.pyi000066400000000000000000000060301526064357400265050ustar00rootroot00000000000000from collections.abc import Iterator from contextlib import AbstractContextManager from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.utils.functional import cached_property from typing_extensions import override from .client import DatabaseClient from .creation import DatabaseCreation from .features import DatabaseFeatures from .introspection import DatabaseIntrospection from .operations import DatabaseOperations from .validation import DatabaseValidation def wrap_oracle_errors() -> AbstractContextManager[None]: ... class _UninitializedOperatorsDescriptor: def __get__(self, instance: Any, cls: Any | None = None) -> Any: ... class DatabaseWrapper(BaseDatabaseWrapper): client: DatabaseClient creation: DatabaseCreation features: DatabaseFeatures introspection: DatabaseIntrospection validation: DatabaseValidation client_class: type[DatabaseClient] creation_class: type[DatabaseCreation] features_class: type[DatabaseFeatures] introspection_class: type[DatabaseIntrospection] ops_class: type[DatabaseOperations] validation_class: type[DatabaseValidation] vendor: str display_name: str data_types: Any data_type_check_constraints: Any operators: Any pattern_esc: str Database: Any SchemaEditorClass: Any def __init__(self, *args: Any, **kwargs: Any) -> None: ... @property def is_pool(self) -> bool: ... @property def pool(self) -> Any: ... def close_pool(self) -> None: ... @override def get_connection_params(self) -> Any: ... @override def get_new_connection(self, conn_params: Any) -> Any: ... pattern_ops: Any @override def init_connection_state(self) -> None: ... @override def create_cursor(self, name: Any | None = None) -> Any: ... @override def check_constraints(self, table_names: Any | None = None) -> None: ... @override def is_usable(self) -> bool: ... @cached_property def oracle_version(self) -> tuple[int, ...]: ... @cached_property def oracledb_version(self) -> tuple[int, ...]: ... class OracleParam: force_bytes: Any input_size: Any def __init__(self, param: Any, cursor: Any, strings_only: bool = False) -> None: ... class VariableWrapper: var: Any def __init__(self, var: Any) -> None: ... def bind_parameter(self, cursor: Any) -> Any: ... def __getattr__(self, key: Any) -> Any: ... @override def __setattr__(self, key: Any, value: Any) -> None: ... class FormatStylePlaceholderCursor: charset: str cursor: Any database: BaseDatabaseWrapper def __init__(self, connection: Any, database: BaseDatabaseWrapper) -> None: ... def execute(self, query: Any, params: Any | None = None) -> Any: ... def executemany(self, query: Any, params: Any | None = None) -> Any: ... def close(self) -> None: ... def var(self, *args: Any) -> Any: ... def arrayvar(self, *args: Any) -> Any: ... def __getattr__(self, attr: Any) -> Any: ... def __iter__(self) -> Iterator[Any]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/client.pyi000066400000000000000000000011271526064357400270530ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any from django.db.backends.base.client import BaseDatabaseClient from django.db.backends.oracle.base import DatabaseWrapper from typing_extensions import override class DatabaseClient(BaseDatabaseClient): connection: DatabaseWrapper executable_name: str wrapper_name: str @staticmethod def connect_string(settings_dict: dict[str, Any]) -> str: ... @classmethod @override def settings_to_cmd_args_env( cls, settings_dict: dict[str, Any], parameters: Iterable[str] ) -> tuple[list[str], None]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/creation.pyi000066400000000000000000000010041526064357400273730ustar00rootroot00000000000000from typing import Any, ClassVar from django.db.backends.base.creation import BaseDatabaseCreation from django.db.backends.oracle.base import DatabaseWrapper from typing_extensions import override TEST_DATABASE_PREFIX: str class DatabaseCreation(BaseDatabaseCreation): destroy_test_db_connection_close_method: ClassVar[str | None] connection: DatabaseWrapper @override def set_as_test_mirror(self, primary_settings_dict: Any) -> None: ... @override def test_db_signature(self) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/features.pyi000066400000000000000000000071061526064357400274160ustar00rootroot00000000000000from typing import Any from django.db.backends.base.features import BaseDatabaseFeatures from django.db.backends.oracle.base import DatabaseWrapper from django.utils.functional import cached_property from typing_extensions import override class DatabaseFeatures(BaseDatabaseFeatures): connection: DatabaseWrapper interprets_empty_strings_as_nulls: bool has_select_for_update: bool has_select_for_update_nowait: bool has_select_for_update_skip_locked: bool has_select_for_update_of: bool select_for_update_of_column: bool can_return_columns_from_insert: bool supports_subqueries_in_group_by: bool supports_transactions: bool supports_timezones: bool has_native_duration_field: bool can_defer_constraint_checks: bool supports_partially_nullable_unique_constraints: bool supports_deferrable_unique_constraints: bool truncates_names: bool supports_tablespaces: bool supports_sequence_reset: bool can_introspect_materialized_views: bool atomic_transactions: bool nulls_order_largest: bool requires_literal_defaults: bool closed_cursor_error_class: Any supports_select_for_update_with_limit: bool supports_temporal_subtraction: bool ignores_table_name_case: bool supports_index_on_text_field: bool create_test_procedure_without_params_sql: str create_test_procedure_with_int_param_sql: str supports_callproc_kwargs: bool supports_over_clause: bool supports_frame_range_fixed_distance: bool supports_ignore_conflicts: bool max_query_params: int supports_partial_indexes: bool supports_slicing_ordering_in_compound: bool allows_multiple_constraints_on_same_fields: bool supports_json_field_contains: bool can_return_rows_from_update: bool supports_aggregate_order_by_clause: bool supports_any_value: bool supports_tuple_comparison_against_subquery: bool @cached_property @override def supports_json_negative_indexing(self) -> bool: ... # type: ignore[override] @cached_property @override def django_test_skips(self) -> dict[str, set[str]]: ... # type: ignore[override] @cached_property @override def introspected_field_types(self) -> dict[str, str]: ... # type: ignore[override] @cached_property @override def test_collations(self) -> dict[str, str | None]: ... # type: ignore[override] @cached_property @override def supports_collation_on_charfield(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_primitives_in_json_field(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_frame_exclusion(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_comparing_boolean_expr(self) -> bool: ... # type: ignore[override] @cached_property def supports_aggregation_over_interval_types(self) -> bool: ... @cached_property @override def bare_select_suffix(self) -> str: ... # type: ignore[override] @cached_property @override def supports_tuple_lookups(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_uuid4_function(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_uuid4_function_in_default(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_stored_generated_columns(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_bit_aggregations(self) -> bool: ... # type: ignore[override] typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/functions.pyi000066400000000000000000000006201526064357400276020ustar00rootroot00000000000000from typing import Any from django.db.models import Func class IntervalToSeconds(Func): function: str template: str def __init__(self, expression: Any, *, output_field: Any | None = None, **extra: Any) -> None: ... class SecondsToInterval(Func): function: str template: str def __init__(self, expression: Any, *, output_field: Any | None = None, **extra: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/introspection.pyi000066400000000000000000000011661526064357400305000ustar00rootroot00000000000000from typing import Any, NamedTuple from django.db.backends.base.introspection import BaseDatabaseIntrospection from django.db.backends.oracle.base import DatabaseWrapper from django.db.backends.utils import CursorWrapper from typing_extensions import override FieldInfo: Any class TableInfo(NamedTuple): name: str type: str comment: str | None class DatabaseIntrospection(BaseDatabaseIntrospection): connection: DatabaseWrapper cache_bust_counter: int data_types_reverse: dict[int, str] @override def get_table_description(self, cursor: CursorWrapper, table_name: str) -> list[FieldInfo]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/operations.pyi000066400000000000000000000103321526064357400277560ustar00rootroot00000000000000from typing import Any from django.core.management.color import Style from django.db.backends.base.operations import BaseDatabaseOperations from django.db.backends.oracle.base import DatabaseWrapper from typing_extensions import override class DatabaseOperations(BaseDatabaseOperations): connection: DatabaseWrapper integer_field_ranges: Any set_operators: Any cast_char_field_without_max_length: str cast_data_types: Any @override def cache_key_culling_sql(self) -> str: ... @override def date_extract_sql(self, lookup_type: str, sql: str, params: Any) -> tuple[str, Any]: ... @override def date_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = ...) -> tuple[str, Any]: ... @override def datetime_cast_date_sql(self, sql: str, params: Any, tzname: str | None) -> tuple[str, Any]: ... @override def datetime_cast_time_sql(self, sql: str, params: Any, tzname: str | None) -> tuple[str, Any]: ... @override def datetime_extract_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> tuple[str, Any]: ... @override def datetime_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None) -> str: ... @override def time_trunc_sql(self, lookup_type: str, sql: str, params: Any, tzname: str | None = ...) -> str: ... @override def get_db_converters(self, expression: Any) -> list[Any]: ... def convert_textfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... def convert_binaryfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... def convert_booleanfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... def convert_datetimefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... def convert_datefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... def convert_timefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... def convert_uuidfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... @staticmethod def convert_empty_string(value: Any, expression: Any, connection: Any) -> Any: ... @staticmethod def convert_empty_bytes(value: Any, expression: Any, connection: Any) -> Any: ... @override def deferrable_sql(self) -> str: ... @override def no_limit_value(self) -> str | None: ... @override def limit_offset_sql(self, low_mark: Any, high_mark: Any) -> str: ... @override def last_executed_query(self, cursor: Any, sql: Any, params: Any) -> str: ... @override def last_insert_id(self, cursor: Any, table_name: Any, pk_name: Any) -> Any: ... @override def lookup_cast(self, lookup_type: str, internal_type: Any | None = ...) -> str: ... @override def max_in_list_size(self) -> int: ... @override def max_name_length(self) -> int: ... @override def pk_default_value(self) -> str: ... @override def prep_for_iexact_query(self, x: Any) -> str: ... @override def process_clob(self, value: Any) -> Any: ... @override def quote_name(self, name: str) -> str: ... @override def regex_lookup(self, lookup_type: str) -> str: ... @override def sequence_reset_by_name_sql(self, style: Style, sequences: Any) -> list[str]: ... @override def sequence_reset_sql(self, style: Style, model_list: Any) -> list[str]: ... @override def start_transaction_sql(self) -> str: ... @override def tablespace_sql(self, tablespace: Any, inline: bool = ...) -> str: ... @override def adapt_datefield_value(self, value: Any) -> Any: ... @override def adapt_datetimefield_value(self, value: Any) -> Any: ... @override def adapt_durationfield_value(self, value: Any) -> Any: ... @override def adapt_timefield_value(self, value: Any) -> Any: ... @override def combine_expression(self, connector: Any, sub_expressions: Any) -> Any: ... @override def subtract_temporals(self, internal_type: Any, lhs: Any, rhs: Any) -> Any: ... @override def bulk_batch_size(self, fields: Any, objs: Any) -> int: ... @override def conditional_expression_supported_in_where_clause(self, expression: Any) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/schema.pyi000066400000000000000000000022471526064357400270410ustar00rootroot00000000000000from typing import Any from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.backends.oracle.base import DatabaseWrapper from django.db.models.base import Model from django.db.models.fields import Field from typing_extensions import override class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): connection: DatabaseWrapper sql_create_column: str sql_alter_column_type: str sql_alter_column_null: str sql_alter_column_not_null: str sql_alter_column_default: str sql_alter_column_no_default: str sql_delete_column: str sql_create_column_inline_fk: str sql_delete_table: str sql_create_index: str @override def quote_value(self, value: Any) -> str: ... @override def remove_field(self, model: type[Model], field: Field[Any, Any]) -> None: ... @override def delete_model(self, model: type[Model]) -> None: ... @override def alter_field( self, model: type[Model], old_field: Field[Any, Any], new_field: Field[Any, Any], strict: bool = False ) -> None: ... def normalize_name(self, name: Any) -> str: ... @override def prepare_default(self, value: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/utils.pyi000066400000000000000000000010631526064357400267340ustar00rootroot00000000000000import datetime from typing import Any class BoundVar: types: Any db_type: Any bound_param: Any def __init__(self, field: Any) -> None: ... def bind_parameter(self, cursor: Any) -> Any: ... def get_value(self) -> Any: ... class Oracle_datetime(datetime.datetime): input_size: Any @classmethod def from_datetime(cls, dt: Any) -> Any: ... class BulkInsertMapper: BLOB: str DATE: str INTERVAL: str NCLOB: str NUMBER: str TIMESTAMP: str types: Any def dsn(settings_dict: dict[str, Any]) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/oracle/validation.pyi000066400000000000000000000006561526064357400277350ustar00rootroot00000000000000from typing import Any from django.core.checks.messages import CheckMessage from django.db.backends.base.validation import BaseDatabaseValidation from django.db.backends.oracle.base import DatabaseWrapper from django.db.models.fields import Field class DatabaseValidation(BaseDatabaseValidation): connection: DatabaseWrapper def check_field_type(self, field: Field[Any, Any], field_type: str) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/000077500000000000000000000000001526064357400260075ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/__init__.pyi000066400000000000000000000000001526064357400302570ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/base.pyi000066400000000000000000000032271526064357400274500ustar00rootroot00000000000000from types import ModuleType from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.utils import CursorDebugWrapper as BaseCursorDebugWrapper from django.db.backends.utils import _ExecuteQuery from django.utils.functional import cached_property from .client import DatabaseClient from .creation import DatabaseCreation from .features import DatabaseFeatures from .introspection import DatabaseIntrospection from .operations import DatabaseOperations TIMESTAMPTZ_OID: int def psycopg_version() -> tuple[int, int, int]: ... class DatabaseWrapper(BaseDatabaseWrapper): client: DatabaseClient creation: DatabaseCreation features: DatabaseFeatures introspection: DatabaseIntrospection ops: DatabaseOperations client_class: type[DatabaseClient] creation_class: type[DatabaseCreation] features_class: type[DatabaseFeatures] introspection_class: type[DatabaseIntrospection] ops_class: type[DatabaseOperations] Database: ModuleType operators: dict[str, str] pattern_esc: str pattern_ops: dict[str, str] # PostgreSQL backend-specific attributes. _named_cursor_idx: int @property def pool(self) -> Any: ... def close_pool(self) -> None: ... def tzinfo_factory(self, offset: int) -> Any: ... @cached_property def pg_version(self) -> int: ... class CursorMixin: def callproc(self, name: Any, args: Any = ...) -> Any: ... class ServerBindingCursor(CursorMixin): ... class Cursor(CursorMixin): ... class ServerSideCursor(CursorMixin): ... class CursorDebugWrapper(BaseCursorDebugWrapper): def copy(self, statement: _ExecuteQuery) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/client.pyi000066400000000000000000000011171526064357400300100ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any from django.db.backends.base.client import BaseDatabaseClient from django.db.backends.postgresql.base import DatabaseWrapper from typing_extensions import override class DatabaseClient(BaseDatabaseClient): connection: DatabaseWrapper executable_name: str @classmethod @override def settings_to_cmd_args_env( cls, settings_dict: dict[str, Any], parameters: Iterable[str] ) -> tuple[list[str], dict[str, str] | None]: ... @override def runshell(self, parameters: Iterable[str]) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/compiler.pyi000066400000000000000000000014221526064357400303430ustar00rootroot00000000000000from typing import Any from django.db.models.sql.compiler import SQLAggregateCompiler as SQLAggregateCompiler from django.db.models.sql.compiler import SQLCompiler as SQLCompiler from django.db.models.sql.compiler import SQLDeleteCompiler as SQLDeleteCompiler from django.db.models.sql.compiler import SQLInsertCompiler as BaseSQLInsertCompiler from django.db.models.sql.compiler import SQLUpdateCompiler as SQLUpdateCompiler from typing_extensions import override __all__ = [ "SQLAggregateCompiler", "SQLCompiler", "SQLDeleteCompiler", "SQLInsertCompiler", "SQLUpdateCompiler", ] class InsertUnnest(list[str]): ... class SQLInsertCompiler(BaseSQLInsertCompiler): @override def assemble_as_sql(self, fields: Any, value_rows: Any) -> tuple[Any, Any]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/creation.pyi000066400000000000000000000003201526064357400303310ustar00rootroot00000000000000from django.db.backends.base.creation import BaseDatabaseCreation from django.db.backends.postgresql.base import DatabaseWrapper class DatabaseCreation(BaseDatabaseCreation): connection: DatabaseWrapper typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/features.pyi000066400000000000000000000067611526064357400303620ustar00rootroot00000000000000from typing import Any from django.db.backends.base.features import BaseDatabaseFeatures from django.db.backends.postgresql.base import DatabaseWrapper from django.utils.functional import cached_property from typing_extensions import override class DatabaseFeatures(BaseDatabaseFeatures): connection: DatabaseWrapper allows_group_by_selected_pks: bool can_return_columns_from_insert: bool can_return_rows_from_bulk_insert: bool has_real_datatype: bool has_native_boolean_field: bool has_native_uuid_field: bool has_native_duration_field: bool has_native_json_field: bool can_defer_constraint_checks: bool has_select_for_update: bool has_select_for_update_nowait: bool has_select_for_update_of: bool has_select_for_update_skip_locked: bool has_select_for_no_key_update: bool can_release_savepoints: bool supports_tablespaces: bool supports_transactions: bool can_introspect_materialized_views: bool can_distinct_on_fields: bool can_rollback_ddl: bool supports_combined_alters: bool nulls_order_largest: bool closed_cursor_error_class: Any has_case_insensitive_like: bool greatest_least_ignores_nulls: bool can_clone_databases: bool supports_temporal_subtraction: bool supports_slicing_ordering_in_compound: bool create_test_procedure_without_params_sql: str create_test_procedure_with_int_param_sql: str requires_casted_case_in_updates: bool supports_over_clause: bool only_supports_unbounded_with_preceding_and_following: bool supports_aggregate_filter_clause: bool supported_explain_formats: set[str] supports_deferrable_unique_constraints: bool has_json_operators: bool json_key_contains_list_matching_requires_list: bool supports_uuid4_function: bool @cached_property @override def supports_uuid7_function(self) -> bool: ... # type: ignore[override] @cached_property @override def supports_uuid7_function_shift(self) -> bool: ... # type: ignore[override] @cached_property @override def django_test_skips(self) -> dict[str, set[str]]: ... # type: ignore[override] @cached_property @override def django_test_expected_failures(self) -> set[str]: ... # type: ignore[override] @cached_property def uses_server_side_binding(self) -> bool: ... @cached_property @override def max_query_params(self) -> int | None: ... # type: ignore[override] @cached_property @override def prohibits_null_characters_in_text_exception(self) -> tuple[type[Exception], str]: ... # type: ignore[override] @cached_property @override def introspected_field_types(self) -> dict[str, str]: ... # type: ignore[override] @cached_property def is_postgresql_16(self) -> bool: ... @cached_property def is_postgresql_17(self) -> bool: ... @cached_property def is_postgresql_18(self) -> bool: ... supports_covering_indexes: bool supports_non_deterministic_collations: bool can_return_rows_from_update: bool supports_aggregate_order_by_clause: bool @property @override def supports_nulls_distinct_unique_constraints(self) -> bool: ... # type: ignore[override] @property @override def supports_any_value(self) -> bool: ... # type: ignore[override] @property @override def supports_virtual_generated_columns(self) -> bool: ... # type: ignore[override] @property @override def supports_uuid4_function_in_default(self) -> bool: ... # type: ignore[override] typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/introspection.pyi000066400000000000000000000020521526064357400314310ustar00rootroot00000000000000from typing import NamedTuple from django.db.backends.base.introspection import BaseDatabaseIntrospection from django.db.backends.postgresql.base import DatabaseWrapper from django.db.backends.utils import CursorWrapper from django.db.models.deletion import DatabaseOnDelete, _Collector from typing_extensions import override class FieldInfo(NamedTuple): name: str type_code: int display_size: int | None internal_size: int | None precision: int | None scale: int | None null_ok: bool default: str | None collation: str | None is_autofield: bool comment: str | None class TableInfo(NamedTuple): name: str type: str comment: str | None class DatabaseIntrospection(BaseDatabaseIntrospection): connection: DatabaseWrapper data_types_reverse: dict[int, str] index_default_access_method: str ignored_tables: list[str] on_delete_types: dict[str, _Collector | DatabaseOnDelete] @override def get_table_description(self, cursor: CursorWrapper, table_name: str) -> list[FieldInfo]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/operations.pyi000066400000000000000000000007621526064357400307220ustar00rootroot00000000000000from types import ModuleType from typing import Any from django.db.backends.base.operations import BaseDatabaseOperations from django.db.backends.postgresql.base import DatabaseWrapper def get_json_dumps(encoder: type[Any] | None) -> Any: ... class DatabaseOperations(BaseDatabaseOperations): connection: DatabaseWrapper explain_options: frozenset[str] integerfield_type_map: dict[str, type[Any]] numeric: ModuleType def compose_sql(self, sql: Any, params: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/psycopg_any.pyi000066400000000000000000000016231526064357400310670ustar00rootroot00000000000000from enum import IntEnum from types import ModuleType from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper is_psycopg3: bool TSRANGE_OID: int TSTZRANGE_OID: int errors: ModuleType sql: ModuleType adapt: ModuleType adapters: Any class IsolationLevel(IntEnum): READ_UNCOMMITTED = 1 READ_COMMITTED = 2 REPEATABLE_READ = 3 SERIALIZABLE = 4 # Range types from psycopg Range: Any DateRange: Any DateTimeRange: Any DateTimeTZRange: Any NumericRange: Any RANGE_TYPES: tuple[Any, ...] # Psycopg types Jsonb: Any ClientCursor: Any TextLoader: Any BaseTzLoader: Any RangeDumper: Any DjangoRangeDumper: Any orig_tz_loader_cls: Any def Inet(address: str) -> Any: ... def mogrify(sql: str, params: Any, connection: BaseDatabaseWrapper) -> str: ... def register_tzloader(tz: Any, context: Any) -> None: ... def get_adapters_template(use_tz: bool, timezone: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/postgresql/schema.pyi000066400000000000000000000020261526064357400277720ustar00rootroot00000000000000from typing import Any from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.backends.postgresql.base import DatabaseWrapper from django.db.models.base import Model from django.db.models.indexes import Index from typing_extensions import override class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): connection: DatabaseWrapper sql_delete_sequence: str sql_alter_sequence_type: str sql_create_index: str sql_create_index_concurrently: str sql_delete_index: str sql_delete_index_concurrently: str sql_create_column_inline_fk: str sql_delete_fk: str sql_delete_procedure: str sql_add_identity: str sql_drop_indentity: str # typo in source: `indentity` instead of `identity` @override def quote_value(self, value: Any) -> str: ... @override def add_index(self, model: type[Model], index: Index, concurrently: bool = False) -> None: ... @override def remove_index(self, model: type[Model], index: Index, concurrently: bool = False) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/signals.pyi000066400000000000000000000000771526064357400257730ustar00rootroot00000000000000from django.dispatch import Signal connection_created: Signal typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/000077500000000000000000000000001526064357400251705ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/__init__.pyi000066400000000000000000000000001526064357400274400ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/base.pyi000066400000000000000000000034541526064357400266330ustar00rootroot00000000000000from collections.abc import Callable, Iterable from datetime import date, datetime from re import Pattern from sqlite3 import dbapi2 as Database from types import ModuleType from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from typing_extensions import TypeVar, override from .client import DatabaseClient from .creation import DatabaseCreation from .features import DatabaseFeatures from .introspection import DatabaseIntrospection from .operations import DatabaseOperations from .schema import DatabaseSchemaEditor _R = TypeVar("_R") def decoder(conv_func: Callable[[str], _R]) -> Callable[[bytes], _R]: ... def adapt_date(val: date) -> str: ... def adapt_datetime(val: datetime) -> str: ... class DatabaseWrapper(BaseDatabaseWrapper): client: DatabaseClient creation: DatabaseCreation features: DatabaseFeatures introspection: DatabaseIntrospection ops: DatabaseOperations operators: dict[str, str] pattern_esc: str pattern_ops: dict[str, str] transaction_modes: frozenset[str] Database: ModuleType SchemaEditorClass: type[DatabaseSchemaEditor] client_class: type[DatabaseClient] creation_class: type[DatabaseCreation] features_class: type[DatabaseFeatures] introspection_class: type[DatabaseIntrospection] ops_class: type[DatabaseOperations] def is_in_memory_db(self) -> bool: ... FORMAT_QMARK_REGEX: Pattern[str] class SQLiteCursorWrapper(Database.Cursor): @override def execute(self, query: str, params: Iterable[Any] | None = None) -> SQLiteCursorWrapper: ... # type: ignore[override] @override def executemany(self, query: str, param_list: Iterable[Iterable[Any]]) -> SQLiteCursorWrapper: ... # type: ignore[override] def convert_query(self, query: str, *, param_names: Any = None) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/client.pyi000066400000000000000000000007561526064357400272010ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any from django.db.backends.base.client import BaseDatabaseClient from django.db.backends.sqlite3.base import DatabaseWrapper from typing_extensions import override class DatabaseClient(BaseDatabaseClient): connection: DatabaseWrapper executable_name: str @classmethod @override def settings_to_cmd_args_env( cls, settings_dict: dict[str, Any], parameters: Iterable[str] ) -> tuple[list[str], None]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/creation.pyi000066400000000000000000000004731526064357400275230ustar00rootroot00000000000000from _typeshed import StrPath from django.db.backends.base.creation import BaseDatabaseCreation from django.db.backends.sqlite3.base import DatabaseWrapper class DatabaseCreation(BaseDatabaseCreation): connection: DatabaseWrapper @staticmethod def is_in_memory_db(database_name: StrPath) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/features.pyi000066400000000000000000000032401526064357400275300ustar00rootroot00000000000000from django.db.backends.base.features import BaseDatabaseFeatures from django.db.backends.sqlite3.base import DatabaseWrapper from django.utils.functional import cached_property from typing_extensions import override class DatabaseFeatures(BaseDatabaseFeatures): connection: DatabaseWrapper can_alter_table_drop_column: bool supports_aggregate_order_by_clause: bool supports_aggregate_distinct_multiple_argument: bool supports_any_value: bool @cached_property @override def supports_uuid7_function(self) -> bool: ... # type: ignore[override] @cached_property @override def django_test_skips(self) -> dict[str, set[str]]: ... # type: ignore[override] @cached_property @override def introspected_field_types(self) -> dict[str, str]: ... # type: ignore[override] @property @override def max_query_params(self) -> int: ... # type: ignore[override] @cached_property @override def supports_json_field(self) -> bool: ... # type: ignore[override] @property @override def can_introspect_json_field(self) -> bool: ... # type: ignore[override] @property @override def has_json_object_function(self) -> bool: ... # type: ignore[override] @cached_property @override def can_return_columns_from_insert(self) -> bool: ... # type: ignore[override] @property @override def can_return_rows_from_bulk_insert(self) -> bool: ... # type: ignore[override] @property @override def can_return_rows_from_update(self) -> bool: ... # type: ignore[override] @property @override def supports_uuid4_function_in_default(self) -> bool: ... # type: ignore[override] typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/introspection.pyi000066400000000000000000000017021526064357400306130ustar00rootroot00000000000000from re import Pattern from typing import Any, NamedTuple from django.db.backends.base.introspection import BaseDatabaseIntrospection from django.db.backends.sqlite3.base import DatabaseWrapper from django.db.backends.utils import CursorWrapper from typing_extensions import override class FieldInfo(NamedTuple): name: str type_code: int display_size: int | None internal_size: int | None precision: int | None scale: int | None null_ok: bool default: str | None collation: str | None pk: bool has_json_constraint: bool field_size_re: Pattern[str] def get_field_size(name: str) -> int | None: ... class FlexibleFieldLookupDict: base_data_types_reverse: Any def __getitem__(self, key: str) -> Any: ... class DatabaseIntrospection(BaseDatabaseIntrospection): connection: DatabaseWrapper @override def get_table_description(self, cursor: CursorWrapper, table_name: str) -> list[FieldInfo]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/operations.pyi000066400000000000000000000026671526064357400301110ustar00rootroot00000000000000from collections.abc import Callable from decimal import Decimal from typing import Any from uuid import UUID from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.base.operations import BaseDatabaseOperations from django.db.models.aggregates import Aggregate from django.db.models.expressions import Expression from django.db.models.fields import DateField, DateTimeField, TimeField from typing_extensions import override UNSUPPORTED_DATETIME_AGGREGATES: tuple[type[Aggregate], ...] DATETIME_FIELDS: tuple[type[DateField[Any, Any] | DateTimeField[Any, Any] | TimeField[Any, Any]], ...] class DatabaseOperations(BaseDatabaseOperations): jsonfield_datatype_values: frozenset[str] def convert_datetimefield_value(self, value: Any, expression: Any, connection: Any) -> Any | None: ... def convert_datefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... def convert_timefield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... def get_decimalfield_converter( self, expression: Any, ) -> Callable[[float | None, Expression, BaseDatabaseWrapper], Decimal | None]: ... def convert_uuidfield_value(self, value: Any, expression: Any, connection: Any) -> UUID | None: ... def convert_booleanfield_value(self, value: Any, expression: Any, connection: Any) -> Any: ... @override def format_json_path_numeric_index(self, num: int) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/sqlite3/schema.pyi000066400000000000000000000010761526064357400271570ustar00rootroot00000000000000from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.backends.sqlite3.base import DatabaseWrapper from django.db.models.base import Model from typing_extensions import override class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): connection: DatabaseWrapper sql_create_fk: None # type: ignore[assignment] sql_alter_table_comment: None # type: ignore[assignment] sql_alter_column_comment: None # type: ignore[assignment] @override def delete_model(self, model: type[Model], handle_autom2m: bool = True) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/backends/utils.pyi000066400000000000000000000060651526064357400254760ustar00rootroot00000000000000import datetime from collections.abc import Iterator, Mapping, Sequence from contextlib import AbstractContextManager from decimal import Decimal from logging import Logger from types import TracebackType from typing import Any, Literal, Protocol, Self, TypeAlias, overload, type_check_only from uuid import UUID logger: Logger # Protocol matching psycopg2.sql.Composable, to avoid depending psycopg2 @type_check_only class _Composable(Protocol): def as_string(self, context: Any, /) -> str: ... def __add__(self, other: Self, /) -> _Composable: ... def __mul__(self, n: int, /) -> _Composable: ... _ExecuteQuery: TypeAlias = str | _Composable # Python types that can be adapted to SQL. _SQLType: TypeAlias = ( bool | int | float | Decimal | str | bytes | datetime.date | datetime.datetime | UUID | tuple[Any, ...] | list[Any] | None ) _ExecuteParameters: TypeAlias = Sequence[_SQLType] | Mapping[str, _SQLType] | None class CursorWrapper: cursor: Any db: Any def __init__(self, cursor: Any, db: Any) -> None: ... WRAP_ERROR_ATTRS: Any APPS_NOT_READY_WARNING_MSG: str def __getattr__(self, attr: str) -> Any: ... def __iter__(self) -> Iterator[tuple[Any, ...]]: ... def __enter__(self) -> Self: ... def __exit__( self, type: type[BaseException] | None, value: BaseException | None, traceback: TracebackType | None, ) -> None: ... def callproc( self, procname: str, params: Sequence[Any] | None = None, kparams: dict[str, int] | None = None ) -> Any: ... def execute(self, sql: _ExecuteQuery, params: _ExecuteParameters | None = None) -> Any: ... def executemany(self, sql: _ExecuteQuery, param_list: Sequence[_ExecuteParameters]) -> Any: ... class CursorDebugWrapper(CursorWrapper): def debug_sql( self, sql: str | None = None, params: _ExecuteParameters | Sequence[_ExecuteParameters] | None = None, use_last_executed_query: bool = False, many: bool = False, ) -> AbstractContextManager[None]: ... def debug_transaction(connection: Any, sql: str) -> AbstractContextManager[None]: ... def split_tzname_delta(tzname: str) -> tuple[str, str | None, str | None]: ... @overload def typecast_date(s: Literal[""] | None) -> None: ... # type: ignore[overload-overlap] @overload def typecast_date(s: str) -> datetime.date: ... @overload def typecast_time(s: Literal[""] | None) -> None: ... # type: ignore[overload-overlap] @overload def typecast_time(s: str) -> datetime.time: ... @overload def typecast_timestamp(s: Literal[""] | None) -> None: ... # type: ignore[overload-overlap] @overload def typecast_timestamp(s: str) -> datetime.datetime: ... def split_identifier(identifier: str) -> tuple[str, str]: ... def truncate_name(identifier: str, length: int | None = None, hash_len: int = 4) -> str: ... def names_digest(*args: str, length: int) -> str: ... def format_number(value: Decimal | None, max_digits: int | None, decimal_places: int | None) -> str | None: ... def strip_quotes(table_name: str) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/000077500000000000000000000000001526064357400242065ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/__init__.pyi000066400000000000000000000002141526064357400264650ustar00rootroot00000000000000from .migration import Migration as Migration from .migration import swappable_dependency as swappable_dependency from .operations import * typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/autodetector.pyi000066400000000000000000000074771526064357400274520ustar00rootroot00000000000000from collections.abc import Callable, Iterable from enum import Enum from typing import Any, Self from django.db.migrations.graph import MigrationGraph from django.db.migrations.migration import Migration from django.db.migrations.operations.base import Operation from django.db.migrations.questioner import MigrationQuestioner from django.db.migrations.state import ProjectState from django.db.models.fields import Field from django.utils.functional import cached_property class OperationDependency(tuple[str, str, str | None, OperationDependency.Type]): class Type(Enum): CREATE = 0 REMOVE = 1 ALTER = 2 REMOVE_ORDER_WRT = 3 ALTER_FOO_TOGETHER = 4 REMOVE_INDEX_OR_CONSTRAINT = 5 app_label: str model_name: str field_name: str | None type: Type def __new__(_cls, app_label: str, model_name: str, field_name: str | None, type: Type) -> Self: ... @cached_property def model_name_lower(self) -> str: ... @cached_property def field_name_lower(self) -> str: ... class MigrationAutodetector: from_state: ProjectState to_state: ProjectState questioner: MigrationQuestioner existing_apps: set[Any] def __init__( self, from_state: ProjectState, to_state: ProjectState, questioner: MigrationQuestioner | None = None ) -> None: ... def changes( self, graph: MigrationGraph, trim_to_apps: set[str] | None = None, convert_apps: set[str] | None = None, migration_name: str | None = None, ) -> dict[str, list[Migration]]: ... def deep_deconstruct(self, obj: Any) -> Any: ... def only_relation_agnostic_fields( self, fields: dict[str, Field[Any, Any]] ) -> list[tuple[str, list[Any], dict[str, Callable[..., Any] | int | str]]]: ... def check_dependency(self, operation: Operation, dependency: tuple[str, str, str | None, bool | str]) -> bool: ... def add_operation( self, app_label: str, operation: Operation, dependencies: Iterable[tuple[str, str, str | None, bool | str]] | None = None, beginning: bool = False, ) -> None: ... def swappable_first_key(self, item: tuple[str, str]) -> tuple[str, str]: ... renamed_models: Any renamed_models_rel: Any def generate_renamed_models(self) -> None: ... def generate_created_models(self) -> None: ... def generate_created_proxies(self) -> None: ... def generate_deleted_models(self) -> None: ... def generate_deleted_proxies(self) -> None: ... def create_renamed_fields(self) -> None: ... renamed_fields: Any def generate_renamed_fields(self) -> None: ... def generate_added_fields(self) -> None: ... def generate_removed_fields(self) -> None: ... def generate_altered_fields(self) -> None: ... def create_altered_indexes(self) -> None: ... def generate_added_indexes(self) -> None: ... def generate_removed_indexes(self) -> None: ... def generate_renamed_indexes(self) -> None: ... def create_altered_constraints(self) -> None: ... def generate_added_constraints(self) -> None: ... def generate_removed_constraints(self) -> None: ... def generate_altered_constraints(self) -> None: ... def generate_removed_altered_unique_together(self) -> None: ... def generate_altered_unique_together(self) -> None: ... def generate_altered_db_table(self) -> None: ... def generate_altered_db_table_comment(self) -> None: ... def generate_altered_options(self) -> None: ... def generate_altered_order_with_respect_to(self) -> None: ... def generate_altered_managers(self) -> None: ... def arrange_for_graph( self, changes: dict[str, list[Migration]], graph: MigrationGraph, migration_name: str | None = None ) -> dict[str, list[Migration]]: ... @classmethod def parse_number(cls, name: str) -> int: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/exceptions.pyi000066400000000000000000000012311526064357400271070ustar00rootroot00000000000000from django.db.migrations.migration import Migration from django.db.utils import DatabaseError class AmbiguityError(Exception): ... class BadMigrationError(Exception): ... class CircularDependencyError(Exception): ... class InconsistentMigrationHistory(Exception): ... class InvalidBasesError(ValueError): ... class IrreversibleError(RuntimeError): ... class NodeNotFoundError(LookupError): message: str origin: Migration | None node: tuple[str, str] def __init__(self, message: str, node: tuple[str, str], origin: Migration | None = None) -> None: ... class MigrationSchemaMissing(DatabaseError): ... class InvalidMigrationPlan(ValueError): ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/executor.pyi000066400000000000000000000034241526064357400265720ustar00rootroot00000000000000from collections.abc import Sequence from typing import Protocol, type_check_only from django.db.backends.base.base import BaseDatabaseWrapper from django.db.migrations.migration import Migration from .loader import MigrationLoader from .recorder import MigrationRecorder from .state import ProjectState @type_check_only class _ProgressCallbackT(Protocol): def __call__(self, action: str, migration: Migration | None = ..., fake: bool | None = ..., /) -> None: ... class MigrationExecutor: connection: BaseDatabaseWrapper loader: MigrationLoader recorder: MigrationRecorder progress_callback: _ProgressCallbackT | None def __init__( self, connection: BaseDatabaseWrapper | None, progress_callback: _ProgressCallbackT | None = None, ) -> None: ... def migration_plan( self, targets: Sequence[tuple[str, str | None]] | set[tuple[str, str]], clean_start: bool = False ) -> list[tuple[Migration, bool]]: ... def migrate( self, targets: Sequence[tuple[str, str | None]] | None, plan: Sequence[tuple[Migration, bool]] | None = None, state: ProjectState | None = None, fake: bool = False, fake_initial: bool = False, ) -> ProjectState: ... def apply_migration( self, state: ProjectState, migration: Migration, fake: bool = False, fake_initial: bool = False ) -> ProjectState: ... def record_migration(self, app_label: str, name: str, forward: bool = True) -> None: ... def unapply_migration(self, state: ProjectState, migration: Migration, fake: bool = False) -> ProjectState: ... def check_replacements(self) -> None: ... def detect_soft_applied( self, project_state: ProjectState | None, migration: Migration ) -> tuple[bool, ProjectState]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/graph.pyi000066400000000000000000000051121526064357400260310ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any from django.db.migrations.migration import Migration from django.db.migrations.state import ProjectState from typing_extensions import override class Node: key: tuple[str, str] children: set[Any] parents: set[Any] def __init__(self, key: tuple[str, str]) -> None: ... @override def __eq__(self, other: object) -> bool: ... def __lt__(self, other: tuple[str, str] | Node) -> bool: ... def __le__(self, other: tuple[str, str] | Node) -> bool: ... def __gt__(self, other: tuple[str, str] | Node) -> bool: ... def __ge__(self, other: tuple[str, str] | Node) -> bool: ... @override def __hash__(self) -> int: ... def __getitem__(self, item: int) -> str: ... def add_child(self, child: Node) -> None: ... def add_parent(self, parent: Node) -> None: ... class DummyNode(Node): origin: Any error_message: Any def __init__(self, key: tuple[str, str], origin: Migration | str, error_message: str) -> None: ... def raise_error(self) -> None: ... class MigrationGraph: node_map: dict[tuple[str, str], Node] nodes: dict[tuple[str, str], Migration | None] def __init__(self) -> None: ... def add_node(self, key: tuple[str, str], migration: Migration | None) -> None: ... def add_dummy_node(self, key: tuple[str, str], origin: Migration | str, error_message: str) -> None: ... def add_dependency( self, migration: Migration | str | None, child: tuple[str, str], parent: tuple[str, str], skip_validation: bool = False, ) -> None: ... def remove_replaced_nodes(self, replacement: tuple[str, str], replaced: list[tuple[str, str]]) -> None: ... def remove_replacement_node(self, replacement: tuple[str, str], replaced: list[tuple[str, str]]) -> None: ... def validate_consistency(self) -> None: ... def forwards_plan(self, target: tuple[str, str]) -> list[tuple[str, str]]: ... def backwards_plan(self, target: tuple[str, str]) -> list[tuple[str, str]]: ... def iterative_dfs(self, start: Any, forwards: bool = True) -> list[tuple[str, str]]: ... def root_nodes(self, app: str | None = None) -> list[tuple[str, str]]: ... def leaf_nodes(self, app: str | None = None) -> list[tuple[str, str]]: ... def ensure_not_cyclic(self) -> None: ... def make_state( self, nodes: tuple[str, str] | Sequence[tuple[str, str]] | None = None, at_end: bool = True, real_apps: list[str] | None = None, ) -> ProjectState: ... def __contains__(self, node: tuple[str, str]) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/loader.pyi000066400000000000000000000044541526064357400262060ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.db.migrations.migration import Migration from django.db.migrations.state import ProjectState from .exceptions import AmbiguityError as AmbiguityError from .exceptions import BadMigrationError as BadMigrationError from .exceptions import InconsistentMigrationHistory as InconsistentMigrationHistory from .exceptions import NodeNotFoundError as NodeNotFoundError MIGRATIONS_MODULE_NAME: str class MigrationLoader: connection: BaseDatabaseWrapper | None disk_migrations: dict[tuple[str, str], Migration] applied_migrations: dict[tuple[str, str], Migration] ignore_no_migrations: bool def __init__( self, connection: BaseDatabaseWrapper | None, load: bool = True, ignore_no_migrations: bool = False, replace_migrations: bool = True, ) -> None: ... @classmethod def migrations_module(cls, app_label: str) -> tuple[str | None, bool]: ... unmigrated_apps: set[str] migrated_apps: set[str] def load_disk(self) -> None: ... def get_migration(self, app_label: str, name_prefix: str) -> Migration: ... def get_migration_by_prefix(self, app_label: str, name_prefix: str) -> Migration: ... def check_key(self, key: tuple[str, str], current_app: str) -> tuple[str, str] | None: ... def add_internal_dependencies(self, key: tuple[str, str], migration: Migration) -> None: ... def add_external_dependencies(self, key: tuple[str, str], migration: Migration) -> None: ... graph: Any replacements: dict[tuple[str, str], Migration] replacements_progress: dict[tuple[str, str], bool] def replace_migration(self, migration_key: tuple[str, str]) -> None: ... def build_graph(self) -> None: ... def check_consistent_history(self, connection: BaseDatabaseWrapper) -> None: ... def all_replaced_applied( self, migration_key: tuple[str, str], applied: dict[tuple[str, str], Migration] ) -> bool: ... def detect_conflicts(self) -> dict[str, list[str]]: ... def project_state( self, nodes: tuple[str, str] | Sequence[tuple[str, str]] | None = None, at_end: bool = True ) -> ProjectState: ... def collect_sql(self, plan: Sequence[tuple[Migration, bool]]) -> list[str]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/migration.pyi000066400000000000000000000023601526064357400267230ustar00rootroot00000000000000from collections.abc import Sequence from typing import ClassVar, Self from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.migrations.operations.base import Operation from django.db.migrations.state import ProjectState class Migration: operations: ClassVar[Sequence[Operation]] dependencies: ClassVar[Sequence[tuple[str, str]]] run_before: ClassVar[Sequence[tuple[str, str]]] replaces: ClassVar[Sequence[tuple[str, str]]] initial: ClassVar[bool | None] atomic: ClassVar[bool] name: str app_label: str def __init__(self, name: str, app_label: str) -> None: ... def mutate_state(self, project_state: ProjectState, preserve: bool = True) -> ProjectState: ... def apply( self, project_state: ProjectState, schema_editor: BaseDatabaseSchemaEditor, collect_sql: bool = False ) -> ProjectState: ... def unapply( self, project_state: ProjectState, schema_editor: BaseDatabaseSchemaEditor, collect_sql: bool = False ) -> ProjectState: ... def suggest_name(self) -> str: ... class SwappableTuple(tuple[str, str]): setting: str def __new__(cls, value: tuple[str, str], setting: str) -> Self: ... def swappable_dependency(value: str) -> SwappableTuple: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/operations/000077500000000000000000000000001526064357400263715ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/operations/__init__.pyi000066400000000000000000000033031526064357400306520ustar00rootroot00000000000000from .fields import AddField as AddField from .fields import AlterField as AlterField from .fields import RemoveField as RemoveField from .fields import RenameField as RenameField from .models import AddConstraint as AddConstraint from .models import AddIndex as AddIndex from .models import AlterConstraint as AlterConstraint from .models import AlterIndexTogether as AlterIndexTogether from .models import AlterModelManagers as AlterModelManagers from .models import AlterModelOptions as AlterModelOptions from .models import AlterModelTable as AlterModelTable from .models import AlterModelTableComment as AlterModelTableComment from .models import AlterOrderWithRespectTo as AlterOrderWithRespectTo from .models import AlterUniqueTogether as AlterUniqueTogether from .models import CreateModel as CreateModel from .models import DeleteModel as DeleteModel from .models import RemoveConstraint as RemoveConstraint from .models import RemoveIndex as RemoveIndex from .models import RenameIndex as RenameIndex from .models import RenameModel as RenameModel from .special import RunPython as RunPython from .special import RunSQL as RunSQL from .special import SeparateDatabaseAndState as SeparateDatabaseAndState __all__ = [ "AddConstraint", "AddField", "AddIndex", "AlterConstraint", "AlterField", "AlterIndexTogether", "AlterModelManagers", "AlterModelOptions", "AlterModelTable", "AlterModelTableComment", "AlterOrderWithRespectTo", "AlterUniqueTogether", "CreateModel", "DeleteModel", "RemoveConstraint", "RemoveField", "RemoveIndex", "RenameField", "RenameIndex", "RenameModel", "RunPython", "RunSQL", "SeparateDatabaseAndState", ] typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/operations/base.pyi000066400000000000000000000034251526064357400300320ustar00rootroot00000000000000from collections.abc import Sequence from enum import StrEnum from typing import Any, ClassVar, Self from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.migrations.state import ProjectState from django.db.models import Model class OperationCategory(StrEnum): ADDITION = "+" REMOVAL = "-" ALTERATION = "~" PYTHON = "p" SQL = "s" MIXED = "?" class Operation: reversible: ClassVar[bool] reduces_to_sql: ClassVar[bool] atomic: ClassVar[bool] elidable: ClassVar[bool] serialization_expand_args: ClassVar[list[str]] category: ClassVar[OperationCategory | None] def __new__(cls, *args: Any, **kwargs: Any) -> Self: ... def deconstruct(self) -> tuple[str, Sequence[Any], dict[str, Any]]: ... def state_forwards(self, app_label: str, state: ProjectState) -> None: ... def database_forwards( self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: ProjectState, to_state: ProjectState ) -> None: ... def database_backwards( self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: ProjectState, to_state: ProjectState ) -> None: ... def describe(self) -> str: ... def formatted_description(self) -> str: ... @property def migration_name_fragment(self) -> str: ... def references_model(self, name: str, app_label: str) -> bool: ... def references_field(self, model_name: str, name: str, app_label: str) -> bool: ... def allow_migrate_model(self, connection_alias: BaseDatabaseWrapper | str, model: type[Model]) -> bool: ... def reduce(self, operation: Operation, app_label: str) -> bool | list[Operation]: ... def __replace__(self, /, **changes: Any) -> Self: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/operations/fields.pyi000066400000000000000000000024601526064357400303640ustar00rootroot00000000000000from typing import Any from django.db.models.fields import Field from django.utils.functional import cached_property from .base import Operation class FieldOperation(Operation): model_name: str name: str def __init__(self, model_name: str, name: str, field: Field[Any, Any] | None = None) -> None: ... @cached_property def name_lower(self) -> str: ... @cached_property def model_name_lower(self) -> str: ... def is_same_model_operation(self, operation: FieldOperation) -> bool: ... def is_same_field_operation(self, operation: FieldOperation) -> bool: ... class AddField(FieldOperation): field: Field[Any, Any] preserve_default: bool def __init__(self, model_name: str, name: str, field: Field[Any, Any], preserve_default: bool = True) -> None: ... class RemoveField(FieldOperation): ... class AlterField(FieldOperation): field: Field[Any, Any] preserve_default: bool def __init__(self, model_name: str, name: str, field: Field[Any, Any], preserve_default: bool = True) -> None: ... class RenameField(FieldOperation): old_name: str new_name: str def __init__(self, model_name: str, old_name: str, new_name: str) -> None: ... @cached_property def old_name_lower(self) -> str: ... @cached_property def new_name_lower(self) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/operations/models.pyi000066400000000000000000000131321526064357400303770ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.migrations.operations.base import Operation from django.db.models.base import Model from django.db.models.constraints import BaseConstraint from django.db.models.fields import Field from django.db.models.indexes import Index from django.db.models.manager import Manager from django.db.models.options import _OptionTogetherT from django.utils.functional import cached_property from typing_extensions import override class ModelOperation(Operation): name: str def __init__(self, name: str) -> None: ... @cached_property def name_lower(self) -> str: ... def can_reduce_through(self, operation: Operation, app_label: str) -> bool: ... class CreateModel(ModelOperation): fields: list[tuple[str, Field[Any, Any]]] options: dict[str, Any] bases: Sequence[type[Model] | str] | None managers: Sequence[tuple[str, Manager[Any]]] | None def __init__( self, name: str, fields: list[tuple[str, Field[Any, Any]]], options: dict[str, Any] | None = None, bases: Sequence[type[Any] | str] | None = None, managers: Sequence[tuple[str, Manager[Any]]] | None = None, ) -> None: ... class DeleteModel(ModelOperation): ... class RenameModel(ModelOperation): old_name: str new_name: str def __init__(self, old_name: str, new_name: str) -> None: ... @cached_property def old_name_lower(self) -> str: ... @cached_property def new_name_lower(self) -> str: ... class ModelOptionOperation(ModelOperation): ... class AlterModelTable(ModelOptionOperation): table: str | None def __init__(self, name: str, table: str | None) -> None: ... class AlterModelTableComment(ModelOptionOperation): table_comment: str def __init__(self, name: str, table_comment: str) -> None: ... @override def state_forwards(self, app_label: str, state: Any) -> None: ... @override def database_forwards( self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: Any, to_state: Any ) -> None: ... @override def database_backwards( self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: Any, to_state: Any ) -> None: ... @override def describe(self) -> str: ... @property @override def migration_name_fragment(self) -> str: ... class AlterTogetherOptionOperation(ModelOptionOperation): option_name: str def __init__( self, name: str, option_value: _OptionTogetherT | None, ) -> None: ... @cached_property def option_value(self) -> set[tuple[str, ...]] | None: ... @override def state_forwards(self, app_label: str, state: Any) -> None: ... @override def database_forwards( self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: Any, to_state: Any ) -> None: ... @override def database_backwards( self, app_label: str, schema_editor: BaseDatabaseSchemaEditor, from_state: Any, to_state: Any ) -> None: ... @override def references_field(self, model_name: str, name: str, app_label: str) -> bool: ... @override def describe(self) -> str: ... @property @override def migration_name_fragment(self) -> str: ... class AlterUniqueTogether(AlterTogetherOptionOperation): option_name: str unique_together: set[tuple[str, ...]] | None def __init__(self, name: str, unique_together: _OptionTogetherT | None) -> None: ... class AlterIndexTogether(AlterTogetherOptionOperation): option_name: str index_together: set[tuple[str, ...]] | None def __init__(self, name: str, index_together: _OptionTogetherT | None) -> None: ... class AlterOrderWithRespectTo(ModelOptionOperation): option_name: str order_with_respect_to: str | None def __init__(self, name: str, order_with_respect_to: str | None) -> None: ... class AlterModelOptions(ModelOptionOperation): ALTER_OPTION_KEYS: list[str] options: dict[str, Any] def __init__(self, name: str, options: dict[str, Any]) -> None: ... class AlterModelManagers(ModelOptionOperation): managers: Sequence[tuple[str, Manager[Any]]] def __init__(self, name: str, managers: Sequence[tuple[str, Manager[Any]]]) -> None: ... class IndexOperation(Operation): option_name: str @cached_property def model_name_lower(self) -> str: ... class AddIndex(IndexOperation): model_name: str index: Index def __init__(self, model_name: str, index: Index) -> None: ... class RemoveIndex(IndexOperation): model_name: str name: str def __init__(self, model_name: str, name: str) -> None: ... class RenameIndex(IndexOperation): model_name: str new_name: str old_name: str | None old_fields: Sequence[str] | None def __init__( self, model_name: str, new_name: str, old_name: str | None = None, old_fields: Sequence[str] | None = None, ) -> None: ... @cached_property def old_name_lower(self) -> str: ... @cached_property def new_name_lower(self) -> str: ... class AddConstraint(IndexOperation): model_name: str constraint: BaseConstraint def __init__(self, model_name: str, constraint: BaseConstraint) -> None: ... class RemoveConstraint(IndexOperation): model_name: str name: str def __init__(self, model_name: str, name: str) -> None: ... class AlterConstraint(IndexOperation): model_name: str name: str constraint: BaseConstraint def __init__(self, model_name: str, name: str, constraint: BaseConstraint) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/operations/special.pyi000066400000000000000000000037601526064357400305420ustar00rootroot00000000000000from collections.abc import Mapping, Sequence from typing import Any, Literal, Protocol, TypeAlias, type_check_only from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.migrations.state import StateApps from django.utils.datastructures import _ListOrTuple from typing_extensions import override from .base import Operation _SqlOperations: TypeAlias = str | _ListOrTuple[str | tuple[str, dict[str, Any] | _ListOrTuple[Any] | None]] class SeparateDatabaseAndState(Operation): database_operations: Sequence[Operation] state_operations: Sequence[Operation] def __init__( self, database_operations: Sequence[Operation] | None = None, state_operations: Sequence[Operation] | None = None, ) -> None: ... class RunSQL(Operation): noop: Literal[""] sql: _SqlOperations reverse_sql: _SqlOperations | None state_operations: Sequence[Operation] hints: Mapping[str, Any] def __init__( self, sql: _SqlOperations, reverse_sql: _SqlOperations | None = None, state_operations: Sequence[Operation] | None = None, hints: Mapping[str, Any] | None = None, elidable: bool = False, ) -> None: ... @property @override def reversible(self) -> bool: ... # type: ignore[override] @type_check_only class _CodeCallable(Protocol): def __call__(self, state_apps: StateApps, schema_editor: BaseDatabaseSchemaEditor, /) -> None: ... class RunPython(Operation): code: _CodeCallable reverse_code: _CodeCallable | None hints: Mapping[str, Any] def __init__( self, code: _CodeCallable, reverse_code: _CodeCallable | None = None, atomic: bool | None = None, hints: Mapping[str, Any] | None = None, elidable: bool = False, ) -> None: ... @staticmethod def noop(apps: StateApps, schema_editor: BaseDatabaseSchemaEditor) -> None: ... @property @override def reversible(self) -> bool: ... # type: ignore[override] typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/optimizer.pyi000066400000000000000000000004421526064357400267530ustar00rootroot00000000000000from django.db.migrations.operations.base import Operation class MigrationOptimizer: def optimize(self, operations: list[Operation], app_label: str | None) -> list[Operation]: ... def optimize_inner(self, operations: list[Operation], app_label: str | None) -> list[Operation]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/questioner.pyi000066400000000000000000000037061526064357400271350ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from django.core.management.base import OutputWrapper from django.db.migrations.state import ModelState from django.db.models.fields import Field class MigrationQuestioner: defaults: dict[str, Any] specified_apps: set[str] dry_run: bool | None def __init__( self, defaults: dict[str, bool] | None = None, specified_apps: set[str] | None = None, dry_run: bool | None = None, ) -> None: ... def ask_initial(self, app_label: str) -> bool: ... def ask_not_null_addition(self, field_name: str, model_name: str) -> Any: ... def ask_not_null_alteration(self, field_name: Any, model_name: Any) -> Any: ... def ask_rename(self, model_name: str, old_name: str, new_name: str, field_instance: Field[Any, Any]) -> bool: ... def ask_rename_model(self, old_model_state: ModelState, new_model_state: ModelState) -> bool: ... def ask_merge(self, app_label: str) -> bool: ... def ask_auto_now_add_addition(self, field_name: str, model_name: str) -> Any: ... def ask_unique_callable_default_addition(self, field_name: str, model_name: str) -> None: ... class InteractiveMigrationQuestioner(MigrationQuestioner): prompt_output: OutputWrapper def __init__( self, defaults: dict[str, bool] | None = None, specified_apps: set[str] | None = None, dry_run: bool | None = None, prompt_output: OutputWrapper | None = None, ) -> None: ... class NonInteractiveMigrationQuestioner(MigrationQuestioner): verbosity: int log: Callable[[str], None] | None def __init__( self, defaults: dict[str, bool] | None = None, specified_apps: set[str] | None = None, dry_run: bool | None = None, verbosity: int = 1, log: Callable[[str], None] | None = None, ) -> None: ... def log_lack_of_migration(self, field_name: str, model_name: str, reason: str) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/recorder.pyi000066400000000000000000000015451526064357400265430ustar00rootroot00000000000000from typing import Any, ClassVar, Self from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.base import Model from django.db.models.manager import Manager from django.db.models.query import QuerySet class MigrationRecorder: class Migration(Model): app: Any name: Any applied: Any objects: ClassVar[Manager[Self]] connection: BaseDatabaseWrapper def __init__(self, connection: BaseDatabaseWrapper) -> None: ... @property def migration_qs(self) -> QuerySet[Migration]: ... def has_table(self) -> bool: ... def ensure_schema(self) -> None: ... def applied_migrations(self) -> dict[tuple[str, str], Migration]: ... def record_applied(self, app: str, name: str) -> None: ... def record_unapplied(self, app: str, name: str) -> None: ... def flush(self) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/serializer.pyi000066400000000000000000000041571526064357400271110ustar00rootroot00000000000000from collections.abc import Callable from typing import Any FUNCTION_TYPES: tuple[type, ...] class BaseSerializer: value: Any def __init__(self, value: Any) -> None: ... def serialize(self) -> tuple[str, set[str]]: ... class BaseSequenceSerializer(BaseSerializer): ... class BaseUnorderedSequenceSerializer(BaseSequenceSerializer): ... class BaseSimpleSerializer(BaseSerializer): ... class DateTimeSerializer(BaseSerializer): ... class DatetimeDatetimeSerializer(BaseSerializer): ... class DecimalSerializer(BaseSerializer): ... class ChoicesSerializer(BaseSerializer): ... class DatabaseOnDeleteSerializer(BaseSerializer): ... class DeconstructibleSerializer(BaseSerializer): @staticmethod def serialize_deconstructed( path: str, args: list[Any], kwargs: dict[str, Callable[..., Any] | int | str] ) -> tuple[str, set[str]]: ... class DictionarySerializer(BaseSerializer): ... class EnumSerializer(BaseSerializer): ... class FloatSerializer(BaseSimpleSerializer): ... class FrozensetSerializer(BaseUnorderedSequenceSerializer): ... class FunctionTypeSerializer(BaseSerializer): ... class FunctoolsPartialSerializer(BaseSerializer): ... class GenericAliasSerializer(BaseSerializer): ... class IterableSerializer(BaseSerializer): ... class ModelFieldSerializer(DeconstructibleSerializer): ... class ModelManagerSerializer(DeconstructibleSerializer): ... class OperationSerializer(BaseSerializer): ... class PathLikeSerializer(BaseSerializer): ... class PathSerializer(BaseSerializer): ... class RegexSerializer(BaseSerializer): ... class SequenceSerializer(BaseSequenceSerializer): ... class SetSerializer(BaseUnorderedSequenceSerializer): ... class SettingsReferenceSerializer(BaseSerializer): ... class TupleSerializer(BaseSequenceSerializer): ... class TypeSerializer(BaseSerializer): ... class UUIDSerializer(BaseSerializer): ... class ZoneInfoSerializer(BaseSerializer): ... def serializer_factory(value: Any) -> BaseSerializer: ... class Serializer: @classmethod def register(cls, type_: type, serializer: type[BaseSerializer]) -> None: ... @classmethod def unregister(cls, type_: type) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/state.pyi000066400000000000000000000122561526064357400260570ustar00rootroot00000000000000from collections.abc import Iterable, Iterator, Sequence from contextlib import AbstractContextManager from typing import Any from django.apps import AppConfig from django.apps.registry import Apps from django.db.models.base import Model from django.db.models.fields import Field from django.db.models.manager import Manager from django.utils.functional import cached_property from typing_extensions import override class AppConfigStub(AppConfig): def __init__(self, label: str) -> None: ... class ModelState: name: str app_label: str fields: dict[str, Field[Any, Any]] options: dict[str, Any] bases: Sequence[type[Model] | str] managers: list[tuple[str, Manager[Any]]] def __init__( self, app_label: str, name: str, fields: list[tuple[str, Field[Any, Any]]] | dict[str, Field[Any, Any]], options: dict[str, Any] | None = None, bases: Sequence[type[Model] | str] | None = None, managers: list[tuple[str, Manager[Any]]] | None = None, ) -> None: ... def clone(self) -> ModelState: ... def construct_managers(self) -> Iterator[tuple[str, Manager[Any]]]: ... @classmethod def from_model(cls, model: type[Model], exclude_rels: bool = False) -> ModelState: ... def get_field(self, field_name: str) -> Field[Any, Any]: ... @cached_property def name_lower(self) -> str: ... def render(self, apps: Apps) -> Any: ... def get_index_by_name(self, name: str) -> Any: ... def get_constraint_by_name(self, name: str) -> Any: ... @override def __eq__(self, other: object) -> bool: ... def get_related_models_tuples(model: type[Model]) -> set[tuple[str, str]]: ... def get_related_models_recursive(model: type[Model]) -> set[tuple[str, str]]: ... class ProjectState: is_delayed: bool models: dict[Any, Any] real_apps: set[str] def __init__( self, models: dict[tuple[str, str], ModelState] | None = None, real_apps: set[str] | None = None ) -> None: ... @property def relations(self) -> Any: ... def add_model(self, model_state: ModelState) -> None: ... @cached_property def apps(self) -> StateApps: ... def clear_delayed_apps_cache(self) -> None: ... def clone(self) -> ProjectState: ... @classmethod def from_apps(cls, apps: Apps) -> ProjectState: ... def reload_model(self, app_label: str, model_name: str, delay: bool = False) -> None: ... def reload_models(self, models: list[Any], delay: bool = True) -> None: ... def remove_model(self, app_label: str, model_name: str) -> None: ... def rename_model(self, app_label: str, old_name: str, new_name: str) -> None: ... def alter_model_options( self, app_label: str, model_name: str, options: dict[str, Any], option_keys: Iterable[str] | None = None ) -> None: ... def remove_model_options(self, app_label: str, model_name: str, option_name: str, value_to_remove: Any) -> None: ... def alter_model_managers( self, app_label: str, model_name: str, managers: list[tuple[str, Manager[Any]]] ) -> None: ... def add_index(self, app_label: str, model_name: str, index: Any) -> None: ... def remove_index(self, app_label: str, model_name: str, index_name: str) -> None: ... def rename_index(self, app_label: str, model_name: str, old_index_name: str, new_index_name: str) -> None: ... def add_constraint(self, app_label: str, model_name: str, constraint: Any) -> None: ... def remove_constraint(self, app_label: str, model_name: str, constraint_name: str) -> None: ... def alter_constraint(self, app_label: str, model_name: str, constraint_name: str, constraint: Any) -> None: ... def add_field( self, app_label: str, model_name: str, name: str, field: Field[Any, Any], preserve_default: Any ) -> None: ... def remove_field(self, app_label: str, model_name: str, name: str) -> None: ... def alter_field( self, app_label: str, model_name: str, name: str, field: Field[Any, Any], preserve_default: Any ) -> None: ... def rename_field(self, app_label: str, model_name: str, old_name: str, new_name: str) -> None: ... def update_model_field_relation( self, model: type[Model], model_key: tuple[str, str], field_name: str, field: Field[Any, Any], concretes: Any ) -> None: ... def resolve_model_field_relations( self, model_key: tuple[str, str], field_name: str, field: Field[Any, Any], concretes: Any | None = None ) -> None: ... def resolve_model_relations(self, model_key: tuple[str, str], concretes: Any | None = None) -> None: ... def resolve_fields_and_relations(self) -> None: ... def get_concrete_model_key(self, model: type[Model]) -> Any: ... class StateApps(Apps): real_models: list[ModelState] def __init__( self, real_apps: list[str], models: dict[tuple[str, str], ModelState], ignore_swappable: bool = False ) -> None: ... def bulk_update(self) -> AbstractContextManager[None]: ... def clone(self) -> StateApps: ... def render_multiple(self, model_states: list[ModelState]) -> None: ... @override def register_model(self, app_label: str, model: type[Model]) -> None: ... def unregister_model(self, app_label: str, model_name: str) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/utils.pyi000066400000000000000000000023051526064357400260710ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any, Literal, NamedTuple from django.db.migrations.state import ModelState, ProjectState from django.db.models import Field, Model COMPILED_REGEX_TYPE: Any RECURSIVE_RELATIONSHIP_CONSTANT: str class RegexObject: pattern: str flags: int def __init__(self, obj: Any) -> None: ... def get_migration_name_timestamp() -> str: ... def resolve_relation( model: str | type[Model], app_label: str | None = None, model_name: str | None = None ) -> tuple[str, str]: ... class FieldReference(NamedTuple): to: Any through: Any def field_references( model_tuple: tuple[str, str], field: Field[Any, Any], reference_model_tuple: tuple[str, str], reference_field_name: str | None = None, reference_field: Field[Any, Any] | None = None, ) -> Literal[False] | FieldReference: ... def get_references( state: ProjectState, model_tuple: tuple[str, str], field_tuple: tuple[()] | tuple[str, Field[Any, Any]] = (), ) -> Iterator[tuple[ModelState, str, Field[Any, Any], FieldReference]]: ... def field_is_referenced( state: ProjectState, model_tuple: tuple[str, str], field_tuple: tuple[str, Field[Any, Any]] ) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/db/migrations/writer.pyi000066400000000000000000000023221526064357400262440ustar00rootroot00000000000000from typing import Any from django.db.migrations.migration import Migration from django.db.migrations.operations.base import Operation from django.db.migrations.serializer import BaseSerializer class OperationWriter: operation: Operation buff: list[Any] indentation: int def __init__(self, operation: Operation, indentation: int = 2) -> None: ... def serialize(self) -> tuple[str, set[str]]: ... def indent(self) -> None: ... def unindent(self) -> None: ... def feed(self, line: str) -> None: ... def render(self) -> str: ... class MigrationWriter: migration: Migration needs_manual_porting: bool def __init__(self, migration: Migration, include_header: bool = True) -> None: ... def as_string(self) -> str: ... @property def basedir(self) -> str: ... @property def filename(self) -> str: ... @property def path(self) -> str: ... @classmethod def serialize(cls, value: Any) -> tuple[str, set[str]]: ... @classmethod def register_serializer(cls, type_: type, serializer: type[BaseSerializer]) -> None: ... @classmethod def unregister_serializer(cls, type_: type) -> None: ... MIGRATION_HEADER_TEMPLATE: str MIGRATION_TEMPLATE: str typeddjango-django-stubs-fa03b48/django-stubs/db/models/000077500000000000000000000000001526064357400233155ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/models/__init__.pyi000066400000000000000000000171171526064357400256060ustar00rootroot00000000000000from django.core.exceptions import ObjectDoesNotExist as ObjectDoesNotExist from . import lookups as lookups from . import signals as signals from .aggregates import Aggregate as Aggregate from .aggregates import AnyValue as AnyValue from .aggregates import Avg as Avg from .aggregates import BitAnd as BitAnd from .aggregates import BitOr as BitOr from .aggregates import BitXor as BitXor from .aggregates import Count as Count from .aggregates import Max as Max from .aggregates import Min as Min from .aggregates import StdDev as StdDev from .aggregates import StringAgg as StringAgg from .aggregates import Sum as Sum from .aggregates import Variance as Variance from .base import DEFERRED as DEFERRED from .base import Model as Model from .constraints import BaseConstraint as BaseConstraint from .constraints import CheckConstraint as CheckConstraint from .constraints import Deferrable as Deferrable from .constraints import UniqueConstraint as UniqueConstraint from .deletion import CASCADE as CASCADE from .deletion import DB_CASCADE as DB_CASCADE from .deletion import DB_SET_DEFAULT as DB_SET_DEFAULT from .deletion import DB_SET_NULL as DB_SET_NULL from .deletion import DO_NOTHING as DO_NOTHING from .deletion import PROTECT as PROTECT from .deletion import RESTRICT as RESTRICT from .deletion import SET as SET from .deletion import SET_DEFAULT as SET_DEFAULT from .deletion import SET_NULL as SET_NULL from .deletion import ProtectedError as ProtectedError from .deletion import RestrictedError as RestrictedError from .enums import Choices as Choices from .enums import IntegerChoices as IntegerChoices from .enums import TextChoices as TextChoices from .expressions import Case as Case from .expressions import Exists as Exists from .expressions import Expression as Expression from .expressions import ExpressionList as ExpressionList from .expressions import ExpressionWrapper as ExpressionWrapper from .expressions import F as F from .expressions import Func as Func from .expressions import JSONNull as JSONNull from .expressions import OrderBy as OrderBy from .expressions import OuterRef as OuterRef from .expressions import RowRange as RowRange from .expressions import Subquery as Subquery from .expressions import Value as Value from .expressions import ValueRange as ValueRange from .expressions import When as When from .expressions import Window as Window from .expressions import WindowFrame as WindowFrame from .expressions import WindowFrameExclusion as WindowFrameExclusion from .fetch_modes import FETCH_ONE as FETCH_ONE from .fetch_modes import FETCH_PEERS as FETCH_PEERS from .fetch_modes import FETCH_RAISE as FETCH_RAISE from .fields import BLANK_CHOICE_DASH as BLANK_CHOICE_DASH from .fields import BLANK_CHOICE_LABEL as BLANK_CHOICE_LABEL from .fields import NOT_PROVIDED as NOT_PROVIDED from .fields import AutoField as AutoField from .fields import BigAutoField as BigAutoField from .fields import BigIntegerField as BigIntegerField from .fields import BinaryField as BinaryField from .fields import BooleanField as BooleanField from .fields import CharField as CharField from .fields import CommaSeparatedIntegerField as CommaSeparatedIntegerField from .fields import DateField as DateField from .fields import DateTimeField as DateTimeField from .fields import DecimalField as DecimalField from .fields import DurationField as DurationField from .fields import EmailField as EmailField from .fields import Empty as Empty from .fields import Field as Field from .fields import FilePathField as FilePathField from .fields import FloatField as FloatField from .fields import GenericIPAddressField as GenericIPAddressField from .fields import IntegerField as IntegerField from .fields import IPAddressField as IPAddressField from .fields import NullBooleanField as NullBooleanField from .fields import PositiveBigIntegerField as PositiveBigIntegerField from .fields import PositiveIntegerField as PositiveIntegerField from .fields import PositiveSmallIntegerField as PositiveSmallIntegerField from .fields import SlugField as SlugField from .fields import SmallAutoField as SmallAutoField from .fields import SmallIntegerField as SmallIntegerField from .fields import TextField as TextField from .fields import TimeField as TimeField from .fields import URLField as URLField from .fields import UUIDField as UUIDField from .fields.composite import CompositePrimaryKey from .fields.files import FileField as FileField from .fields.files import ImageField as ImageField from .fields.generated import GeneratedField as GeneratedField from .fields.json import JSONField as JSONField from .fields.proxy import OrderWrt as OrderWrt from .fields.related import ForeignKey as ForeignKey from .fields.related import ForeignObject as ForeignObject from .fields.related import ForeignObjectRel as ForeignObjectRel from .fields.related import ManyToManyField as ManyToManyField from .fields.related import ManyToManyRel as ManyToManyRel from .fields.related import ManyToOneRel as ManyToOneRel from .fields.related import OneToOneField as OneToOneField from .fields.related import OneToOneRel as OneToOneRel from .indexes import Index as Index from .lookups import Lookup as Lookup from .lookups import Transform as Transform from .manager import Manager as Manager from .query import Prefetch as Prefetch from .query import QuerySet as QuerySet from .query import aprefetch_related_objects as aprefetch_related_objects from .query import prefetch_related_objects as prefetch_related_objects from .query_utils import FilteredRelation as FilteredRelation from .query_utils import Q as Q __all__ = [ "BLANK_CHOICE_DASH", "BLANK_CHOICE_LABEL", "CASCADE", "DB_CASCADE", "DB_SET_DEFAULT", "DB_SET_NULL", "DEFERRED", "DO_NOTHING", "FETCH_ONE", "FETCH_PEERS", "FETCH_RAISE", "NOT_PROVIDED", "PROTECT", "RESTRICT", "SET", "SET_DEFAULT", "SET_NULL", "Aggregate", "AnyValue", "AutoField", "Avg", "BaseConstraint", "BigAutoField", "BigIntegerField", "BinaryField", "BitAnd", "BitOr", "BitXor", "BooleanField", "Case", "CharField", "CheckConstraint", "Choices", "CommaSeparatedIntegerField", "CompositePrimaryKey", "Count", "DateField", "DateTimeField", "DecimalField", "Deferrable", "DurationField", "EmailField", "Empty", "Exists", "Expression", "ExpressionList", "ExpressionWrapper", "F", "Field", "FileField", "FilePathField", "FilteredRelation", "FloatField", "ForeignKey", "ForeignObject", "ForeignObjectRel", "Func", "GeneratedField", "GenericIPAddressField", "IPAddressField", "ImageField", "Index", "IntegerChoices", "IntegerField", "JSONField", "JSONNull", "Lookup", "Manager", "ManyToManyField", "ManyToManyRel", "ManyToOneRel", "Max", "Min", "Model", "NullBooleanField", "ObjectDoesNotExist", "OneToOneField", "OneToOneRel", "OrderBy", "OrderWrt", "OuterRef", "PositiveBigIntegerField", "PositiveIntegerField", "PositiveSmallIntegerField", "Prefetch", "ProtectedError", "Q", "QuerySet", "RestrictedError", "RowRange", "SlugField", "SmallAutoField", "SmallIntegerField", "StdDev", "StringAgg", "Subquery", "Sum", "TextChoices", "TextField", "TimeField", "Transform", "URLField", "UUIDField", "UniqueConstraint", "Value", "ValueRange", "Variance", "When", "Window", "WindowFrame", "WindowFrameExclusion", "aprefetch_related_objects", "prefetch_related_objects", "signals", ] typeddjango-django-stubs-fa03b48/django-stubs/db/models/aggregates.pyi000066400000000000000000000072431526064357400261570ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any, ClassVar from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.expressions import BaseExpression, Combinable, Func from django.db.models.fields import IntegerField from django.db.models.functions.mixins import FixDurationInputMixin, NumericOutputFieldMixin from django.db.models.query import _OrderByFieldName from django.db.models.query_utils import Q from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override class Aggregate(Func): name: str | None filter: Any allow_distinct: bool allow_order_by: bool empty_result_set_value: int | None def __init__( self, *expressions: Any, distinct: bool = False, filter: Q | BaseExpression | None = None, default: Any | None = None, order_by: _OrderByFieldName | Sequence[_OrderByFieldName] | None = None, **extra: Any, ) -> None: ... @property def default_alias(self) -> str: ... @override def as_sql( # type: ignore[override] self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... class AnyValue(Aggregate): @override def as_sql( # type: ignore[override] self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... class Avg(FixDurationInputMixin, NumericOutputFieldMixin, Aggregate): ... class BitAggregate(Aggregate): def __init__(self, expression: Combinable | str, **extra: Any) -> None: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class BitAnd(BitAggregate): ... class BitOr(BitAggregate): ... class BitXor(BitAggregate): ... class Count(Aggregate): output_field: ClassVar[IntegerField[Any, Any]] def __init__( self, expression: Combinable | str, filter: Q | BaseExpression | None = None, *, distinct: bool = False, **extra: Any, ) -> None: ... class Max(Aggregate): ... class Min(Aggregate): ... class StdDev(NumericOutputFieldMixin, Aggregate): def __init__( self, expression: Combinable | str, sample: bool = False, *, filter: Q | BaseExpression | None = None, default: Any | None = None, **extra: Any, ) -> None: ... class StringAgg(Aggregate): def __init__( self, expression: Combinable | str, delimiter: str | Combinable, *, distinct: bool = False, filter: Q | BaseExpression | None = None, default: Any | None = None, order_by: _OrderByFieldName | Sequence[_OrderByFieldName] | None = None, **extra: Any, ) -> None: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... @override def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Sum(FixDurationInputMixin, Aggregate): ... class Variance(NumericOutputFieldMixin, Aggregate): def __init__( self, expression: Combinable | str, sample: bool = False, *, filter: Q | BaseExpression | None = None, default: Any | None = None, **extra: Any, ) -> None: ... __all__ = [ "Aggregate", "AnyValue", "Avg", "BitAnd", "BitOr", "BitXor", "Count", "Max", "Min", "StdDev", "StringAgg", "Sum", "Variance", ] typeddjango-django-stubs-fa03b48/django-stubs/db/models/base.pyi000066400000000000000000000155341526064357400247620ustar00rootroot00000000000000from collections.abc import Collection, Iterable, Sequence from typing import Any, ClassVar, Final, Literal, Self, overload from weakref import ReferenceType from django.core.checks.messages import CheckMessage from django.core.exceptions import MultipleObjectsReturned as BaseMultipleObjectsReturned from django.core.exceptions import ObjectDoesNotExist, ObjectNotUpdated, ValidationError from django.db.models import BaseConstraint, Field, QuerySet from django.db.models.fetch_modes import FetchMode from django.db.models.manager import Manager from django.db.models.options import Options from django.db.models.utils import AltersData from django.utils.datastructures import _ListOrTuple from typing_extensions import TypeVar, override _Self = TypeVar("_Self", bound=Model) class Deferred: ... DEFERRED: Deferred class ModelStateFieldsCacheDescriptor: @overload def __get__(self, instance: None, cls: type[ModelState] | None = None) -> Self: ... @overload def __get__(self, instance: ModelState, cls: type[ModelState] | None = None) -> dict[Any, Any]: ... class ModelStateFetchModeDescriptor: @overload def __get__(self, instance: None, cls: type[ModelState] | None = None) -> Self: ... @overload def __get__(self, instance: ModelState, cls: type[ModelState] | None = None) -> FetchMode: ... class ModelState: db: str | None adding: bool fields_cache: ModelStateFieldsCacheDescriptor fetch_mode: ModelStateFetchModeDescriptor peers: _ListOrTuple[ReferenceType[Model]] @override def __getstate__(self) -> dict[str, Any]: ... def __del__(self) -> None: ... class ModelBase(type): def __new__(cls, name: str, bases: tuple[type, ...], attrs: dict[str, Any], **kwargs: Any) -> ModelBase: ... def add_to_class(cls, name: str, value: Any) -> None: ... @property def _base_manager(cls: type[_Self]) -> Manager[_Self]: ... # type: ignore[misc] @property def _default_manager(cls: type[_Self]) -> Manager[_Self]: ... # type: ignore[misc] # Class level only access for the `objects` manager when it's not defined explicitly. # Because this acts as a fallback (matching django adding this manager if not defined), it resolves conflict # we previously had with pyright and pyrefly when overriding `objects`. # See https://github.com/typeddjango/django-stubs/pull/3559#issue-5057479304 def __getattr__(cls: type[_Self], name: Literal["objects"]) -> Manager[_Self]: ... class Model(AltersData, metaclass=ModelBase): # These attributes should only exist on concrete subclasses, not abstract models, and are # generated by the metaclass. To replicate this runtime behavior, the mypy plugin will delete # them, replacing them only on concrete subclasses. In the case of the exception subclasses, # the correct inheritance hierarchy including any concrete parents will also be reproduced. # Other type checkers will not understand the absence of these from abstract models, nor the # correct exception hierarchy unless they re-implement the plugin logic themselves. DoesNotExist: Final[type[ObjectDoesNotExist]] NotUpdated: Final[type[ObjectNotUpdated]] MultipleObjectsReturned: Final[type[BaseMultipleObjectsReturned]] _meta: ClassVar[Options[Self]] pk: Any _state: ModelState def __init__(self, *args: Any, **kwargs: Any) -> None: ... @classmethod def from_db( cls, db: str | None, field_names: Collection[str], values: Collection[Any], *, fetch_mode: FetchMode | None = None, ) -> Self: ... @override def __getstate__(self) -> dict[str, Any]: ... def _get_pk_val(self, meta: Options[Model] | None = None) -> str: ... def get_deferred_fields(self) -> set[str]: ... def refresh_from_db( self, using: str | None = None, fields: Iterable[str] | None = None, from_queryset: QuerySet[Self] | None = None, ) -> None: ... async def arefresh_from_db( self, using: str | None = None, fields: Iterable[str] | None = None, from_queryset: QuerySet[Self] | None = None, ) -> None: ... def serializable_value(self, field_name: str) -> Any: ... def save( self, *, force_insert: bool | tuple[ModelBase, ...] = False, force_update: bool = False, using: str | None = None, update_fields: Iterable[str] | None = None, ) -> None: ... async def asave( self, *, force_insert: bool | tuple[ModelBase, ...] = False, force_update: bool = False, using: str | None = None, update_fields: Iterable[str] | None = None, ) -> None: ... def save_base( self, raw: bool = False, force_insert: bool | tuple[ModelBase, ...] = False, force_update: bool = False, using: str | None = None, update_fields: Iterable[str] | None = None, ) -> None: ... def _do_update( self, base_qs: QuerySet[Self], using: str | None, pk_val: Any, values: Collection[tuple[Field[Any, Any], type[Model] | None, Any]], update_fields: Iterable[str] | None, forced_update: bool, returning_fields: Sequence[Field[Any, Any]], ) -> list[Sequence[Any]]: ... def delete(self, using: Any | None = None, keep_parents: bool = False) -> tuple[int, dict[str, int]]: ... async def adelete(self, using: Any | None = None, keep_parents: bool = False) -> tuple[int, dict[str, int]]: ... def prepare_database_save(self, field: Field[Any, Any]) -> Any: ... def clean(self) -> None: ... def validate_unique(self, exclude: Collection[str] | None = None) -> None: ... def date_error_message(self, lookup_type: str, field_name: str, unique_for: str) -> ValidationError: ... def unique_error_message(self, model_class: type[Model], unique_check: Sequence[str]) -> ValidationError: ... def get_constraints(self) -> list[tuple[type[Model], Sequence[BaseConstraint]]]: ... def validate_constraints(self, exclude: Collection[str] | None = None) -> None: ... def full_clean( self, exclude: Iterable[str] | None = None, validate_unique: bool = True, validate_constraints: bool = True ) -> None: ... def clean_fields(self, exclude: Collection[str] | None = None) -> None: ... @classmethod def check(cls, **kwargs: Any) -> list[CheckMessage]: ... def subclass_exception( name: str, bases: tuple[type[BaseException], ...], module: str, attached_to: type[Model] ) -> type[BaseException]: ... def method_set_order( self: Model, ordered_obj: type[Model], id_list: Iterable[Any], using: str | None = None ) -> None: ... def method_get_order(self: Model, ordered_obj: type[Model]) -> QuerySet[Any]: ... def make_foreign_order_accessors(model: type[Model], related_model: type[Model]) -> None: ... def model_unpickle(model_id: tuple[str, str] | type[Model]) -> Model: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/constants.pyi000066400000000000000000000002201526064357400260460ustar00rootroot00000000000000from enum import Enum from typing import cast LOOKUP_SEP: str class OnConflict(Enum): IGNORE = cast(str, ...) UPDATE = cast(str, ...) typeddjango-django-stubs-fa03b48/django-stubs/db/models/constraints.pyi000066400000000000000000000076431526064357400264210ustar00rootroot00000000000000from collections.abc import Sequence from enum import Enum from typing import Any, Self, cast, overload from django.core.checks import CheckMessage from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.models.base import Model from django.db.models.expressions import BaseExpression, Combinable from django.db.models.query_utils import Q from django.utils.functional import _StrOrPromise from typing_extensions import override class Deferrable(Enum): DEFERRED = cast(str, ...) IMMEDIATE = cast(str, ...) class BaseConstraint: name: str violation_error_code: str | None violation_error_message: _StrOrPromise | None default_violation_error_message: _StrOrPromise non_db_attrs: tuple[str, ...] def __init__( self, *, name: str, violation_error_code: str | None = None, violation_error_message: _StrOrPromise | None = None, ) -> None: ... @property def contains_expressions(self) -> bool: ... def constraint_sql(self, model: type[Model] | None, schema_editor: BaseDatabaseSchemaEditor | None) -> str: ... def create_sql(self, model: type[Model] | None, schema_editor: BaseDatabaseSchemaEditor | None) -> str: ... def remove_sql(self, model: type[Model] | None, schema_editor: BaseDatabaseSchemaEditor | None) -> str: ... def validate( self, model: type[Model], instance: Model, exclude: set[str] | None = None, using: str = "default" ) -> None: ... def get_violation_error_message(self) -> _StrOrPromise | dict[str, Any]: ... def check(self, model: type[Model], connection: BaseDatabaseWrapper) -> list[CheckMessage]: ... def deconstruct(self) -> tuple[str, Sequence[Any], dict[str, Any]]: ... def clone(self) -> Self: ... class CheckConstraint(BaseConstraint): condition: Q | BaseExpression def __init__( self, *, name: str, condition: Q | BaseExpression, violation_error_code: str | None = None, violation_error_message: _StrOrPromise | None = None, ) -> None: ... @override def check(self, model: type[Model], connection: BaseDatabaseWrapper) -> list[CheckMessage]: ... @override def validate( self, model: type[Model], instance: Model, exclude: set[str] | None = None, using: str = "default" ) -> None: ... class UniqueConstraint(BaseConstraint): expressions: Sequence[BaseExpression | Combinable] fields: Sequence[str] condition: Q | None deferrable: Deferrable | None nulls_distinct: bool | None @overload def __init__( self, *expressions: str | BaseExpression | Combinable, fields: None = None, name: str, condition: Q | None = None, deferrable: Deferrable | None = None, include: Sequence[str] | None = None, opclasses: Sequence[Any] = (), nulls_distinct: bool | None = None, violation_error_code: str | None = None, violation_error_message: _StrOrPromise | None = None, ) -> None: ... @overload def __init__( self, *, fields: Sequence[str], name: str, condition: Q | None = None, deferrable: Deferrable | None = None, include: Sequence[str] | None = None, opclasses: Sequence[Any] = (), nulls_distinct: bool | None = None, violation_error_code: str | None = None, violation_error_message: _StrOrPromise | None = None, ) -> None: ... @property @override def contains_expressions(self) -> bool: ... @override def check(self, model: type[Model], connection: BaseDatabaseWrapper) -> list[CheckMessage]: ... @override def validate( self, model: type[Model], instance: Model, exclude: set[str] | None = None, using: str = "default" ) -> None: ... __all__ = ["BaseConstraint", "CheckConstraint", "Deferrable", "UniqueConstraint"] typeddjango-django-stubs-fa03b48/django-stubs/db/models/deletion.pyi000066400000000000000000000107461526064357400256530ustar00rootroot00000000000000from collections import defaultdict from collections.abc import Callable, Iterable, Iterator, Sequence from typing import Any, TypeAlias from django.db import IntegrityError from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.models.base import Model from django.db.models.fields import Field from django.db.models.options import Options from django.db.models.query import QuerySet from django.utils.datastructures import _IndexableCollection def CASCADE( collector: Collector, field: Field[Any, Any], sub_objs: QuerySet[Model], using: str, ) -> None: ... def SET_NULL( collector: Collector, field: Field[Any, Any], sub_objs: QuerySet[Model], using: str, ) -> None: ... def SET_DEFAULT( collector: Collector, field: Field[Any, Any], sub_objs: QuerySet[Model], using: str, ) -> None: ... def DO_NOTHING( collector: Collector, field: Field[Any, Any], sub_objs: QuerySet[Model], using: str, ) -> None: ... def PROTECT( collector: Collector, field: Field[Any, Any], sub_objs: QuerySet[Model], using: str, ) -> None: ... def RESTRICT( collector: Collector, field: Field[Any, Any], sub_objs: QuerySet[Model], using: str, ) -> None: ... def SET(value: Any) -> Callable[..., Any]: ... _Collector: TypeAlias = Callable[[Collector, Field[Any, Any], QuerySet[Model], str], None] class DatabaseOnDelete: operation: str forced_collector: _Collector | None def __init__(self, operation: str, name: str, forced_collector: _Collector | None = ...) -> None: ... def __call__(collector, field: Field[Any, Any], sub_objs: QuerySet[Model], using: str) -> None: ... def on_delete_sql(self, schema_editor: BaseDatabaseSchemaEditor) -> str: ... DB_CASCADE: DatabaseOnDelete DB_SET_DEFAULT: DatabaseOnDelete DB_SET_NULL: DatabaseOnDelete SKIP_COLLECTION: frozenset[_Collector | DatabaseOnDelete] def get_candidate_relations_to_delete(opts: Options[Model]) -> Iterable[Field[Any, Any]]: ... class ProtectedError(IntegrityError): protected_objects: set[Model] def __init__(self, msg: str, protected_objects: set[Model]) -> None: ... class RestrictedError(IntegrityError): restricted_objects: set[Model] def __init__(self, msg: str, restricted_objects: set[Model]) -> None: ... class Collector: using: str origin: Model | QuerySet[Model] | None data: dict[type[Model], set[Model] | list[Model]] field_updates: defaultdict[tuple[Field[Any, Any], Any], list[Model]] restricted_objects: defaultdict[Model, defaultdict[Field[Any, Any], set[Model]]] fast_deletes: list[QuerySet[Model]] dependencies: defaultdict[Model, set[Model]] def __init__( self, using: str, origin: Model | QuerySet[Model] | None = None, force_collection: bool = ... ) -> None: ... def add( self, objs: _IndexableCollection[Model], source: type[Model] | None = None, nullable: bool = False, reverse_dependency: bool = False, ) -> list[Model]: ... def add_dependency(self, model: type[Model], dependency: type[Model], reverse_dependency: bool = False) -> None: ... def add_field_update(self, field: Field[Any, Any], value: Any, objs: _IndexableCollection[Model]) -> None: ... def add_restricted_objects(self, field: Field[Any, Any], objs: _IndexableCollection[Model]) -> None: ... def clear_restricted_objects_from_set(self, model: type[Model], objs: set[Model]) -> None: ... def clear_restricted_objects_from_queryset(self, model: type[Model], qs: QuerySet[Model]) -> None: ... def can_fast_delete(self, objs: Model | Iterable[Model], from_field: Field[Any, Any] | None = None) -> bool: ... def get_del_batches( self, objs: _IndexableCollection[Model], fields: Iterable[Field[Any, Any]] ) -> Sequence[Sequence[Model]]: ... def collect( self, objs: _IndexableCollection[Model | None], source: type[Model] | None = None, nullable: bool = False, collect_related: bool = True, source_attr: str | None = None, reverse_dependency: bool = False, keep_parents: bool = False, fail_on_restricted: bool = True, ) -> None: ... def related_objects( self, related_model: type[Model], related_fields: Iterable[Field[Any, Any]], objs: _IndexableCollection[Model] ) -> QuerySet[Model]: ... def instances_with_model(self) -> Iterator[tuple[type[Model], Model]]: ... def sort(self) -> None: ... def delete(self) -> tuple[int, dict[str, int]]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/enums.pyi000066400000000000000000000051451526064357400251740ustar00rootroot00000000000000import enum import sys from enum import EnumType, IntEnum, StrEnum from enum import property as enum_property from typing import Any, Literal, overload, type_check_only from _typeshed import ConvertibleToInt from _typeshed import Self as MetaclassSelf # noqa: TID251 from django.utils.functional import _StrOrPromise from typing_extensions import override class ChoicesType(EnumType): __empty__: _StrOrPromise def __new__( metacls: type[MetaclassSelf], classname: str, bases: tuple[type, ...], classdict: enum._EnumDict, **kwds: Any ) -> MetaclassSelf: ... @property def names(self) -> list[str]: ... @property def choices(self) -> list[tuple[Any, _StrOrPromise]]: ... @property def labels(self) -> list[_StrOrPromise]: ... @property def values(self) -> list[Any]: ... if sys.version_info < (3, 12): @override def __contains__(self, member: Any) -> bool: ... class Choices(enum.Enum, metaclass=ChoicesType): # type: ignore[misc] _label_: _StrOrPromise do_not_call_in_templates: Literal[True] @enum_property def label(self) -> _StrOrPromise: ... @enum_property @override def value(self) -> Any: ... # fake, to keep simulate class properties @type_check_only class _IntegerChoicesType(ChoicesType): @property @override def choices(self) -> list[tuple[int, _StrOrPromise]]: ... @property @override def values(self) -> list[int]: ... # In reality, the `__init__` overloads provided below should also support # all the arguments of `int.__new__`/`str.__new__` (e.g. `base`, `encoding`). # They are omitted on purpose to avoid having convoluted stubs for these enums: class IntegerChoices(Choices, IntEnum, metaclass=_IntegerChoicesType): # type: ignore[misc] _value_: int @overload def __init__(self, x: ConvertibleToInt) -> None: ... @overload def __init__(self, x: ConvertibleToInt, label: _StrOrPromise) -> None: ... @enum_property @override def value(self) -> int: ... # fake, to keep simulate class properties @type_check_only class _TextChoicesType(ChoicesType): @property @override def choices(self) -> list[tuple[str, _StrOrPromise]]: ... @property @override def values(self) -> list[str]: ... class TextChoices(Choices, StrEnum, metaclass=_TextChoicesType): # type: ignore[misc] _value_: str @overload def __init__(self, object: str) -> None: ... @overload def __init__(self, object: str, label: _StrOrPromise) -> None: ... @enum_property @override def value(self) -> str: ... __all__ = ["Choices", "IntegerChoices", "TextChoices"] typeddjango-django-stubs-fa03b48/django-stubs/db/models/expressions.pyi000066400000000000000000000365451526064357400264370ustar00rootroot00000000000000import datetime from collections.abc import Callable, Iterator, Mapping, Sequence from decimal import Decimal from enum import Enum from typing import Any, ClassVar, Generic, Literal, Never, Self, TypeAlias from django.core.exceptions import FieldError from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Q, fields from django.db.models.fields import Field from django.db.models.lookups import Lookup, Transform from django.db.models.query import QuerySet from django.db.models.sql.compiler import SQLCompiler, _AsSqlType, _ParamsT from django.db.models.sql.query import Query from django.utils.deconstruct import _Deconstructible from django.utils.functional import cached_property from typing_extensions import TypeVar, override _OutputField = TypeVar("_OutputField", bound=Field[Any, Any], default=Field[Any, Any]) _Numeric: TypeAlias = float | Decimal _AddOperand: TypeAlias = datetime.datetime | datetime.timedelta | _Numeric | Combinable | str | None _SubOperand: TypeAlias = datetime.datetime | datetime.timedelta | _Numeric | Combinable | None _ExprListCompatible: TypeAlias = Sequence[BaseExpression | F | str] | BaseExpression | F | str class SQLiteNumericMixin: def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class OutputFieldIsNoneError(FieldError): ... class Combinable: ADD: str SUB: str MUL: str DIV: str POW: str MOD: str BITAND: str BITOR: str BITLEFTSHIFT: str BITRIGHTSHIFT: str BITXOR: str def __neg__(self) -> CombinedExpression: ... def __add__(self, other: _AddOperand) -> CombinedExpression: ... def __sub__(self, other: _SubOperand) -> CombinedExpression: ... def __mul__(self, other: datetime.timedelta | Combinable | _Numeric) -> CombinedExpression: ... def __truediv__(self, other: Combinable | _Numeric) -> CombinedExpression: ... def __mod__(self, other: int | Combinable) -> CombinedExpression: ... def __pow__(self, other: _Numeric | Combinable) -> CombinedExpression: ... def __and__(self, other: Combinable | Q) -> Q: ... def bitand(self, other: int) -> CombinedExpression: ... def bitleftshift(self, other: int) -> CombinedExpression: ... def bitrightshift(self, other: int) -> CombinedExpression: ... def __xor__(self, other: Combinable | Q) -> Q: ... def bitxor(self, other: int) -> CombinedExpression: ... def __or__(self, other: Combinable | Q) -> Q: ... def bitor(self, other: int) -> CombinedExpression: ... def __radd__(self, other: _AddOperand) -> CombinedExpression: ... def __rsub__(self, other: _SubOperand) -> CombinedExpression: ... def __rmul__(self, other: _Numeric | Combinable) -> CombinedExpression: ... def __rtruediv__(self, other: _Numeric | Combinable) -> CombinedExpression: ... def __rmod__(self, other: int | Combinable) -> CombinedExpression: ... def __rpow__(self, other: _Numeric | Combinable) -> CombinedExpression: ... def __rand__(self, other: Any) -> Combinable: ... def __ror__(self, other: Any) -> Combinable: ... def __rxor__(self, other: Any) -> Combinable: ... def __invert__(self) -> NegatedExpression[Combinable]: ... class BaseExpression: empty_result_set_value: Any is_summary: bool filterable: bool window_compatible: bool allowed_default: bool constraint_validation_compatible: bool set_returning: bool allows_composite_expressions: bool def __init__(self, output_field: Field[Any, Any] | None = None) -> None: ... def get_db_converters(self, connection: BaseDatabaseWrapper) -> list[Callable[..., Any]]: ... def get_source_expressions(self) -> list[Any]: ... def set_source_expressions(self, exprs: Sequence[Combinable | Expression]) -> None: ... def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... @cached_property def contains_aggregate(self) -> bool: ... @cached_property def contains_over_clause(self) -> bool: ... @cached_property def contains_column_references(self) -> bool: ... @cached_property def contains_subquery(self) -> bool: ... def resolve_expression( self, query: Any | None = None, allow_joins: bool = True, reuse: set[str] | None = None, summarize: bool = False, for_save: bool = False, ) -> Self: ... @property def conditional(self) -> bool: ... @property def field(self) -> Field[Any, Any]: ... @cached_property def output_field(self) -> Field[Any, Any]: ... @cached_property def convert_value(self) -> Callable[..., Any]: ... def get_lookup(self, lookup: str) -> type[Lookup] | None: ... def get_transform(self, name: str) -> type[Transform] | None: ... def relabeled_clone(self, change_map: Mapping[str, str]) -> Self: ... def replace_expressions(self, replacements: Mapping[Self, Any]) -> Self: ... def get_refs(self) -> set[str]: ... def copy(self) -> Self: ... def prefix_references(self, prefix: str) -> Self: ... def get_group_by_cols(self) -> list[BaseExpression]: ... def get_source_fields(self) -> list[Field[Any, Any] | None]: ... def asc(self, **kwargs: Any) -> OrderBy: ... def desc(self, **kwargs: Any) -> OrderBy: ... def reverse_ordering(self) -> BaseExpression: ... def flatten(self) -> Iterator[BaseExpression]: ... def select_format(self, compiler: SQLCompiler, sql: str, params: _ParamsT) -> _AsSqlType: ... def get_expression_for_validation(self) -> BaseExpression: ... class Expression(_Deconstructible, BaseExpression, Combinable): @cached_property def identity(self) -> tuple[Any, ...]: ... def register_combinable_fields( lhs: type[Field[Any, Any]], connector: str, rhs: type[Field[Any, Any]], result: type[Field[Any, Any]], ) -> None: ... class CombinedExpression(SQLiteNumericMixin, Expression): @cached_property @override def allowed_default(self) -> bool: ... # type: ignore[override] connector: str lhs: Combinable rhs: Combinable def __init__( self, lhs: Combinable, connector: str, rhs: Combinable, output_field: Field[Any, Any] | None = None ) -> None: ... class DurationExpression(CombinedExpression): def compile(self, side: Combinable, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class TemporalSubtraction(CombinedExpression): output_field: ClassVar[fields.DurationField[Any, Any]] def __init__(self, lhs: Combinable, rhs: Combinable) -> None: ... class F(_Deconstructible, Combinable): allowed_default: ClassVar[bool] def __init__(self, name: str) -> None: ... def __getitem__(self, subscript: int | slice) -> Sliced: ... def __contains__(self, other: Any) -> Never: ... def resolve_expression( self, query: Any | None = None, allow_joins: bool = True, reuse: set[str] | None = None, summarize: bool = False, for_save: bool = False, ) -> Expression: ... def replace_expressions(self, replacements: Mapping[F, Any]) -> F: ... def asc(self, **kwargs: Any) -> OrderBy: ... def desc(self, **kwargs: Any) -> OrderBy: ... def copy(self) -> Self: ... class Sliced(F): def __init__(self, obj: F, subscript: int | slice) -> None: ... @override def resolve_expression( self, query: Any | None = None, allow_joins: bool = True, reuse: set[str] | None = None, summarize: bool = False, for_save: bool = False, ) -> Func: ... class ResolvedOuterRef(F): contains_aggregate: ClassVar[bool] contains_over_clause: ClassVar[bool] def as_sql(self, *args: Any, **kwargs: Any) -> _AsSqlType: ... def relabeled_clone(self, relabels: Mapping[str, str]) -> Self: ... def get_group_by_cols(self) -> list[BaseExpression]: ... class OuterRef(F): contains_aggregate: ClassVar[bool] contains_over_clause: ClassVar[bool] def __init__(self, name: str | OuterRef) -> None: ... def relabeled_clone(self, relabels: Any) -> Self: ... class Func(SQLiteNumericMixin, Expression, Generic[_OutputField]): @cached_property @override def allowed_default(self) -> bool: ... # type: ignore[override] function: str | None = None template: str arg_joiner: str arity: int | None source_expressions: list[Expression] extra: dict[Any, Any] def __init__(self, *expressions: Any, output_field: _OutputField | None = None, **extra: Any) -> None: ... @override def as_sql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, function: str | None = None, template: str | None = None, arg_joiner: str | None = None, **extra_context: Any, ) -> _AsSqlType: ... class Value(Expression): value: Any for_save: bool def __init__(self, value: Any, output_field: Field[Any, Any] | None = None) -> None: ... @property @override def empty_result_set_value(self) -> Any: ... def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class JSONNull(Value): def __init__(self) -> None: ... def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class RawSQL(Expression): params: list[Any] sql: str def __init__(self, sql: str, params: Sequence[Any], output_field: Field[Any, Any] | None = None) -> None: ... class Star(Expression): ... class DatabaseDefault(Expression): def __init__(self, expression: Expression, output_field: Field[Any, Any] | None = None) -> None: ... class Col(Expression): target: Field[Any, Any] alias: str contains_column_references: Literal[True] possibly_multivalued: Literal[False] def __init__(self, alias: str, target: Field[Any, Any], output_field: Field[Any, Any] | None = None) -> None: ... @override def relabeled_clone(self, relabels: Mapping[str, str]) -> Self: ... class ColPairs(Expression): alias: str targets: Sequence[Field[Any, Any]] sources: Sequence[Field[Any, Any]] def __init__( self, alias: str, targets: Sequence[Field[Any, Any]], sources: Sequence[Field[Any, Any]], output_field: Field[Any, Any] | None, ) -> None: ... def __len__(self) -> int: ... def __iter__(self) -> Iterator[Col]: ... def get_cols(self) -> list[Col]: ... @override def relabeled_clone(self, relabels: Mapping[str, str]) -> Self: ... class Ref(Expression): def __init__(self, refs: str, source: Expression) -> None: ... @override def relabeled_clone(self, relabels: Mapping[str, str]) -> Self: ... class ExpressionList(Func): def __init__( self, *expressions: BaseExpression | Combinable, output_field: Field[Any, Any] | None = None, **extra: Any ) -> None: ... class OrderByList(ExpressionList): @classmethod def from_param(cls, context: str, param: _ExprListCompatible | None) -> Self | None: ... _E = TypeVar("_E", bound=Q | Combinable) class ExpressionWrapper(Expression, Generic[_E]): @property @override def allowed_default(self) -> bool: ... # type: ignore[override] def __init__(self, expression: _E, output_field: Field[Any, Any]) -> None: ... expression: _E class NegatedExpression(ExpressionWrapper[_E]): def __init__(self, expression: _E) -> None: ... @override def __invert__(self) -> _E: ... # type: ignore[override] class When(Expression): @cached_property @override def allowed_default(self) -> bool: ... # type: ignore[override] template: str condition: Any result: Any def __init__(self, condition: Any | None = None, then: Any | None = None, **lookups: Any) -> None: ... @override def as_sql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, template: str | None = None, **extra_context: Any ) -> _AsSqlType: ... class Case(Expression): @cached_property @override def allowed_default(self) -> bool: ... # type: ignore[override] template: str case_joiner: str cases: Any default: Any extra: Any def __init__( self, *cases: Any, default: Any | None = None, output_field: Field[Any, Any] | None = None, **extra: Any ) -> None: ... @override def as_sql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, template: str | None = None, case_joiner: str | None = None, **extra_context: Any, ) -> _AsSqlType: ... class Subquery(BaseExpression, Combinable, Generic[_OutputField]): template: str subquery: bool query: Query extra: dict[Any, Any] def __init__( self, queryset: Query | QuerySet[Any] | Subquery, output_field: _OutputField | None = None, **extra: Any ) -> None: ... @property def external_aliases(self) -> set[str]: ... def get_external_cols(self) -> list[Col]: ... @override def as_sql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, template: str | None = None, **extra_context: Any ) -> _AsSqlType: ... class Exists(Subquery): output_field: ClassVar[fields.BooleanField[Any, Any]] def __init__(self, queryset: Query | QuerySet[Any] | Subquery, **kwargs: Any) -> None: ... class OrderBy(Expression): template: str nulls_first: bool nulls_last: bool descending: bool expression: Expression | F | Subquery allows_composite_expressions: bool def __init__( self, expression: Expression | F | Subquery, descending: bool = False, nulls_first: bool | None = None, nulls_last: bool | None = None, ) -> None: ... @override def as_sql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, template: str | None = None, **extra_context: Any ) -> _AsSqlType: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... @override def asc(self) -> None: ... # type: ignore[override] @override def desc(self) -> None: ... # type: ignore[override] class Window(SQLiteNumericMixin, Expression): template: str contains_aggregate: bool contains_over_clause: bool partition_by: ExpressionList | None order_by: OrderByList | None def __init__( self, expression: BaseExpression, partition_by: _ExprListCompatible | None = None, order_by: _ExprListCompatible | None = None, frame: WindowFrame | None = None, output_field: Field[Any, Any] | None = None, ) -> None: ... @override def as_sql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, template: str | None = None ) -> _AsSqlType: ... @override def as_sqlite( # type: ignore[override] self, compiler: SQLCompiler, connection: BaseDatabaseWrapper ) -> _AsSqlType: ... class WindowFrameExclusion(Enum): CURRENT_ROW = "CURRENT ROW" GROUP = "GROUP" TIES = "TIES" NO_OTHERS = "NO OTHERS" class WindowFrame(Expression): template: str def __init__( self, start: int | None = None, end: int | None = None, exclusion: WindowFrameExclusion | None = None, ) -> None: ... def get_exclusion(self) -> str: ... def window_frame_start_end( self, connection: BaseDatabaseWrapper, start: int | None, end: int | None ) -> tuple[int, int]: ... class RowRange(WindowFrame): frame_type: str class ValueRange(WindowFrame): frame_type: str typeddjango-django-stubs-fa03b48/django-stubs/db/models/fetch_modes.pyi000066400000000000000000000014221526064357400263170ustar00rootroot00000000000000from typing import Any, NoReturn from django.db.models import Model from typing_extensions import override class FetchMode: track_peers: bool def fetch(self, fetcher: Any, instance: Model) -> None: ... class FetchOne(FetchMode): @override def fetch(self, fetcher: Any, instance: Model) -> None: ... @override def __reduce__(self) -> str: ... FETCH_ONE: FetchOne class FetchPeers(FetchMode): track_peers: bool @override def fetch(self, fetcher: Any, instance: Model) -> None: ... @override def __reduce__(self) -> str: ... FETCH_PEERS: FetchPeers class FetchRaise(FetchMode): @override def fetch(self, fetcher: Any, instance: Model) -> NoReturn: ... @override def __reduce__(self) -> str: ... FETCH_RAISE: FetchRaise typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/000077500000000000000000000000001526064357400245635ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/__init__.pyi000066400000000000000000000634351526064357400270600ustar00rootroot00000000000000import decimal import uuid from collections.abc import Callable, Iterable, Mapping, Sequence from datetime import date, time, timedelta from datetime import datetime as real_datetime from typing import Any, ClassVar, Generic, Protocol, Self, TypeAlias, overload, type_check_only from django import forms from django.core.checks import CheckMessage from django.core.validators import _ValidatorCallable from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Model from django.db.models.expressions import Col, Combinable, Expression, Func from django.db.models.fields.reverse_related import ForeignObjectRel from django.db.models.query import _OrderByFieldName from django.db.models.query_utils import Q, RegisterLookupMixin from django.db.models.sql.compiler import SQLCompiler, _AsSqlType, _ParamsT from django.forms.widgets import Widget from django.utils.choices import BlankChoiceIterator, _Choice, _ChoiceNamedGroup, _ChoicesCallable, _ChoicesInput from django.utils.datastructures import DictWrapper from django.utils.functional import _Getter, _StrOrPromise, cached_property from typing_extensions import TypeVar, override class Empty: ... class NOT_PROVIDED: ... # RemovedInDjango70Warning BLANK_CHOICE_DASH: list[tuple[str, str]] BLANK_CHOICE_LABEL: _StrOrPromise _ChoicesList: TypeAlias = Sequence[_Choice] | Sequence[_ChoiceNamedGroup] _LimitChoicesTo: TypeAlias = Q | dict[str, Any] _LimitChoicesToCallable: TypeAlias = Callable[[], _LimitChoicesTo] _F = TypeVar("_F", bound=Field[Any, Any], covariant=True) @type_check_only class _FieldDescriptor(Protocol[_F]): """ Accessing fields of a model class (not instance) returns an object conforming to this protocol. Depending on field type this could be DeferredAttribute, ForwardManyToOneDescriptor, FileDescriptor, etc. """ @property def field(self) -> _F: ... _AllLimitChoicesTo: TypeAlias = _LimitChoicesTo | _LimitChoicesToCallable | _ChoicesCallable # noqa: PYI047 _ErrorMessagesMapping: TypeAlias = Mapping[str, _StrOrPromise] _ErrorMessagesDict: TypeAlias = dict[str, _StrOrPromise] # __set__ value type _ST = TypeVar("_ST", contravariant=True) # __get__ return type _GT = TypeVar("_GT", covariant=True) class Field(RegisterLookupMixin, Generic[_ST, _GT]): """ Typing model fields. How does this work? Let's take a look at the self-contained example (it is way easier than our django implementation, but has the same concept). To understand this example you need: 1. Be familiar with descriptors: https://docs.python.org/3/howto/descriptor.html 2. Follow our explanation below Let's start with defining our fake model class and fake integer field. .. code:: python from typing import Generic class Model(object): ... _SetType = int | float # You can assign ints and floats _GetType = int # access type is always `int` class IntField(object): def __get__(self, instance: Model, owner) -> _GetType: ... def __set__(self, instance, value: _SetType) -> None: ... Now, let's create our own example model, this would be something like ``User`` in your own apps: .. code:: python class Example(Model): count = IntField() And now, lets test that our reveal type works: .. code:: python example = Example() reveal_type(example.count) # Revealed type is "int" example.count = 1.5 # ok example.count = 'a' # Incompatible types in assignment # (expression has type "str", variable has type "int | float") Notice, that this is not magic. This is how descriptors work with ``mypy``. We also need ``_pyi_private_set_type`` attributes and friends to help inside our plugin. It is required to enhance parts like ``filter`` queries. """ _pyi_private_set_type: Any _pyi_private_get_type: Any _pyi_lookup_exact_type: Any help_text: _StrOrPromise attname: str auto_created: bool primary_key: bool remote_field: ForeignObjectRel | None is_relation: bool related_model: type[Model] | None generated: ClassVar[bool] one_to_many: bool | None one_to_one: bool | None many_to_many: bool | None many_to_one: bool | None max_length: int | None model: type[Model] name: str verbose_name: _StrOrPromise description: _StrOrPromise | _Getter[_StrOrPromise] blank: bool null: bool editable: bool empty_strings_allowed: bool choices: _ChoicesList | None db_column: str | None db_comment: str | None db_default: type[NOT_PROVIDED] | Expression column: str | None concrete: bool default: Any empty_values: Sequence[Any] creation_counter: int auto_creation_counter: int default_validators: list[_ValidatorCallable] default_error_messages: ClassVar[_ErrorMessagesDict] hidden: bool system_check_removed_details: Any | None system_check_deprecated_details: Any | None non_db_attrs: tuple[str, ...] def __init__( self, verbose_name: _StrOrPromise | None = None, name: str | None = None, primary_key: bool = False, max_length: int | None = None, unique: bool = False, blank: bool = False, null: bool = False, db_index: bool = False, rel: ForeignObjectRel | None = None, default: Any = ..., editable: bool = True, serialize: bool = True, unique_for_date: str | None = None, unique_for_month: str | None = None, unique_for_year: str | None = None, choices: _ChoicesInput | None = None, help_text: _StrOrPromise = "", db_column: str | None = None, db_tablespace: str | None = None, auto_created: bool = False, validators: Iterable[_ValidatorCallable] = (), error_messages: _ErrorMessagesMapping | None = None, db_comment: str | None = None, db_default: type[NOT_PROVIDED] | Expression | _ST = ..., ) -> None: ... def __set__(self, instance: Any, value: _ST) -> None: ... # class access @overload def __get__(self, instance: None, owner: Any) -> _FieldDescriptor[Self]: ... # Model instance access @overload def __get__(self, instance: Model, owner: Any) -> _GT: ... # non-Model instances @overload def __get__(self, instance: Any, owner: Any) -> Self: ... def check(self, **kwargs: Any) -> list[CheckMessage]: ... def get_col(self, alias: str, output_field: Field[Any, Any] | None = None) -> Col: ... @cached_property def cached_col(self) -> Col: ... def select_format(self, compiler: SQLCompiler, sql: str, params: _ParamsT) -> _AsSqlType: ... def deconstruct(self) -> tuple[str, str, Sequence[Any], dict[str, Any]]: ... def clone(self) -> Self: ... def __lt__(self, other: Any) -> bool: ... def __le__(self, other: Any) -> bool: ... def __gt__(self, other: Any) -> bool: ... def __ge__(self, other: Any) -> bool: ... def __deepcopy__(self, memodict: dict[int, Any]) -> Self: ... def __copy__(self) -> Self: ... def get_pk_value_on_save(self, instance: Model) -> Any: ... def to_python(self, value: Any) -> Any: ... @cached_property def error_messages(self) -> _ErrorMessagesDict: ... @cached_property def validators(self) -> list[_ValidatorCallable]: ... def run_validators(self, value: Any) -> None: ... def validate(self, value: Any, model_instance: Model | None) -> None: ... def clean(self, value: Any, model_instance: Model | None) -> Any: ... def db_type_parameters(self, connection: BaseDatabaseWrapper) -> DictWrapper[Any]: ... def db_check(self, connection: BaseDatabaseWrapper) -> str | None: ... def db_type(self, connection: BaseDatabaseWrapper) -> str | None: ... def rel_db_type(self, connection: BaseDatabaseWrapper) -> str | None: ... def cast_db_type(self, connection: BaseDatabaseWrapper) -> str | None: ... def db_parameters(self, connection: BaseDatabaseWrapper) -> dict[str, str | None]: ... def db_type_suffix(self, connection: BaseDatabaseWrapper) -> str | None: ... def get_db_converters(self, connection: BaseDatabaseWrapper) -> list[Callable[..., Any]]: ... @cached_property def unique(self) -> bool: ... @property def db_tablespace(self) -> str: ... @property def db_returning(self) -> bool: ... descriptor_class: type def set_attributes_from_name(self, name: str) -> None: ... def contribute_to_class(self, cls: type[Model], name: str, private_only: bool = False) -> None: ... def get_filter_kwargs_for_object(self, obj: Model) -> dict[str, Any]: ... def get_attname(self) -> str: ... def get_attname_column(self) -> tuple[str, str | None]: ... def get_internal_type(self) -> str: ... def pre_save(self, model_instance: Model, add: bool) -> Any: ... def get_prep_value(self, value: Any) -> Any: ... def get_db_prep_value(self, value: Any, connection: BaseDatabaseWrapper, prepared: bool = False) -> Any: ... def get_db_prep_save(self, value: Any, connection: BaseDatabaseWrapper) -> Any: ... def has_default(self) -> bool: ... def has_db_default(self) -> bool: ... def get_default(self) -> Any: ... def get_choices( self, include_blank: bool = True, blank_choice: _ChoicesList | None = None, limit_choices_to: _LimitChoicesTo | None = None, ordering: Sequence[_OrderByFieldName] = (), ) -> BlankChoiceIterator | _ChoicesList: ... def value_to_string(self, obj: Model) -> str: ... @property def flatchoices(self) -> list[_Choice]: ... def save_form_data(self, instance: Model, data: Any) -> None: ... def formfield( self, *, form_class: type[forms.Field] | None = ..., choices_form_class: type[forms.ChoiceField] | None = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., **kwargs: Any, # Subclasses are allowed to return None ) -> forms.Field | None: ... def value_from_object(self, obj: Model) -> _GT: ... def slice_expression(self, expression: Expression, start: int, length: int | None) -> Func: ... class IntegerField(Field[_ST, _GT]): _pyi_private_set_type: float | int | str | Combinable _pyi_private_get_type: int _pyi_lookup_exact_type: str | int class PositiveIntegerRelDbTypeMixin: def rel_db_type(self, connection: BaseDatabaseWrapper) -> str: ... class SmallIntegerField(IntegerField[_ST, _GT]): ... class BigIntegerField(IntegerField[_ST, _GT]): MAX_BIGINT: ClassVar[int] class PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField[_ST, _GT]): integer_field_class: type[IntegerField[Any, Any]] class PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, SmallIntegerField[_ST, _GT]): integer_field_class: type[SmallIntegerField[Any, Any]] class PositiveBigIntegerField(PositiveIntegerRelDbTypeMixin, BigIntegerField[_ST, _GT]): integer_field_class: type[BigIntegerField[Any, Any]] class FloatField(Field[_ST, _GT]): _pyi_private_set_type: float | int | str | Combinable _pyi_private_get_type: float _pyi_lookup_exact_type: float class DecimalField(Field[_ST, _GT]): _pyi_private_set_type: str | float | decimal.Decimal | Combinable _pyi_private_get_type: decimal.Decimal _pyi_lookup_exact_type: str | int | decimal.Decimal # attributes max_digits: int decimal_places: int def __init__( self, verbose_name: _StrOrPromise | None = None, name: str | None = None, max_digits: int | None = None, decimal_places: int | None = None, *, primary_key: bool = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., choices: _ChoicesInput | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., ) -> None: ... @cached_property def context(self) -> decimal.Context: ... class CharField(Field[_ST, _GT]): _pyi_private_set_type: str | int | Combinable _pyi_private_get_type: str # objects are converted to string before comparison _pyi_lookup_exact_type: Any db_collation: str | None def __init__( self, verbose_name: _StrOrPromise | None = ..., name: str | None = ..., primary_key: bool = ..., max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _ChoicesInput | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., *, db_collation: str | None = None, ) -> None: ... class CommaSeparatedIntegerField(CharField[_ST, _GT]): ... class SlugField(CharField[_ST, _GT]): def __init__( self, verbose_name: _StrOrPromise | None = ..., name: str | None = ..., primary_key: bool = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _ChoicesInput | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., *, max_length: int | None = 50, db_index: bool = True, allow_unicode: bool = False, db_collation: str | None = None, ) -> None: ... class EmailField(CharField[_ST, _GT]): _pyi_private_set_type: str | Combinable class URLField(CharField[_ST, _GT]): def __init__( self, verbose_name: _StrOrPromise | None = None, name: str | None = None, *, primary_key: bool = ..., max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., rel: ForeignObjectRel | None = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _ChoicesInput | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., auto_created: bool = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., db_collation: str | None = None, ) -> None: ... class TextField(Field[_ST, _GT]): _pyi_private_set_type: str | Combinable _pyi_private_get_type: str # objects are converted to string before comparison _pyi_lookup_exact_type: Any db_collation: str | None def __init__( self, verbose_name: _StrOrPromise | None = ..., name: str | None = ..., primary_key: bool = ..., max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _ChoicesInput | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., *, db_collation: str | None = None, ) -> None: ... class BooleanField(Field[_ST, _GT]): _pyi_private_set_type: bool | Combinable _pyi_private_get_type: bool _pyi_lookup_exact_type: bool class NullBooleanField(BooleanField[_ST, _GT]): _pyi_private_set_type: bool | Combinable | None # type: ignore[assignment] _pyi_private_get_type: bool | None # type: ignore[assignment] _pyi_lookup_exact_type: bool | None # type: ignore[assignment] class IPAddressField(Field[_ST, _GT]): _pyi_private_set_type: str | Combinable _pyi_private_get_type: str class GenericIPAddressField(Field[_ST, _GT]): _pyi_private_set_type: str | int | Callable[..., Any] | Combinable _pyi_private_get_type: str default_error_messages: ClassVar[_ErrorMessagesDict] unpack_ipv4: bool protocol: str def __init__( self, verbose_name: _StrOrPromise | None = None, name: Any | None = None, protocol: str = "both", unpack_ipv4: bool = False, primary_key: bool = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., choices: _ChoicesInput | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., ) -> None: ... class DateTimeCheckMixin: def check(self, **kwargs: Any) -> list[CheckMessage]: ... class DateField(DateTimeCheckMixin, Field[_ST, _GT]): _pyi_private_set_type: str | date | Combinable _pyi_private_get_type: date _pyi_lookup_exact_type: str | date auto_now: bool auto_now_add: bool def __init__( self, verbose_name: _StrOrPromise | None = None, name: str | None = None, auto_now: bool = False, auto_now_add: bool = False, *, primary_key: bool = ..., max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., choices: _ChoicesInput | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., ) -> None: ... @override def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override] class TimeField(DateTimeCheckMixin, Field[_ST, _GT]): _pyi_private_set_type: str | time | real_datetime | Combinable _pyi_private_get_type: time auto_now: bool auto_now_add: bool def __init__( self, verbose_name: _StrOrPromise | None = None, name: str | None = None, auto_now: bool = False, auto_now_add: bool = False, *, primary_key: bool = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., choices: _ChoicesInput | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., ) -> None: ... class DateTimeField(DateField[_ST, _GT]): _pyi_private_set_type: str | real_datetime | date | Combinable _pyi_private_get_type: real_datetime _pyi_lookup_exact_type: str | real_datetime class UUIDField(Field[_ST, _GT]): _pyi_private_set_type: str | uuid.UUID _pyi_private_get_type: uuid.UUID _pyi_lookup_exact_type: uuid.UUID | str def __init__( self, verbose_name: _StrOrPromise | None = None, *, name: str | None = ..., primary_key: bool = ..., max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., rel: ForeignObjectRel | None = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _ChoicesInput | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., auto_created: bool = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., ) -> None: ... class FilePathField(Field[_ST, _GT]): path: Any match: str | None recursive: bool allow_files: bool allow_folders: bool def __init__( self, verbose_name: _StrOrPromise | None = None, name: str | None = None, path: str | Callable[..., str] = "", match: str | None = None, recursive: bool = False, allow_files: bool = True, allow_folders: bool = False, *, primary_key: bool = ..., max_length: int = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., choices: _ChoicesInput | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., ) -> None: ... class BinaryField(Field[_ST, _GT]): _pyi_private_get_type: bytes | memoryview def get_placeholder_sql(self, value: Any, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class DurationField(Field[_ST, _GT]): _pyi_private_get_type: timedelta class AutoFieldMixin: db_returning: bool def __init__(self, *args: Any, **kwargs: Any) -> None: ... def check(self, **kwargs: Any) -> list[CheckMessage]: ... def deconstruct(self) -> tuple[str, str, Sequence[Any], dict[str, Any]]: ... def validate(self, value: Any, model_instance: Model | None) -> None: ... def get_db_prep_value(self, value: Any, connection: BaseDatabaseWrapper, prepared: bool = False) -> Any: ... def get_db_prep_save(self, value: Any, connection: BaseDatabaseWrapper) -> Any: ... def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... def formfield(self, **kwargs: Any) -> None: ... class AutoFieldMeta(type): ... class AutoField(AutoFieldMixin, IntegerField[_ST, _GT], metaclass=AutoFieldMeta): # type: ignore[misc] _pyi_private_set_type: Combinable | int | str _pyi_private_get_type: int _pyi_lookup_exact_type: str | int class BigAutoField(AutoFieldMixin, BigIntegerField[_ST, _GT]): ... # type: ignore[misc] class SmallAutoField(AutoFieldMixin, SmallIntegerField[_ST, _GT]): ... # type: ignore[misc] __all__ = [ "BLANK_CHOICE_DASH", "BLANK_CHOICE_LABEL", "NOT_PROVIDED", "AutoField", "BigAutoField", "BigIntegerField", "BinaryField", "BooleanField", "CharField", "CommaSeparatedIntegerField", "DateField", "DateTimeField", "DecimalField", "DurationField", "EmailField", "Empty", "Field", "FilePathField", "FloatField", "GenericIPAddressField", "IPAddressField", "IntegerField", "NullBooleanField", "PositiveBigIntegerField", "PositiveIntegerField", "PositiveSmallIntegerField", "SlugField", "SmallAutoField", "SmallIntegerField", "TextField", "TimeField", "URLField", "UUIDField", ] typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/composite.pyi000066400000000000000000000050771526064357400273210ustar00rootroot00000000000000from collections.abc import Iterable, Iterator, Mapping from typing import Any, Literal from django.core.validators import _ValidatorCallable from django.db.models import NOT_PROVIDED, Field from django.db.models.base import Model from django.db.models.fields.reverse_related import ForeignObjectRel from django.db.models.options import _AnyField from django.utils.choices import _ChoicesInput from django.utils.functional import _StrOrPromise, cached_property from typing_extensions import override class AttributeSetter: def __init__(self, name: str, value: Any) -> None: ... class CompositeAttribute: field: CompositePrimaryKey def __init__(self, field: CompositePrimaryKey) -> None: ... @property def attnames(self) -> list[str]: ... def __get__(self, instance: Model, cls: type[Model] | None = None) -> tuple[Any, ...]: ... def __set__(self, instance: Model, values: list[Any] | tuple[Any] | None) -> None: ... class CompositePrimaryKey(Field[Any, Any]): field_names: tuple[str] descriptor_class: type[CompositeAttribute] column: None def __init__( self, *args: str, verbose_name: _StrOrPromise | None = None, name: str | None = None, primary_key: Literal[True] = True, max_length: int | None = None, unique: bool = False, blank: Literal[True] = True, null: bool = False, db_index: bool = False, rel: ForeignObjectRel | None = None, default: type[NOT_PROVIDED] = ..., editable: Literal[False] = False, serialize: bool = True, unique_for_date: str | None = None, unique_for_month: str | None = None, unique_for_year: str | None = None, choices: _ChoicesInput | None = None, help_text: _StrOrPromise = "", db_column: None = None, db_tablespace: str | None = None, auto_created: bool = False, validators: Iterable[_ValidatorCallable] = (), error_messages: Mapping[str, _StrOrPromise] | None = None, db_comment: str | None = None, db_default: type[NOT_PROVIDED] = ..., ) -> None: ... @cached_property def fields( self, ) -> tuple[_AnyField, ...]: ... @cached_property def columns(self) -> tuple[str, ...]: ... def __iter__(self) -> Iterator[_AnyField]: ... def __len__(self) -> int: ... @override def get_pk_value_on_save(self, instance: Model) -> tuple[Any, ...]: ... @override def get_attname_column(self) -> tuple[str, None]: ... def unnest(fields: Iterable[Field[Any, Any]]) -> list[Field[Any, Any]]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/files.pyi000066400000000000000000000120041526064357400264050ustar00rootroot00000000000000from collections.abc import Callable, Iterable from typing import Any, Protocol, Self, overload, type_check_only from _typeshed import StrPath from django.core.files.base import File from django.core.files.images import ImageFile from django.core.files.storage import Storage from django.core.validators import _ValidatorCallable from django.db.models.base import Model from django.db.models.expressions import Expression from django.db.models.fields import NOT_PROVIDED, Field, _ErrorMessagesMapping from django.db.models.query_utils import DeferredAttribute from django.db.models.utils import AltersData from django.utils.choices import _Choices from django.utils.functional import _StrOrPromise from typing_extensions import TypeVar, override class FieldFile(File[Any], AltersData): instance: Model field: FileField storage: Storage name: str | None def __init__(self, instance: Model, field: FileField, name: str | None) -> None: ... @override def __eq__(self, other: object) -> bool: ... @override def __hash__(self) -> int: ... file: Any @property def path(self) -> str: ... @property def url(self) -> str: ... @property @override def size(self) -> int: ... @override def open(self, mode: str = "rb") -> Self: ... # type: ignore[override] def save(self, name: str, content: File[Any], save: bool = True) -> None: ... def delete(self, save: bool = True) -> None: ... @property @override def closed(self) -> bool: ... @override def __getstate__(self) -> dict[str, Any]: ... def __setstate__(self, state: dict[str, Any]) -> None: ... class FileDescriptor(DeferredAttribute): field: FileField @override def __get__(self, instance: Model | None, cls: type[Model] | None = None) -> FieldFile | FileDescriptor: ... def __set__(self, instance: Model, value: Any | None) -> None: ... _M = TypeVar("_M", bound=Model, contravariant=True) @type_check_only class _UploadToCallable(Protocol[_M]): def __call__(self, instance: _M, filename: str, /) -> StrPath: ... class FileField(Field[Any, Any]): attr_class: type[FieldFile] descriptor_class: type[FileDescriptor] storage: Storage upload_to: StrPath | _UploadToCallable[Any] def __init__( self, verbose_name: _StrOrPromise | None = None, name: str | None = None, upload_to: StrPath | _UploadToCallable[Any] = "", storage: Storage | Callable[[], Storage] | None = None, *, max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | str = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _Choices | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., ) -> None: ... # class access @overload @override def __get__(self, instance: None, owner: Any) -> FileDescriptor: ... # Model instance access @overload @override def __get__(self, instance: Model, owner: Any) -> FieldFile: ... # non-Model instances @overload @override def __get__(self, instance: Any, owner: Any) -> Self: ... @override def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override] def generate_filename(self, instance: Model, filename: StrPath) -> str: ... @override def save_form_data(self, instance: Model, data: File[Any] | str | bool | None) -> None: ... class ImageFileDescriptor(FileDescriptor): field: ImageField @override def __set__(self, instance: Model, value: str | None) -> None: ... class ImageFieldFile(ImageFile, FieldFile): field: ImageField @override def delete(self, save: bool = True) -> None: ... class ImageField(FileField): attr_class: type[ImageFieldFile] descriptor_class: type[ImageFileDescriptor] def __init__( self, verbose_name: _StrOrPromise | None = None, name: str | None = None, width_field: str | None = None, height_field: str | None = None, **kwargs: Any, ) -> None: ... # class access @overload @override def __get__(self, instance: None, owner: Any) -> ImageFileDescriptor: ... # Model instance access @overload @override def __get__(self, instance: Model, owner: Any) -> ImageFieldFile: ... # non-Model instances @overload @override def __get__(self, instance: Any, owner: Any) -> Self: ... def update_dimension_fields(self, instance: Model, force: bool = False, *args: Any, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/generated.pyi000066400000000000000000000037701526064357400272530ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any, ClassVar, Literal from django.core.validators import _ValidatorCallable from django.db import models from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.expressions import Expression from django.db.models.fields import _ErrorMessagesMapping from django.db.models.sql import Query from django.utils.choices import _ChoicesInput from django.utils.datastructures import DictWrapper from django.utils.functional import _StrOrPromise, cached_property from typing_extensions import override class GeneratedField(models.Field[Any, Any]): generated: ClassVar[Literal[True]] db_returning: Literal[True] _query: Query | None output_field: models.Field[Any, Any] | None def __init__( self, *, expression: Expression, output_field: models.Field[Any, Any], db_persist: bool, verbose_name: _StrOrPromise | None = ..., name: str | None = ..., primary_key: bool = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., default: Any = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _ChoicesInput | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_comment: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., **kwargs: Any, ) -> None: ... def generated_sql(self, connection: BaseDatabaseWrapper) -> tuple[str, Any]: ... @cached_property def referenced_fields(self) -> frozenset[models.Field[Any, Any]]: ... @override def db_type_parameters(self, connection: BaseDatabaseWrapper) -> DictWrapper[Any]: ... __all__ = ["GeneratedField"] typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/json.pyi000066400000000000000000000135041526064357400262620ustar00rootroot00000000000000import json from collections.abc import Callable from typing import Any, ClassVar, Self from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Model, lookups from django.db.models.expressions import Expression from django.db.models.fields import TextField from django.db.models.lookups import FieldGetDbPrepValueMixin, PostgresOperatorLookup, Transform from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from django.utils.functional import _StrOrPromise from typing_extensions import TypeVar, override from . import Field from .mixins import CheckFieldDefaultMixin # __set__ value type _ST = TypeVar("_ST", contravariant=True, default=Any) # __get__ return type _GT = TypeVar("_GT", covariant=True, default=Any) class JSONField(CheckFieldDefaultMixin, Field[_ST, _GT]): encoder: type[json.JSONEncoder] | None decoder: type[json.JSONDecoder] | None def __init__( self, verbose_name: _StrOrPromise | None = None, name: str | None = None, encoder: type[json.JSONEncoder] | None = None, decoder: type[json.JSONDecoder] | None = None, **kwargs: Any, ) -> None: ... def from_db_value(self, value: str | None, expression: Expression, connection: BaseDatabaseWrapper) -> Any: ... @override def get_transform(self, name: str) -> type[Transform] | KeyTransformFactory: ... # type: ignore[override] @override def value_to_string(self, obj: Model) -> Any: ... class DataContains(FieldGetDbPrepValueMixin, PostgresOperatorLookup): ... class ContainedBy(FieldGetDbPrepValueMixin, PostgresOperatorLookup): ... class HasKeyLookup(PostgresOperatorLookup): logical_operator: str | None def compile_json_path_final_key(self, connection: BaseDatabaseWrapper, key_transform: Any) -> str: ... @override def as_sql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, template: str | None = None ) -> _AsSqlType: ... def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class HasKey(HasKeyLookup): postgres_operator: str class HasKeys(HasKeyLookup): postgres_operator: str logical_operator: str class HasAnyKeys(HasKeys): postgres_operator: str logical_operator: str class HasKeyOrArrayIndex(HasKey): @override def compile_json_path_final_key(self, connection: BaseDatabaseWrapper, key_transform: Any) -> str: ... class JSONExact(lookups.Exact): ... class CaseInsensitiveMixin: # `process_lhs` drops `lhs` from `Lookup.process_lhs`, matching runtime. def process_lhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... def process_rhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class JSONIContains(CaseInsensitiveMixin, lookups.IContains): ... # type: ignore[misc] class KeyTransform(Transform): key_name: str postgres_operator: str postgres_nested_operator: str def __init__(self, key_name: Any, *args: Any, **kwargs: Any) -> None: ... def preprocess_lhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> Any: ... def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... def as_postgresql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... @override def as_sqlite( # type: ignore[override] self, compiler: SQLCompiler, connection: BaseDatabaseWrapper ) -> _AsSqlType: ... class KeyTextTransform(KeyTransform): postgres_operator: str postgres_nested_operator: str output_field: ClassVar[TextField[Any, Any]] @override def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... @classmethod def from_lookup(cls, lookup: str) -> Self: ... KT: Callable[[str], KeyTextTransform] class KeyTransformTextLookupMixin: def __init__(self, key_transform: Any, *args: Any, **kwargs: Any) -> None: ... class KeyTransformIsNull(lookups.IsNull): def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class KeyTransformIn(lookups.In): ... class KeyTransformExact(JSONExact): ... class KeyTransformIExact(CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IExact): ... # type: ignore[misc] class KeyTransformIContains( # type: ignore[misc] CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IContains ): ... class KeyTransformStartsWith(KeyTransformTextLookupMixin, lookups.StartsWith): ... class KeyTransformIStartsWith( # type: ignore[misc] CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IStartsWith ): ... class KeyTransformEndsWith(KeyTransformTextLookupMixin, lookups.EndsWith): ... class KeyTransformIEndsWith( # type: ignore[misc] CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IEndsWith ): ... class KeyTransformRegex(KeyTransformTextLookupMixin, lookups.Regex): ... class KeyTransformIRegex(CaseInsensitiveMixin, KeyTransformTextLookupMixin, lookups.IRegex): ... # type: ignore[misc] class KeyTransformNumericLookupMixin: def process_rhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class KeyTransformLt(KeyTransformNumericLookupMixin, lookups.LessThan): ... class KeyTransformLte(KeyTransformNumericLookupMixin, lookups.LessThanOrEqual): ... class KeyTransformGt(KeyTransformNumericLookupMixin, lookups.GreaterThan): ... class KeyTransformGte(KeyTransformNumericLookupMixin, lookups.GreaterThanOrEqual): ... class KeyTransformFactory: key_name: Any def __init__(self, key_name: Any) -> None: ... def __call__(self, *args: Any, **kwargs: Any) -> KeyTransform: ... __all__ = ["JSONField"] typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/mixins.pyi000066400000000000000000000012141526064357400266130ustar00rootroot00000000000000from typing import Any from django.core.checks.messages import CheckMessage from django.db.models.base import Model from django.utils.functional import cached_property NOT_PROVIDED: Any class FieldCacheMixin: @cached_property def cache_name(self) -> str: ... def get_cached_value(self, instance: Model, default: Any = ...) -> Model | None: ... def is_cached(self, instance: Model) -> bool: ... def set_cached_value(self, instance: Model, value: Model | None) -> None: ... def delete_cached_value(self, instance: Model) -> None: ... class CheckFieldDefaultMixin: def check(self, **kwargs: Any) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/proxy.pyi000066400000000000000000000002531526064357400264670ustar00rootroot00000000000000from typing import Any from django.db.models import fields class OrderWrt(fields.IntegerField[Any, Any]): def __init__(self, *args: Any, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/related.pyi000066400000000000000000000413401526064357400267300ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Sequence from typing import Any, Generic, Literal, Self, overload from uuid import UUID from django import forms from django.core.validators import _ValidatorCallable from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.base import Model from django.db.models.expressions import Combinable, Expression from django.db.models.fields import NOT_PROVIDED, Field, _AllLimitChoicesTo, _ErrorMessagesMapping, _LimitChoicesTo from django.db.models.fields.mixins import FieldCacheMixin from django.db.models.fields.related_descriptors import ForeignKeyDeferredAttribute, ManyRelatedManager from django.db.models.fields.related_descriptors import ForwardManyToOneDescriptor as ForwardManyToOneDescriptor from django.db.models.fields.related_descriptors import ForwardOneToOneDescriptor as ForwardOneToOneDescriptor from django.db.models.fields.related_descriptors import ManyToManyDescriptor as ManyToManyDescriptor from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor as ReverseManyToOneDescriptor from django.db.models.fields.related_descriptors import ReverseOneToOneDescriptor as ReverseOneToOneDescriptor from django.db.models.fields.reverse_related import ForeignObjectRel as ForeignObjectRel from django.db.models.fields.reverse_related import ManyToManyRel as ManyToManyRel from django.db.models.fields.reverse_related import ManyToOneRel as ManyToOneRel from django.db.models.fields.reverse_related import OneToOneRel as OneToOneRel from django.db.models.query_utils import FilteredRelation, PathInfo, Q from django.db.models.sql.where import WhereNode from django.forms.widgets import Widget from django.utils.choices import _Choices from django.utils.functional import _StrOrPromise, cached_property from typing_extensions import TypeVar, override RECURSIVE_RELATIONSHIP_CONSTANT: Literal["self"] def resolve_relation(scope_model: type[Model], relation: str | type[Model]) -> str | type[Model]: ... def lazy_related_operation( function: Callable[..., Any], model: type[Model], *related_models: type[Model] | str, **kwargs: Any ) -> None: ... # __set__ value type _ST = TypeVar("_ST", contravariant=True) # __get__ return type _GT = TypeVar("_GT", covariant=True, default=_ST) class RelatedField(FieldCacheMixin, Field[_ST, _GT]): one_to_many: bool one_to_one: bool many_to_many: bool many_to_one: bool opts: Any remote_field: ForeignObjectRel rel_class: type[ForeignObjectRel] def __init__( self, related_name: str | None = None, related_query_name: str | None = None, limit_choices_to: _AllLimitChoicesTo | None = None, *, verbose_name: _StrOrPromise | None = ..., name: str | None = ..., primary_key: bool = ..., max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., rel: ForeignObjectRel | None = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _Choices | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_tablespace: str | None = ..., auto_created: bool = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., db_comment: str | None = ..., ) -> None: ... @cached_property @override def related_model(self) -> type[Model]: ... # type: ignore[override] @override def contribute_to_class(self, cls: type[Model], name: str, private_only: bool = False, **kwargs: Any) -> None: ... def get_forward_related_filter(self, obj: Model) -> dict[str, int | UUID]: ... def get_reverse_related_filter(self, obj: Model) -> Q: ... @property def swappable_setting(self) -> str | None: ... def set_attributes_from_rel(self) -> None: ... def do_related_class(self, other: type[Model], cls: type[Model]) -> None: ... def get_limit_choices_to(self) -> _LimitChoicesTo: ... def related_query_name(self) -> str: ... @property def target_field(self) -> Field[Any, Any]: ... class ForeignObject(RelatedField[_ST, _GT]): remote_field: ForeignObjectRel rel_class: type[ForeignObjectRel] column: None from_fields: Sequence[str] to_fields: Sequence[str | None] # None occurs in ForeignKey, where to_field defaults to None def __init__( self, to: type[Model] | str, on_delete: Callable[..., None], from_fields: Sequence[str], to_fields: Sequence[str], rel: ForeignObjectRel | None = None, related_name: str | None = None, related_query_name: str | None = None, limit_choices_to: _AllLimitChoicesTo | None = None, parent_link: bool = False, swappable: bool = True, *, verbose_name: _StrOrPromise | None = ..., name: str | None = ..., primary_key: bool = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., choices: _Choices | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., db_comment: str | None = ..., ) -> None: ... # class access @overload @override def __get__(self, instance: None, owner: Any) -> ForwardManyToOneDescriptor[Self]: ... # Model instance access @overload @override def __get__(self, instance: Model, owner: Any) -> _GT: ... # non-Model instances @overload @override def __get__(self, instance: Any, owner: Any) -> Self: ... def resolve_related_fields(self) -> list[tuple[Field[Any, Any], Field[Any, Any]]]: ... @cached_property def related_fields(self) -> list[tuple[Field[Any, Any], Field[Any, Any]]]: ... @cached_property def reverse_related_fields(self) -> list[tuple[Field[Any, Any], Field[Any, Any]]]: ... @cached_property def local_related_fields(self) -> tuple[Field[Any, Any], ...]: ... @cached_property def foreign_related_fields(self) -> tuple[Field[Any, Any], ...]: ... @property @override def non_db_attrs(self) -> tuple[str, ...]: ... # type: ignore[override] def get_local_related_value(self, instance: Model) -> tuple[Any, ...]: ... def get_foreign_related_value(self, instance: Model) -> tuple[Any, ...]: ... @staticmethod def get_instance_value_for_fields(instance: Model, fields: Sequence[Field[Any, Any]]) -> tuple[Any, ...]: ... def get_joining_fields(self, reverse_join: bool = False) -> tuple[tuple[Field[Any, Any], Field[Any, Any]], ...]: ... def get_reverse_joining_fields(self) -> tuple[tuple[Field[Any, Any], Field[Any, Any]], ...]: ... def get_extra_descriptor_filter(self, instance: Model) -> dict[str, Any] | Q: ... def get_extra_restriction(self, alias: str, related_alias: str) -> WhereNode | None: ... def get_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ... @cached_property def path_infos(self) -> list[PathInfo]: ... def get_reverse_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ... @cached_property def reverse_path_infos(self) -> list[PathInfo]: ... def contribute_to_related_class(self, cls: type[Model], related: RelatedField[Any, Any]) -> None: ... @override def get_attname_column(self) -> tuple[str, None]: ... forward_related_accessor_class: type[ForwardManyToOneDescriptor[Any]] related_accessor_class: type[ReverseManyToOneDescriptor[Any]] requires_unique_target: bool class ForeignKey(ForeignObject[_ST, _GT]): _pyi_private_set_type: Any | Combinable _pyi_private_get_type: Any descriptor_class: type[ForeignKeyDeferredAttribute] remote_field: ManyToOneRel rel_class: type[ManyToOneRel] column: str # type: ignore[assignment] def __init__( self, to: type[Model] | str, on_delete: Callable[..., None], related_name: str | None = None, related_query_name: str | None = None, limit_choices_to: _AllLimitChoicesTo | None = None, parent_link: bool = False, to_field: str | None = None, db_constraint: bool = True, *, swappable: bool = ..., verbose_name: _StrOrPromise | None = ..., name: str | None = ..., primary_key: bool = ..., max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _Choices | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., db_comment: str | None = ..., ) -> None: ... @classmethod def __class_getitem__(cls, *args: Any, **kwargs: Any) -> type[Self]: ... @override def contribute_to_related_class(self, cls: type[Model], related: RelatedField[Any, Any]) -> None: ... @override def formfield( self, *, form_class: type[forms.Field] | None = ..., choices_form_class: type[forms.ChoiceField] | None = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., # ForeignKey adds `using` using: str | None = ..., **kwargs: Any, ) -> forms.Field | None: ... @override def cast_db_type(self, connection: BaseDatabaseWrapper) -> str | None: ... def convert_empty_strings(self, value: Any, expression: Expression, connection: BaseDatabaseWrapper) -> Any: ... @override def get_attname_column(self) -> tuple[str, str]: ... # type: ignore[override] class OneToOneField(ForeignKey[_ST, _GT]): _pyi_private_set_type: Any | Combinable _pyi_private_get_type: Any remote_field: OneToOneRel rel_class: type[OneToOneRel] def __init__( self, to: type[Model] | str, on_delete: Callable[..., None], to_field: str | None = None, *, swappable: bool = ..., related_name: str | None = ..., related_query_name: str | None = ..., limit_choices_to: _AllLimitChoicesTo | None = ..., parent_link: bool = ..., db_constraint: bool = ..., verbose_name: _StrOrPromise | None = ..., name: str | None = ..., primary_key: bool = ..., max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., db_default: type[NOT_PROVIDED] | Expression | _ST = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _Choices | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_tablespace: str | None = ..., validators: Iterable[_ValidatorCallable] = ..., error_messages: _ErrorMessagesMapping | None = ..., db_comment: str | None = ..., ) -> None: ... # class access @overload @override def __get__(self, instance: None, owner: Any) -> ForwardOneToOneDescriptor[Self]: ... # Model instance access @overload @override def __get__(self, instance: Model, owner: Any) -> _GT: ... # non-Model instances @overload @override def __get__(self, instance: Any, owner: Any) -> Self: ... forward_related_accessor_class: type[ForwardOneToOneDescriptor[Any]] related_accessor_class: type[ReverseOneToOneDescriptor[Any, Any]] # type: ignore[assignment] _Through = TypeVar("_Through", bound=Model, default=Any) _To = TypeVar("_To", bound=Model) class ManyToManyField(RelatedField[Any, Any], Generic[_To, _Through]): has_null_arg: bool swappable: bool many_to_many: Literal[True] many_to_one: Literal[False] one_to_many: Literal[False] one_to_one: Literal[False] remote_field: ManyToManyRel rel_class: type[ManyToManyRel] column: None def __init__( self, to: type[_To] | str, related_name: str | None = None, related_query_name: str | None = None, limit_choices_to: _AllLimitChoicesTo | None = None, symmetrical: bool | None = None, through: type[_Through] | str | None = None, through_fields: tuple[str, str] | None = None, db_constraint: bool = True, db_table: str | None = None, swappable: bool = True, *, verbose_name: _StrOrPromise | None = ..., name: str | None = ..., primary_key: bool = ..., max_length: int | None = ..., unique: bool = ..., blank: bool = ..., null: bool = ..., db_index: bool = ..., default: Any = ..., editable: bool = ..., auto_created: bool = ..., serialize: bool = ..., unique_for_date: str | None = ..., unique_for_month: str | None = ..., unique_for_year: str | None = ..., choices: _Choices | None = ..., help_text: _StrOrPromise = ..., db_column: str | None = ..., db_tablespace: str | None = ..., error_messages: _ErrorMessagesMapping | None = ..., db_comment: str | None = ..., ) -> None: ... # class access @overload @override def __get__(self, instance: None, owner: Any) -> ManyToManyDescriptor[_To, _Through]: ... # Model instance access @overload @override def __get__(self, instance: Model, owner: Any) -> ManyRelatedManager[_To, _Through]: ... # non-Model instances @overload @override def __get__(self, instance: Any, owner: Any) -> Self: ... def get_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ... def get_reverse_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ... @override def contribute_to_class(self, cls: type[Model], name: str, **kwargs: Any) -> None: ... # type: ignore[override] def contribute_to_related_class(self, cls: type[Model], related: RelatedField[Any, Any]) -> None: ... @override def get_attname_column(self) -> tuple[str, None]: ... def m2m_db_table(self) -> str: ... def m2m_column_name(self) -> str: ... def m2m_reverse_name(self) -> str: ... def m2m_field_name(self) -> str: ... def m2m_reverse_field_name(self) -> str: ... def m2m_target_field_name(self) -> str: ... def m2m_reverse_target_field_name(self) -> str: ... @override def formfield( self, *, form_class: type[forms.Field] | None = ..., choices_form_class: type[forms.ChoiceField] | None = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., # ManyToManyField adds `using` using: str | None = ..., **kwargs: Any, ) -> forms.Field | None: ... @cached_property def path_infos(self) -> list[PathInfo]: ... @cached_property def reverse_path_infos(self) -> list[PathInfo]: ... def create_many_to_many_intermediary_model(field: ManyToManyField[Any, Any], klass: type[Model]) -> type[Model]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/related_descriptors.pyi000066400000000000000000000223621526064357400313540ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Mapping from typing import Any, Generic, Never, Self, overload, type_check_only from django.core.exceptions import ObjectDoesNotExist from django.db.models.base import Model from django.db.models.fields import Field from django.db.models.fields.related import ForeignKey, ManyToManyField, RelatedField from django.db.models.fields.reverse_related import ManyToManyRel, ManyToOneRel, OneToOneRel from django.db.models.manager import BaseManager, Manager from django.db.models.query import QuerySet from django.db.models.query_utils import DeferredAttribute from django.utils.functional import cached_property from typing_extensions import TypeVar, override _M = TypeVar("_M", bound=Model) _F = TypeVar("_F", bound=Field[Any, Any]) _From = TypeVar("_From", bound=Model) _Through = TypeVar("_Through", bound=Model, default=Model) _To = TypeVar("_To", bound=Model) class ForeignKeyDeferredAttribute(DeferredAttribute): field: RelatedField[Any, Any] def __set__(self, instance: Model, value: Any) -> None: ... class ForwardManyToOneDescriptor(Generic[_F]): field: _F def __init__(self, field_with_rel: _F) -> None: ... @cached_property def RelatedObjectDoesNotExist(self) -> type[ObjectDoesNotExist]: ... def is_cached(self, instance: Model) -> bool: ... def get_queryset(self, *, instance: Model) -> QuerySet[Any]: ... def get_prefetch_querysets( self, instances: list[Model], querysets: list[QuerySet[Any]] | None = None ) -> tuple[QuerySet[Any], Callable[..., Any], Callable[..., Any], bool, str, bool]: ... def get_object(self, instance: Model) -> Model: ... def __get__( self, instance: Model | None, cls: type[Model] | None = None ) -> Model | ForwardManyToOneDescriptor[Any] | None: ... def fetch_one(self, instance: Model) -> None: ... def fetch_many(self, instances: Iterable[Model]) -> None: ... def __set__(self, instance: Model, value: Model | None) -> None: ... @override def __reduce__(self) -> tuple[Callable[..., Any], tuple[type[Model], str]]: ... class ForwardOneToOneDescriptor(ForwardManyToOneDescriptor[_F]): @override def get_object(self, instance: Model) -> Model: ... class ReverseOneToOneDescriptor(Generic[_From, _To]): """ In the example:: class Restaurant(Model): place = OneToOneField(Place, related_name='restaurant') ``Place.restaurant`` is a ``ReverseOneToOneDescriptor`` instance. """ related: OneToOneRel def __init__(self, related: OneToOneRel) -> None: ... @cached_property def RelatedObjectDoesNotExist(self) -> type[ObjectDoesNotExist]: ... def is_cached(self, instance: _From) -> bool: ... def get_queryset(self, *, instance: Model) -> QuerySet[_To]: ... def get_prefetch_querysets( self, instances: list[_From], querysets: list[QuerySet[_To]] | None = None ) -> tuple[QuerySet[_To], Callable[..., Any], Callable[..., Any], bool, str, bool]: ... @overload def __get__(self, instance: None, cls: Any | None = None) -> ReverseOneToOneDescriptor[_From, _To]: ... @overload def __get__(self, instance: _From, cls: Any | None = None) -> _To: ... # For compatibility with the fetcher protocol. While `self.related` is really a `OneToOneRel`, # it quacks enough like a `Field` to work. @property def field(self) -> Field[Any, Any]: ... def fetch_one(self, instance: Model) -> None: ... def fetch_many(self, instances: Iterable[Model]) -> None: ... def __set__(self, instance: _From, value: _To | None) -> None: ... @override def __reduce__(self) -> tuple[Callable[..., Any], tuple[type[_To], str]]: ... class ReverseManyToOneDescriptor(Generic[_To]): """ In the example:: class Child(Model): parent = ForeignKey(Parent, related_name='children') ``Parent.children`` is a ``ReverseManyToOneDescriptor`` instance. """ rel: ManyToOneRel field: ForeignKey[_To, _To] def __init__(self, rel: ManyToOneRel) -> None: ... @cached_property def related_manager_cls(self) -> type[RelatedManager[_To]]: ... @overload def __get__(self, instance: None, cls: Any | None = None) -> Self: ... @overload def __get__(self, instance: Model, cls: Any | None = None) -> RelatedManager[_To]: ... def __set__(self, instance: Any, value: Any) -> Never: ... # Fake class, Django defines 'RelatedManager' inside a function body @type_check_only class RelatedManager(Manager[_To], Generic[_To]): related_val: tuple[int, ...] # Related managers are bound to model instances, so we allow instance access. @override def __get__(self, instance: object, cls: type[Any] | None = None) -> Self: ... def __call__(self, *, manager: str) -> RelatedManager[_To]: ... def add(self, *objs: _To | int, bulk: bool = ...) -> None: ... async def aadd(self, *objs: _To | int, bulk: bool = ...) -> None: ... def remove(self, *objs: _To | int, bulk: bool = ...) -> None: ... async def aremove(self, *objs: _To | int, bulk: bool = ...) -> None: ... def clear(self, *, bulk: bool = ...) -> None: ... async def aclear(self, *, bulk: bool = ...) -> None: ... def set( self, objs: QuerySet[_To] | Iterable[_To | int], *, bulk: bool = ..., clear: bool = ..., ) -> None: ... async def aset( self, objs: QuerySet[_To] | Iterable[_To | int], *, bulk: bool = ..., clear: bool = ..., ) -> None: ... def create_reverse_many_to_one_manager( superclass: type[BaseManager[_M]], rel: ManyToOneRel ) -> type[RelatedManager[_M]]: ... class ManyToManyDescriptor(ReverseManyToOneDescriptor[Any], Generic[_To, _Through]): """ In the example:: class Pizza(Model): toppings = ManyToManyField(Topping, related_name='pizzas') ``Pizza.toppings`` and ``Topping.pizzas`` are ``ManyToManyDescriptor`` instances. """ # 'field' here is 'rel.field' rel: ManyToManyRel # type: ignore[assignment] field: ManyToManyField[_To, _Through] # type: ignore[assignment] reverse: bool def __init__(self, rel: ManyToManyRel, reverse: bool = False) -> None: ... @property def through(self) -> type[_Through]: ... @cached_property @override def related_manager_cls(self) -> type[ManyRelatedManager[_To, _Through]]: ... # type: ignore[override] @overload # type: ignore[override] def __get__(self, instance: None, cls: Any | None = None) -> Self: ... @overload @override def __get__(self, instance: Model, cls: Any | None = None) -> ManyRelatedManager[_To, _Through]: ... # Fake class, Django defines 'ManyRelatedManager' inside a function body @type_check_only class ManyRelatedManager(Manager[_To], Generic[_To, _Through]): related_val: tuple[int, ...] # See `RelatedManager.__get__` @override def __get__(self, instance: object, cls: type[Any] | None = None) -> Self: ... through: type[_Through] def __call__(self, *, manager: str) -> ManyRelatedManager[_To, _Through]: ... def add( self, *objs: _To | int, through_defaults: Mapping[str, Any] | None = ..., ) -> None: ... async def aadd( self, *objs: _To | int, through_defaults: Mapping[str, Any] | None = ..., ) -> None: ... def remove(self, *objs: _To | int) -> None: ... async def aremove(self, *objs: _To | int) -> None: ... def clear(self) -> None: ... async def aclear(self) -> None: ... def set( self, objs: QuerySet[_To] | Iterable[_To | int], *, clear: bool = ..., through_defaults: Mapping[str, Any] | None = ..., ) -> None: ... async def aset( self, objs: QuerySet[_To] | Iterable[_To | int], *, clear: bool = ..., through_defaults: Mapping[str, Any] | None = ..., ) -> None: ... @override def create( self, *, through_defaults: Mapping[str, Any] | None = ..., **kwargs: Any, ) -> _To: ... @override async def acreate( self, *, through_defaults: Mapping[str, Any] | None = ..., **kwargs: Any, ) -> _To: ... @override def get_or_create( self, defaults: Mapping[str, Any] | None = ..., through_defaults: Mapping[str, Any] | None = ..., **kwargs: Any, ) -> tuple[_To, bool]: ... @override async def aget_or_create( self, defaults: Mapping[str, Any] | None = ..., through_defaults: Mapping[str, Any] | None = ..., **kwargs: Any, ) -> tuple[_To, bool]: ... @override def update_or_create( self, defaults: Mapping[str, Any] | None = ..., create_defaults: Mapping[str, Any] | None = ..., through_defaults: Mapping[str, Any] | None = ..., **kwargs: Any, ) -> tuple[_To, bool]: ... @override async def aupdate_or_create( self, defaults: Mapping[str, Any] | None = ..., create_defaults: Mapping[str, Any] | None = ..., through_defaults: Mapping[str, Any] | None = ..., **kwargs: Any, ) -> tuple[_To, bool]: ... def create_forward_many_to_many_manager( superclass: type[BaseManager[_To]], rel: ManyToManyRel, reverse: bool ) -> type[ManyRelatedManager[_To, _Through]]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/related_lookups.pyi000066400000000000000000000020351526064357400305020ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.lookups import Exact, GreaterThan, GreaterThanOrEqual, In, IsNull, LessThan, LessThanOrEqual from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override def get_normalized_value(value: Any, lhs: Any) -> tuple[Any, ...]: ... class RelatedIn(In): @override def get_prep_lookup(self) -> Iterable[Any]: ... class RelatedLookupMixin: rhs: Any def get_prep_lookup(self) -> Any: ... def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class RelatedExact(RelatedLookupMixin, Exact): ... class RelatedLessThan(RelatedLookupMixin, LessThan): ... class RelatedGreaterThan(RelatedLookupMixin, GreaterThan): ... class RelatedGreaterThanOrEqual(RelatedLookupMixin, GreaterThanOrEqual): ... class RelatedLessThanOrEqual(RelatedLookupMixin, LessThanOrEqual): ... class RelatedIsNull(RelatedLookupMixin, IsNull): ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/reverse_related.pyi000066400000000000000000000127021526064357400304630ustar00rootroot00000000000000from collections.abc import Callable, Sequence from typing import Any, Literal from django.db.models.base import Model from django.db.models.fields import Field, _AllLimitChoicesTo, _ChoicesList, _LimitChoicesTo from django.db.models.fields.related import ForeignKey, ForeignObject, ManyToManyField, OneToOneField from django.db.models.lookups import Lookup, StartsWith, Transform from django.db.models.query import _OrderByFieldName from django.db.models.query_utils import FilteredRelation, PathInfo from django.db.models.sql.where import WhereNode from django.utils.functional import cached_property from typing_extensions import override from .mixins import FieldCacheMixin # Common note: `model` and `through` can be of type `str` when passed to `__init__`. # When parent's `contribute_to_class` is called (during startup), # strings are resolved to real model classes. # Thus `str` is acceptable in __init__, but instance attribute `model` is always # `Type[Model]` class ForeignObjectRel(FieldCacheMixin): auto_created: bool concrete: Literal[False] editable: bool empty_strings_allowed: bool is_relation: bool null: bool field: ForeignObject[Any, Any] model: type[Model] related_name: str | None related_query_name: str | None limit_choices_to: _AllLimitChoicesTo | None parent_link: bool on_delete: Callable[..., Any] | None symmetrical: bool multiple: bool field_name: str | None def __init__( self, field: ForeignObject[Any, Any], to: type[Model] | str, related_name: str | None = None, related_query_name: str | None = None, limit_choices_to: _AllLimitChoicesTo | None = None, parent_link: bool = False, on_delete: Callable[..., Any] | None = None, ) -> None: ... @cached_property def hidden(self) -> bool: ... @cached_property def name(self) -> str: ... @property def remote_field(self) -> ForeignObject[Any, Any]: ... @property def target_field(self) -> Field[Any, Any]: ... @cached_property def related_model(self) -> type[Model]: ... @cached_property def many_to_many(self) -> bool: ... @cached_property def many_to_one(self) -> bool: ... @cached_property def one_to_many(self) -> bool: ... @cached_property def one_to_one(self) -> bool: ... def get_lookup(self, lookup_name: str) -> type[Lookup] | None: ... def get_lookups(self) -> dict[str, Any]: ... def get_transform(self, name: str) -> type[Transform] | None: ... def get_internal_type(self) -> str: ... @property def db_type(self) -> Any: ... # Yes, seems that `get_choices` will fail if `limit_choices_to=None` # and `self.limit_choices_to` is callable. def get_choices( self, include_blank: bool = True, blank_choice: _ChoicesList | None = None, limit_choices_to: _LimitChoicesTo | None = None, ordering: Sequence[_OrderByFieldName] = (), ) -> _ChoicesList: ... def get_joining_fields(self) -> tuple[tuple[Field[Any, Any], Field[Any, Any]], ...]: ... def get_extra_restriction(self, alias: str, related_alias: str) -> StartsWith | WhereNode | None: ... def set_field_name(self) -> None: ... @property def identity(self) -> tuple[Any, ...]: ... @cached_property def accessor_name(self) -> str | None: ... def get_accessor_name(self, model: type[Model] | None = None) -> str | None: ... def get_path_info(self, filtered_relation: FilteredRelation | None = None) -> list[PathInfo]: ... @cached_property def path_infos(self) -> list[PathInfo]: ... class ManyToOneRel(ForeignObjectRel): field: ForeignKey[Any, Any] def __init__( self, field: ForeignKey[Any, Any], to: type[Model] | str, field_name: str, related_name: str | None = None, related_query_name: str | None = None, limit_choices_to: _AllLimitChoicesTo | None = None, parent_link: bool = False, on_delete: Callable[..., Any] | None = None, ) -> None: ... def get_related_field(self) -> Field[Any, Any]: ... @override def get_accessor_name(self, model: type[Model] | None = None) -> str: ... @property @override def identity(self) -> tuple[Any, ...]: ... class OneToOneRel(ManyToOneRel): field: OneToOneField[Any, Any] def __init__( self, field: OneToOneField[Any, Any], to: type[Model] | str, field_name: str | None, related_name: str | None = None, related_query_name: str | None = None, limit_choices_to: _AllLimitChoicesTo | None = None, parent_link: bool = False, on_delete: Callable[..., Any] | None = None, ) -> None: ... class ManyToManyRel(ForeignObjectRel): field: ManyToManyField[Any, Any] # type: ignore[assignment] through: type[Model] | None through_fields: tuple[str, str] | None db_constraint: bool def __init__( self, field: ManyToManyField[Any, Any], to: type[Model] | str, related_name: str | None = None, related_query_name: str | None = None, limit_choices_to: _AllLimitChoicesTo | None = None, symmetrical: bool = True, through: type[Model] | str | None = None, through_fields: tuple[str, str] | None = None, db_constraint: bool = True, ) -> None: ... def get_related_field(self) -> Field[Any, Any]: ... @property @override def identity(self) -> tuple[Any, ...]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/fields/tuple_lookups.pyi000066400000000000000000000041401526064357400302120ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.expressions import Expression, Func from django.db.models.fields import Field from django.db.models.lookups import Exact, GreaterThan, GreaterThanOrEqual, In, IsNull, LessThan, LessThanOrEqual from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override class Tuple(Func): function: str output_field: Field[Any, Any] def __len__(self) -> int: ... def __iter__(self) -> Iterator[Expression]: ... @override def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override] class TupleLookupMixin: allows_composite_expressions: bool def get_prep_lookup(self) -> Any: ... def check_rhs_is_tuple_or_list(self) -> None: ... def check_rhs_length_equals_lhs_length(self) -> None: ... def check_rhs_is_supported_expression(self) -> None: ... def get_lhs_str(self) -> str: ... def get_prep_lhs(self) -> Any: ... def process_lhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, lhs: Any = None) -> _AsSqlType: ... def process_rhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... def get_fallback_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class TupleExact(TupleLookupMixin, Exact): ... class TupleIsNull(TupleLookupMixin, IsNull): ... class TupleGreaterThan(TupleLookupMixin, GreaterThan): ... class TupleGreaterThanOrEqual(TupleLookupMixin, GreaterThanOrEqual): ... class TupleLessThan(TupleLookupMixin, LessThan): ... class TupleLessThanOrEqual(TupleLookupMixin, LessThanOrEqual): ... class TupleIn(TupleLookupMixin, In): def check_rhs_is_collection_of_tuples_or_lists(self) -> None: ... def check_rhs_elements_length_equals_lhs_length(self) -> None: ... def check_rhs_is_query(self) -> None: ... tuple_lookups: dict[str, type[TupleLookupMixin]] typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/000077500000000000000000000000001526064357400253255ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/__init__.pyi000066400000000000000000000114771526064357400276210ustar00rootroot00000000000000from .comparison import Cast as Cast from .comparison import Coalesce as Coalesce from .comparison import Collate as Collate from .comparison import Greatest as Greatest from .comparison import Least as Least from .comparison import NullIf as NullIf from .datetime import Extract as Extract from .datetime import ExtractDay as ExtractDay from .datetime import ExtractHour as ExtractHour from .datetime import ExtractIsoWeekDay as ExtractIsoWeekDay from .datetime import ExtractIsoYear as ExtractIsoYear from .datetime import ExtractMinute as ExtractMinute from .datetime import ExtractMonth as ExtractMonth from .datetime import ExtractQuarter as ExtractQuarter from .datetime import ExtractSecond as ExtractSecond from .datetime import ExtractWeek as ExtractWeek from .datetime import ExtractWeekDay as ExtractWeekDay from .datetime import ExtractYear as ExtractYear from .datetime import Now as Now from .datetime import Trunc as Trunc from .datetime import TruncDate as TruncDate from .datetime import TruncDay as TruncDay from .datetime import TruncHour as TruncHour from .datetime import TruncMinute as TruncMinute from .datetime import TruncMonth as TruncMonth from .datetime import TruncQuarter as TruncQuarter from .datetime import TruncSecond as TruncSecond from .datetime import TruncTime as TruncTime from .datetime import TruncWeek as TruncWeek from .datetime import TruncYear as TruncYear from .json import JSONArray as JSONArray from .json import JSONObject as JSONObject from .math import Abs as Abs from .math import ACos as ACos from .math import ASin as ASin from .math import ATan as ATan from .math import ATan2 as ATan2 from .math import Ceil as Ceil from .math import Cos as Cos from .math import Cot as Cot from .math import Degrees as Degrees from .math import Exp as Exp from .math import Floor as Floor from .math import Ln as Ln from .math import Log as Log from .math import Mod as Mod from .math import Pi as Pi from .math import Power as Power from .math import Radians as Radians from .math import Random as Random from .math import Round as Round from .math import Sign as Sign from .math import Sin as Sin from .math import Sqrt as Sqrt from .math import Tan as Tan from .text import MD5 as MD5 from .text import SHA1 as SHA1 from .text import SHA224 as SHA224 from .text import SHA256 as SHA256 from .text import SHA384 as SHA384 from .text import SHA512 as SHA512 from .text import Chr as Chr from .text import Concat as Concat from .text import ConcatPair as ConcatPair from .text import Left as Left from .text import Length as Length from .text import Lower as Lower from .text import LPad as LPad from .text import LTrim as LTrim from .text import Ord as Ord from .text import Repeat as Repeat from .text import Replace as Replace from .text import Reverse as Reverse from .text import Right as Right from .text import RPad as RPad from .text import RTrim as RTrim from .text import StrIndex as StrIndex from .text import Substr as Substr from .text import Trim as Trim from .text import Upper as Upper from .uuid import UUID4 as UUID4 from .uuid import UUID7 as UUID7 from .window import CumeDist as CumeDist from .window import DenseRank as DenseRank from .window import FirstValue as FirstValue from .window import Lag as Lag from .window import LastValue as LastValue from .window import Lead as Lead from .window import NthValue as NthValue from .window import Ntile as Ntile from .window import PercentRank as PercentRank from .window import Rank as Rank from .window import RowNumber as RowNumber __all__ = [ "MD5", "SHA1", "SHA224", "SHA256", "SHA384", "SHA512", "UUID4", "UUID7", "ACos", "ASin", "ATan", "ATan2", "Abs", "Cast", "Ceil", "Chr", "Coalesce", "Collate", "Concat", "ConcatPair", "Cos", "Cot", "CumeDist", "Degrees", "DenseRank", "Exp", "Extract", "ExtractDay", "ExtractHour", "ExtractIsoWeekDay", "ExtractIsoYear", "ExtractMinute", "ExtractMonth", "ExtractQuarter", "ExtractSecond", "ExtractWeek", "ExtractWeekDay", "ExtractYear", "FirstValue", "Floor", "Greatest", "JSONArray", "JSONObject", "LPad", "LTrim", "Lag", "LastValue", "Lead", "Least", "Left", "Length", "Ln", "Log", "Lower", "Mod", "Now", "NthValue", "Ntile", "NullIf", "Ord", "PercentRank", "Pi", "Power", "RPad", "RTrim", "Radians", "Random", "Rank", "Repeat", "Replace", "Reverse", "Right", "Round", "RowNumber", "Sign", "Sin", "Sqrt", "StrIndex", "Substr", "Tan", "Trim", "Trunc", "TruncDate", "TruncDay", "TruncHour", "TruncMinute", "TruncMonth", "TruncQuarter", "TruncSecond", "TruncTime", "TruncWeek", "TruncYear", "Upper", ] typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/comparison.pyi000066400000000000000000000032411526064357400302220ustar00rootroot00000000000000import re from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Func from django.db.models.expressions import Combinable from django.db.models.fields import Field from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override class Cast(Func): def __init__(self, expression: Combinable | str, output_field: str | Field[Any, Any]) -> None: ... @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... # type: ignore[override] def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Coalesce(Func): @property @override def empty_result_set_value(self) -> Any: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Collate(Func): collation_re: re.Pattern[str] def __init__(self, expression: Combinable | str, collation: str) -> None: ... @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... # type: ignore[override] class Greatest(Func): ... class Least(Func): ... class NullIf(Func): def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/datetime.pyi000066400000000000000000000054431526064357400276520ustar00rootroot00000000000000from datetime import tzinfo from typing import Any, ClassVar from django.db import models from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Func, Transform from django.db.models.expressions import Combinable from django.db.models.fields import Field from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override class TimezoneMixin: tzinfo: Any def get_tzname(self) -> str | None: ... class Extract(TimezoneMixin, Transform): lookup_name: str | None # type: ignore[assignment] output_field: ClassVar[models.IntegerField[Any, Any]] def __init__( self, expression: Combinable | str, lookup_name: str | None = None, tzinfo: Any | None = None, **extra: Any ) -> None: ... @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override] class ExtractYear(Extract): ... class ExtractIsoYear(Extract): ... class ExtractMonth(Extract): ... class ExtractDay(Extract): ... class ExtractWeek(Extract): ... class ExtractWeekDay(Extract): ... class ExtractIsoWeekDay(Extract): ... class ExtractQuarter(Extract): ... class ExtractHour(Extract): ... class ExtractMinute(Extract): ... class ExtractSecond(Extract): ... class Now(Func): output_field: ClassVar[models.DateTimeField[Any, Any]] def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class TruncBase(TimezoneMixin, Transform): kind: str | None tzinfo: Any def __init__( self, expression: Combinable | str, output_field: Field[Any, Any] | None = None, tzinfo: tzinfo | None = None, **extra: Any, ) -> None: ... @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... # type: ignore[override] class Trunc(TruncBase): def __init__( self, expression: Combinable | str, kind: str, output_field: Field[Any, Any] | None = None, tzinfo: tzinfo | None = None, **extra: Any, ) -> None: ... class TruncYear(TruncBase): ... class TruncQuarter(TruncBase): ... class TruncMonth(TruncBase): ... class TruncWeek(TruncBase): ... class TruncDay(TruncBase): ... class TruncDate(TruncBase): output_field: ClassVar[models.DateField[Any, Any]] class TruncTime(TruncBase): output_field: ClassVar[models.TimeField[Any, Any]] class TruncHour(TruncBase): ... class TruncMinute(TruncBase): ... class TruncSecond(TruncBase): ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/json.pyi000066400000000000000000000033001526064357400270150ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any, ClassVar from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.expressions import Func from django.db.models.fields.json import JSONField from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override class JSONArray(Func): output_field: ClassVar[JSONField[Any, Any]] @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... # type: ignore [override] def as_native( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, *, returning: str, **extra_context: Any ) -> _AsSqlType: ... def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class JSONObject(Func): output_field: ClassVar[JSONField[Any, Any]] def __init__(self, **fields: Any) -> None: ... @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... # type: ignore [override] def as_native( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, *, returning: str, **extra_context: Any ) -> _AsSqlType: ... def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... def join(self, args: Sequence[Any]) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/math.pyi000066400000000000000000000045211526064357400270030ustar00rootroot00000000000000from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.expressions import Combinable, Func from django.db.models.functions.mixins import FixDecimalInputMixin, NumericOutputFieldMixin from django.db.models.lookups import Transform from django.db.models.sql.compiler import SQLCompiler, _AsSqlType class Abs(Transform): ... class ACos(NumericOutputFieldMixin, Transform): ... class ASin(NumericOutputFieldMixin, Transform): ... class ATan(NumericOutputFieldMixin, Transform): ... class ATan2(NumericOutputFieldMixin, Func): ... class Ceil(Transform): def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Cos(NumericOutputFieldMixin, Transform): ... class Cot(NumericOutputFieldMixin, Transform): def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Degrees(NumericOutputFieldMixin, Transform): def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Exp(NumericOutputFieldMixin, Transform): ... class Floor(Transform): ... class Ln(NumericOutputFieldMixin, Transform): ... class Log(FixDecimalInputMixin, NumericOutputFieldMixin, Func): ... class Mod(FixDecimalInputMixin, NumericOutputFieldMixin, Func): ... class Pi(NumericOutputFieldMixin, Func): def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Power(NumericOutputFieldMixin, Func): ... class Radians(NumericOutputFieldMixin, Transform): def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Random(NumericOutputFieldMixin, Func): def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Round(FixDecimalInputMixin, Transform): def __init__(self, expression: Combinable | str, precision: int = 0, **extra: Any) -> None: ... class Sin(NumericOutputFieldMixin, Transform): ... class Sqrt(NumericOutputFieldMixin, Transform): ... class Tan(NumericOutputFieldMixin, Transform): ... class Sign(Transform): ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/mixins.pyi000066400000000000000000000011621526064357400273570ustar00rootroot00000000000000from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.sql.compiler import SQLCompiler, _AsSqlType class FixDecimalInputMixin: def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... class FixDurationInputMixin: def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class NumericOutputFieldMixin: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/text.pyi000066400000000000000000000113351526064357400270370ustar00rootroot00000000000000from typing import Any, ClassVar from django.db import models from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Func, Transform from django.db.models.expressions import Combinable, Expression, Value, _OutputField from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override class MySQLSHA2Mixin: def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class OracleHashMixin: def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class PostgreSQLSHAMixin: def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... class Chr(Transform): def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class ConcatPair(Func): def pipes_concat_sql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... as_sqlite = pipes_concat_sql def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... def coalesce(self) -> ConcatPair: ... class Concat(Func): def __init__(self, *expressions: Any, **extra: Any) -> None: ... class Left(Func[_OutputField]): output_field: ClassVar[models.CharField[Any, Any]] def __init__( self, expression: Combinable | str, length: Expression | int, *, output_field: _OutputField | None = None, **extra: Any, ) -> None: ... def get_substr(self) -> Substr: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Length(Transform): output_field: ClassVar[models.IntegerField[Any, Any]] def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Lower(Transform): ... class LPad(Func): output_field: ClassVar[models.CharField[Any, Any]] def __init__( self, expression: Combinable | str, length: Expression | int | None, fill_text: Expression = ..., **extra: Any ) -> None: ... class LTrim(Transform): ... class MD5(OracleHashMixin, Transform): ... class Ord(Transform): output_field: ClassVar[models.IntegerField[Any, Any]] def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Repeat(Func): output_field: ClassVar[models.CharField[Any, Any]] def __init__(self, expression: Combinable | str, number: Expression | int | None, **extra: Any) -> None: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Replace(Func): def __init__(self, expression: Combinable | str, text: Value, replacement: Value = ..., **extra: Any) -> None: ... class Reverse(Transform): def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Right(Left[_OutputField]): @override def get_substr(self) -> Substr: ... class RPad(LPad): ... class RTrim(Transform): ... class SHA1(OracleHashMixin, PostgreSQLSHAMixin, Transform): ... class SHA224(MySQLSHA2Mixin, PostgreSQLSHAMixin, Transform): def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class SHA256(MySQLSHA2Mixin, OracleHashMixin, PostgreSQLSHAMixin, Transform): ... class SHA384(MySQLSHA2Mixin, OracleHashMixin, PostgreSQLSHAMixin, Transform): ... class SHA512(MySQLSHA2Mixin, OracleHashMixin, PostgreSQLSHAMixin, Transform): ... class StrIndex(Func): output_field: ClassVar[models.IntegerField[Any, Any]] def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... class Substr(Func[_OutputField]): output_field: ClassVar[models.CharField[Any, Any]] def __init__( self, expression: Combinable | str, pos: Expression | int, length: Expression | int | None = None, *, output_field: _OutputField | None = None, **extra: Any, ) -> None: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class Trim(Transform): ... class Upper(Transform): ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/uuid.pyi000066400000000000000000000031261526064357400270200ustar00rootroot00000000000000import datetime as dt from typing import Any, ClassVar from django.db import models from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.expressions import Func from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override class UUID4(Func): output_field: ClassVar[models.UUIDField[Any, Any]] @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... # type: ignore[override] def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... class UUID7(Func): output_field: ClassVar[models.UUIDField[Any, Any]] def __init__(self, shift: dt.timedelta | None = None, **extra: Any) -> None: ... @override def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... # type: ignore[override] def as_postgresql( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any ) -> _AsSqlType: ... @override def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... def as_mysql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/functions/window.pyi000066400000000000000000000023331526064357400273600ustar00rootroot00000000000000from typing import Any, ClassVar from django.db import models from django.db.models.expressions import Combinable, Func class CumeDist(Func): output_field: ClassVar[models.FloatField[Any, Any]] class DenseRank(Func): output_field: ClassVar[models.IntegerField[Any, Any]] class FirstValue(Func): ... class LagLeadFunction(Func): def __init__(self, expression: Combinable | str, offset: int = 1, default: Any = None, **extra: Any) -> None: ... class Lag(LagLeadFunction): ... class LastValue(Func): ... class Lead(LagLeadFunction): ... class NthValue(Func): def __init__(self, expression: Combinable | str, nth: int = 1, **extra: Any) -> None: ... class Ntile(Func): def __init__(self, num_buckets: int = 1, **extra: Any) -> None: ... output_field: ClassVar[models.IntegerField[Any, Any]] class PercentRank(Func): output_field: ClassVar[models.FloatField[Any, Any]] class Rank(Func): output_field: ClassVar[models.IntegerField[Any, Any]] class RowNumber(Func): output_field: ClassVar[models.IntegerField[Any, Any]] __all__ = [ "CumeDist", "DenseRank", "FirstValue", "Lag", "LastValue", "Lead", "NthValue", "Ntile", "PercentRank", "Rank", "RowNumber", ] typeddjango-django-stubs-fa03b48/django-stubs/db/models/indexes.pyi000066400000000000000000000047021526064357400255020ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any from django.core.checks import CheckMessage from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.backends.ddl_references import Statement from django.db.models.base import Model from django.db.models.expressions import BaseExpression, Combinable, Expression, Func from django.db.models.query_utils import Q from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from typing_extensions import override class Index: suffix: str max_name_length: int fields: Sequence[str] fields_orders: Sequence[tuple[str, str]] name: str db_tablespace: str | None opclasses: Sequence[str] condition: Q | None expressions: Sequence[BaseExpression | Combinable] include: Sequence[str] def __init__( self, *expressions: BaseExpression | Combinable | str, fields: Sequence[str] = (), name: str | None = None, db_tablespace: str | None = None, opclasses: Sequence[str] = (), condition: Q | None = None, include: Sequence[str] | None = None, ) -> None: ... @property def contains_expressions(self) -> bool: ... def check(self, model: type[Model], connection: BaseDatabaseWrapper) -> list[CheckMessage]: ... def create_sql( self, model: type[Model], schema_editor: BaseDatabaseSchemaEditor, using: str = "", **kwargs: Any ) -> Statement: ... def remove_sql(self, model: type[Model], schema_editor: BaseDatabaseSchemaEditor, **kwargs: Any) -> str: ... def deconstruct(self) -> tuple[str, Sequence[Any], dict[str, Any]]: ... def clone(self) -> Index: ... def set_name_with_model(self, model: type[Model]) -> None: ... class IndexExpression(Func): template: str wrapper_classes: tuple[type[Expression], ...] def set_wrapper_classes(self, connection: Any | None = None) -> None: ... @classmethod def register_wrappers(cls, *wrapper_classes: type[Expression]) -> None: ... @override def resolve_expression( self, query: Any | None = None, allow_joins: bool = True, reuse: set[str] | None = None, summarize: bool = False, for_save: bool = False, ) -> IndexExpression: ... @override def as_sqlite(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, **extra_context: Any) -> _AsSqlType: ... __all__ = ["Index"] typeddjango-django-stubs-fa03b48/django-stubs/db/models/lookups.pyi000066400000000000000000000155601526064357400255430ustar00rootroot00000000000000from collections.abc import Iterable, Sequence from typing import Any, Generic, Literal from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.expressions import Combinable, Expression, Func from django.db.models.fields import BooleanField from django.db.models.query_utils import RegisterLookupMixin from django.db.models.sql.compiler import SQLCompiler, _AsSqlType, _ParamT from django.utils.datastructures import OrderedSet from django.utils.functional import cached_property from typing_extensions import TypeVar, override _T = TypeVar("_T", default=Any) class Lookup(Expression, Generic[_T]): lookup_name: str | None prepare_rhs: bool can_use_none_as_rhs: bool lhs: Any rhs: Any bilateral_transforms: list[type[Transform]] def __init__(self, lhs: Any, rhs: Any) -> None: ... def apply_bilateral_transforms(self, value: Expression) -> Expression: ... def batch_process_rhs( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, rhs: OrderedSet[Any] | None = None ) -> tuple[list[str], list[str]]: ... @override def get_source_expressions(self) -> list[Expression]: ... @override def set_source_expressions(self, new_exprs: Sequence[Combinable | Expression]) -> None: ... def get_prep_lookup(self) -> Any: ... def get_prep_lhs(self) -> Any: ... def get_db_prep_lookup(self, value: _ParamT, connection: BaseDatabaseWrapper) -> _AsSqlType: ... def process_lhs( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, lhs: Expression | None = None ) -> _AsSqlType: ... def process_rhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... def rhs_is_direct_value(self) -> bool: ... def as_oracle(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... @cached_property @override def output_field(self) -> BooleanField[Any, Any]: ... @property @override def identity(self) -> tuple[type[Lookup], Any, Any]: ... @cached_property @override def allowed_default(self) -> bool: ... # type: ignore[override] class Transform(RegisterLookupMixin, Func): bilateral: bool @property def lhs(self) -> Expression: ... def get_bilateral_transforms(self) -> list[type[Transform]]: ... class BuiltinLookup(Lookup[_T]): @override def process_lhs( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, lhs: Expression | None = None ) -> _AsSqlType: ... def get_rhs_op(self, connection: BaseDatabaseWrapper, rhs: str) -> str: ... class FieldGetDbPrepValueMixin: get_db_prep_lookup_value_is_iterable: bool def get_db_prep_lookup(self, value: _ParamT, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class FieldGetDbPrepValueIterableMixin(FieldGetDbPrepValueMixin): get_db_prep_lookup_value_is_iterable: Literal[True] def get_prep_lookup(self) -> Iterable[Any]: ... def process_rhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... def resolve_expression_parameter( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, sql: str, param: Any ) -> _AsSqlType: ... def batch_process_rhs( self, compiler: SQLCompiler, connection: BaseDatabaseWrapper, rhs: OrderedSet[Any] | None = None ) -> tuple[list[str], list[str]]: ... class PostgresOperatorLookup(Lookup[_T]): postgres_operator: str | None def as_postgresql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class Exact(FieldGetDbPrepValueMixin, BuiltinLookup[_T]): ... class IExact(BuiltinLookup[_T]): @override def process_rhs(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class GreaterThan(FieldGetDbPrepValueMixin, BuiltinLookup[_T]): ... class GreaterThanOrEqual(FieldGetDbPrepValueMixin, BuiltinLookup[_T]): ... class LessThan(FieldGetDbPrepValueMixin, BuiltinLookup[_T]): ... class LessThanOrEqual(FieldGetDbPrepValueMixin, BuiltinLookup[_T]): ... class IntegerFieldOverflow: underflow_exception: type[Exception] overflow_exception: type[Exception] def process_rhs(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... class IntegerFieldFloatRounding: rhs: Any def get_prep_lookup(self) -> Any: ... class IntegerFieldExact(IntegerFieldOverflow, Exact[int | float]): ... class IntegerGreaterThan(IntegerFieldOverflow, GreaterThan[int | float]): ... class IntegerGreaterThanOrEqual(IntegerFieldOverflow, IntegerFieldFloatRounding, GreaterThanOrEqual[int | float]): ... class IntegerLessThan(IntegerFieldOverflow, IntegerFieldFloatRounding, LessThan[int | float]): ... class IntegerLessThanOrEqual(IntegerFieldOverflow, LessThanOrEqual[int | float]): ... class In(FieldGetDbPrepValueIterableMixin, BuiltinLookup[Iterable[_T]]): def split_parameter_list_as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> Any: ... class PatternLookup(BuiltinLookup[str]): param_pattern: str @override def process_rhs(self, qn: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... @property def is_simple_lookup(self) -> bool: ... class Contains(PatternLookup): ... class IContains(Contains): ... class StartsWith(PatternLookup): ... class IStartsWith(StartsWith): ... class EndsWith(PatternLookup): ... class IEndsWith(EndsWith): ... class Range(FieldGetDbPrepValueIterableMixin, BuiltinLookup[_T]): ... class IsNull(BuiltinLookup[bool]): ... class Regex(BuiltinLookup[str]): ... class IRegex(Regex): ... class YearLookup(Lookup): def year_lookup_bounds(self, connection: BaseDatabaseWrapper, year: int) -> list[str]: ... def get_direct_rhs_sql(self, connection: BaseDatabaseWrapper, rhs: str) -> str: ... def get_bound_params(self, start: Any, finish: Any) -> Any: ... class YearExact(YearLookup, Exact[_T]): @override def get_bound_params(self, start: Any, finish: Any) -> tuple[Any, Any]: ... class YearGt(YearLookup, GreaterThan[_T]): @override def get_bound_params(self, start: Any, finish: Any) -> tuple[Any]: ... class YearGte(YearLookup, GreaterThanOrEqual[_T]): @override def get_bound_params(self, start: Any, finish: Any) -> tuple[Any]: ... class YearLt(YearLookup, LessThan[_T]): @override def get_bound_params(self, start: Any, finish: Any) -> tuple[Any]: ... class YearLte(YearLookup, LessThanOrEqual[_T]): @override def get_bound_params(self, start: Any, finish: Any) -> tuple[Any]: ... class UUIDTextMixin: rhs: Any def process_rhs(self, qn: Any, connection: BaseDatabaseWrapper) -> Any: ... class UUIDIExact(UUIDTextMixin, IExact[_T]): ... class UUIDContains(UUIDTextMixin, Contains): ... class UUIDIContains(UUIDTextMixin, IContains): ... class UUIDStartsWith(UUIDTextMixin, StartsWith): ... class UUIDIStartsWith(UUIDTextMixin, IStartsWith): ... class UUIDEndsWith(UUIDTextMixin, EndsWith): ... class UUIDIEndsWith(UUIDTextMixin, IEndsWith): ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/manager.pyi000066400000000000000000000221621526064357400254550ustar00rootroot00000000000000import datetime from collections.abc import AsyncIterator, Collection, Iterable, Iterator, Mapping, Sequence from typing import Any, Generic, Literal, NoReturn, Self, overload from django.core.checks.messages import CheckMessage from django.db.models.base import Model from django.db.models.expressions import Combinable, OrderBy from django.db.models.options import Options from django.db.models.query import Prefetch, QuerySet, RawQuerySet, _LookupT, _PrefetchedQuerySetT, _ToAttrT from typing_extensions import TypeVar, override _T = TypeVar("_T", bound=Model, covariant=True) class BaseManager(Generic[_T]): creation_counter: int auto_created: bool use_in_migrations: bool name: str model: type[_T] _db: str | None def __new__(cls, *args: Any, **kwargs: Any) -> Self: ... def __init__(self) -> None: ... def __class_getitem__(cls, *args: Any, **kwargs: Any) -> type[Self]: ... def deconstruct( self, ) -> tuple[bool, str | None, str | None, Sequence[Any] | None, dict[str, Any] | None]: ... def check(self, **kwargs: Any) -> list[CheckMessage]: ... @classmethod def from_queryset(cls, queryset_class: type[QuerySet[_T]], class_name: str | None = None) -> type[Self]: ... @classmethod def _get_queryset_methods(cls, queryset_class: type) -> dict[str, Any]: ... def contribute_to_class(self, cls: type[Model], name: str) -> None: ... def db_manager(self, using: str | None = None, hints: dict[str, Model] | None = None) -> Self: ... @property def db(self) -> str: ... def get_queryset(self) -> QuerySet[_T]: ... def all(self) -> QuerySet[_T]: ... # At runtime, managers declared on a model are wrapped in a `ManagerDescriptor` which raises on instance access. # Accepting only `instance=None` makes `instance.objects` a type error. # `Options` is accepted to work around https://github.com/python/mypy/issues/13608 # mypy re-applies `__get__` to the return type of `Options.base_manager`, passing the `Options` object as `instance`. def __get__(self, instance: Options[Any] | None, cls: type[Any] | None = None) -> Self: ... class Manager(BaseManager[_T]): # NOTE: The following methods are in common with QuerySet, but note that the use of QuerySet as a return type # rather than a self-type (_QS), since Manager's QuerySet-like methods return QuerySets and not Managers. def iterator(self, chunk_size: int | None = ...) -> Iterator[_T]: ... def aiterator(self, chunk_size: int = ...) -> AsyncIterator[_T]: ... def aggregate(self, *args: Any, **kwargs: Any) -> dict[str, Any]: ... async def aaggregate(self, *args: Any, **kwargs: Any) -> dict[str, Any]: ... def get(self, *args: Any, **kwargs: Any) -> _T: ... async def aget(self, *args: Any, **kwargs: Any) -> _T: ... def create(self, **kwargs: Any) -> _T: ... async def acreate(self, **kwargs: Any) -> _T: ... def bulk_create( self, objs: Iterable[_T], batch_size: int | None = ..., ignore_conflicts: bool = ..., update_conflicts: bool = ..., update_fields: Collection[str] | None = ..., unique_fields: Collection[str] | None = ..., ) -> list[_T]: ... async def abulk_create( self, objs: Iterable[_T], batch_size: int | None = ..., ignore_conflicts: bool = ..., update_conflicts: bool = ..., update_fields: Collection[str] | None = ..., unique_fields: Collection[str] | None = ..., ) -> list[_T]: ... def bulk_update(self, objs: Iterable[_T], fields: Iterable[str], batch_size: int | None = ...) -> int: ... async def abulk_update(self, objs: Iterable[_T], fields: Iterable[str], batch_size: int | None = ...) -> int: ... def get_or_create(self, defaults: Mapping[str, Any] | None = ..., **kwargs: Any) -> tuple[_T, bool]: ... async def aget_or_create(self, defaults: Mapping[str, Any] | None = ..., **kwargs: Any) -> tuple[_T, bool]: ... def update_or_create( self, defaults: Mapping[str, Any] | None = ..., create_defaults: Mapping[str, Any] | None = ..., **kwargs: Any, ) -> tuple[_T, bool]: ... async def aupdate_or_create( self, defaults: Mapping[str, Any] | None = ..., create_defaults: Mapping[str, Any] | None = ..., **kwargs: Any, ) -> tuple[_T, bool]: ... def earliest(self, *fields: str | OrderBy) -> _T: ... async def aearliest(self, *fields: str | OrderBy) -> _T: ... def latest(self, *fields: str | OrderBy) -> _T: ... async def alatest(self, *fields: str | OrderBy) -> _T: ... def first(self) -> _T | None: ... async def afirst(self) -> _T | None: ... def last(self) -> _T | None: ... async def alast(self) -> _T | None: ... def in_bulk(self, id_list: Iterable[Any] | None = ..., *, field_name: str = ...) -> dict[Any, _T]: ... async def ain_bulk(self, id_list: Iterable[Any] | None = ..., *, field_name: str = ...) -> dict[Any, _T]: ... def update(self, **kwargs: Any) -> int: ... async def aupdate(self, **kwargs: Any) -> int: ... def exists(self) -> bool: ... async def aexists(self) -> bool: ... def explain(self, *, format: str | None = ..., **options: Any) -> str: ... async def aexplain(self, *, format: str | None = ..., **options: Any) -> str: ... def contains(self, obj: Model) -> bool: ... async def acontains(self, obj: Model) -> bool: ... def raw( self, raw_query: str, params: Any = ..., translations: dict[str, str] | None = ..., using: str | None = ..., ) -> RawQuerySet[_T]: ... # The type of values may be overridden to be more specific in the mypy plugin, depending on the fields param def values(self, *fields: str | Combinable, **expressions: Any) -> QuerySet[_T, dict[str, Any]]: ... # The type of values_list may be overridden to be more specific in the mypy plugin, depending on the fields param def values_list(self, *fields: str | Combinable, flat: bool = ..., named: bool = ...) -> QuerySet[_T, Any]: ... def dates( self, field_name: str, kind: Literal["year", "month", "week", "day"], order: Literal["ASC", "DESC"] = "ASC", ) -> QuerySet[_T, datetime.date]: ... def datetimes( self, field_name: str, kind: Literal["year", "month", "week", "day", "hour", "minute", "second"], order: Literal["ASC", "DESC"] = "ASC", tzinfo: datetime.tzinfo | None = None, ) -> QuerySet[_T, datetime.datetime]: ... def none(self) -> QuerySet[_T]: ... def filter(self, *args: Any, **kwargs: Any) -> QuerySet[_T]: ... def exclude(self, *args: Any, **kwargs: Any) -> QuerySet[_T]: ... def complex_filter(self, filter_obj: Any) -> QuerySet[_T]: ... def count(self) -> int: ... async def acount(self) -> int: ... def union(self, *other_qs: QuerySet[Model, Any], all: bool = ...) -> QuerySet[_T]: ... def intersection(self, *other_qs: QuerySet[Model, Any]) -> QuerySet[_T]: ... def difference(self, *other_qs: QuerySet[Model, Any]) -> QuerySet[_T]: ... def select_for_update( self, nowait: bool = ..., skip_locked: bool = ..., of: Sequence[str] = ..., no_key: bool = ... ) -> QuerySet[_T]: ... @overload def select_related(self, clear: None, /) -> QuerySet[_T]: ... @overload def select_related(self, *fields: str) -> QuerySet[_T]: ... @overload def prefetch_related(self, clear: None, /) -> QuerySet[_T]: ... @overload def prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[_T]: ... def annotate(self, *args: Any, **kwargs: Any) -> QuerySet[_T]: ... def alias(self, *args: Any, **kwargs: Any) -> QuerySet[_T]: ... def order_by(self, *field_names: str | Combinable) -> QuerySet[_T]: ... def distinct(self, *field_names: str) -> QuerySet[_T]: ... # extra() return type won't be supported any time soon def extra( self, select: dict[str, Any] | None = ..., where: list[str] | None = ..., params: list[Any] | None = ..., tables: list[str] | None = ..., order_by: Sequence[str] | None = ..., select_params: Sequence[Any] | None = ..., ) -> QuerySet[Any]: ... def reverse(self) -> QuerySet[_T]: ... @overload def defer(self, clear: None, /) -> QuerySet[_T]: ... @overload def defer(self, *fields: str) -> QuerySet[_T]: ... def only(self, *fields: str) -> QuerySet[_T]: ... def using(self, alias: str | None) -> QuerySet[_T]: ... class ManagerDescriptor: manager: BaseManager[Any] def __init__(self, manager: BaseManager[Any]) -> None: ... @overload def __get__(self, instance: None, cls: type[Model] | None = None) -> BaseManager[Any]: ... @overload def __get__(self, instance: Model, cls: type[Model] | None = None) -> NoReturn: ... class EmptyManager(Manager[_T]): def __init__(self, model: type[_T]) -> None: ... # Unlike other managers, `EmptyManager` is exposed through properties of plain classes (e.g. `AnonymousUser.groups`) # where instance access is legitimate. @override def __get__(self, instance: object, cls: type[Any] | None = None) -> Self: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/options.pyi000066400000000000000000000136571526064357400255470ustar00rootroot00000000000000from collections.abc import Iterable, Sequence from typing import Any, Generic, TypeAlias, overload from django.apps.config import AppConfig from django.apps.registry import Apps from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.base import Model from django.db.models.constraints import BaseConstraint, UniqueConstraint from django.db.models.fields import AutoField, Field from django.db.models.fields.related import ManyToManyField, OneToOneField from django.db.models.fields.reverse_related import ForeignObjectRel from django.db.models.manager import Manager from django.db.models.query import _OrderByFieldName from django.db.models.query_utils import PathInfo from django.utils.datastructures import ImmutableList, _ListOrTuple from django.utils.functional import _StrOrPromise, cached_property from typing_extensions import TypeVar PROXY_PARENTS: object EMPTY_RELATION_TREE: Any IMMUTABLE_WARNING: str DEFAULT_NAMES: tuple[str, ...] _OptionTogetherT: TypeAlias = _ListOrTuple[_ListOrTuple[str] | str] | set[tuple[str, ...]] # noqa: PYI047 _AnyField: TypeAlias = Field[Any, Any] | ForeignObjectRel @overload def normalize_together(option_together: _ListOrTuple[_ListOrTuple[str] | str]) -> tuple[tuple[str, ...], ...]: ... # Any other value will be returned unchanged, but probably only set is semantically allowed @overload def normalize_together(option_together: set[tuple[str, ...]]) -> set[tuple[str, ...]]: ... _T = TypeVar("_T") def make_immutable_fields_list(name: str, data: Iterable[_T]) -> ImmutableList[_T]: ... _M = TypeVar("_M", bound=Model) class Options(Generic[_M]): constraints: _ListOrTuple[BaseConstraint] FORWARD_PROPERTIES: set[str] REVERSE_PROPERTIES: set[str] default_apps: Any local_fields: list[Field[Any, Any]] local_many_to_many: list[ManyToManyField[Any, Any]] private_fields: list[Any] local_managers: list[Manager[_M]] base_manager_name: str | None default_manager_name: str | None model_name: str | None verbose_name: _StrOrPromise | None verbose_name_plural: _StrOrPromise | None db_table: str db_table_comment: str ordering: Sequence[_OrderByFieldName] | None indexes: _ListOrTuple[Any] unique_together: Sequence[tuple[str, ...]] # Are always normalized select_on_save: bool default_permissions: Sequence[str] permissions: _ListOrTuple[Any] object_name: str | None app_label: str get_latest_by: Sequence[str] | None order_with_respect_to: str | None db_tablespace: str required_db_features: _ListOrTuple[str] required_db_vendor: str | None meta: type | None pk: Field[Any, Any] auto_field: AutoField[Any, Any] | None abstract: bool managed: bool proxy: bool proxy_for_model: type[Model] | None concrete_model: type[Model] | None swappable: str | None parents: dict[type[Model], Field[Any, Any] | None] auto_created: bool related_fkey_lookups: list[Any] apps: Apps default_related_name: str | None model: type[Model] original_attrs: dict[str, Any] def __init__(self, meta: type | None, app_label: str | None = None) -> None: ... @property def label(self) -> str: ... @property def label_lower(self) -> str: ... @property def app_config(self) -> AppConfig: ... def contribute_to_class(self, cls: type[Model], name: str) -> None: ... def add_manager(self, manager: Manager[_M]) -> None: ... def add_field(self, field: Field[Any, Any], private: bool = False) -> None: ... # if GenericForeignKey is passed as argument, it has primary_key = True set before def setup_pk(self, field: Field[Any, Any]) -> None: ... def setup_proxy(self, target: type[Model]) -> None: ... def can_migrate(self, connection: BaseDatabaseWrapper | str) -> bool: ... @cached_property def verbose_name_raw(self) -> str: ... @cached_property def swapped(self) -> str | None: ... def setting_changed(self, *, setting: str, **kwargs: Any) -> None: ... @cached_property def managers(self) -> ImmutableList[Manager[_M]]: ... @cached_property def managers_map(self) -> dict[str, Manager[_M]]: ... @cached_property def base_manager(self) -> Manager[_M]: ... @cached_property def default_manager(self) -> Manager[_M] | None: ... @cached_property def fields(self) -> ImmutableList[Field[Any, Any]]: ... @cached_property def concrete_fields(self) -> ImmutableList[Field[Any, Any]]: ... @cached_property def local_concrete_fields(self) -> ImmutableList[Field[Any, Any]]: ... @cached_property def many_to_many(self) -> ImmutableList[ManyToManyField[Any, Any]]: ... @cached_property def related_objects(self) -> ImmutableList[ForeignObjectRel]: ... @cached_property def fields_map(self) -> dict[str, _AnyField]: ... def get_field(self, field_name: str) -> _AnyField: ... def get_base_chain(self, model: type[Model]) -> list[type[Model]]: ... @cached_property def all_parents(self) -> tuple[type[Model]]: ... def get_parent_list(self) -> list[type[Model]]: ... def get_ancestor_link(self, ancestor: type[Model]) -> OneToOneField[Any, Any] | None: ... def get_path_to_parent(self, parent: type[Model]) -> list[PathInfo]: ... def get_path_from_parent(self, parent: type[Model]) -> list[PathInfo]: ... def get_fields(self, include_parents: bool = True, include_hidden: bool = False) -> list[_AnyField]: ... def _get_fields( self, forward: bool = True, reverse: bool = True, include_parents: bool | object = True, include_hidden: bool = False, topmost_call: bool = True, ) -> list[_AnyField]: ... @cached_property def total_unique_constraints(self) -> list[UniqueConstraint]: ... @cached_property def pk_fields(self) -> list[Field[Any, Any]]: ... @property def is_composite_pk(self) -> bool: ... @cached_property def db_returning_fields(self) -> list[Field[Any, Any]]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/query.pyi000066400000000000000000000355661526064357400252240ustar00rootroot00000000000000import datetime from collections.abc import AsyncIterator, Collection, Iterable, Iterator, Mapping, Sequence, Sized from types import TracebackType from typing import Any, Generic, Literal, NamedTuple, Self, TypeAlias, overload, type_check_only from django.db.backends.utils import _ExecuteQuery from django.db.models import Manager from django.db.models.base import Model from django.db.models.expressions import Combinable, OrderBy from django.db.models.fetch_modes import FetchMode from django.db.models.sql.query import Query, RawQuery from django.db.models.utils import AltersData from django.utils.functional import cached_property from typing_extensions import TypeVar, override _T = TypeVar("_T", covariant=True) _ContainsT = TypeVar("_ContainsT") _Model = TypeVar("_Model", bound=Model, covariant=True) _Row = TypeVar("_Row", covariant=True, default=_Model) # ONLY use together with _Model _TupleT = TypeVar("_TupleT", bound=tuple[Any, ...], covariant=True) # The type of the lookup passed to Prefetch(...) # This will be specialized to a `LiteralString` in the plugin for further processing and validation _LookupT = TypeVar("_LookupT", bound=str, covariant=True) # The type of the queryset passed to Prefetch(...) _PrefetchedQuerySetT = TypeVar("_PrefetchedQuerySetT", bound=QuerySet[Model], covariant=True, default=QuerySet[Model]) # The attribute name to store the prefetched list[_PrefetchedQuerySetT] # This will be specialized to a `LiteralString` in the plugin for further processing and validation _ToAttrT = TypeVar("_ToAttrT", bound=str, covariant=True, default=str) _OrderByFieldName: TypeAlias = str | Combinable MAX_GET_RESULTS: int REPR_OUTPUT_SIZE: int DEFAULT_FETCH_MODE: FetchMode PROHIBITED_FILTER_KWARGS: frozenset[str] class BaseIterable(Generic[_T]): queryset: QuerySet[Model] chunked_fetch: bool chunk_size: int def __init__(self, queryset: QuerySet[Model], chunked_fetch: bool = False, chunk_size: int = 100) -> None: ... def __aiter__(self) -> AsyncIterator[_T]: ... class ModelIterable(BaseIterable[_Model], Generic[_Model]): def __iter__(self) -> Iterator[_Model]: ... class RawModelIterable(BaseIterable[dict[str, Any]]): def __iter__(self) -> Iterator[dict[str, Any]]: ... class ValuesIterable(BaseIterable[dict[str, Any]]): def __iter__(self) -> Iterator[dict[str, Any]]: ... class ValuesListIterable(BaseIterable[_TupleT]): def __iter__(self) -> Iterator[_TupleT]: ... class NamedValuesListIterable(ValuesListIterable[NamedTuple]): @override def __iter__(self) -> Iterator[NamedTuple]: ... class FlatValuesListIterable(BaseIterable[_T]): def __iter__(self) -> Iterator[_T]: ... @type_check_only class _SupportsContains(Generic[_ContainsT]): def __contains__(self, item: _ContainsT, /) -> bool: ... class PreventQuerySetCloning: queryset: QuerySet[Any] def __init__(self, queryset: QuerySet[Any]) -> None: ... def __enter__(self) -> QuerySet[Any]: ... def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None, ) -> None: ... # Using `object` (not `_Row | None`) to satisfy Collection protocol and support `User | AnonymousUser` patterns class QuerySet(AltersData, _SupportsContains[object], Iterable[_Row], Sized, Generic[_Model, _Row]): model: type[_Model] query: Query _iterable_class: type[BaseIterable[Any]] _result_cache: list[_Row] | None def __init__( self, model: type[Model] | None = None, query: Query | None = None, using: str | None = None, hints: dict[str, Model] | None = None, ) -> None: ... @classmethod def as_manager(cls) -> Manager[_Model]: ... def __deepcopy__(self, memo: dict[int, Any]) -> Self: ... @override def __getstate__(self) -> dict[str, Any]: ... @override def __len__(self) -> int: ... @override def __iter__(self) -> Iterator[_Row]: ... def __aiter__(self) -> AsyncIterator[_Row]: ... def __bool__(self) -> bool: ... @overload def __getitem__(self, i: int) -> _Row: ... @overload def __getitem__(self, s: slice) -> Self: ... def __class_getitem__(cls, item: type[_Model]) -> Self: ... # Technically, the other QuerySet must be of the same type _T, but _T is covariant def __and__(self, other: QuerySet[_Model, _Row]) -> Self: ... def __or__(self, other: QuerySet[_Model, _Row]) -> Self: ... def __xor__(self, other: QuerySet[_Model, _Row]) -> Self: ... # IMPORTANT: When updating any of the following methods' signatures, please ALSO modify # the corresponding method in BaseManager. def iterator(self, chunk_size: int | None = None) -> Iterator[_Row]: ... def aiterator(self, chunk_size: int = 2000) -> AsyncIterator[_Row]: ... def aggregate(self, *args: Any, **kwargs: Any) -> dict[str, Any]: ... async def aaggregate(self, *args: Any, **kwargs: Any) -> dict[str, Any]: ... def count(self) -> int: ... async def acount(self) -> int: ... def get(self, *args: Any, **kwargs: Any) -> _Row: ... async def aget(self, *args: Any, **kwargs: Any) -> _Row: ... def create(self, **kwargs: Any) -> _Model: ... async def acreate(self, **kwargs: Any) -> _Model: ... def bulk_create( self, objs: Iterable[_Model], batch_size: int | None = None, ignore_conflicts: bool = False, update_conflicts: bool = False, update_fields: Collection[str] | None = None, unique_fields: Collection[str] | None = None, ) -> list[_Model]: ... async def abulk_create( self, objs: Iterable[_Model], batch_size: int | None = None, ignore_conflicts: bool = False, update_conflicts: bool = False, update_fields: Collection[str] | None = None, unique_fields: Collection[str] | None = None, ) -> list[_Model]: ... def bulk_update(self, objs: Iterable[_Model], fields: Iterable[str], batch_size: int | None = None) -> int: ... async def abulk_update( self, objs: Iterable[_Model], fields: Iterable[str], batch_size: int | None = None ) -> int: ... def get_or_create(self, defaults: Mapping[str, Any] | None = None, **kwargs: Any) -> tuple[_Model, bool]: ... async def aget_or_create(self, defaults: Mapping[str, Any] | None = None, **kwargs: Any) -> tuple[_Model, bool]: ... def update_or_create( self, defaults: Mapping[str, Any] | None = None, create_defaults: Mapping[str, Any] | None = None, **kwargs: Any, ) -> tuple[_Model, bool]: ... async def aupdate_or_create( self, defaults: Mapping[str, Any] | None = None, create_defaults: Mapping[str, Any] | None = None, **kwargs: Any, ) -> tuple[_Model, bool]: ... def earliest(self, *fields: str | OrderBy) -> _Row: ... async def aearliest(self, *fields: str | OrderBy) -> _Row: ... def latest(self, *fields: str | OrderBy) -> _Row: ... async def alatest(self, *fields: str | OrderBy) -> _Row: ... def first(self) -> _Row | None: ... async def afirst(self) -> _Row | None: ... def last(self) -> _Row | None: ... async def alast(self) -> _Row | None: ... def in_bulk(self, id_list: Iterable[Any] | None = None, *, field_name: str = "pk") -> dict[Any, _Model]: ... async def ain_bulk(self, id_list: Iterable[Any] | None = None, *, field_name: str = "pk") -> dict[Any, _Model]: ... def delete(self) -> tuple[int, dict[str, int]]: ... async def adelete(self) -> tuple[int, dict[str, int]]: ... def _raw_delete(self, using: str | None) -> int: ... def update(self, **kwargs: Any) -> int: ... async def aupdate(self, **kwargs: Any) -> int: ... def exists(self) -> bool: ... async def aexists(self) -> bool: ... def contains(self, obj: Model) -> bool: ... async def acontains(self, obj: Model) -> bool: ... def explain(self, *, format: str | None = None, **options: Any) -> str: ... async def aexplain(self, *, format: str | None = None, **options: Any) -> str: ... def raw( self, raw_query: _ExecuteQuery, params: Any = (), translations: dict[str, str] | None = None, using: str | None = None, ) -> RawQuerySet[_Model]: ... # The type of values may be overridden to be more specific in the mypy plugin, depending on the fields param def values(self, *fields: str | Combinable, **expressions: Any) -> QuerySet[_Model, dict[str, Any]]: ... # The type of values_list may be overridden to be more specific in the mypy plugin, depending on the fields param def values_list( self, *fields: str | Combinable, flat: bool = False, named: bool = False ) -> QuerySet[_Model, Any]: ... def dates( self, field_name: str, kind: Literal["year", "month", "week", "day"], order: Literal["ASC", "DESC"] = "ASC", ) -> QuerySet[_Model, datetime.date]: ... def datetimes( self, field_name: str, kind: Literal["year", "month", "week", "day", "hour", "minute", "second"], order: Literal["ASC", "DESC"] = "ASC", tzinfo: datetime.tzinfo | None = None, ) -> QuerySet[_Model, datetime.datetime]: ... def none(self) -> Self: ... def all(self) -> Self: ... def filter(self, *args: Any, **kwargs: Any) -> Self: ... def exclude(self, *args: Any, **kwargs: Any) -> Self: ... def complex_filter(self, filter_obj: Any) -> Self: ... def union(self, *other_qs: QuerySet[Model, Any], all: bool = False) -> Self: ... def intersection(self, *other_qs: QuerySet[Model, Any]) -> Self: ... def difference(self, *other_qs: QuerySet[Model, Any]) -> Self: ... def select_for_update( self, nowait: bool = False, skip_locked: bool = False, of: Sequence[str] = (), no_key: bool = False ) -> Self: ... @overload def select_related(self, clear: None, /) -> Self: ... @overload def select_related(self, *fields: str) -> Self: ... @overload def prefetch_related(self, clear: None, /) -> Self: ... @overload def prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> Self: ... def annotate(self, *args: Any, **kwargs: Any) -> Self: ... def alias(self, *args: Any, **kwargs: Any) -> Self: ... def order_by(self, *field_names: _OrderByFieldName) -> Self: ... def distinct(self, *field_names: str) -> Self: ... # extra() return type won't be supported any time soon def extra( self, select: dict[str, Any] | None = None, where: Sequence[str] | None = None, params: Sequence[Any] | None = None, tables: Sequence[str] | None = None, order_by: Sequence[_OrderByFieldName] | None = None, select_params: Sequence[Any] | None = None, ) -> QuerySet[Any, Any]: ... def reverse(self) -> Self: ... @overload def defer(self, clear: None, /) -> Self: ... @overload def defer(self, *fields: str) -> Self: ... def only(self, *fields: str) -> Self: ... def fetch_mode(self, fetch_mode: FetchMode) -> Self: ... def using(self, alias: str | None) -> Self: ... @property def ordered(self) -> bool: ... @property def totally_ordered(self) -> bool: ... @property def db(self) -> str: ... def _fetch_all(self) -> None: ... def resolve_expression(self, *args: Any, **kwargs: Any) -> Any: ... class RawQuerySet(_SupportsContains[object], Iterable[_Model], Sized): raw_query: RawQuery | str model: type[_Model] | None query: RawQuery params: tuple[Any, ...] | None translations: dict[str, str] def __init__( self, raw_query: RawQuery | str, model: type[_Model] | None = None, query: Query | None = None, params: tuple[Any, ...] = (), translations: dict[str, str] | None = None, using: str | None = None, hints: dict[str, Model] | None = None, fetch_mode: FetchMode = ..., ) -> None: ... def resolve_model_init_order(self) -> tuple[list[str], list[int], list[tuple[str, int]]]: ... @overload def prefetch_related(self, clear: None, /) -> Self: ... @overload def prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> Self: ... @override def __len__(self) -> int: ... def __bool__(self) -> bool: ... @override def __iter__(self) -> Iterator[_Model]: ... def __aiter__(self) -> AsyncIterator[_Model]: ... def iterator(self) -> Iterator[_Model]: ... @overload def __getitem__(self, k: int) -> _Model: ... @overload def __getitem__(self, k: str) -> Any: ... @overload def __getitem__(self, k: slice) -> Self: ... @property def db(self) -> str: ... def using(self, alias: str | None) -> Self: ... @cached_property def columns(self) -> list[str]: ... @cached_property def model_fields(self) -> dict[str, str]: ... # Deprecated alias of QuerySet, for compatibility only. _QuerySet: TypeAlias = QuerySet # noqa: PYI047 class Prefetch(Generic[_LookupT, _PrefetchedQuerySetT, _ToAttrT]): prefetch_through: str prefetch_to: str queryset: _PrefetchedQuerySetT | None to_attr: _ToAttrT | None def __init__( self, lookup: _LookupT, queryset: _PrefetchedQuerySetT | None = None, to_attr: _ToAttrT | None = None ) -> None: ... @override def __getstate__(self) -> dict[str, Any]: ... def add_prefix(self, prefix: str) -> None: ... def get_current_prefetch_to(self, level: int) -> str: ... def get_current_to_attr(self, level: int) -> tuple[str, str]: ... def get_current_querysets(self, level: int) -> Sequence[_PrefetchedQuerySetT] | None: ... def normalize_prefetch_lookups( lookups: Sequence[str | Prefetch[Any]], prefix: str | None = None ) -> list[Prefetch[Any]]: ... def prefetch_related_objects(model_instances: Sequence[_Model], *related_lookups: str | Prefetch[Any]) -> None: ... async def aprefetch_related_objects( model_instances: Sequence[_Model], *related_lookups: str | Prefetch[Any] ) -> None: ... def get_prefetcher(instance: Model, through_attr: str, to_attr: str) -> tuple[Any, Any, bool, bool]: ... def prefetch_one_level( instances: Sequence[Model], prefetcher: Any, lookup: Prefetch[Any], level: int ) -> tuple[list[Any], list[Prefetch[Any]]]: ... class InstanceCheckMeta(type): ... class EmptyQuerySet(metaclass=InstanceCheckMeta): def __init__(self, *args: Any, **kwargs: Any) -> None: ... class RelatedPopulator: db: str cols_start: int cols_end: int init_list: list[str] reorder_for_init: Any model_cls: type[Model] pk_idx: int related_populators: list[RelatedPopulator] local_setter: Any remote_setter: Any def __init__(self, klass_info: dict[str, Any], select: Any, db: str, fetch_mode: FetchMode) -> None: ... def populate(self, row: Sequence[Any], from_obj: Model) -> None: ... def get_related_populators( klass_info: dict[str, Any], select: Any, db: str, fetch_mode: FetchMode ) -> list[RelatedPopulator]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/query_utils.pyi000066400000000000000000000122051526064357400264250ustar00rootroot00000000000000import logging from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence from typing import Any, ClassVar, Literal, NamedTuple from _typeshed import Incomplete from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.base import Model from django.db.models.expressions import BaseExpression from django.db.models.fields import Field from django.db.models.fields.mixins import FieldCacheMixin from django.db.models.lookups import Lookup, Transform from django.db.models.options import Options from django.db.models.sql.compiler import SQLCompiler, _AsSqlType from django.db.models.sql.query import Query from django.db.models.sql.where import WhereNode from django.utils import tree from django.utils.functional import cached_property from typing_extensions import TypeVar logger: logging.Logger PROHIBITED_FILTER_KWARGS: frozenset[str] class class_or_instance_method: class_method: Callable[..., Any] instance_method: Callable[..., Any] def __init__(self, class_method: Callable[..., Any], instance_method: Callable[..., Any]) -> None: ... def __get__(self, instance: Any, owner: Any) -> Callable[..., Any]: ... class PathInfo(NamedTuple): from_opts: Options[Model] to_opts: Options[Model] target_fields: tuple[Field[Any, Any], ...] join_field: Field[Any, Any] m2m: bool direct: bool filtered_relation: FilteredRelation | None def subclasses(cls: type[RegisterLookupMixin]) -> Iterator[type[RegisterLookupMixin]]: ... class Q(tree.Node): AND: Literal["AND"] OR: Literal["OR"] XOR: Literal["XOR"] conditional: bool connectors: tuple[None, Literal["AND"], Literal["OR"], Literal["XOR"]] def __init__(self, *args: Any, **kwargs: Any) -> None: ... # Fake signature, the real is # def __init__(self, *args: Any, _connector: Any | None = ..., _negated: bool = ..., **kwargs: Any) -> None: ... def __or__(self, other: Q) -> Q: ... def __and__(self, other: Q) -> Q: ... def __xor__(self, other: Q) -> Q: ... def __invert__(self) -> Q: ... def resolve_expression( self, query: Query | None = None, allow_joins: bool = True, reuse: set[str] | None = None, summarize: bool = False, for_save: bool = False, ) -> WhereNode: ... def replace_expressions(self, replacements: dict[tree.Node, tree.Node]) -> tree.Node: ... def flatten(self) -> Iterator[Incomplete]: ... def check(self, against: dict[str, Any], using: str = "default") -> bool: ... def deconstruct(self) -> tuple[str, Sequence[Any], dict[str, Any]]: ... @cached_property def identity(self) -> tuple[Any, ...]: ... @cached_property def referenced_base_fields(self) -> set[str]: ... class DeferredAttribute: field: Field[Any, Any] def __init__(self, field: Field[Any, Any]) -> None: ... def __get__(self, instance: Model | None, cls: type[Model] | None = None) -> Any: ... def fetch_one(self, instance: Model) -> None: ... def fetch_many(self, instances: Iterable[Model]) -> None: ... _R = TypeVar("_R", bound=type) class RegisterLookupMixin: class_lookups: ClassVar[dict[str, Any]] lookup_name: str @classmethod def get_class_lookups(cls) -> dict[str, Any]: ... def get_instance_lookups(self) -> dict[str, Any]: ... def get_lookups(self) -> dict[str, Any]: ... def get_lookup(self, lookup_name: str) -> type[Lookup] | None: ... def get_transform(self, lookup_name: str) -> type[Transform] | None: ... @staticmethod def merge_dicts(dicts: Iterable[dict[str, Any]]) -> dict[str, Any]: ... @classmethod def register_class_lookup(cls, lookup: _R, lookup_name: str | None = None) -> _R: ... def register_instance_lookup(self, lookup: _R, lookup_name: str | None = None) -> _R: ... @classmethod def register_lookup(cls, lookup: _R, lookup_name: str | None = None) -> _R: ... @classmethod def _unregister_class_lookup(cls, lookup: type[Lookup], lookup_name: str | None = None) -> None: ... def _unregister_instance_lookup(self, lookup: type[Lookup], lookup_name: str | None = None) -> None: ... @classmethod def _unregister_lookup(cls, lookup: type[Lookup], lookup_name: str | None = None) -> None: ... def select_related_descend( field: Field[Any, Any], restricted: bool, requested: Mapping[str, Any] | None, select_mask: set[Field[Any, Any]] | None, ) -> bool: ... _E = TypeVar("_E", bound=BaseExpression) def refs_expression( lookup_parts: Sequence[str], annotations: Mapping[str, _E] ) -> tuple[Literal[False] | _E, Sequence[str]]: ... def check_rel_lookup_compatibility(model: type[Model], target_opts: Any, field: FieldCacheMixin) -> bool: ... class FilteredRelation: relation_name: str alias: str | None condition: Q def __init__(self, relation_name: str, *, condition: Q = ...) -> None: ... def clone(self) -> FilteredRelation: ... def relabeled_clone(self, change_map: dict[str, str]) -> FilteredRelation: ... def resolve_expression(self, query: Query, reuse: set[str], *args: Any, **kwargs: Any) -> FilteredRelation: ... def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/signals.pyi000066400000000000000000000021101526064357400254720ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from django.apps.registry import Apps from django.db.models.base import Model from django.dispatch import Signal from django.dispatch.dispatcher import _AnyHashable from typing_extensions import override class_prepared: Signal class ModelSignal(Signal): @override def connect( # type: ignore[override] self, receiver: Callable[..., Any], sender: type[Model] | str | None = None, weak: bool = True, dispatch_uid: _AnyHashable | None = None, apps: Apps | None = None, ) -> None: ... @override def disconnect( # type: ignore[override] self, receiver: Callable[..., Any] | None = None, sender: type[Model] | str | None = None, dispatch_uid: _AnyHashable | None = None, apps: Apps | None = None, ) -> bool | None: ... pre_init: ModelSignal post_init: ModelSignal pre_save: ModelSignal post_save: ModelSignal pre_delete: ModelSignal post_delete: ModelSignal m2m_changed: ModelSignal pre_migrate: Signal post_migrate: Signal typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/000077500000000000000000000000001526064357400241145ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/__init__.pyi000066400000000000000000000006351526064357400264020ustar00rootroot00000000000000from .query import Query as Query from .query import RawQuery as RawQuery from .subqueries import AggregateQuery as AggregateQuery from .subqueries import DeleteQuery as DeleteQuery from .subqueries import InsertQuery as InsertQuery from .subqueries import UpdateQuery as UpdateQuery from .where import AND as AND from .where import OR as OR from .where import XOR as XOR __all__ = ["AND", "OR", "XOR", "Query"] typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/compiler.pyi000066400000000000000000000174501526064357400264600ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Iterator, Sequence from datetime import date, datetime from decimal import Decimal from re import Pattern from typing import Any, Literal, TypeAlias, overload from uuid import UUID from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.utils import CursorWrapper from django.db.models import Field from django.db.models.base import Model from django.db.models.expressions import BaseExpression, Expression, Ref from django.db.models.sql.query import Query from django.db.models.sql.subqueries import AggregateQuery, DeleteQuery, InsertQuery, UpdateQuery from django.utils.functional import cached_property from typing_extensions import deprecated, override _ParamT: TypeAlias = str | int _ParamsT: TypeAlias = tuple[_ParamT, ...] _AsSqlType: TypeAlias = tuple[str, _ParamsT] class PositionRef(Ref): def __init__(self, ordinal: str, refs: str, source: Expression) -> None: ... class SQLCompiler: query: Query connection: BaseDatabaseWrapper using: str | None quote_cache: Any select: Any annotation_col_map: Any klass_info: Any ordering_parts: Pattern[str] def __init__( self, query: Query, connection: BaseDatabaseWrapper, using: str | None, elide_empty: bool = True ) -> None: ... col_count: int | None def setup_query(self, with_col_aliases: bool = False) -> None: ... has_extra_select: Any def pre_sql_setup( self, with_col_aliases: bool = False, ) -> tuple[ list[tuple[Expression, _AsSqlType, None]], list[tuple[Expression, tuple[str, _ParamsT, bool]]], list[_AsSqlType], ]: ... def get_group_by( self, select: list[tuple[BaseExpression, _AsSqlType, str | None]], order_by: list[tuple[Expression, tuple[str, _ParamsT, bool]]], ) -> list[_AsSqlType]: ... def collapse_group_by( self, expressions: list[Expression], having: list[Expression] | tuple[Any, ...] ) -> list[Expression]: ... @classmethod def get_select_from_parent(cls, klass_info: dict[str, Any]) -> None: ... def get_select( self, with_col_aliases: bool = False, ) -> tuple[list[tuple[Expression, _AsSqlType, str | None]], dict[str, Any] | None, dict[str, int]]: ... def _order_by_pairs(self) -> None: ... def get_order_by(self) -> list[tuple[Expression, tuple[str, _ParamsT, bool]]]: ... def get_extra_select( self, order_by: list[tuple[Expression, tuple[str, _ParamsT, bool]]], select: list[tuple[Expression, _AsSqlType, str | None]], ) -> list[tuple[Expression, _AsSqlType, None]]: ... def quote_name(self, name: str) -> str: ... @deprecated("SQLCompiler.quote_name_unless_alias() is deprecated. Use .quote_name() instead.") def quote_name_unless_alias(self, name: str) -> str: ... def compile(self, node: BaseExpression) -> _AsSqlType: ... def get_combinator_sql(self, combinator: str, all: bool) -> tuple[list[str], list[int] | list[str]]: ... def get_qualify_sql(self) -> tuple[list[str], list[Any]]: ... def as_sql(self, with_limits: bool = True, with_col_aliases: bool = False) -> _AsSqlType: ... def get_default_columns( self, select_mask: dict[str, Any], start_alias: str | None = None, opts: Any | None = None, from_parent: type[Model] | None = None, ) -> list[Expression]: ... def get_distinct(self) -> tuple[list[Any], list[Any]]: ... def find_ordering_name( self, name: str, opts: Any, alias: str | None = None, default_order: str = "ASC", already_seen: set[tuple[tuple[tuple[str, str]] | None, tuple[tuple[str, str]]]] | None = None, ) -> list[tuple[Expression, bool]]: ... def get_from_clause(self) -> tuple[list[str], _ParamsT]: ... def get_related_selections( self, select: list[tuple[Expression, str | None]], select_mask: dict[str, Any], opts: Any | None = None, root_alias: str | None = None, cur_depth: int = 1, requested: dict[str, dict[str, dict[str, dict[Any, Any]]]] | None = None, restricted: bool | None = None, ) -> list[dict[str, Any]]: ... def get_select_for_update_of_arguments(self) -> list[Any]: ... def get_converters( self, expressions: list[Expression] ) -> dict[int, tuple[list[Callable[..., Any]], Expression]]: ... def apply_converters( self, rows: Iterable[Iterable[Any]], converters: dict[int, tuple[list[Callable[..., Any]], Expression]] ) -> Iterator[list[date | datetime | float | Decimal | UUID | bytes | str | None]]: ... def has_composite_fields(self, expressions: Iterable[Expression]) -> bool: ... def composite_fields_to_tuples( self, rows: Iterable[Any], expressions: Iterable[Expression] ) -> Iterator[list[tuple[Any, ...]]]: ... def results_iter( self, results: Iterable[list[Sequence[Any]]] | None = None, tuple_expected: bool = False, chunked_fetch: bool = False, chunk_size: int = 100, ) -> Iterator[Sequence[Any]]: ... def has_results(self) -> bool: ... @overload def execute_sql( self, result_type: Literal["cursor"] = "cursor", chunked_fetch: bool = False, chunk_size: int = 100 ) -> CursorWrapper: ... @overload def execute_sql( self, result_type: Literal["no results"] | None = "no results", chunked_fetch: bool = False, chunk_size: int = 100, ) -> None: ... @overload def execute_sql( self, result_type: Literal["single"] = "single", chunked_fetch: bool = False, chunk_size: int = 100 ) -> Iterable[Sequence[Any]] | None: ... @overload def execute_sql( self, result_type: Literal["multi"] = "multi", chunked_fetch: bool = False, chunk_size: int = 100 ) -> Iterable[list[Sequence[Any]]] | None: ... def explain_query(self) -> Iterator[str]: ... class SQLInsertCompiler(SQLCompiler): query: InsertQuery returning_fields: Sequence[Any] | None returning_params: Sequence[Any] def field_as_sql( self, field: Field[Any, Any] | None, get_placeholder_sql: Callable[[Any, SQLInsertCompiler, BaseDatabaseWrapper], _AsSqlType], val: Any, ) -> _AsSqlType: ... def prepare_value(self, field: Any, value: Any) -> Any: ... def pre_save_val(self, field: Any, obj: Any) -> Any: ... def assemble_as_sql(self, fields: Any, value_rows: Any) -> tuple[list[list[str]], list[list[Any]]]: ... @override def as_sql(self) -> list[_AsSqlType]: ... # type: ignore[override] @override def execute_sql( # type: ignore[override] self, returning_fields: Sequence[str] | None = None ) -> list[tuple[Any]]: ... # 1-tuple class SQLDeleteCompiler(SQLCompiler): query: DeleteQuery @cached_property def single_alias(self) -> bool: ... @cached_property def contains_self_reference_subquery(self) -> bool: ... @override def as_sql(self) -> _AsSqlType: ... # type: ignore[override] class SQLUpdateCompiler(SQLCompiler): query: UpdateQuery returning_fields: Sequence[Any] | None returning_params: Sequence[Any] @override def as_sql(self) -> _AsSqlType: ... # type: ignore[override] @override def execute_sql(self, result_type: Literal["cursor", "no results"]) -> int: ... # type: ignore[override] def execute_returning_sql(self, returning_fields: Sequence[Any] | None) -> list[Sequence[Any]]: ... @override def pre_sql_setup(self) -> None: ... # type: ignore[override] class SQLAggregateCompiler(SQLCompiler): query: AggregateQuery col_count: int @override def as_sql(self) -> _AsSqlType: ... # type: ignore[override] def cursor_iter( cursor: CursorWrapper, sentinel: Any, col_count: int | None, itersize: int ) -> Iterator[list[Sequence[Any]]]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/constants.pyi000066400000000000000000000004761526064357400266620ustar00rootroot00000000000000from typing import Final, Literal GET_ITERATOR_CHUNK_SIZE: Final[int] MULTI: Literal["multi"] SINGLE: Literal["single"] NO_RESULTS: Literal["no results"] CURSOR: Literal["cursor"] ROW_COUNT: Literal["row count"] ORDER_DIR: dict[str, tuple[str, str]] INNER: Literal["INNER JOIN"] LOUTER: Literal["LEFT OUTER JOIN"] typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/datastructures.pyi000066400000000000000000000034541526064357400277220ustar00rootroot00000000000000from typing import Any from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.fields.mixins import FieldCacheMixin from django.db.models.query_utils import FilteredRelation, PathInfo from django.db.models.sql.compiler import SQLCompiler, _AsSqlType class MultiJoin(Exception): level: int names_with_path: list[tuple[str, list[PathInfo]]] def __init__(self, names_pos: int, path_with_names: list[tuple[str, list[PathInfo]]]) -> None: ... class Empty: ... class Join: table_name: str parent_alias: str table_alias: str | None join_type: str join_cols: tuple[Any, ...] join_field: FieldCacheMixin nullable: bool filtered_relation: FilteredRelation | None def __init__( self, table_name: str, parent_alias: str, table_alias: str | None, join_type: str, join_field: FieldCacheMixin, nullable: bool, filtered_relation: FilteredRelation | None = None, ) -> None: ... def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... def relabeled_clone(self, change_map: dict[str | None, str]) -> Join: ... @property def identity(self) -> tuple[type[Join], str, str, FieldCacheMixin, FilteredRelation | None]: ... def demote(self) -> Join: ... def promote(self) -> Join: ... class BaseTable: join_type: Any parent_alias: Any filtered_relation: Any table_name: str table_alias: str | None def __init__(self, table_name: str, alias: str | None) -> None: ... def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... def relabeled_clone(self, change_map: dict[str | None, str]) -> BaseTable: ... @property def identity(self) -> tuple[type[BaseTable], str, str | None]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/query.pyi000066400000000000000000000247271526064357400260200ustar00rootroot00000000000000import collections from collections.abc import Callable, Iterable, Iterator, Sequence from typing import Any, Literal, NamedTuple from django.db.backends.utils import CursorWrapper from django.db.models import Field, FilteredRelation, Model, Q from django.db.models.expressions import BaseExpression, Combinable, Expression from django.db.models.lookups import Lookup, Transform from django.db.models.options import Options from django.db.models.query import _OrderByFieldName from django.db.models.query_utils import PathInfo from django.db.models.sql.datastructures import BaseTable, Join from django.db.models.sql.where import WhereNode from django.utils.functional import cached_property from typing_extensions import override class JoinInfo(NamedTuple): final_field: Field[Any, Any] targets: tuple[Any, ...] opts: Any joins: list[str] path: list[Any] transform_function: Callable[[Field[Any, Any], str], Expression] class RawQuery: high_mark: int | None low_mark: int | None params: Any sql: str using: str extra_select: dict[Any, Any] annotation_select: dict[Any, Any] cursor: CursorWrapper | None def __init__(self, sql: str, using: str, params: Any = ()) -> None: ... def chain(self, using: str) -> RawQuery: ... def clone(self, using: str) -> RawQuery: ... def get_columns(self) -> list[str]: ... def __iter__(self) -> Iterator[Any]: ... @property def params_type(self) -> type[dict[Any, Any] | tuple[Any, ...]] | None: ... class Query(BaseExpression): alias_prefix: str subq_aliases: frozenset[Any] compiler: str base_table_class: type[BaseTable] model: type[Model] | None alias_refcount: dict[str, int] alias_map: dict[str, BaseTable | Join] external_aliases: dict[str, bool] table_map: dict[str, list[str]] default_cols: bool default_ordering: bool standard_ordering: bool used_aliases: set[str] where: WhereNode filter_is_sticky: bool subquery: bool group_by: Sequence[Combinable] | Sequence[str] | Literal[True] | None order_by: Sequence[_OrderByFieldName] distinct: bool distinct_fields: tuple[str, ...] select: Sequence[BaseExpression] select_for_update: bool select_for_update_nowait: bool select_for_update_skip_locked: bool select_for_update_of: tuple[Any, ...] select_for_no_key_update: bool select_related: dict[str, Any] | bool max_depth: int join_class: type[Join] values_select: tuple[Any, ...] selected: dict[str, int | str | Expression] | None annotation_select_mask: list[str] | None combinator: str | None combinator_all: bool combined_queries: tuple[Any, ...] extra_select_mask: set[str] | None extra_tables: tuple[Any, ...] extra_order_by: Sequence[_OrderByFieldName] deferred_loading: tuple[set[str] | frozenset[str], bool] high_mark: int | None low_mark: int extra: dict[str, Any] annotations: dict[str, Expression] empty_result_set_value: Any | None explain_info: Any | None def __init__(self, model: type[Model] | None, alias_cols: bool = True) -> None: ... @property @override def output_field(self) -> Field[Any, Any]: ... @property def has_select_fields(self) -> bool: ... @cached_property def base_table(self) -> str: ... def add_annotation(self, annotation: Any, alias: str, select: bool = True) -> None: ... def sql_with_params(self) -> tuple[str, tuple[Any, ...]]: ... def __deepcopy__(self, memo: dict[int, Any]) -> Query: ... def get_compiler( self, using: str | None = None, connection: Any | None = None, elide_empty: bool = True ) -> Any: ... def join_parent_model(self, opts: Any, model: Any | None, alias: str, seen: dict[Any, str]) -> str: ... def names_to_path( self, names: Sequence[str], opts: Any, allow_many: bool = True, fail_on_missing: bool = False ) -> tuple[list[Any], Any, tuple[Any, ...], Sequence[str]]: ... def get_meta(self) -> Options[Any]: ... def clone(self) -> Query: ... def chain(self, klass: type[Query] | None = None) -> Query: ... def get_count(self, using: str) -> int: ... @override def get_group_by_cols(self, wrapper: Any | None = None) -> list[Any]: ... def has_filters(self) -> WhereNode: ... def get_external_cols(self) -> list[Any]: ... def exists(self, limit: bool = True) -> Any: ... def has_results(self, using: str) -> bool: ... def explain(self, using: str, format: str | None = None, **options: Any) -> str: ... def combine(self, rhs: Query, connector: str) -> None: ... def ref_alias(self, alias: str) -> None: ... def unref_alias(self, alias: str, amount: int = 1) -> None: ... def promote_joins(self, aliases: Iterable[str]) -> None: ... def demote_joins(self, aliases: Iterable[str]) -> None: ... def reset_refcounts(self, to_counts: dict[str, int]) -> None: ... def check_alias(self, alias: str) -> None: ... def check_related_objects(self, field: Any, value: Any, opts: Any) -> None: ... def check_query_object_type(self, value: Any, opts: Any, field: Any) -> None: ... def change_aliases(self, change_map: dict[str | None, str]) -> None: ... def bump_prefix(self, other_query: Query, exclude: Any | None = None) -> None: ... def get_initial_alias(self) -> str: ... def count_active_tables(self) -> int: ... @override def resolve_expression(self, query: Query, *args: Any, **kwargs: Any) -> Query: ... # type: ignore[override] def resolve_lookup_value( self, value: Any, can_reuse: set[str] | None, allow_joins: bool, summarize: bool = False ) -> Any: ... def solve_lookup_type( self, lookup: str, summarize: bool = False ) -> tuple[Sequence[str], Sequence[str], Expression | Literal[False]]: ... def table_alias( self, table_name: str, create: bool = False, filtered_relation: Any | None = None ) -> tuple[str, bool]: ... def get_aggregation(self, using: Any, aggregate_exprs: dict[str, Any]) -> dict[str, Any]: ... def build_filter( self, filter_expr: Q | Expression | dict[str, str] | tuple[str, Any], branch_negated: bool = False, current_negated: bool = False, can_reuse: set[str] | None = None, allow_joins: bool = True, split_subq: bool = True, check_filterable: bool = True, summarize: bool = False, update_join_types: bool = True, ) -> tuple[WhereNode, Iterable[str]]: ... def add_select_col(self, col: Any, name: str) -> None: ... def add_filter(self, filter_lhs: tuple[str, Any], filter_rhs: tuple[str, Any]) -> None: ... def add_q(self, q_object: Q, reuse_all: bool = False) -> None: ... def build_where(self, filter_expr: Q | Expression | dict[str, str] | tuple[str, Any]) -> WhereNode: ... def add_filtered_relation(self, filtered_relation: FilteredRelation, alias: str) -> None: ... def setup_joins( self, names: Sequence[str], opts: Any, alias: str, can_reuse: set[str] | None = None, allow_many: bool = True, ) -> JoinInfo: ... def trim_joins( self, targets: tuple[Field[Any, Any], ...], joins: list[str], path: list[PathInfo] ) -> tuple[tuple[Field[Any, Any], ...], str, list[str]]: ... def resolve_ref( self, name: str, allow_joins: bool = True, reuse: set[str] | None = None, summarize: bool = False ) -> Expression: ... def split_exclude( self, filter_expr: tuple[str, Any], can_reuse: set[str], names_with_path: list[tuple[str, list[PathInfo]]], ) -> tuple[WhereNode, Iterable[str]]: ... def set_empty(self) -> None: ... def is_empty(self) -> bool: ... def set_limits(self, low: int | None = None, high: int | None = None) -> None: ... def clear_limits(self) -> None: ... @property def is_sliced(self) -> bool: ... def has_limit_one(self) -> bool: ... def can_filter(self) -> bool: ... def clear_select_clause(self) -> None: ... def clear_select_fields(self) -> None: ... def set_select(self, cols: list[Expression]) -> None: ... def add_distinct_fields(self, *field_names: str) -> None: ... def add_fields(self, field_names: Iterable[str], allow_m2m: bool = True) -> None: ... def add_ordering(self, *ordering: _OrderByFieldName) -> None: ... @property def orderby_issubset_groupby(self) -> bool: ... def clear_where(self) -> None: ... def clear_ordering(self, force: bool = False, clear_default: bool = True) -> None: ... def set_group_by(self, allow_aliases: bool = True) -> None: ... def add_select_related(self, fields: Iterable[str]) -> None: ... def add_extra( self, select: dict[str, Any] | None, select_params: Iterable[Any] | None, where: Sequence[str] | None, params: Sequence[str] | None, tables: Sequence[str] | None, order_by: Sequence[_OrderByFieldName] | None, ) -> None: ... def clear_deferred_loading(self) -> None: ... def add_deferred_loading(self, field_names: Iterable[str]) -> None: ... def add_immediate_loading(self, field_names: Iterable[str]) -> None: ... def get_select_mask(self) -> dict[str, Any]: ... def set_annotation_mask(self, names: Iterable[str] | None) -> None: ... def append_annotation_mask(self, names: Iterable[str]) -> None: ... def set_extra_mask(self, names: Iterable[str] | None) -> None: ... def set_values(self, fields: Iterable[str] | None) -> None: ... @property def annotation_select(self) -> dict[str, Any]: ... @property def extra_select(self) -> dict[str, Any]: ... def trim_start(self, names_with_path: list[tuple[str, list[PathInfo]]]) -> tuple[str, bool]: ... def is_nullable(self, field: Field[Any, Any]) -> bool: ... def check_filterable(self, expression: Any) -> None: ... def build_lookup(self, lookups: Sequence[str], lhs: Expression | Query, rhs: Any) -> Lookup: ... def try_transform(self, lhs: Expression | Query, name: str, lookups: Sequence[str] | None = ...) -> Transform: ... def join( self, join: BaseTable | Join, reuse: str | None = None, ) -> str: ... class JoinPromoter: connector: str negated: bool effective_connector: str num_children: int votes: collections.Counter[str] def __init__(self, connector: str, num_children: int, negated: bool) -> None: ... def add_votes(self, votes: Iterable[str]) -> None: ... def update_join_types(self, query: Query) -> set[str]: ... __all__ = ["Query", "RawQuery"] typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/subqueries.pyi000066400000000000000000000031571526064357400270340ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any from django.db.models.base import Model from django.db.models.expressions import Case from django.db.models.fields import Field from django.db.models.sql.query import Query from django.db.models.sql.where import WhereNode class DeleteQuery(Query): def do_query(self, table: str, where: WhereNode, using: str) -> int: ... def delete_batch(self, pk_list: list[int] | list[str], using: str) -> int: ... class UpdateQuery(Query): def __init__(self, *args: Any, **kwargs: Any) -> None: ... def update_batch(self, pk_list: list[int], values: dict[str, int | None], using: str) -> None: ... def add_update_values(self, values: dict[str, Any]) -> None: ... def add_update_fields(self, values_seq: list[tuple[Field[Any, Any], type[Model] | None, Case]]) -> None: ... def add_related_update(self, model: type[Model], field: Field[Any, Any], value: int | str) -> None: ... def get_related_updates(self) -> list[UpdateQuery]: ... class InsertQuery(Query): fields: Iterable[Field[Any, Any]] objs: list[Model] raw: bool def __init__( self, *args: Any, on_conflict: Any | None = ..., update_fields: Any | None = ..., unique_fields: Any | None = ..., **kwargs: Any, ) -> None: ... def insert_values(self, fields: Iterable[Field[Any, Any]], objs: list[Model], raw: bool = False) -> None: ... class AggregateQuery(Query): inner_query: Query def __init__(self, model: type[Model], inner_query: Query) -> None: ... __all__ = ["AggregateQuery", "DeleteQuery", "InsertQuery", "UpdateQuery"] typeddjango-django-stubs-fa03b48/django-stubs/db/models/sql/where.pyi000066400000000000000000000050231526064357400257510ustar00rootroot00000000000000from collections.abc import Iterator, Sequence from typing import Any, Final from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.expressions import Expression from django.db.models.fields import BooleanField from django.db.models.lookups import Lookup from django.db.models.sql.compiler import SQLCompiler, _AsSqlType, _ParamsT from django.utils import tree from django.utils.functional import cached_property AND: Final = "AND" OR: Final = "OR" XOR: Final = "XOR" class WhereNode(tree.Node): resolved: bool conditional: bool def split_having_qualify( self, negated: bool = ..., must_group_by: bool = ... ) -> tuple[WhereNode | None, WhereNode | None, WhereNode | None]: ... def as_sql(self, compiler: SQLCompiler, connection: BaseDatabaseWrapper) -> _AsSqlType: ... def get_group_by_cols(self) -> list[Expression]: ... def get_source_expressions(self) -> list[Any]: ... def set_source_expressions(self, children: list[Any]) -> None: ... def relabel_aliases(self, change_map: dict[str | None, str]) -> None: ... def clone(self) -> WhereNode: ... def relabeled_clone(self, change_map: dict[str | None, str]) -> WhereNode: ... def replace_expressions(self, replacements: dict[Any, Any]) -> WhereNode: ... def get_refs(self) -> set[str]: ... @cached_property def contains_aggregate(self) -> bool: ... @cached_property def contains_over_clause(self) -> bool: ... @property def is_summary(self) -> bool: ... def resolve_expression(self, *args: Any, **kwargs: Any) -> WhereNode: ... @cached_property def output_field(self) -> BooleanField[Any, Any]: ... def select_format(self, compiler: SQLCompiler, sql: str, params: _ParamsT) -> _AsSqlType: ... def get_db_converters(self, connection: BaseDatabaseWrapper) -> list[Any]: ... def get_lookup(self, lookup: str) -> type[Lookup] | None: ... def leaves(self) -> Iterator[Any]: ... class NothingNode: contains_aggregate: bool contains_over_clause: bool def as_sql( self, compiler: SQLCompiler | None = None, connection: BaseDatabaseWrapper | None = None ) -> _AsSqlType: ... class ExtraWhere: contains_aggregate: bool contains_over_clause: bool sqls: Sequence[str] params: Sequence[int] | Sequence[str] | None def __init__(self, sqls: Sequence[str], params: Sequence[int] | Sequence[str] | None) -> None: ... def as_sql( self, compiler: SQLCompiler | None = None, connection: BaseDatabaseWrapper | None = None ) -> _AsSqlType: ... typeddjango-django-stubs-fa03b48/django-stubs/db/models/utils.pyi000066400000000000000000000013621526064357400252020ustar00rootroot00000000000000from collections.abc import Iterable, Iterator, Mapping from typing import Any, NamedTuple from django.db.models.base import Model from typing_extensions import deprecated, override def make_model_tuple(model: type[Model] | str | tuple[str, str]) -> tuple[str, str]: ... def resolve_callables(mapping: Mapping[str, Any]) -> Iterator[tuple[str, Any]]: ... def unpickle_named_row(names: Iterable[str], values: Iterable[Any]) -> NamedTuple: ... def create_namedtuple_class(*names: str) -> type[NamedTuple]: ... class AltersData: @override def __init_subclass__(cls, **kwargs: Any) -> None: ... # RemovedInDjango70Warning @deprecated("Replace with `BLANK_CHOICE_LABEL` if not using `BLANK_CHOICE_DASH`.") def get_blank_choice_label() -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/db/transaction.pyi000066400000000000000000000045121526064357400251040ustar00rootroot00000000000000from collections.abc import Callable from contextlib import AbstractContextManager from types import TracebackType from typing import Any, overload from django.db import ProgrammingError from typing_extensions import TypeVar, deprecated class TransactionManagementError(ProgrammingError): ... def get_connection(using: str | None = None) -> Any: ... def get_autocommit(using: str | None = None) -> bool: ... def set_autocommit(autocommit: bool, using: str | None = None) -> Any: ... def commit(using: str | None = None) -> None: ... def rollback(using: str | None = None) -> None: ... @deprecated("savepoint() is deprecated. Use savepoint_create() instead.") def savepoint(using: str | None = None) -> str: ... def savepoint_create(using: str | None = None) -> str: ... def savepoint_rollback(sid: str, using: str | None = None) -> None: ... def savepoint_commit(sid: str, using: str | None = None) -> None: ... def clean_savepoints(using: str | None = None) -> None: ... def get_rollback(using: str | None = None) -> bool: ... def set_rollback(rollback: bool, using: str | None = None) -> None: ... def mark_for_rollback_on_error(using: str | None = None) -> AbstractContextManager[None]: ... def on_commit(func: Callable[[], object], using: str | None = None, robust: bool = False) -> None: ... _C = TypeVar("_C", bound=Callable[..., Any]) # Any callable # Don't inherit from ContextDecorator, so we can provide a more specific signature for __call__ class Atomic: using: str | None savepoint: bool def __init__(self, using: str | None, savepoint: bool, durable: bool) -> None: ... # When decorating, return the decorated function as-is, rather than clobbering it as ContextDecorator does. def __call__(self, func: _C) -> _C: ... def __enter__(self) -> None: ... def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, exc_tb: TracebackType | None, ) -> None: ... # Bare decorator @overload def atomic(using: _C) -> _C: ... # Decorator or context-manager with parameters @overload def atomic(using: str | None = None, savepoint: bool = True, durable: bool = False) -> Atomic: ... # Bare decorator @overload def non_atomic_requests(using: _C) -> _C: ... # Decorator with arguments @overload def non_atomic_requests(using: str | None = None) -> Callable[[_C], _C]: ... typeddjango-django-stubs-fa03b48/django-stubs/db/utils.pyi000066400000000000000000000043421526064357400237200ustar00rootroot00000000000000from collections.abc import Callable, Iterable from types import TracebackType from typing import Any from django.apps import AppConfig from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models import Model from django.utils.connection import BaseConnectionHandler from django.utils.functional import cached_property from typing_extensions import TypeVar, override DEFAULT_DB_ALIAS: str DJANGO_VERSION_PICKLE_KEY: str class Error(Exception): ... class InterfaceError(Error): ... class DatabaseError(Error): ... class DataError(DatabaseError): ... class OperationalError(DatabaseError): ... class IntegrityError(DatabaseError): ... class InternalError(DatabaseError): ... class ProgrammingError(DatabaseError): ... class NotSupportedError(DatabaseError): ... _F = TypeVar("_F", bound=Callable[..., Any]) class DatabaseErrorWrapper: def __init__(self, wrapper: Any) -> None: ... def __del__(self) -> None: ... def __enter__(self) -> None: ... def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None, ) -> None: ... def __call__(self, func: _F) -> _F: ... def load_backend(backend_name: str) -> Any: ... class ConnectionHandler(BaseConnectionHandler[BaseDatabaseWrapper]): @override def configure_settings(self, databases: dict[str, Any] | None) -> dict[str, Any]: ... @property def databases(self) -> dict[str, dict[str, Any]]: ... @override def create_connection(self, alias: str) -> BaseDatabaseWrapper: ... class ConnectionRouter: def __init__(self, routers: Iterable[Any] | None = None) -> None: ... @cached_property def routers(self) -> list[Any]: ... def db_for_read(self, model: type[Model], **hints: Any) -> str: ... def db_for_write(self, model: type[Model], **hints: Any) -> str: ... def allow_relation(self, obj1: Model, obj2: Model, **hints: Any) -> bool: ... def allow_migrate(self, db: str, app_label: str, **hints: Any) -> bool: ... def allow_migrate_model(self, db: str, model: type[Model]) -> bool: ... def get_migratable_models( self, app_config: AppConfig, db: str, include_auto_created: bool = False ) -> list[type[Model]]: ... typeddjango-django-stubs-fa03b48/django-stubs/dispatch/000077500000000000000000000000001526064357400232445ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/dispatch/__init__.pyi000066400000000000000000000001641526064357400255270ustar00rootroot00000000000000from django.dispatch.dispatcher import Signal as Signal from django.dispatch.dispatcher import receiver as receiver typeddjango-django-stubs-fa03b48/django-stubs/dispatch/dispatcher.pyi000066400000000000000000000032771526064357400261260ustar00rootroot00000000000000import threading from collections.abc import Callable, MutableMapping from logging import Logger from typing import Any, TypeAlias from typing_extensions import TypeVar _AnyHashable: TypeAlias = Any NONE_ID: int NO_RECEIVERS: Any logger: Logger class Signal: receivers: list[Any] lock: threading.Lock use_caching: bool sender_receivers_cache: MutableMapping[Any, Any] def __init__(self, use_caching: bool = False) -> None: ... def connect( self, receiver: Callable[..., Any], sender: object | None = None, weak: bool = True, dispatch_uid: _AnyHashable | None = None, ) -> None: ... def disconnect( self, receiver: Callable[..., Any] | None = None, sender: object | None = None, dispatch_uid: _AnyHashable | None = None, ) -> bool: ... def has_listeners(self, sender: Any | None = None) -> bool: ... def send(self, sender: Any, **named: Any) -> list[tuple[Callable[..., Any], str | None]]: ... async def asend(self, sender: Any, **named: Any) -> list[tuple[Callable[..., Any], str | None]]: ... def send_robust(self, sender: Any, **named: Any) -> list[tuple[Callable[..., Any], Exception | Any]]: ... async def asend_robust(self, sender: Any, **named: Any) -> list[tuple[Callable[..., Any], Exception | Any]]: ... def _live_receivers(self, sender: Any) -> tuple[list[Callable[..., Any]], list[Callable[..., Any]]]: ... _F = TypeVar("_F", bound=Callable[..., Any]) def receiver( signal: list[Signal] | tuple[Signal, ...] | Signal, *, sender: object | None = ..., weak: bool = ..., dispatch_uid: _AnyHashable | None = ..., **named: Any, ) -> Callable[[_F], _F]: ... typeddjango-django-stubs-fa03b48/django-stubs/forms/000077500000000000000000000000001526064357400225735ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/forms/__init__.pyi000066400000000000000000000046001526064357400250550ustar00rootroot00000000000000from django.core.exceptions import ValidationError as ValidationError from .boundfield import BoundField as BoundField from .fields import BooleanField as BooleanField from .fields import CharField as CharField from .fields import ChoiceField as ChoiceField from .fields import ComboField as ComboField from .fields import DateField as DateField from .fields import DateTimeField as DateTimeField from .fields import DecimalField as DecimalField from .fields import DurationField as DurationField from .fields import EmailField as EmailField from .fields import Field as Field from .fields import FileField as FileField from .fields import FilePathField as FilePathField from .fields import FloatField as FloatField from .fields import GenericIPAddressField as GenericIPAddressField from .fields import ImageField as ImageField from .fields import IntegerField as IntegerField from .fields import JSONField as JSONField from .fields import MultipleChoiceField as MultipleChoiceField from .fields import MultiValueField as MultiValueField from .fields import NullBooleanField as NullBooleanField from .fields import RegexField as RegexField from .fields import SlugField as SlugField from .fields import SplitDateTimeField as SplitDateTimeField from .fields import TimeField as TimeField from .fields import TypedChoiceField as TypedChoiceField from .fields import TypedMultipleChoiceField as TypedMultipleChoiceField from .fields import URLField as URLField from .fields import UUIDField as UUIDField from .forms import BaseForm as BaseForm from .forms import Form as Form from .formsets import BaseFormSet as BaseFormSet from .formsets import all_valid as all_valid from .formsets import formset_factory as formset_factory from .models import ALL_FIELDS as ALL_FIELDS from .models import BaseInlineFormSet as BaseInlineFormSet from .models import BaseModelForm as BaseModelForm from .models import BaseModelFormSet as BaseModelFormSet from .models import ModelChoiceField as ModelChoiceField from .models import ModelForm as ModelForm from .models import ModelMultipleChoiceField as ModelMultipleChoiceField from .models import fields_for_model as fields_for_model from .models import inlineformset_factory as inlineformset_factory from .models import model_to_dict as model_to_dict from .models import modelform_factory as modelform_factory from .models import modelformset_factory as modelformset_factory from .widgets import * typeddjango-django-stubs-fa03b48/django-stubs/forms/boundfield.pyi000066400000000000000000000064121526064357400254340ustar00rootroot00000000000000from collections.abc import Iterable, Iterator from typing import Any, TypeAlias, overload from django.forms.fields import Field from django.forms.forms import BaseForm from django.forms.renderers import BaseRenderer from django.forms.utils import ErrorList, RenderableFieldMixin from django.forms.widgets import Widget from django.utils.functional import _StrOrPromise, cached_property from django.utils.safestring import SafeString from typing_extensions import override _AttrsT: TypeAlias = dict[str, str | bool] class BoundField(RenderableFieldMixin): form: BaseForm field: Field name: str html_name: str html_initial_name: str html_initial_id: str label: _StrOrPromise help_text: _StrOrPromise renderer: BaseRenderer def __init__(self, form: BaseForm, field: Field, name: str) -> None: ... @cached_property def subwidgets(self) -> list[BoundWidget]: ... def __bool__(self) -> bool: ... def __iter__(self) -> Iterator[BoundWidget]: ... def __len__(self) -> int: ... @overload def __getitem__(self, idx: int | str) -> BoundWidget: ... @overload def __getitem__(self, idx: slice) -> list[BoundWidget]: ... @property def errors(self) -> ErrorList: ... @property def template_name(self) -> str: ... @override def get_context(self) -> dict[str, Any]: ... @override def as_widget( self, widget: Widget | None = None, attrs: _AttrsT | None = None, only_initial: bool = False ) -> SafeString: ... def as_text(self, attrs: _AttrsT | None = None, **kwargs: Any) -> SafeString: ... @override def __html__(self) -> SafeString: ... def as_textarea(self, attrs: _AttrsT | None = None, **kwargs: Any) -> SafeString: ... @override def as_hidden(self, attrs: _AttrsT | None = None, **kwargs: Any) -> SafeString: ... @property def data(self) -> Any: ... def value(self) -> Any: ... def label_tag( self, contents: str | None = None, attrs: _AttrsT | None = None, label_suffix: str | None = None, tag: str | None = None, ) -> SafeString: ... def legend_tag( self, contents: str | None = None, attrs: _AttrsT | None = None, label_suffix: str | None = None ) -> SafeString: ... def css_classes(self, extra_classes: str | Iterable[str] | None = None) -> str: ... @property def is_hidden(self) -> bool: ... @property def auto_id(self) -> str: ... @property def id_for_label(self) -> str: ... @cached_property def initial(self) -> Any: ... def build_widget_attrs(self, attrs: _AttrsT, widget: Widget | None = None) -> _AttrsT: ... @property def aria_describedby(self) -> str | None: ... @property def widget_type(self) -> str: ... @property def use_fieldset(self) -> bool: ... class BoundWidget: parent_widget: Widget data: dict[str, Any] renderer: BaseRenderer def __init__(self, parent_widget: Widget, data: dict[str, Any], renderer: BaseRenderer) -> None: ... def tag(self, wrap_label: bool = False) -> SafeString: ... @property def template_name(self) -> str: ... @property def id_for_label(self) -> str: ... @property def choice_label(self) -> str: ... def __html__(self) -> SafeString: ... __all__ = ("BoundField",) typeddjango-django-stubs-fa03b48/django-stubs/forms/fields.pyi000066400000000000000000000551451526064357400245760ustar00rootroot00000000000000import datetime import json from collections.abc import Callable, Collection, Iterable, Iterator, Sequence from decimal import Decimal from re import Pattern from typing import Any, ClassVar, Protocol, Self, TypeAlias, type_check_only from uuid import UUID from django.core.files import File from django.core.validators import _ValidatorCallable from django.db.models.fields import _ErrorMessagesDict, _ErrorMessagesMapping from django.forms.boundfield import BoundField from django.forms.forms import BaseForm from django.forms.widgets import Widget from django.utils.choices import CallableChoiceIterator, _ChoicesCallable, _ChoicesInput from django.utils.datastructures import _PropertyDescriptor from django.utils.functional import _StrOrPromise from typing_extensions import override # Problem: attribute `widget` is always of type `Widget` after field instantiation. # However, on class level it can be set to `Type[Widget]` too. # If we annotate it as `Widget | Type[Widget]`, every code that uses field # instances will not typecheck. # If we annotate it as `Widget`, any widget subclasses that do e.g. # `widget = Select` will not typecheck. # `Any` gives too much freedom, but does not create false positives. _ClassLevelWidgetT: TypeAlias = Any class Field: initial: Any label: _StrOrPromise | None required: bool widget: _ClassLevelWidgetT hidden_widget: type[Widget] default_validators: list[_ValidatorCallable] default_error_messages: ClassVar[_ErrorMessagesDict] empty_values: Sequence[Any] show_hidden_initial: bool help_text: _StrOrPromise disabled: bool label_suffix: str | None localize: bool error_messages: _ErrorMessagesDict validators: list[_ValidatorCallable] bound_field_class: type[BoundField] | None def __init__( self, *, required: bool = True, widget: Widget | type[Widget] | None = None, label: _StrOrPromise | None = None, initial: Any | None = None, help_text: _StrOrPromise = "", error_messages: _ErrorMessagesMapping | None = None, show_hidden_initial: bool = False, validators: Iterable[_ValidatorCallable] = (), localize: bool = False, disabled: bool = False, label_suffix: str | None = None, template_name: str | None = None, bound_field_class: type[BoundField] | None = None, ) -> None: ... def prepare_value(self, value: Any) -> Any: ... def to_python(self, value: Any | None) -> Any | None: ... def validate(self, value: Any) -> None: ... def run_validators(self, value: Any) -> None: ... def clean(self, value: Any) -> Any: ... def bound_data(self, data: Any, initial: Any) -> Any: ... def widget_attrs(self, widget: Widget) -> dict[str, Any]: ... def has_changed(self, initial: Any | None, data: Any | None) -> bool: ... def get_bound_field(self, form: BaseForm, field_name: str) -> BoundField: ... def __deepcopy__(self, memo: dict[int, Any]) -> Self: ... class CharField(Field): max_length: int | None min_length: int | None strip: bool empty_value: str | None def __init__( self, *, max_length: int | None = None, min_length: int | None = None, strip: bool = True, empty_value: str | None = "", required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def to_python(self, value: Any | None) -> str | None: ... @override def widget_attrs(self, widget: Widget) -> dict[str, Any]: ... class IntegerField(Field): widget: _ClassLevelWidgetT max_value: int | Callable[[], int] | None min_value: int | Callable[[], int] | None step_size: int | Callable[[], int] | None re_decimal: Pattern[str] def __init__( self, *, max_value: int | Callable[[], int] | None = None, min_value: int | Callable[[], int] | None = None, step_size: int | Callable[[], int] | None = None, required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def to_python(self, value: Any | None) -> int | None: ... @override def widget_attrs(self, widget: Widget) -> dict[str, Any]: ... class FloatField(IntegerField): def __init__( self, *, max_value: int | float | None = None, min_value: int | float | None = None, step_size: int | float | None = None, required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def to_python(self, value: Any | None) -> float | None: ... # type: ignore[override] @override def validate(self, value: float) -> None: ... @override def widget_attrs(self, widget: Widget) -> dict[str, Any]: ... class DecimalField(IntegerField): decimal_places: int | None max_digits: int | None def __init__( self, *, max_value: Decimal | int | float | None = None, min_value: Decimal | int | float | None = None, max_digits: int | None = None, decimal_places: int | None = None, step_size: Decimal | int | float | None = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def to_python(self, value: Any | None) -> Decimal | None: ... # type: ignore[override] @override def validate(self, value: Decimal) -> None: ... @override def widget_attrs(self, widget: Widget) -> dict[str, Any]: ... class BaseTemporalField(Field): input_formats: Collection[str] | DateTimeFormatsIterator | None def __init__( self, *, input_formats: Collection[str] | DateTimeFormatsIterator | None = None, required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def to_python(self, value: str | None) -> Any | None: ... def strptime(self, value: str, format: str) -> Any: ... class DateField(BaseTemporalField): widget: _ClassLevelWidgetT @override def to_python(self, value: str | datetime.datetime | datetime.date | None) -> datetime.date | None: ... @override def strptime(self, value: str, format: str) -> datetime.date: ... class TimeField(BaseTemporalField): widget: _ClassLevelWidgetT @override def to_python(self, value: str | datetime.time | None) -> datetime.time | None: ... @override def strptime(self, value: str, format: str) -> datetime.time: ... class DateTimeFormatsIterator: def __iter__(self) -> Iterator[str]: ... class DateTimeField(BaseTemporalField): widget: _ClassLevelWidgetT @override def prepare_value(self, value: Any) -> Any: ... @override def to_python(self, value: str | datetime.datetime | datetime.date | None) -> datetime.datetime | None: ... @override def strptime(self, value: str, format: str) -> datetime.datetime: ... class DurationField(Field): @override def prepare_value(self, value: datetime.timedelta | str | None) -> str | None: ... @override def to_python(self, value: Any | None) -> datetime.timedelta | None: ... class RegexField(CharField): regex: _PropertyDescriptor[str | Pattern[str], Pattern[str]] def __init__( self, regex: str | Pattern[str], *, max_length: int | None = ..., min_length: int | None = ..., strip: bool = ..., empty_value: str | None = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... class EmailField(CharField): widget: _ClassLevelWidgetT def __init__( self, *, max_length: int | None = ..., min_length: int | None = ..., strip: bool = ..., empty_value: str | None = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... class FileField(Field): widget: _ClassLevelWidgetT allow_empty_file: bool max_length: int | None def __init__( self, *, max_length: int | None = None, allow_empty_file: bool = False, required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def to_python(self, data: File[Any] | None) -> File[Any] | None: ... @override def clean(self, data: Any, initial: Any | None = None) -> Any: ... @override def bound_data(self, _: Any | None, initial: Any) -> Any: ... @override def has_changed(self, initial: Any | None, data: Any | None) -> bool: ... class ImageField(FileField): @override def to_python(self, data: File[Any] | None) -> File[Any] | None: ... @override def widget_attrs(self, widget: Widget) -> dict[str, Any]: ... class URLField(CharField): widget: _ClassLevelWidgetT def __init__( self, *, max_length: int | None = ..., min_length: int | None = ..., strip: bool = ..., empty_value: str | None = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., assume_scheme: str | None = None, ) -> None: ... @override def to_python(self, value: Any | None) -> str | None: ... class BooleanField(Field): widget: _ClassLevelWidgetT @override def to_python(self, value: Any | None) -> bool: ... @override def validate(self, value: Any) -> None: ... @override def has_changed(self, initial: Any | None, data: Any | None) -> bool: ... class NullBooleanField(BooleanField): widget: _ClassLevelWidgetT @override def to_python(self, value: Any | None) -> bool | None: ... # type: ignore[override] @override def validate(self, value: Any) -> None: ... class ChoiceField(Field): choices: _PropertyDescriptor[ _ChoicesInput | _ChoicesCallable | CallableChoiceIterator, _ChoicesInput | CallableChoiceIterator, ] widget: _ClassLevelWidgetT def __init__( self, *, choices: _ChoicesInput | _ChoicesCallable = (), required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def __deepcopy__(self, memo: dict[int, Any]) -> Self: ... # Real return type of `to_python` is `str`, but it results in errors when # subclassing `ModelChoiceField`: `# type: ignore[override]` is not inherited @override def to_python(self, value: Any | None) -> Any: ... @override def validate(self, value: Any) -> None: ... def valid_value(self, value: Any) -> bool: ... @type_check_only class _CoerceCallable(Protocol): def __call__(self, value: Any, /) -> Any: ... class TypedChoiceField(ChoiceField): coerce: _CoerceCallable empty_value: str | None def __init__( self, *, coerce: _CoerceCallable = ..., empty_value: str | None = "", choices: _ChoicesInput | _ChoicesCallable = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def clean(self, value: Any) -> Any: ... class MultipleChoiceField(ChoiceField): widget: _ClassLevelWidgetT hidden_widget: type[Widget] @override def to_python(self, value: Any | None) -> list[str]: ... @override def validate(self, value: Any) -> None: ... @override def has_changed(self, initial: Collection[Any] | None, data: Collection[Any] | None) -> bool: ... class TypedMultipleChoiceField(MultipleChoiceField): coerce: _CoerceCallable empty_value: list[Any] | None def __init__( self, *, coerce: _CoerceCallable = ..., empty_value: list[Any] | None = ..., choices: _ChoicesInput | _ChoicesCallable = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def clean(self, value: Any) -> Any: ... @override def validate(self, value: Any) -> None: ... class ComboField(Field): fields: Sequence[Field] def __init__( self, fields: Sequence[Field], *, required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def clean(self, value: Any) -> Any: ... class MultiValueField(Field): require_all_fields: bool fields: Sequence[Field] def __init__( self, fields: Sequence[Field], *, require_all_fields: bool = True, required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def __deepcopy__(self, memo: dict[int, Any]) -> Self: ... @override def validate(self, value: Any) -> None: ... @override def clean(self, value: Any) -> Any: ... def compress(self, data_list: Any) -> Any: ... @override def has_changed(self, initial: Any | None, data: Any | None) -> bool: ... class FilePathField(ChoiceField): allow_files: bool allow_folders: bool match: str | None path: str recursive: bool match_re: Pattern[str] | None def __init__( self, path: str, *, match: str | None = None, recursive: bool = False, allow_files: bool = True, allow_folders: bool = False, choices: _ChoicesInput | _ChoicesCallable = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... def set_choices(self) -> None: ... class SplitDateTimeField(MultiValueField): widget: _ClassLevelWidgetT hidden_widget: type[Widget] def __init__( self, *, input_date_formats: Any | None = None, input_time_formats: Any | None = None, fields: Sequence[Field] = ..., require_all_fields: bool = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def compress(self, data_list: tuple[datetime.date, datetime.time] | None) -> datetime.datetime | None: ... class GenericIPAddressField(CharField): unpack_ipv4: bool def __init__( self, *, protocol: str = "both", unpack_ipv4: bool = False, required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... @override def to_python(self, value: Any) -> str: ... class SlugField(CharField): allow_unicode: bool def __init__( self, *, allow_unicode: bool = False, max_length: Any | None = ..., min_length: Any | None = ..., strip: bool = ..., empty_value: str | None = ..., required: bool = ..., widget: Widget | type[Widget] | None = ..., label: _StrOrPromise | None = ..., initial: Any | None = ..., help_text: _StrOrPromise = ..., error_messages: _ErrorMessagesMapping | None = ..., show_hidden_initial: bool = ..., validators: Iterable[_ValidatorCallable] = ..., localize: bool = ..., disabled: bool = ..., label_suffix: str | None = ..., ) -> None: ... class UUIDField(CharField): @override def prepare_value(self, value: Any | None) -> Any | None: ... @override def to_python(self, value: Any) -> UUID | None: ... # type: ignore[override] class InvalidJSONInput(str): ... class JSONString(str): ... class JSONField(CharField): default_error_messages: ClassVar[_ErrorMessagesDict] widget: _ClassLevelWidgetT encoder: type[json.JSONEncoder] | None decoder: type[json.JSONDecoder] | None def __init__( self, encoder: type[json.JSONEncoder] | None = None, decoder: type[json.JSONDecoder] | None = None, **kwargs: Any, ) -> None: ... @override def to_python(self, value: Any) -> Any: ... @override def bound_data(self, data: Any, initial: Any) -> Any: ... @override def prepare_value(self, value: Any) -> str: ... @override def has_changed(self, initial: Any | None, data: Any | None) -> bool: ... __all__ = ( "BooleanField", "CharField", "ChoiceField", "ComboField", "DateField", "DateTimeField", "DecimalField", "DurationField", "EmailField", "Field", "FileField", "FilePathField", "FloatField", "GenericIPAddressField", "ImageField", "IntegerField", "JSONField", "MultiValueField", "MultipleChoiceField", "NullBooleanField", "RegexField", "SlugField", "SplitDateTimeField", "TimeField", "TypedChoiceField", "TypedMultipleChoiceField", "URLField", "UUIDField", ) typeddjango-django-stubs-fa03b48/django-stubs/forms/forms.pyi000066400000000000000000000070211526064357400244440ustar00rootroot00000000000000from collections.abc import Iterable, Iterator, Mapping, MutableMapping, Sequence from typing import Any, ClassVar, overload from django.core.exceptions import ValidationError from django.db.models.query import _SupportsContains from django.forms.boundfield import BoundField from django.forms.fields import Field from django.forms.renderers import BaseRenderer from django.forms.utils import ErrorDict, ErrorList, RenderableFormMixin, _DataT, _FilesT from django.forms.widgets import Media, MediaDefiningClass from django.utils.functional import _StrOrPromise, cached_property from typing_extensions import override class DeclarativeFieldsMetaclass(MediaDefiningClass): ... class BaseForm(_SupportsContains[str], RenderableFormMixin): default_renderer: BaseRenderer | type[BaseRenderer] | None field_order: Iterable[str] | None use_required_attribute: bool is_bound: bool data: _DataT files: _FilesT auto_id: bool | str initial: MutableMapping[str, Any] error_class: type[ErrorList] prefix: str | None label_suffix: str empty_permitted: bool fields: dict[str, Field] renderer: BaseRenderer cleaned_data: dict[str, Any] template_name_div: str template_name_p: str template_name_table: str template_name_ul: str template_name_label: str bound_field_class: type[BoundField] | None def __init__( self, data: _DataT | None = None, files: _FilesT | None = None, auto_id: bool | str = "id_%s", prefix: str | None = None, initial: MutableMapping[str, Any] | None = None, error_class: type[ErrorList] = ..., label_suffix: str | None = None, empty_permitted: bool = False, field_order: Iterable[str] | None = None, use_required_attribute: bool | None = None, renderer: BaseRenderer | None = None, bound_field_class: type[BoundField] | None = None, ) -> None: ... def order_fields(self, field_order: Iterable[str] | None) -> None: ... def __iter__(self) -> Iterator[BoundField]: ... def __getitem__(self, name: str) -> BoundField: ... @property def errors(self) -> ErrorDict: ... def is_valid(self) -> bool: ... def add_prefix(self, field_name: str) -> str: ... def add_initial_prefix(self, field_name: str) -> str: ... @property def template_name(self) -> str: ... @override def get_context(self) -> dict[str, Any]: ... def non_field_errors(self) -> ErrorList: ... @overload def add_error( self, field: None, error: Mapping[str, ValidationError | _StrOrPromise | Sequence[ValidationError | _StrOrPromise]], ) -> None: ... @overload def add_error( self, field: str | None, error: ValidationError | _StrOrPromise | Sequence[ValidationError | _StrOrPromise] ) -> None: ... def has_error(self, field: str | None, code: str | None = None) -> bool: ... def full_clean(self) -> None: ... def clean(self) -> dict[str, Any] | None: ... def has_changed(self) -> bool: ... @cached_property def changed_data(self) -> list[str]: ... @property def media(self) -> Media: ... def is_multipart(self) -> bool: ... def hidden_fields(self) -> list[BoundField]: ... def visible_fields(self) -> list[BoundField]: ... def get_initial_for_field(self, field: Field, field_name: str) -> Any: ... class Form(BaseForm, metaclass=DeclarativeFieldsMetaclass): base_fields: ClassVar[dict[str, Field]] declared_fields: ClassVar[dict[str, Field]] __all__ = ("BaseForm", "Form") typeddjango-django-stubs-fa03b48/django-stubs/forms/formsets.pyi000066400000000000000000000102521526064357400251600ustar00rootroot00000000000000from collections.abc import Iterator, Mapping, Sequence, Sized from typing import Any, ClassVar, Generic from django.db.models.fields import _ErrorMessagesDict from django.db.models.query import _SupportsContains from django.forms.forms import BaseForm, Form from django.forms.renderers import BaseRenderer from django.forms.utils import ErrorList, RenderableFormMixin, _DataT, _FilesT from django.forms.widgets import Media, MediaDefiningClass, Widget from django.utils.functional import cached_property from typing_extensions import TypeVar, override TOTAL_FORM_COUNT: str INITIAL_FORM_COUNT: str MIN_NUM_FORM_COUNT: str MAX_NUM_FORM_COUNT: str ORDERING_FIELD_NAME: str DELETION_FIELD_NAME: str DEFAULT_MIN_NUM: int DEFAULT_MAX_NUM: int _F = TypeVar("_F", bound=BaseForm) class ManagementForm(Form): cleaned_data: dict[str, int | None] @override def clean(self) -> dict[str, int | None]: ... class BaseFormSet(_SupportsContains[_F], Sized, RenderableFormMixin, Generic[_F]): form: type[_F] extra: int can_order: bool can_delete: bool can_delete_extra: bool min_num: int max_num: int absolute_max: int validate_min: bool validate_max: bool is_bound: bool prefix: str | None auto_id: str data: _DataT files: _FilesT initial: Sequence[Mapping[str, Any]] | None form_kwargs: dict[str, Any] error_class: type[ErrorList] deletion_widget: MediaDefiningClass ordering_widget: MediaDefiningClass default_error_messages: ClassVar[_ErrorMessagesDict] template_name_div: str template_name_p: str template_name_table: str template_name_ul: str def __init__( self, data: _DataT | None = None, files: _FilesT | None = None, auto_id: str = "id_%s", prefix: str | None = None, initial: Sequence[Mapping[str, Any]] | None = None, error_class: type[ErrorList] = ..., form_kwargs: dict[str, Any] | None = None, error_messages: Mapping[str, str] | None = None, ) -> None: ... def __iter__(self) -> Iterator[_F]: ... def __getitem__(self, index: int) -> _F: ... @override def __len__(self) -> int: ... def __bool__(self) -> bool: ... @cached_property def management_form(self) -> ManagementForm: ... def total_form_count(self) -> int: ... def initial_form_count(self) -> int: ... @cached_property def forms(self) -> list[_F]: ... def get_form_kwargs(self, index: int | None) -> dict[str, Any]: ... @property def initial_forms(self) -> list[_F]: ... @property def extra_forms(self) -> list[_F]: ... @property def empty_form(self) -> _F: ... @property def cleaned_data(self) -> list[dict[str, Any]]: ... @property def deleted_forms(self) -> list[_F]: ... @property def ordered_forms(self) -> list[_F]: ... @classmethod def get_default_prefix(cls) -> str: ... @classmethod def get_deletion_widget(cls) -> type[Widget]: ... @classmethod def get_ordering_widget(cls) -> type[Widget]: ... def non_form_errors(self) -> ErrorList: ... @property def errors(self) -> list[ErrorList]: ... def total_error_count(self) -> int: ... def is_valid(self) -> bool: ... def full_clean(self) -> None: ... def clean(self) -> None: ... def has_changed(self) -> bool: ... def add_fields(self, form: _F, index: int | None) -> None: ... def add_prefix(self, index: int | str) -> str: ... def is_multipart(self) -> bool: ... @property def media(self) -> Media: ... @property def template_name(self) -> str: ... @override def get_context(self) -> dict[str, Any]: ... def formset_factory( form: type[_F], formset: type[BaseFormSet[_F]] = ..., extra: int = 1, can_order: bool = False, can_delete: bool = False, max_num: int | None = None, validate_max: bool = False, min_num: int | None = None, validate_min: bool = False, absolute_max: int | None = None, can_delete_extra: bool = True, renderer: BaseRenderer | None = None, ) -> type[BaseFormSet[_F]]: ... def all_valid(formsets: Sequence[BaseFormSet[_F]]) -> bool: ... __all__ = ("BaseFormSet", "all_valid", "formset_factory") typeddjango-django-stubs-fa03b48/django-stubs/forms/models.pyi000066400000000000000000000313221526064357400246020ustar00rootroot00000000000000from collections.abc import Callable, Collection, Container, Iterator, Mapping, MutableMapping, Sequence from typing import Any, ClassVar, Generic, Literal, Self, TypeAlias, overload from uuid import UUID from django.db import models from django.db.models import ForeignKey from django.db.models.base import Model from django.db.models.fields import _AllLimitChoicesTo, _LimitChoicesTo from django.db.models.manager import Manager from django.db.models.query import QuerySet from django.db.models.utils import AltersData from django.forms.fields import ChoiceField, Field, _ClassLevelWidgetT from django.forms.forms import BaseForm, DeclarativeFieldsMetaclass from django.forms.formsets import BaseFormSet from django.forms.renderers import BaseRenderer from django.forms.utils import ErrorList, _DataT, _FilesT from django.forms.widgets import Widget from django.utils.choices import BaseChoiceIterator, CallableChoiceIterator, _ChoicesCallable, _ChoicesInput from django.utils.datastructures import _PropertyDescriptor from django.utils.functional import _StrOrPromise from typing_extensions import TypeVar, override ALL_FIELDS: Literal["__all__"] _Fields: TypeAlias = Collection[str] | Literal["__all__"] _Widgets: TypeAlias = dict[str, type[Widget] | Widget] _Labels: TypeAlias = dict[str, str] _HelpTexts: TypeAlias = dict[str, str] _ErrorMessages: TypeAlias = dict[str, dict[str, str]] _FormFieldCallback: TypeAlias = Callable[[models.Field[Any, Any]], Field | None] _M = TypeVar("_M", bound=Model) _ParentM = TypeVar("_ParentM", bound=Model) def construct_instance( form: BaseForm, instance: _M, fields: Container[str] | None = None, exclude: Container[str] | None = None ) -> _M: ... def model_to_dict(instance: Model, fields: _Fields | None = None, exclude: _Fields | None = None) -> dict[str, Any]: ... def apply_limit_choices_to_to_formfield(formfield: Field) -> None: ... def fields_for_model( model: type[Model], fields: _Fields | None = None, exclude: _Fields | None = None, widgets: _Widgets | None = None, formfield_callback: _FormFieldCallback | None = None, localized_fields: _Fields | None = None, labels: _Labels | None = None, help_texts: _HelpTexts | None = None, error_messages: _ErrorMessages | None = None, field_classes: Mapping[str, type[Field]] | None = None, *, apply_limit_choices_to: bool = True, form_declared_fields: _Fields | None = None, ) -> dict[str, Any]: ... class ModelFormOptions(Generic[_M]): model: type[_M] fields: _Fields | None exclude: _Fields | None widgets: _Widgets | None localized_fields: _Fields | None labels: _Labels | None help_texts: _HelpTexts | None error_messages: _ErrorMessages | None field_classes: dict[str, type[Field]] | None formfield_callback: _FormFieldCallback | None def __init__(self, options: type | None = None) -> None: ... class ModelFormMetaclass(DeclarativeFieldsMetaclass): ... class BaseModelForm(BaseForm, AltersData, Generic[_M]): instance: _M _meta: ModelFormOptions[_M] def __init__( self, data: _DataT | None = None, files: _FilesT | None = None, auto_id: bool | str = "id_%s", prefix: str | None = None, initial: MutableMapping[str, Any] | None = None, error_class: type[ErrorList] = ..., label_suffix: str | None = None, empty_permitted: bool = False, instance: _M | None = None, use_required_attribute: bool | None = None, renderer: BaseRenderer | None = None, ) -> None: ... def validate_unique(self) -> None: ... def validate_constraints(self) -> None: ... def save(self, commit: bool = True) -> _M: ... def save_m2m(self) -> None: ... class ModelForm(BaseModelForm[_M], metaclass=ModelFormMetaclass): base_fields: ClassVar[dict[str, Field]] declared_fields: ClassVar[dict[str, Field]] def modelform_factory( model: type[_M], form: type[ModelForm[_M]] = ..., fields: _Fields | None = None, exclude: _Fields | None = None, formfield_callback: _FormFieldCallback | None = None, widgets: _Widgets | None = None, localized_fields: _Fields | None = None, labels: _Labels | None = None, help_texts: _HelpTexts | None = None, error_messages: _ErrorMessages | None = None, field_classes: Mapping[str, type[Field]] | None = None, ) -> type[ModelForm[_M]]: ... _ModelFormT = TypeVar("_ModelFormT", bound=ModelForm[Any], default=ModelForm[_M]) # ONLY use together with _M class BaseModelFormSet(BaseFormSet[_ModelFormT], AltersData, Generic[_M, _ModelFormT]): model: type[_M] | None edit_only: bool unique_fields: Collection[str] queryset: QuerySet[_M] | None initial_extra: Sequence[dict[str, Any]] | None def __init__( self, data: _DataT | None = None, files: _FilesT | None = None, auto_id: str = "id_%s", prefix: str | None = None, queryset: QuerySet[_M] | None = None, *, initial: Sequence[dict[str, Any]] | None = None, **kwargs: Any, ) -> None: ... @override def initial_form_count(self) -> int: ... def get_queryset(self) -> QuerySet[_M]: ... def save_new(self, form: _ModelFormT, commit: bool = True) -> _M: ... def save_existing(self, form: _ModelFormT, obj: _M, commit: bool = True) -> _M: ... def delete_existing(self, obj: _M, commit: bool = True) -> None: ... saved_forms: list[_ModelFormT] def save_m2m(self) -> None: ... def save(self, commit: bool = True) -> list[_M]: ... @override def clean(self) -> None: ... def validate_unique(self) -> None: ... def get_unique_error_message(self, unique_check: Sequence[str]) -> str: ... def get_date_error_message(self, date_check: tuple[str, Literal["date", "year", "month"], str, str]) -> str: ... def get_form_error(self) -> str: ... changed_objects: list[tuple[_M, list[str]]] deleted_objects: list[_M] def save_existing_objects(self, commit: bool = True) -> list[_M]: ... new_objects: list[_M] def save_new_objects(self, commit: bool = True) -> list[_M]: ... @override def add_fields(self, form: _ModelFormT, index: int | None) -> None: ... def modelformset_factory( model: type[_M], form: type[_ModelFormT] = ..., formfield_callback: _FormFieldCallback | None = None, formset: type[BaseModelFormSet[Any, Any]] = ..., extra: int = 1, can_delete: bool = False, can_order: bool = False, max_num: int | None = None, fields: _Fields | None = None, exclude: _Fields | None = None, widgets: _Widgets | None = None, validate_max: bool = False, localized_fields: _Fields | None = None, labels: _Labels | None = None, help_texts: _HelpTexts | None = None, error_messages: _ErrorMessages | None = None, min_num: int | None = None, validate_min: bool = False, field_classes: Mapping[str, type[Field]] | None = None, absolute_max: int | None = None, can_delete_extra: bool = True, renderer: BaseRenderer | None = None, edit_only: bool = False, ) -> type[BaseModelFormSet[_M, _ModelFormT]]: ... class BaseInlineFormSet(BaseModelFormSet[_M, _ModelFormT], Generic[_M, _ParentM, _ModelFormT]): instance: _ParentM save_as_new: bool unique_fields: Collection[str] fk: ForeignKey[Any, Any] # set by inlineformset_set def __init__( self, data: _DataT | None = None, files: _FilesT | None = None, instance: _ParentM | None = None, save_as_new: bool = False, prefix: str | None = None, queryset: QuerySet[_M] | None = None, **kwargs: Any, ) -> None: ... @override def initial_form_count(self) -> int: ... @classmethod @override def get_default_prefix(cls) -> str: ... @override def save_new(self, form: _ModelFormT, commit: bool = True) -> _M: ... @override def add_fields(self, form: _ModelFormT, index: int | None) -> None: ... @override def get_unique_error_message(self, unique_check: Sequence[str]) -> str: ... @overload def _get_foreign_key( parent_model: type[Model], model: type[Model], fk_name: str | None = None, can_fail: Literal[False] = ... ) -> ForeignKey[Any, Any]: ... @overload def _get_foreign_key( parent_model: type[Model], model: type[Model], fk_name: str | None = None, can_fail: Literal[True] = ... ) -> ForeignKey[Any, Any] | None: ... def inlineformset_factory( parent_model: type[_ParentM], model: type[_M], form: type[_ModelFormT] = ..., formset: type[BaseInlineFormSet[Any, Any, Any]] = ..., fk_name: str | None = None, fields: _Fields | None = None, exclude: _Fields | None = None, extra: int = 3, can_order: bool = False, can_delete: bool = True, max_num: int | None = None, formfield_callback: _FormFieldCallback | None = None, widgets: _Widgets | None = None, validate_max: bool = False, localized_fields: Sequence[str] | None = None, labels: _Labels | None = None, help_texts: _HelpTexts | None = None, error_messages: _ErrorMessages | None = None, min_num: int | None = None, validate_min: bool = False, field_classes: Mapping[str, type[Field]] | None = None, absolute_max: int | None = None, can_delete_extra: bool = True, renderer: BaseRenderer | None = None, edit_only: bool = False, ) -> type[BaseInlineFormSet[_M, _ParentM, _ModelFormT]]: ... class InlineForeignKeyField(Field): widget: _ClassLevelWidgetT parent_instance: Model pk_field: bool to_field: str | None def __init__( self, parent_instance: Model, *args: Any, pk_field: bool = False, to_field: str | None = None, **kwargs: Any, ) -> None: ... @override def clean(self, value: Any) -> Model: ... @override def has_changed(self, initial: Any, data: Any) -> bool: ... class ModelChoiceIteratorValue: def __init__(self, value: Any, instance: Model) -> None: ... class ModelChoiceIterator(BaseChoiceIterator, Generic[_M]): field: ModelChoiceField[_M] queryset: QuerySet[_M] def __init__(self, field: ModelChoiceField[_M]) -> None: ... @override def __iter__(self) -> Iterator[tuple[ModelChoiceIteratorValue | str, str]]: ... def __len__(self) -> int: ... def __bool__(self) -> bool: ... def choice(self, obj: _M) -> tuple[ModelChoiceIteratorValue, str]: ... class ModelChoiceField(ChoiceField, Generic[_M]): iterator: type[ModelChoiceIterator[_M]] empty_label: _StrOrPromise | None queryset: QuerySet[_M] | None limit_choices_to: _AllLimitChoicesTo | None to_field_name: str | None def __init__( self, queryset: Manager[_M] | QuerySet[_M] | None, *, empty_label: _StrOrPromise | None = "", required: bool = True, widget: Widget | type[Widget] | None = None, label: _StrOrPromise | None = None, initial: Any | None = None, help_text: _StrOrPromise = "", to_field_name: str | None = None, limit_choices_to: _AllLimitChoicesTo | None = None, blank: bool = False, **kwargs: Any, ) -> None: ... def validate_no_null_characters(self, value: Any) -> None: ... def get_limit_choices_to(self) -> _LimitChoicesTo: ... @override def __deepcopy__(self, memo: dict[int, Any]) -> Self: ... def label_from_instance(self, obj: _M) -> str: ... choices: _PropertyDescriptor[ _ChoicesInput | _ChoicesCallable | CallableChoiceIterator, _ChoicesInput | CallableChoiceIterator | ModelChoiceIterator[_M], ] @override def prepare_value(self, value: Any) -> Any: ... @override def to_python(self, value: Any | None) -> _M | None: ... @override def validate(self, value: _M | None) -> None: ... @override def has_changed(self, initial: Model | int | str | UUID | None, data: int | str | None) -> bool: ... class ModelMultipleChoiceField(ModelChoiceField[_M]): widget: _ClassLevelWidgetT hidden_widget: type[Widget] def __init__(self, queryset: Manager[_M] | QuerySet[_M] | None, **kwargs: Any) -> None: ... @override def to_python(self, value: Any) -> list[_M]: ... # type: ignore[override] @override def clean(self, value: Any) -> QuerySet[_M]: ... @override def prepare_value(self, value: Any) -> Any: ... @override def has_changed(self, initial: Collection[Any] | None, data: Collection[Any] | None) -> bool: ... # type: ignore[override] def modelform_defines_fields(form_class: type[ModelForm[Any]]) -> bool: ... __all__ = ( "ALL_FIELDS", "BaseInlineFormSet", "BaseModelForm", "BaseModelFormSet", "ModelChoiceField", "ModelForm", "ModelMultipleChoiceField", "fields_for_model", "inlineformset_factory", "model_to_dict", "modelform_factory", "modelformset_factory", ) typeddjango-django-stubs-fa03b48/django-stubs/forms/renderers.pyi000066400000000000000000000023671526064357400253170ustar00rootroot00000000000000from typing import Any from django.forms.boundfield import BoundField from django.http import HttpRequest from django.template.backends.base import BaseEngine from django.template.backends.django import DjangoTemplates as DjangoTemplatesR from django.template.backends.jinja2 import Jinja2 as Jinja2R from django.template.base import Template from django.utils.functional import cached_property from typing_extensions import override def get_default_renderer() -> BaseRenderer: ... class BaseRenderer: form_template_name: str formset_template_name: str field_template_name: str bound_field_class: type[BoundField] | None def get_template(self, template_name: str) -> Any: ... def render(self, template_name: str, context: dict[str, Any], request: HttpRequest | None = None) -> str: ... class EngineMixin: def get_template(self, template_name: str) -> Any: ... @cached_property def engine(self) -> BaseEngine: ... class DjangoTemplates(EngineMixin, BaseRenderer): backend: type[DjangoTemplatesR] class Jinja2(EngineMixin, BaseRenderer): @cached_property def backend(self) -> type[Jinja2R]: ... class TemplatesSetting(BaseRenderer): @override def get_template(self, template_name: str) -> Template | None: ... typeddjango-django-stubs-fa03b48/django-stubs/forms/utils.pyi000066400000000000000000000060011526064357400244530ustar00rootroot00000000000000from collections import UserList from collections.abc import Mapping, Sequence from datetime import datetime from typing import Any, TypeAlias from django.core.exceptions import ValidationError from django.core.files.uploadedfile import UploadedFile from django.forms.renderers import BaseRenderer from django.utils.datastructures import MultiValueDict from django.utils.functional import _StrOrPromise from django.utils.safestring import SafeString from typing_extensions import override _DataT: TypeAlias = Mapping[str, Any] # noqa: PYI047 _FilesT: TypeAlias = MultiValueDict[str, UploadedFile[Any]] # noqa: PYI047 def pretty_name(name: str) -> str: ... def flatatt(attrs: dict[str, Any]) -> SafeString: ... class RenderableMixin: def get_context(self) -> dict[str, Any]: ... def render( self, template_name: str | None = None, context: dict[str, Any] | None = None, renderer: BaseRenderer | type[BaseRenderer] | None = None, ) -> SafeString: ... # This is a lie, but this is how it is supposed to be used, # in reallity it is `__str__ = __html__ = render`: @override def __str__(self) -> SafeString: ... def __html__(self) -> SafeString: ... class RenderableFieldMixin(RenderableMixin): def as_field_group(self) -> SafeString: ... def as_hidden(self) -> SafeString: ... def as_widget(self) -> SafeString: ... class RenderableFormMixin(RenderableMixin): def as_p(self) -> SafeString: ... def as_table(self) -> SafeString: ... def as_ul(self) -> SafeString: ... def as_div(self) -> SafeString: ... class RenderableErrorMixin(RenderableMixin): def as_json(self, escape_html: bool = False) -> str: ... def as_text(self) -> SafeString: ... def as_ul(self) -> SafeString: ... class ErrorDict(dict[str, ErrorList], RenderableErrorMixin): template_name: str template_name_text: str template_name_ul: str renderer: BaseRenderer def __init__(self, *args: Any, renderer: BaseRenderer | None = None, **kwargs: Any): ... def as_data(self) -> dict[str, list[ValidationError]]: ... def get_json_data(self, escape_html: bool = False) -> dict[str, Any]: ... @override def get_context(self) -> dict[str, Any]: ... class ErrorList(UserList[ValidationError | _StrOrPromise], RenderableErrorMixin): template_name: str template_name_text: str template_name_ul: str error_class: str renderer: BaseRenderer def __init__( self, initlist: ErrorList | Sequence[str | Exception] | None = None, error_class: str | None = None, renderer: BaseRenderer | None = None, field_id: str | None = None, ) -> None: ... def as_data(self) -> list[ValidationError]: ... @override def copy(self) -> ErrorList: ... def get_json_data(self, escape_html: bool = False) -> list[dict[str, str]]: ... @override def get_context(self) -> dict[str, Any]: ... def from_current_timezone(value: datetime) -> datetime: ... def to_current_timezone(value: datetime) -> datetime: ... typeddjango-django-stubs-fa03b48/django-stubs/forms/widgets.pyi000066400000000000000000000335721526064357400247760ustar00rootroot00000000000000import datetime from collections.abc import Iterable, Iterator, Mapping, Sequence from re import Pattern from typing import Any, Literal, Protocol, Self, TypeAlias, type_check_only from _typeshed import Self as MetaclassSelf # noqa: TID251 from django.core.files.base import File from django.db.models.fields.files import FieldFile from django.forms.renderers import BaseRenderer from django.forms.utils import _DataT, _FilesT from django.utils.choices import _Choices from django.utils.datastructures import _ListOrTuple from django.utils.safestring import SafeString from typing_extensions import override _OptAttrs: TypeAlias = dict[str, Any] class MediaOrderConflictWarning(RuntimeWarning): ... class MediaAsset: element_template: str def __init__(self, path: str, **attributes: Any) -> None: ... @override def __eq__(self, other: object) -> bool: ... @override def __hash__(self) -> int: ... def __html__(self) -> SafeString: ... def render(self, *, attrs: Any | None = None) -> SafeString: ... @property def path(self) -> str: ... class Script(MediaAsset): element_template: str def __init__(self, src: str, **attributes: Any) -> None: ... class Stylesheet(MediaAsset): element_template: str def __init__(self, href: str, **attributes: Any) -> None: ... class Media: def __init__( self, media: type | None = None, css: dict[str, Sequence[str]] | None = None, js: Sequence[str] | None = None, ) -> None: ... def render(self, *, attrs: Any | None = None) -> SafeString: ... def render_js(self, *, attrs: Any | None = None) -> list[SafeString]: ... def render_css(self, *, attrs: Any | None = None) -> Iterable[SafeString]: ... def absolute_path(self, path: str) -> str: ... def __getitem__(self, name: str) -> Media: ... @staticmethod def merge(*lists: Iterable[Any]) -> list[Any]: ... def __add__(self, other: Media) -> Media: ... def __html__(self) -> SafeString: ... class MediaDefiningClass(type): def __new__( mcs: type[MetaclassSelf], name: str, bases: tuple[type, ...], attrs: dict[str, Any], ) -> MetaclassSelf: ... class Widget(metaclass=MediaDefiningClass): needs_multipart_form: bool is_localized: bool is_required: bool supports_microseconds: bool attrs: _OptAttrs template_name: str | None use_fieldset: bool def __init__(self, attrs: _OptAttrs | None = None) -> None: ... def __deepcopy__(self, memo: dict[int, Any]) -> Self: ... @property def is_hidden(self) -> bool: ... @property def media(self) -> Media: ... def subwidgets(self, name: str, value: Any, attrs: _OptAttrs | None = None) -> Iterator[dict[str, Any]]: ... # format_value subclasses can return any value usable in a template def format_value(self, value: Any) -> Any: ... def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... def render( self, name: str, value: Any, attrs: _OptAttrs | None = None, renderer: BaseRenderer | None = None ) -> SafeString: ... def build_attrs(self, base_attrs: _OptAttrs, extra_attrs: _OptAttrs | None = None) -> dict[str, Any]: ... def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ... def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ... def id_for_label(self, id_: str) -> str: ... def use_required_attribute(self, initial: Any) -> bool: ... class Input(Widget): input_type: str | None template_name: str @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... class TextInput(Input): input_type: str template_name: str class NumberInput(Input): input_type: str template_name: str class EmailInput(Input): input_type: str template_name: str class URLInput(Input): input_type: str template_name: str class ColorInput(Input): input_type: str template_name: str class SearchInput(Input): input_type: str template_name: str class TelInput(Input): input_type: str template_name: str class PasswordInput(Input): render_value: bool input_type: str template_name: str def __init__(self, attrs: _OptAttrs | None = None, render_value: bool = False) -> None: ... @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... class HiddenInput(Input): input_type: str template_name: str class MultipleHiddenInput(HiddenInput): template_name: str @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... @override def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ... # ModelMultipleChoiceField causes format_value to return a list of PKs generally @override def format_value(self, value: Any) -> list[Any]: ... class FileInput(Input): allow_multiple_selected: bool input_type: str template_name: str needs_multipart_form: bool @override def format_value(self, value: Any) -> None: ... @override def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ... @override def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ... @override def use_required_attribute(self, initial: Any) -> bool: ... FILE_INPUT_CONTRADICTION: object class ClearableFileInput(FileInput): clear_checkbox_label: str initial_text: str input_text: str template_name: str checked: bool def clear_checkbox_name(self, name: str) -> str: ... def clear_checkbox_id(self, name: str) -> str: ... def is_initial(self, value: File[Any] | str | None) -> bool: ... # ClearableFileInput.format_value violates the Liskov substitution principle @override def format_value(self, value: Any) -> FieldFile | None: ... # type: ignore[override] @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... @override def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ... @override def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ... class Textarea(Widget): template_name: str def __init__(self, attrs: _OptAttrs | None = None) -> None: ... class DateTimeBaseInput(TextInput): format_key: str format: str | None supports_microseconds: bool def __init__(self, attrs: _OptAttrs | None = None, format: str | None = None) -> None: ... @override def format_value(self, value: Any) -> str | None: ... class DateInput(DateTimeBaseInput): format_key: str template_name: str class DateTimeInput(DateTimeBaseInput): format_key: str template_name: str class TimeInput(DateTimeBaseInput): format_key: str template_name: str def boolean_check(v: Any) -> bool: ... @type_check_only class _CheckCallable(Protocol): def __call__(self, value: Any, /) -> bool: ... class CheckboxInput(Input): check_test: _CheckCallable input_type: str template_name: str def __init__(self, attrs: _OptAttrs | None = None, check_test: _CheckCallable | None = None) -> None: ... @override def format_value(self, value: Any) -> str | None: ... @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... @override def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> bool: ... @override def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ... class ChoiceWidget(Widget): allow_multiple_selected: bool input_type: str | None template_name: str | None option_template_name: str | None add_id_index: bool checked_attribute: Any option_inherits_attrs: bool choices: _Choices def __init__(self, attrs: _OptAttrs | None = None, choices: _Choices = ()) -> None: ... @override def subwidgets(self, name: str, value: Any, attrs: _OptAttrs | None = None) -> Iterator[dict[str, Any]]: ... def options(self, name: str, value: list[str], attrs: _OptAttrs | None = None) -> Iterator[dict[str, Any]]: ... def optgroups( self, name: str, value: list[str], attrs: _OptAttrs | None = None ) -> list[tuple[str | None, list[dict[str, Any]], int | None]]: ... def create_option( self, name: str, value: Any, label: int | str, selected: bool, index: int, subindex: int | None = None, attrs: _OptAttrs | None = None, ) -> dict[str, Any]: ... @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... @override def id_for_label(self, id_: str, index: str = "0") -> str: ... @override def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ... @override def format_value(self, value: Any) -> list[str]: ... class Select(ChoiceWidget): input_type: str | None template_name: str option_template_name: str add_id_index: bool checked_attribute: Any option_inherits_attrs: bool @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... @override def use_required_attribute(self, initial: Any) -> bool: ... class NullBooleanSelect(Select): def __init__(self, attrs: _OptAttrs | None = None) -> None: ... # NullBooleanSelect.format_value violates the Liskov substitution principle @override def format_value(self, value: Any) -> str: ... # type: ignore[override] @override def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> bool | None: ... class SelectMultiple(Select): allow_multiple_selected: bool @override def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> Any: ... @override def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ... class RadioSelect(ChoiceWidget): input_type: str template_name: str option_template_name: str @override def id_for_label(self, id_: str, index: str | None = None) -> str: ... class CheckboxSelectMultiple(RadioSelect): input_type: str template_name: str option_template_name: str @override def use_required_attribute(self, initial: Any) -> bool: ... @override def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ... class MultiWidget(Widget): template_name: str widgets: Sequence[Widget] def __init__( self, widgets: dict[str, Widget | type[Widget]] | Sequence[Widget | type[Widget]], attrs: _OptAttrs | None = None, ) -> None: ... @property @override def is_hidden(self) -> bool: ... @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... @override def id_for_label(self, id_: str) -> str: ... @override def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> list[Any]: ... @override def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ... def decompress(self, value: Any) -> Any | None: ... @property @override def needs_multipart_form(self) -> bool: ... # type: ignore[override] class SplitDateTimeWidget(MultiWidget): supports_microseconds: bool template_name: str widgets: tuple[DateInput, TimeInput] def __init__( self, attrs: _OptAttrs | None = None, date_format: str | None = None, time_format: str | None = None, date_attrs: dict[str, str] | None = None, time_attrs: dict[str, str] | None = None, ) -> None: ... @override def decompress(self, value: Any) -> tuple[datetime.date | None, datetime.time | None]: ... class SplitHiddenDateTimeWidget(SplitDateTimeWidget): template_name: str def __init__( self, attrs: _OptAttrs | None = None, date_format: str | None = None, time_format: str | None = None, date_attrs: dict[str, str] | None = None, time_attrs: dict[str, str] | None = None, ) -> None: ... class SelectDateWidget(Widget): none_value: tuple[Literal[""], str] month_field: str day_field: str year_field: str template_name: str input_type: str select_widget: type[ChoiceWidget] date_re: Pattern[str] years: Iterable[int | str] months: Mapping[int, str] year_none_value: tuple[Literal[""], str] month_none_value: tuple[Literal[""], str] day_none_value: tuple[Literal[""], str] def __init__( self, attrs: _OptAttrs | None = None, years: Iterable[int | str] | None = None, months: Mapping[int, str] | None = None, empty_label: str | _ListOrTuple[str] | None = None, ) -> None: ... @override def get_context(self, name: str, value: Any, attrs: _OptAttrs | None) -> dict[str, Any]: ... @override def format_value(self, value: Any) -> dict[str, str | int | None]: ... @override def id_for_label(self, id_: str) -> str: ... @override def value_from_datadict(self, data: _DataT, files: _FilesT, name: str) -> str | Any | None: ... @override def value_omitted_from_data(self, data: _DataT, files: _FilesT, name: str) -> bool: ... __all__ = ( "CheckboxInput", "CheckboxSelectMultiple", "ClearableFileInput", "ColorInput", "DateInput", "DateTimeInput", "EmailInput", "FileInput", "HiddenInput", "Media", "MediaDefiningClass", "MultiWidget", "MultipleHiddenInput", "NullBooleanSelect", "NumberInput", "PasswordInput", "RadioSelect", "Script", "SearchInput", "Select", "SelectDateWidget", "SelectMultiple", "SplitDateTimeWidget", "SplitHiddenDateTimeWidget", "Stylesheet", "TelInput", "TextInput", "Textarea", "TimeInput", "URLInput", "Widget", ) typeddjango-django-stubs-fa03b48/django-stubs/http/000077500000000000000000000000001526064357400224245ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/http/__init__.pyi000066400000000000000000000036531526064357400247150ustar00rootroot00000000000000from .cookie import SimpleCookie as SimpleCookie from .cookie import parse_cookie as parse_cookie from .request import HttpHeaders as HttpHeaders from .request import HttpRequest as HttpRequest from .request import QueryDict as QueryDict from .request import RawPostDataException as RawPostDataException from .request import UnreadablePostError as UnreadablePostError from .response import BadHeaderError as BadHeaderError from .response import FileResponse as FileResponse from .response import Http404 as Http404 from .response import HttpResponse as HttpResponse from .response import HttpResponseBadRequest as HttpResponseBadRequest from .response import HttpResponseBase as HttpResponseBase from .response import HttpResponseForbidden as HttpResponseForbidden from .response import HttpResponseGone as HttpResponseGone from .response import HttpResponseNotAllowed as HttpResponseNotAllowed from .response import HttpResponseNotFound as HttpResponseNotFound from .response import HttpResponseNotModified as HttpResponseNotModified from .response import HttpResponsePermanentRedirect as HttpResponsePermanentRedirect from .response import HttpResponseRedirect as HttpResponseRedirect from .response import HttpResponseServerError as HttpResponseServerError from .response import JsonResponse as JsonResponse from .response import StreamingHttpResponse as StreamingHttpResponse __all__ = [ "BadHeaderError", "FileResponse", "Http404", "HttpHeaders", "HttpRequest", "HttpResponse", "HttpResponseBadRequest", "HttpResponseBase", "HttpResponseForbidden", "HttpResponseGone", "HttpResponseNotAllowed", "HttpResponseNotFound", "HttpResponseNotModified", "HttpResponsePermanentRedirect", "HttpResponseRedirect", "HttpResponseServerError", "JsonResponse", "QueryDict", "RawPostDataException", "SimpleCookie", "StreamingHttpResponse", "UnreadablePostError", "parse_cookie", ] typeddjango-django-stubs-fa03b48/django-stubs/http/cookie.pyi000066400000000000000000000001541526064357400244200ustar00rootroot00000000000000from http.cookies import SimpleCookie as SimpleCookie def parse_cookie(cookie: str) -> dict[str, str]: ... typeddjango-django-stubs-fa03b48/django-stubs/http/multipartparser.pyi000066400000000000000000000043231526064357400264070ustar00rootroot00000000000000import re from collections.abc import Iterator, Mapping from typing import Any, ClassVar, Literal from django.http.request import QueryDict, _PostDataProtocol from django.utils.datastructures import ImmutableList, MultiValueDict class MultiPartParserError(Exception): ... class InputStreamExhausted(Exception): ... RAW: Literal["raw"] FILE: Literal["file"] FIELD: Literal["field"] FIELD_TYPES: frozenset[str] class MultiPartParser: boundary_re: ClassVar[re.Pattern[str]] def __init__( self, META: Mapping[str, Any], input_data: _PostDataProtocol, upload_handlers: list[Any] | ImmutableList[Any], encoding: str | None = ..., ) -> None: ... def parse(self) -> tuple[QueryDict, MultiValueDict[Any, Any]]: ... def handle_file_complete(self, old_field_name: str, counters: list[int]) -> None: ... def sanitize_file_name(self, file_name: str) -> str | None: ... def IE_sanitize(self, file_name: str) -> str | None: ... class LazyStream: length: int | None position: int def __init__(self, producer: BoundaryIter | ChunkIter, length: int | None = ...) -> None: ... def tell(self) -> int: ... def read(self, size: int | None = ...) -> bytes: ... def __next__(self) -> bytes: ... def close(self) -> None: ... def __iter__(self) -> LazyStream: ... def unget(self, bytes: bytes) -> None: ... class ChunkIter: flo: _PostDataProtocol chunk_size: int def __init__(self, flo: _PostDataProtocol, chunk_size: int = ...) -> None: ... def __next__(self) -> bytes: ... def __iter__(self) -> ChunkIter: ... class InterBoundaryIter: def __init__(self, stream: LazyStream, boundary: bytes) -> None: ... def __iter__(self) -> InterBoundaryIter: ... def __next__(self) -> LazyStream: ... class BoundaryIter: def __init__(self, stream: LazyStream, boundary: bytes) -> None: ... def __iter__(self) -> BoundaryIter: ... def __next__(self) -> bytes: ... class Parser: def __init__(self, stream: LazyStream, boundary: bytes) -> None: ... def __iter__(self) -> Iterator[tuple[str, dict[str, tuple[str, dict[str, bytes | str]]], LazyStream]]: ... __all__ = ("InputStreamExhausted", "MultiPartParser", "MultiPartParserError") typeddjango-django-stubs-fa03b48/django-stubs/http/request.pyi000066400000000000000000000244571526064357400246530ustar00rootroot00000000000000import datetime from collections.abc import Awaitable, Callable, Iterable, Iterator, Mapping, Sequence from re import Pattern from typing import Any, BinaryIO, Literal, NoReturn, Protocol, Self, TypeAlias, overload, type_check_only from django.contrib.auth.models import _AnyUser from django.contrib.sessions.backends.base import SessionBase from django.contrib.sites.models import Site from django.core.files import uploadedfile, uploadhandler from django.http.multipartparser import MultiPartParser from django.urls import ResolverMatch from django.utils.datastructures import CaseInsensitiveMapping, ImmutableList, MultiValueDict from django.utils.functional import cached_property from django.views.debug import ExceptionReporter, SafeExceptionReporterFilter from typing_extensions import TypeVar, override RAISE_ERROR: object host_validation_re: Pattern[str] @type_check_only class _PostDataProtocol(Protocol): def read(self, num_bytes: int | None = ..., /) -> bytes: ... def readline(self, limit: int | None = ..., /) -> bytes: ... def readlines(self) -> list[bytes]: ... def __iter__(self) -> Iterator[bytes]: ... class UnreadablePostError(OSError): ... class RawPostDataException(Exception): ... _UploadHandlerList: TypeAlias = list[uploadhandler.FileUploadHandler] | ImmutableList[uploadhandler.FileUploadHandler] class HttpHeaders(CaseInsensitiveMapping[str]): HTTP_PREFIX: str UNPREFIXED_HEADERS: set[str] def __init__(self, environ: Mapping[str, Any]) -> None: ... @classmethod def parse_header_name(cls, header: str) -> str | None: ... @classmethod def to_wsgi_name(cls, header: str) -> str: ... @classmethod def to_asgi_name(cls, header: str) -> str: ... @classmethod def to_wsgi_names(cls, headers: Mapping[str, Any]) -> dict[str, Any]: ... @classmethod def to_asgi_names(cls, headers: Mapping[str, Any]) -> dict[str, Any]: ... class HttpRequest: GET: _ImmutableQueryDict POST: _ImmutableQueryDict COOKIES: dict[str, str] META: dict[str, Any] FILES: MultiValueDict[str, uploadedfile.UploadedFile[Any]] path: str path_info: str method: str | None resolver_match: ResolverMatch | None content_type: str | None content_params: dict[str, str] | None _body: bytes _stream: BinaryIO # Attributes set by middleware: # https://docs.djangoproject.com/en/stable/ref/request-response/#attributes-set-by-middleware # django.contrib.sessions.middleware.SessionMiddleware: session: SessionBase # django.contrib.sites.middleware.CurrentSiteMiddleware: site: Site # django.contrib.auth.middleware.AuthenticationMiddleware: user: _AnyUser auser: Callable[[], Awaitable[_AnyUser]] # django.middleware.locale.LocaleMiddleware: LANGUAGE_CODE: str # Attributes set by application code: # https://docs.djangoproject.com/en/stable/ref/request-response/#attributes-set-by-application-code current_app: str urlconf: str | None exception_reporter_filter: SafeExceptionReporterFilter exception_reporter_class: type[ExceptionReporter] def __init__(self) -> None: ... def get_host(self) -> str: ... def get_port(self) -> str: ... def get_full_path(self, force_append_slash: bool = False) -> str: ... def get_full_path_info(self, force_append_slash: bool = False) -> str: ... def get_signed_cookie( self, key: str, default: Any = ..., salt: str = ..., max_age: int | datetime.timedelta | None = ... ) -> str | None: ... def build_absolute_uri(self, location: str | None = ...) -> str: ... @property def scheme(self) -> str | None: ... def is_secure(self) -> bool: ... @property def encoding(self) -> str | None: ... @encoding.setter def encoding(self, val: str) -> None: ... @property def upload_handlers(self) -> _UploadHandlerList: ... @upload_handlers.setter def upload_handlers(self, upload_handlers: _UploadHandlerList) -> None: ... @property def multipart_parser_class(self) -> MultiPartParser: ... @multipart_parser_class.setter def multipart_parser_class(self, multipart_parser_class: MultiPartParser) -> None: ... @cached_property def accepted_types(self) -> list[MediaType]: ... @cached_property def accepted_types_by_precedence(self) -> list[MediaType]: ... def accepted_type(self, media_type: str) -> MediaType | None: ... def get_preferred_type(self, media_types: Sequence[str]) -> str | None: ... def parse_file_upload( self, META: Mapping[str, Any], post_data: _PostDataProtocol ) -> tuple[QueryDict, MultiValueDict[str, uploadedfile.UploadedFile[Any]]]: ... @cached_property def headers(self) -> HttpHeaders: ... @property def body(self) -> bytes: ... def _load_post_and_files(self) -> None: ... def accepts(self, media_type: str) -> bool: ... def close(self) -> None: ... # File-like and iterator interface, a minimal subset of BytesIO. def read(self, n: int | None = -1, /) -> bytes: ... def readline(self, limit: int | None = -1, /) -> bytes: ... def __iter__(self) -> Iterator[bytes]: ... def readlines(self) -> list[bytes]: ... _Z = TypeVar("_Z") # mypy uses mro to pick between `__init__` and `__new__` for return types and will prefers `__init__` over `__new__` # in case of a tie. So to be able to specialize type via `__new__` (which is required for pyright to work), # we need to use an intermediary class for the `__init__` method. # See https://github.com/python/mypy/issues/17251 # https://github.com/python/mypy/blob/c724a6a806655f94d0c705a7121e3d671eced96d/mypy/typeops.py#L148-L149 @type_check_only class _QueryDictMixin: def __init__( self, query_string: str | bytes | None = ..., mutable: bool = ..., encoding: str | None = ..., ) -> None: ... class QueryDict(_QueryDictMixin, MultiValueDict[str, str]): _mutable: bool # We can make it mutable only by specifying `mutable=True`. # It can be done a) with kwarg and b) with pos. arg. `overload` has # some problems with args/kwargs + Literal, so two signatures are required. # ('querystring', True, [...]) @overload def __new__( cls, query_string: str | bytes | None, mutable: Literal[True], encoding: str | None = ..., ) -> QueryDict: ... # ([querystring='string',] mutable=True, [...]) @overload def __new__( cls, *, query_string: str | bytes | None = ..., mutable: Literal[True], encoding: str | None = ..., ) -> QueryDict: ... # Otherwise it's immutable @overload def __new__( cls, query_string: str | bytes | None = ..., mutable: Literal[False] = ..., encoding: str | None = ..., ) -> _ImmutableQueryDict: ... @classmethod @override def fromkeys( # type: ignore[override] cls, iterable: Iterable[bytes | str], value: str | bytes = ..., mutable: bool = ..., encoding: str | None = ..., ) -> Self: ... @property def encoding(self) -> str: ... @encoding.setter def encoding(self, value: str) -> None: ... @override def __setitem__(self, key: str | bytes, value: str | bytes) -> None: ... @override def __delitem__(self, key: str | bytes) -> None: ... @override def setlist(self, key: str | bytes, list_: Iterable[str | bytes]) -> None: ... @override def setlistdefault(self, key: str | bytes, default_list: list[str] | None = ...) -> list[str]: ... @override def appendlist(self, key: str | bytes, value: str | bytes) -> None: ... # Fake signature (because *args is used in source, but it fails with more that 1 argument) @overload # type:ignore[override] def pop(self, key: str | bytes, /) -> list[str]: ... @overload @override def pop(self, key: str | bytes, default: str | _Z = ..., /) -> list[str] | _Z: ... @override def popitem(self) -> tuple[str, list[str]]: ... # type:ignore[override] @override def clear(self) -> None: ... @override def setdefault(self, key: str | bytes, default: str | bytes | None = ...) -> str: ... @override def copy(self) -> QueryDict: ... def urlencode(self, safe: str | None = ...) -> str: ... @type_check_only class _ImmutableQueryDict(QueryDict): _mutable: Literal[False] @override def __setitem__(self, key: str | bytes, value: str | bytes) -> NoReturn: ... @override def __delitem__(self, key: str | bytes) -> NoReturn: ... @override def setlist(self, key: str | bytes, list_: Iterable[str | bytes]) -> NoReturn: ... @override def setlistdefault(self, key: str | bytes, default_list: list[str] | None = ...) -> NoReturn: ... @override def appendlist(self, key: str | bytes, value: str | bytes) -> NoReturn: ... # Fake signature (because *args is used in source, but it fails with more that 1 argument) @overload @override def pop(self, key: str | bytes, /) -> NoReturn: ... @overload @override def pop(self, key: str | bytes, default: str | _Z = ..., /) -> NoReturn: ... @override def popitem(self) -> NoReturn: ... @override def clear(self) -> NoReturn: ... @override def setdefault(self, key: str | bytes, default: str | bytes | None = ...) -> NoReturn: ... @override def copy(self) -> QueryDict: ... # type: ignore[override] @override def urlencode(self, safe: str | None = ...) -> str: ... # Fakes for convenience (for `request.GET` and `request.POST`). If dict # was created by Django, there is no chance to hit `List[object]` (empty list) # edge case. @override def __getitem__(self, key: str) -> str: ... @override def dict(self) -> dict[str, str]: ... # type: ignore[override] class MediaType: main_type: str sub_type: str params: dict[str, bytes] def __init__(self, media_type_raw_line: str) -> None: ... def match(self, other: str) -> bool: ... @cached_property def quality(self) -> float: ... @property def specificity(self) -> int: ... @cached_property def range_params(self) -> dict[str, bytes]: ... @overload def bytes_to_text(s: None, encoding: str) -> None: ... @overload def bytes_to_text(s: bytes | str, encoding: str) -> str: ... def split_domain_port(host: str) -> tuple[str, str]: ... def validate_host(host: str, allowed_hosts: Iterable[str]) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/http/response.pyi000066400000000000000000000143541526064357400250140ustar00rootroot00000000000000import datetime from collections.abc import AsyncIterable, AsyncIterator, Iterable, Iterator, Mapping from http.cookies import SimpleCookie from io import BytesIO from json import JSONEncoder from typing import Any, Literal, NoReturn, overload, type_check_only from django.utils.datastructures import CaseInsensitiveMapping, _PropertyDescriptor from django.utils.functional import _StrOrPromise, cached_property from typing_extensions import TypeVar, override class BadHeaderError(ValueError): ... _Z = TypeVar("_Z") class ResponseHeaders(CaseInsensitiveMapping[str]): def __init__(self, data: Mapping[str, str]) -> None: ... def _convert_to_charset(self, value: bytes | str | int, charset: str, mime_encode: bool = ...) -> str: ... def __delitem__(self, key: str) -> None: ... def __setitem__(self, key: str, value: str | bytes | int) -> None: ... def pop(self, key: str, default: _Z = ...) -> _Z | tuple[str, str]: ... def setdefault(self, key: str, value: str | bytes | int) -> None: ... class HttpResponseBase: status_code: int streaming: bool cookies: SimpleCookie closed: bool headers: ResponseHeaders def __init__( self, content_type: str | None = ..., status: int | None = ..., reason: str | None = ..., charset: str | None = ..., headers: Mapping[str, str] | None = ..., ) -> None: ... @property def reason_phrase(self) -> str: ... @reason_phrase.setter def reason_phrase(self, value: str) -> None: ... @property def charset(self) -> str: ... @charset.setter def charset(self, value: str) -> None: ... def serialize_headers(self) -> bytes: ... __bytes__ = serialize_headers def __setitem__(self, header: str, value: str | bytes | int) -> None: ... def __delitem__(self, header: str) -> None: ... def __getitem__(self, header: str) -> str: ... def has_header(self, header: str) -> bool: ... def __contains__(self, header: str) -> bool: ... def items(self) -> Iterable[tuple[str, str]]: ... @overload def get(self, header: str, alternate: str) -> str: ... @overload def get(self, header: str, alternate: None = None) -> str | None: ... def set_cookie( self, key: str, value: str = ..., max_age: int | datetime.timedelta | None = ..., expires: str | datetime.datetime | None = ..., path: str = ..., domain: str | None = ..., secure: bool = ..., httponly: bool = ..., samesite: Literal["Lax", "Strict", "None", False] | None = ..., ) -> None: ... def setdefault(self, key: str, value: str) -> None: ... def set_signed_cookie(self, key: str, value: str, salt: str = ..., **kwargs: Any) -> None: ... def delete_cookie( self, key: str, path: str = ..., domain: str | None = ..., samesite: Literal["Lax", "Strict", "None", False] | None = ..., ) -> None: ... def make_bytes(self, value: object) -> bytes: ... def close(self) -> None: ... def write(self, content: str | bytes) -> None: ... def flush(self) -> None: ... def tell(self) -> int: ... def readable(self) -> bool: ... def seekable(self) -> bool: ... def writable(self) -> bool: ... def writelines(self, lines: Iterable[object]) -> None: ... # Fake methods that are implemented by all subclasses @type_check_only def __iter__(self) -> Iterator[bytes]: ... @type_check_only def getvalue(self) -> bytes: ... class HttpResponse(HttpResponseBase, Iterable[bytes]): content = _PropertyDescriptor[object, bytes]() csrf_cookie_set: bool sameorigin: bool test_server_port: str test_was_secure_request: bool xframe_options_exempt: bool def __init__(self, content: object = ..., *args: Any, **kwargs: Any) -> None: ... def serialize(self) -> bytes: ... __bytes__ = serialize @override def __iter__(self) -> Iterator[bytes]: ... @override def getvalue(self) -> bytes: ... @cached_property def text(self) -> str: ... class StreamingHttpResponse(HttpResponseBase, Iterable[bytes], AsyncIterable[bytes]): is_async: bool streaming_content = _PropertyDescriptor[ Iterable[object] | AsyncIterable[object], Iterator[bytes] | AsyncIterator[bytes] ]() def __init__( self, streaming_content: Iterable[object] | AsyncIterable[object] = ..., *args: Any, **kwargs: Any ) -> None: ... @override def __iter__(self) -> Iterator[bytes]: ... @override def __aiter__(self) -> AsyncIterator[bytes]: ... @override def getvalue(self) -> bytes: ... @property def content(self) -> NoReturn: ... @property def text(self) -> NoReturn: ... class FileResponse(StreamingHttpResponse): file_to_stream: BytesIO | None block_size: int as_attachment: bool filename: str def __init__(self, *args: Any, as_attachment: bool = ..., filename: str = ..., **kwargs: Any) -> None: ... def set_headers(self, filelike: BytesIO) -> None: ... class HttpResponseRedirectBase(HttpResponse): allowed_schemes: list[str] def __init__( self, redirect_to: _StrOrPromise, preserve_request: bool = False, *args: Any, max_length: int = ..., **kwargs: Any, ) -> None: ... @property def url(self) -> str: ... class HttpResponseRedirect(HttpResponseRedirectBase): status_code_preserve_request: int class HttpResponsePermanentRedirect(HttpResponseRedirectBase): status_code_preserve_request: int class HttpResponseNotModified(HttpResponse): def __init__(self, *args: Any, **kwargs: Any) -> None: ... class HttpResponseBadRequest(HttpResponse): ... class HttpResponseNotFound(HttpResponse): ... class HttpResponseForbidden(HttpResponse): ... class HttpResponseNotAllowed(HttpResponse): def __init__(self, permitted_methods: Iterable[str], *args: Any, **kwargs: Any) -> None: ... class HttpResponseGone(HttpResponse): ... class HttpResponseServerError(HttpResponse): ... class Http404(Exception): ... class JsonResponse(HttpResponse): def __init__( self, data: Any, encoder: type[JSONEncoder] = ..., safe: bool = ..., json_dumps_params: dict[str, Any] | None = ..., **kwargs: Any, ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/middleware/000077500000000000000000000000001526064357400235625ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/middleware/__init__.pyi000066400000000000000000000000001526064357400260320ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/middleware/cache.pyi000066400000000000000000000021151526064357400253470ustar00rootroot00000000000000from typing import Any from django.core.cache import BaseCache from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseBase from django.utils.deprecation import MiddlewareMixin, _AnyGetResponseCallable class UpdateCacheMiddleware(MiddlewareMixin): cache_timeout: float key_prefix: str cache_alias: str @property def cache(self) -> BaseCache: ... def process_response(self, request: HttpRequest, response: HttpResponseBase | str) -> HttpResponseBase | str: ... class FetchFromCacheMiddleware(MiddlewareMixin): key_prefix: str cache_alias: str @property def cache(self) -> BaseCache: ... def process_request(self, request: HttpRequest) -> HttpResponse | None: ... class CacheMiddleware(UpdateCacheMiddleware, FetchFromCacheMiddleware): key_prefix: str cache_alias: str cache_timeout: float def __init__( self, get_response: _AnyGetResponseCallable, cache_timeout: float | None = ..., page_timeout: float | None = ..., **kwargs: Any, ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/middleware/clickjacking.pyi000066400000000000000000000006031526064357400267200ustar00rootroot00000000000000from django.http.request import HttpRequest from django.http.response import HttpResponse from django.utils.deprecation import MiddlewareMixin class XFrameOptionsMiddleware(MiddlewareMixin): def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ... def get_xframe_options_value(self, request: HttpRequest, response: HttpResponse) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/middleware/common.pyi000066400000000000000000000022151526064357400255750ustar00rootroot00000000000000from typing import Any, ClassVar from django.http.request import HttpRequest from django.http.response import HttpResponseBase, HttpResponsePermanentRedirect, HttpResponseRedirectBase from django.utils.deprecation import MiddlewareMixin class CommonMiddleware(MiddlewareMixin): response_redirect_class: ClassVar[type[HttpResponseRedirectBase]] def process_request(self, request: HttpRequest) -> HttpResponsePermanentRedirect | None: ... def should_redirect_with_slash(self, request: HttpRequest) -> bool: ... def get_full_path_with_slash(self, request: HttpRequest) -> str: ... def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ... class BrokenLinkEmailsMiddleware(MiddlewareMixin): using: ClassVar[str | None] def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ... def send_mail(self, subject: str, message: str, *args: Any, **kwargs: Any) -> None: ... def is_internal_request(self, domain: str, referer: str) -> bool: ... def is_ignorable_request(self, request: HttpRequest, uri: str, domain: str, referer: str) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/middleware/csp.pyi000066400000000000000000000007201526064357400250710ustar00rootroot00000000000000from django.http import HttpRequest, HttpResponse from django.utils.csp import CSP as CSP from django.utils.csp import LazyNonce from django.utils.deprecation import MiddlewareMixin def get_nonce(request: HttpRequest) -> LazyNonce | None: ... class ContentSecurityPolicyMiddleware(MiddlewareMixin): def process_request(self, request: HttpRequest) -> None: ... def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/middleware/csrf.pyi000066400000000000000000000034271526064357400252500ustar00rootroot00000000000000from collections import defaultdict from collections.abc import Callable from logging import Logger from re import Pattern from typing import Any from django.http.request import HttpRequest from django.http.response import HttpResponseBase, HttpResponseForbidden from django.utils.deprecation import MiddlewareMixin from django.utils.functional import cached_property logger: Logger invalid_token_chars_re: Pattern[str] REASON_BAD_ORIGIN: str REASON_NO_REFERER: str REASON_BAD_REFERER: str REASON_NO_CSRF_COOKIE: str REASON_CSRF_TOKEN_MISSING: str REASON_MALFORMED_REFERER: str REASON_INSECURE_REFERER: str REASON_INCORRECT_LENGTH: str REASON_INVALID_CHARACTERS: str CSRF_SECRET_LENGTH: int CSRF_TOKEN_LENGTH: Any CSRF_ALLOWED_CHARS: Any CSRF_SESSION_KEY: str def get_token(request: HttpRequest) -> str: ... def rotate_token(request: HttpRequest) -> None: ... class InvalidTokenFormat(Exception): reason: str def __init__(self, reason: str) -> None: ... class RejectRequest(Exception): reason: str def __init__(self, reason: str) -> None: ... class CsrfViewMiddleware(MiddlewareMixin): @cached_property def csrf_trusted_origins_hosts(self) -> list[str]: ... @cached_property def allowed_origins_exact(self) -> set[str]: ... @cached_property def allowed_origin_subdomains(self) -> defaultdict[str, list[str]]: ... def process_request(self, request: HttpRequest) -> None: ... def process_view( self, request: HttpRequest, callback: Callable[..., HttpResponseBase], callback_args: tuple[Any, ...], callback_kwargs: dict[str, Any], ) -> HttpResponseForbidden | None: ... def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ... def _get_new_csrf_string() -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/middleware/gzip.pyi000066400000000000000000000006341526064357400252610ustar00rootroot00000000000000from re import Pattern from typing import ClassVar from django.http.request import HttpRequest from django.http.response import HttpResponseBase from django.utils.deprecation import MiddlewareMixin re_accepts_gzip: Pattern[str] class GZipMiddleware(MiddlewareMixin): max_random_bytes: ClassVar[int] def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ... typeddjango-django-stubs-fa03b48/django-stubs/middleware/http.pyi000066400000000000000000000005611526064357400252660ustar00rootroot00000000000000from django.http.request import HttpRequest from django.http.response import HttpResponseBase from django.utils.deprecation import MiddlewareMixin class ConditionalGetMiddleware(MiddlewareMixin): def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ... def needs_etag(self, response: HttpResponseBase) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/middleware/locale.pyi000066400000000000000000000007451526064357400255520ustar00rootroot00000000000000from typing import ClassVar from django.http.request import HttpRequest from django.http.response import HttpResponseBase, HttpResponseRedirectBase from django.utils.deprecation import MiddlewareMixin class LocaleMiddleware(MiddlewareMixin): response_redirect_class: ClassVar[type[HttpResponseRedirectBase]] def process_request(self, request: HttpRequest) -> None: ... def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ... typeddjango-django-stubs-fa03b48/django-stubs/middleware/security.pyi000066400000000000000000000011601526064357400261520ustar00rootroot00000000000000from typing import Any from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponsePermanentRedirect from django.utils.deprecation import MiddlewareMixin class SecurityMiddleware(MiddlewareMixin): sts_seconds: int sts_include_subdomains: bool sts_preload: bool content_type_nosniff: bool redirect: bool redirect_host: str | None redirect_exempt: list[Any] def process_request(self, request: HttpRequest) -> HttpResponsePermanentRedirect | None: ... def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: ... typeddjango-django-stubs-fa03b48/django-stubs/py.typed000066400000000000000000000000001526064357400231320ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/shortcuts.pyi000066400000000000000000000037621526064357400242360ustar00rootroot00000000000000from collections.abc import Callable, Mapping, Sequence from typing import Any, Literal, Protocol, overload, type_check_only from django.db.models import Manager, QuerySet from django.db.models.base import Model from django.http import HttpRequest from django.http.response import HttpResponse, HttpResponsePermanentRedirect, HttpResponseRedirect from django.utils.functional import _StrOrPromise from typing_extensions import TypeVar def render( request: HttpRequest | None, template_name: str | Sequence[str], context: Mapping[str, Any] | None = ..., content_type: str | None = ..., status: int | None = ..., using: str | None = ..., ) -> HttpResponse: ... @type_check_only class SupportsGetAbsoluteUrl(Protocol): def get_absolute_url(self) -> str: ... @overload def redirect( to: Callable[..., Any] | str | SupportsGetAbsoluteUrl, *args: Any, permanent: Literal[True], preserve_request: bool = False, max_length: int = ..., **kwargs: Any, ) -> HttpResponsePermanentRedirect: ... @overload def redirect( to: Callable[..., Any] | str | SupportsGetAbsoluteUrl, *args: Any, permanent: Literal[False] = False, preserve_request: bool = False, **kwargs: Any, ) -> HttpResponseRedirect: ... @overload def redirect( to: Callable[..., Any] | str | SupportsGetAbsoluteUrl, *args: Any, permanent: bool, **kwargs: Any ) -> HttpResponseRedirect | HttpResponsePermanentRedirect: ... _T = TypeVar("_T", bound=Model) def get_object_or_404(klass: type[_T] | Manager[_T] | QuerySet[_T], *args: Any, **kwargs: Any) -> _T: ... async def aget_object_or_404(klass: type[_T] | Manager[_T] | QuerySet[_T], *args: Any, **kwargs: Any) -> _T: ... def get_list_or_404(klass: type[_T] | Manager[_T] | QuerySet[_T], *args: Any, **kwargs: Any) -> list[_T]: ... async def aget_list_or_404(klass: type[_T] | Manager[_T] | QuerySet[_T], *args: Any, **kwargs: Any) -> list[_T]: ... def resolve_url(to: Callable[..., Any] | Model | _StrOrPromise, *args: Any, **kwargs: Any) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/tasks/000077500000000000000000000000001526064357400225725ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/tasks/__init__.pyi000066400000000000000000000016251526064357400250600ustar00rootroot00000000000000from django.utils.connection import BaseConnectionHandler from .backends.base import BaseTaskBackend from .base import DEFAULT_TASK_BACKEND_ALIAS as DEFAULT_TASK_BACKEND_ALIAS from .base import DEFAULT_TASK_QUEUE_NAME as DEFAULT_TASK_QUEUE_NAME from .base import Task as Task from .base import TaskContext as TaskContext from .base import TaskResult as TaskResult from .base import TaskResultStatus as TaskResultStatus from .base import task as task __all__ = [ "DEFAULT_TASK_BACKEND_ALIAS", "DEFAULT_TASK_QUEUE_NAME", "Task", "TaskContext", "TaskResult", "TaskResultStatus", "default_task_backend", "task", "task_backends", ] class TaskBackendHandler(BaseConnectionHandler[BaseTaskBackend]): ... task_backends: TaskBackendHandler # Actually ConnectionProxy, but quacks exactly like BaseTaskBackend, it's not worth distinguishing the two. default_task_backend: BaseTaskBackend typeddjango-django-stubs-fa03b48/django-stubs/tasks/backends/000077500000000000000000000000001526064357400243445ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/tasks/backends/__init__.pyi000066400000000000000000000000001526064357400266140ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/tasks/backends/base.pyi000066400000000000000000000020201526064357400257730ustar00rootroot00000000000000from abc import ABCMeta, abstractmethod from typing import Any from django.tasks.base import Task, TaskResult from typing_extensions import ParamSpec, TypeVar _P = ParamSpec("_P") _R = TypeVar("_R") class BaseTaskBackend(metaclass=ABCMeta): task_class: type[Task[..., Any]] supports_defer: bool supports_async_task: bool supports_get_result: bool supports_priority: bool alias: str queues: set[str] options: dict[str, Any] def __init__(self, alias: str, params: dict[str, Any]) -> None: ... def validate_task(self, task: Task[..., Any]) -> None: ... @abstractmethod def enqueue(self, task: Task[_P, _R], args: list[Any], kwargs: dict[str, Any]) -> TaskResult[_P, _R]: ... async def aenqueue(self, task: Task[_P, _R], args: list[Any], kwargs: dict[str, Any]) -> TaskResult[_P, _R]: ... def get_result(self, result_id: str) -> TaskResult[..., Any]: ... async def aget_result(self, result_id: str) -> TaskResult[..., Any]: ... def check(self, **kwargs: Any) -> list[Any]: ... typeddjango-django-stubs-fa03b48/django-stubs/tasks/backends/dummy.pyi000066400000000000000000000012601526064357400262210ustar00rootroot00000000000000from typing import Any from django.tasks.base import Task, TaskResult from typing_extensions import ParamSpec, TypeVar, override from .base import BaseTaskBackend _P = ParamSpec("_P") _R = TypeVar("_R") class DummyBackend(BaseTaskBackend): results: list[TaskResult[..., Any]] def __init__(self, alias: str, params: dict[str, Any]) -> None: ... @override def enqueue(self, task: Task[_P, _R], args: list[Any], kwargs: dict[str, Any]) -> TaskResult[_P, _R]: ... @override def get_result(self, result_id: str) -> TaskResult[..., Any]: ... @override async def aget_result(self, result_id: str) -> TaskResult[..., Any]: ... def clear(self) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/tasks/backends/immediate.pyi000066400000000000000000000007721526064357400270330ustar00rootroot00000000000000from logging import Logger from typing import Any from django.tasks.base import Task, TaskResult from typing_extensions import ParamSpec, TypeVar, override from .base import BaseTaskBackend _P = ParamSpec("_P") _R = TypeVar("_R") logger: Logger class ImmediateBackend(BaseTaskBackend): worker_id: str def __init__(self, alias: str, params: dict[str, Any]) -> None: ... @override def enqueue(self, task: Task[_P, _R], args: list[Any], kwargs: dict[str, Any]) -> TaskResult[_P, _R]: ... typeddjango-django-stubs-fa03b48/django-stubs/tasks/base.pyi000066400000000000000000000076221526064357400242360ustar00rootroot00000000000000from collections.abc import Callable from dataclasses import dataclass from datetime import datetime from typing import Any, Concatenate, Generic, Literal, overload from django.db.models.enums import TextChoices as TextChoices from django.utils.module_loading import import_string as import_string from django.utils.translation import pgettext_lazy as pgettext_lazy from typing_extensions import ParamSpec, TypeVar from .backends.base import BaseTaskBackend from .exceptions import TaskResultMismatch as TaskResultMismatch DEFAULT_TASK_BACKEND_ALIAS: str DEFAULT_TASK_PRIORITY: int DEFAULT_TASK_QUEUE_NAME: str TASK_MAX_PRIORITY: int TASK_MIN_PRIORITY: int TASK_REFRESH_ATTRS: set[str] class TaskResultStatus(TextChoices): READY = ... RUNNING = ... FAILED = ... SUCCESSFUL = ... _P = ParamSpec("_P") _R = TypeVar("_R") @dataclass(frozen=True, slots=True, kw_only=True) class Task(Generic[_P, _R]): # Loose: `_P` excludes `TaskContext` when `takes_context=True`, so `func` may have an extra leading param. func: Callable[..., _R] priority: int = ... backend: str = ... queue_name: str = ... run_after: datetime | None = None takes_context: bool = ... def __post_init__(self) -> None: ... @property def name(self) -> str: ... def using( self, *, priority: int | None = None, queue_name: str | None = None, run_after: datetime | None = None, backend: str | None = None, ) -> Task[_P, _R]: ... def enqueue(self, *args: _P.args, **kwargs: _P.kwargs) -> TaskResult[_P, _R]: ... async def aenqueue(self, *args: _P.args, **kwargs: _P.kwargs) -> TaskResult[_P, _R]: ... def get_result(self, result_id: str) -> TaskResult[_P, _R]: ... async def aget_result(self, result_id: str) -> TaskResult[_P, _R]: ... def call(self, *args: _P.args, **kwargs: _P.kwargs) -> _R: ... async def acall(self, *args: _P.args, **kwargs: _P.kwargs) -> _R: ... def get_backend(self) -> BaseTaskBackend: ... @property def module_path(self) -> str: ... @overload def task( function: Callable[Concatenate[TaskContext[Any, Any], _P], _R], *, priority: int | None = None, queue_name: str | None = None, backend: str | None = None, takes_context: Literal[True], ) -> Task[_P, _R]: ... @overload def task( function: Callable[_P, _R], *, priority: int | None = None, queue_name: str | None = None, backend: str | None = None, takes_context: Literal[False] = False, ) -> Task[_P, _R]: ... @overload def task( *, priority: int | None = None, queue_name: str | None = None, backend: str | None = None, takes_context: Literal[True], ) -> Callable[[Callable[Concatenate[TaskContext[Any, Any], _P], _R]], Task[_P, _R]]: ... @overload def task( *, priority: int | None = None, queue_name: str | None = None, backend: str | None = None, takes_context: Literal[False] = False, ) -> Callable[[Callable[_P, _R]], Task[_P, _R]]: ... @dataclass(kw_only=True) class TaskError: exception_class_path: str traceback: str @property def exception_class(self) -> type[BaseException]: ... @dataclass(kw_only=True) class TaskResult(Generic[_P, _R]): task: Task[_P, _R] id: str status: TaskResultStatus enqueued_at: datetime | None started_at: datetime | None finished_at: datetime | None last_attempted_at: datetime | None args: list[Any] kwargs: dict[str, Any] backend: str errors: list[TaskError] worker_ids: list[str] def __post_init__(self) -> None: ... @property def return_value(self) -> _R: ... @property def is_finished(self) -> bool: ... @property def attempts(self) -> int: ... def refresh(self) -> None: ... async def arefresh(self) -> None: ... @dataclass(kw_only=True) class TaskContext(Generic[_P, _R]): task_result: TaskResult[_P, _R] @property def attempt(self) -> int: ... typeddjango-django-stubs-fa03b48/django-stubs/tasks/checks.pyi000066400000000000000000000004051526064357400245540ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any from django.apps.config import AppConfig from django.core.checks.messages import CheckMessage def check_tasks(app_configs: Sequence[AppConfig] | None = ..., **kwargs: Any) -> list[CheckMessage]: ... typeddjango-django-stubs-fa03b48/django-stubs/tasks/exceptions.pyi000066400000000000000000000004551526064357400255020ustar00rootroot00000000000000from django.core.exceptions import ImproperlyConfigured as ImproperlyConfigured class TaskException(Exception): ... class InvalidTask(TaskException): ... class InvalidTaskBackend(ImproperlyConfigured): ... class TaskResultDoesNotExist(TaskException): ... class TaskResultMismatch(TaskException): ... typeddjango-django-stubs-fa03b48/django-stubs/tasks/signals.pyi000066400000000000000000000013541526064357400247600ustar00rootroot00000000000000from logging import Logger from typing import Any from django.dispatch import Signal as Signal from django.tasks.backends.base import BaseTaskBackend from django.tasks.base import TaskResult from .base import TaskResultStatus as TaskResultStatus logger: Logger task_enqueued: Signal task_finished: Signal task_started: Signal def clear_tasks_handlers(*, setting: str, **kwargs: Any) -> None: ... def log_task_enqueued(sender: type[BaseTaskBackend], task_result: TaskResult[..., Any], **kwargs: Any) -> None: ... def log_task_started(sender: type[BaseTaskBackend], task_result: TaskResult[..., Any], **kwargs: Any) -> None: ... def log_task_finished(sender: type[BaseTaskBackend], task_result: TaskResult[..., Any], **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/template/000077500000000000000000000000001526064357400232605ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/template/__init__.pyi000066400000000000000000000014761526064357400255520ustar00rootroot00000000000000from . import defaultfilters as defaultfilters # Template parts from .base import Node as Node from .base import NodeList as NodeList from .base import Origin as Origin from .base import Template as Template from .base import Variable as Variable from .base import VariableDoesNotExist as VariableDoesNotExist from .context import Context as Context from .context import ContextPopException as ContextPopException from .context import RequestContext as RequestContext from .engine import Engine as Engine from .exceptions import TemplateDoesNotExist as TemplateDoesNotExist from .exceptions import TemplateSyntaxError as TemplateSyntaxError from .library import Library as Library from .utils import EngineHandler as EngineHandler engines: EngineHandler __all__ = ("Context", "Engine", "RequestContext", "Template", "engines") typeddjango-django-stubs-fa03b48/django-stubs/template/autoreload.pyi000066400000000000000000000004561526064357400261470ustar00rootroot00000000000000from pathlib import Path from typing import Any def get_template_directories() -> set[Path]: ... def reset_loaders() -> None: ... def watch_for_template_changes(sender: object, **kwargs: Any) -> None: ... def template_changed(sender: object | None, file_path: Path, **kwargs: Any) -> bool | None: ... typeddjango-django-stubs-fa03b48/django-stubs/template/backends/000077500000000000000000000000001526064357400250325ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/template/backends/__init__.pyi000066400000000000000000000000001526064357400273020ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/template/backends/base.pyi000066400000000000000000000017211526064357400264700ustar00rootroot00000000000000from collections.abc import Iterator, Mapping from typing import Any, Protocol, type_check_only from django.core.checks.messages import CheckMessage from django.http.request import HttpRequest from django.utils.functional import cached_property class BaseEngine: name: str dirs: list[str] app_dirs: bool def __init__(self, params: Mapping[str, Any]) -> None: ... def check(self, **kwargs: Any) -> list[CheckMessage]: ... @property def app_dirname(self) -> str: ... def from_string(self, template_code: str) -> _EngineTemplate: ... def get_template(self, template_name: str) -> _EngineTemplate: ... @cached_property def template_dirs(self) -> tuple[str, ...]: ... def iter_template_filenames(self, template_name: str) -> Iterator[str]: ... @type_check_only class _EngineTemplate(Protocol): def render( self, context: dict[str, Any] | None = ..., request: HttpRequest | None = ..., ) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/template/backends/django.pyi000066400000000000000000000023561526064357400270250ustar00rootroot00000000000000from collections.abc import Iterator from typing import Any, NoReturn from django.template.base import Origin from django.template.base import Template as _BaseTemplate from django.template.engine import Engine from django.template.exceptions import TemplateDoesNotExist from typing_extensions import override from .base import BaseEngine, _EngineTemplate class DjangoTemplates(BaseEngine): engine: Engine @override def from_string(self, template_code: str) -> Template: ... @override def get_template(self, template_name: str) -> Template: ... def get_templatetag_libraries(self, custom_libraries: dict[str, str]) -> dict[str, str]: ... def copy_exception(exc: TemplateDoesNotExist, backend: DjangoTemplates | None = None) -> TemplateDoesNotExist: ... def reraise(exc: TemplateDoesNotExist, backend: DjangoTemplates) -> NoReturn: ... def get_template_tag_modules() -> Iterator[tuple[str, str]]: ... def get_installed_libraries() -> dict[str, str]: ... def get_package_libraries(pkg: Any) -> Iterator[str]: ... class Template(_EngineTemplate): template: _BaseTemplate backend: DjangoTemplates def __init__(self, template: _BaseTemplate, backend: BaseEngine) -> None: ... @property def origin(self) -> Origin: ... typeddjango-django-stubs-fa03b48/django-stubs/template/backends/dummy.pyi000066400000000000000000000011241526064357400267060ustar00rootroot00000000000000import string from typing import Any from django.http.request import HttpRequest from typing_extensions import override from .base import BaseEngine class TemplateStrings(BaseEngine): def __init__(self, params: dict[str, dict[Any, Any] | list[Any] | bool | str]) -> None: ... @override def from_string(self, template_code: str) -> Template: ... @override def get_template(self, template_name: str) -> Template: ... class Template(string.Template): template: str def render(self, context: dict[str, Any] | None = ..., request: HttpRequest | None = ...) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/template/backends/jinja2.pyi000066400000000000000000000023541526064357400267360ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from django.http.request import HttpRequest from django.template.exceptions import TemplateSyntaxError from django.utils.functional import cached_property from jinja2 import Environment from jinja2 import Template as Jinja2Template from typing_extensions import override from .base import BaseEngine class Jinja2(BaseEngine): env: Environment context_processors: list[str] def __init__(self, params: dict[str, Any]) -> None: ... @override def from_string(self, template_code: str) -> Template: ... @override def get_template(self, template_name: str) -> Template: ... @cached_property def template_context_processors(self) -> list[Callable[[HttpRequest], dict[str, Any]]]: ... class Template: template: Jinja2Template backend: Jinja2 origin: Origin def __init__(self, template: Jinja2Template, backend: Jinja2) -> None: ... def render(self, context: dict[str, Any] | None = None, request: HttpRequest | None = None) -> str: ... class Origin: name: str template_name: str | None def __init__(self, name: str, template_name: str | None) -> None: ... def get_exception_info(exception: TemplateSyntaxError) -> dict[str, Any]: ... typeddjango-django-stubs-fa03b48/django-stubs/template/backends/utils.pyi000066400000000000000000000005261526064357400267200ustar00rootroot00000000000000from collections.abc import Callable from django.http.request import HttpRequest from django.utils.functional import _StrPromise from django.utils.safestring import SafeString def csrf_input(request: HttpRequest) -> SafeString: ... csrf_input_lazy: Callable[[HttpRequest], SafeString] csrf_token_lazy: Callable[[HttpRequest], _StrPromise] typeddjango-django-stubs-fa03b48/django-stubs/template/base.pyi000066400000000000000000000141161526064357400247200ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence from enum import Enum from logging import Logger from re import Pattern from typing import Any, cast from django.template.context import Context from django.template.engine import Engine from django.template.library import Library from django.template.loaders.base import Loader from django.utils.safestring import SafeString from typing_extensions import override FILTER_SEPARATOR: str FILTER_ARGUMENT_SEPARATOR: str VARIABLE_ATTRIBUTE_SEPARATOR: str BLOCK_TAG_START: str BLOCK_TAG_END: str VARIABLE_TAG_START: str VARIABLE_TAG_END: str COMMENT_TAG_START: str COMMENT_TAG_END: str SINGLE_BRACE_START: str SINGLE_BRACE_END: str UNKNOWN_SOURCE: str tag_re: Pattern[str] logger: Logger class TokenType(Enum): TEXT = cast(int, ...) VAR = cast(int, ...) BLOCK = cast(int, ...) COMMENT = cast(int, ...) class VariableDoesNotExist(Exception): msg: str params: tuple[Any, ...] def __init__(self, msg: str, params: tuple[Any, ...] = ...) -> None: ... class Origin: name: str template_name: bytes | str | None loader: Loader | None def __init__(self, name: str, template_name: bytes | str | None = None, loader: Loader | None = None) -> None: ... @property def loader_name(self) -> str | None: ... class Template: name: str | None origin: Origin engine: Engine source: str nodelist: NodeList extra_data: dict[str, Any] def __init__( self, template_string: Template | str, origin: Origin | None = None, name: str | None = None, engine: Engine | None = None, ) -> None: ... def render(self, context: Context) -> SafeString: ... def compile_nodelist(self) -> NodeList: ... def get_exception_info(self, exception: Exception, token: Token) -> dict[str, Any]: ... class PartialTemplate: nodelist: NodeList origin: Origin name: str def __init__( self, nodelist: NodeList, origin: Origin, name: str, source_start: int | None = None, source_end: int | None = None, ) -> None: ... def get_exception_info(self, exception: Exception, token: Token) -> dict[str, Any]: ... def find_partial_source(self, full_source: str) -> str: ... @property def source(self) -> str: ... def render(self, context: Context) -> SafeString: ... def linebreak_iter(template_source: str) -> Iterator[int]: ... class Token: contents: str token_type: TokenType lineno: int | None position: tuple[int, int] | None def __init__( self, token_type: TokenType, contents: str, position: tuple[int, int] | None = None, lineno: int | None = None, ) -> None: ... def split_contents(self) -> list[str]: ... class Lexer: template_string: str verbatim: bool | str def __init__(self, template_string: str) -> None: ... def tokenize(self) -> list[Token]: ... def create_token(self, token_string: str, position: tuple[int, int] | None, lineno: int, in_tag: bool) -> Token: ... class DebugLexer(Lexer): template_string: str verbatim: bool | str @override def tokenize(self) -> list[Token]: ... class Parser: tokens: list[Token] | str tags: dict[str, Callable[..., Any]] filters: dict[str, Callable[..., Any]] command_stack: list[tuple[str, Token]] libraries: dict[str, Library] origin: Origin | None extra_data: dict[str, Any] def __init__( self, tokens: list[Token] | str, libraries: dict[str, Library] | None = None, builtins: list[Library] | None = None, origin: Origin | None = None, ) -> None: ... def parse(self, parse_until: Iterable[str] | None = None) -> NodeList: ... def skip_past(self, endtag: str) -> None: ... def extend_nodelist(self, nodelist: NodeList, node: Node, token: Token) -> None: ... def error(self, token: Token, e: Exception | str) -> Exception: ... def invalid_block_tag(self, token: Token, command: str, parse_until: Iterable[str] | None = None) -> Any: ... def unclosed_block_tag(self, parse_until: Iterable[str]) -> Any: ... def next_token(self) -> Token: ... def prepend_token(self, token: Token) -> None: ... def delete_first_token(self) -> None: ... def add_library(self, lib: Library) -> None: ... def compile_filter(self, token: str) -> FilterExpression: ... def find_filter(self, filter_name: str) -> Callable[..., Any]: ... constant_string: str filter_raw_string: str filter_re: Pattern[str] class FilterExpression: token: str filters: list[Any] var: Any is_var: bool def __init__(self, token: str, parser: Parser) -> None: ... def resolve(self, context: Context, ignore_failures: bool = False) -> Any: ... @staticmethod def args_check(name: str, func: Callable[..., Any], provided: list[tuple[bool, Any]]) -> bool: ... class Variable: var: dict[Any, Any] | str literal: SafeString | float | None lookups: tuple[str, ...] | None translate: bool message_context: str | None def __init__(self, var: dict[Any, Any] | str) -> None: ... def resolve(self, context: Mapping[str, Mapping[str, Any]] | Context | int | str) -> Any: ... class Node: must_be_first: bool child_nodelists: Any origin: Origin token: Token | None def render(self, context: Context) -> str: ... def render_annotated(self, context: Context) -> int | str: ... def get_nodes_by_type(self, nodetype: type[Node]) -> list[Node]: ... class NodeList(list[Node]): contains_nontext: bool def render(self, context: Context) -> SafeString: ... def get_nodes_by_type(self, nodetype: type[Node]) -> list[Node]: ... class TextNode(Node): s: str def __init__(self, s: str) -> None: ... def render_value_in_context(value: Any, context: Context) -> str: ... class VariableNode(Node): filter_expression: FilterExpression def __init__(self, filter_expression: FilterExpression) -> None: ... kwarg_re: Pattern[str] def token_kwargs(bits: Sequence[str], parser: Parser, support_legacy: bool = False) -> dict[str, FilterExpression]: ... typeddjango-django-stubs-fa03b48/django-stubs/template/context.pyi000066400000000000000000000066671526064357400255060ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Iterator from contextlib import AbstractContextManager from types import TracebackType from typing import Any, Self, TypeAlias from django.http.request import HttpRequest from django.template.base import Node, Origin, Template from django.template.loader_tags import IncludeNode from typing_extensions import override _ContextKeys: TypeAlias = int | str | Node _ContextValues: TypeAlias = dict[str, Any] | Context class ContextPopException(Exception): ... class ContextDict(dict[Any, Any]): context: BaseContext def __init__(self, context: BaseContext, *args: Any, **kwargs: Any) -> None: ... def __enter__(self) -> Self: ... def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, exc_tb: TracebackType | None, ) -> None: ... class BaseContext(Iterable[Any]): def __init__(self, dict_: Any | None = None) -> None: ... def __copy__(self) -> Self: ... @override def __iter__(self) -> Iterator[Any]: ... def push(self, *args: Any, **kwargs: Any) -> ContextDict: ... def pop(self) -> ContextDict: ... def __setitem__(self, key: _ContextKeys, value: Any) -> None: ... def set_upward(self, key: _ContextKeys, value: int | str) -> None: ... def __getitem__(self, key: _ContextKeys) -> Any: ... def __delitem__(self, key: _ContextKeys) -> None: ... def __contains__(self, key: _ContextKeys) -> bool: ... def get(self, key: _ContextKeys, otherwise: Any | None = None) -> Any | None: ... def setdefault(self, key: _ContextKeys, default: list[Origin] | int | None = None) -> list[Origin] | int | None: ... def new(self, values: _ContextValues | None = None) -> Context: ... def flatten(self) -> dict[_ContextKeys, dict[_ContextKeys, type[Any] | str] | int | str | None]: ... class Context(BaseContext): dicts: Any autoescape: bool use_l10n: bool | None use_tz: bool | None template_name: str | None render_context: RenderContext template: Template | None def __init__( self, dict_: Any | None = None, autoescape: bool = True, use_l10n: bool | None = None, use_tz: bool | None = None, ) -> None: ... def bind_template(self, template: Template) -> AbstractContextManager[None]: ... def update(self, other_dict: dict[str, Any] | Context) -> ContextDict: ... class RenderContext(BaseContext): dicts: list[dict[IncludeNode | str, str]] template: Template | None def push_state(self, template: Template, isolated_context: bool = True) -> AbstractContextManager[None]: ... class RequestContext(Context): autoescape: bool dicts: list[dict[str, str]] render_context: RenderContext template_name: str | None use_l10n: bool | None use_tz: bool | None request: HttpRequest def __init__( self, request: HttpRequest, dict_: dict[str, Any] | None = None, processors: list[Callable[..., Any]] | None = None, use_l10n: bool | None = None, use_tz: bool | None = None, autoescape: bool = True, ) -> None: ... template: Template | None @override def bind_template(self, template: Template) -> AbstractContextManager[None]: ... @override def new(self, values: _ContextValues | None = None) -> RequestContext: ... def make_context(context: dict[str, Any] | None, request: HttpRequest | None = None, **kwargs: Any) -> Context: ... typeddjango-django-stubs-fa03b48/django-stubs/template/context_processors.pyi000066400000000000000000000013661526064357400277570ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from django.http.request import HttpRequest from django.utils.functional import SimpleLazyObject from typing_extensions import TypeVar _R = TypeVar("_R", bound=HttpRequest) def csp(request: HttpRequest) -> dict[str, SimpleLazyObject[str] | None]: ... def csrf(request: HttpRequest) -> dict[str, SimpleLazyObject[str]]: ... def debug(request: HttpRequest) -> dict[str, Callable[..., Any] | bool]: ... def i18n(request: HttpRequest) -> dict[str, list[tuple[str, str]] | bool | str]: ... def tz(request: HttpRequest) -> dict[str, str]: ... def static(request: HttpRequest) -> dict[str, str]: ... def media(request: HttpRequest) -> dict[str, str]: ... def request(request: _R) -> dict[str, _R]: ... typeddjango-django-stubs-fa03b48/django-stubs/template/defaultfilters.pyi000066400000000000000000000066341526064357400270310ustar00rootroot00000000000000from collections.abc import Callable from datetime import date as _date from datetime import datetime from datetime import time as _time from typing import Any from django.utils.safestring import SafeString register: Any def stringfilter(func: Callable[..., Any]) -> Callable[..., Any]: ... def addslashes(value: str) -> str: ... def capfirst(value: str) -> str: ... def escapejs_filter(value: str) -> SafeString: ... def json_script(value: Any, element_id: str | None = ...) -> SafeString: ... def floatformat(text: Any | None, arg: int | str = -1) -> str: ... def iriencode(value: str) -> str: ... def linenumbers(value: str, autoescape: bool = True) -> SafeString: ... def lower(value: str) -> str: ... def make_list(value: str) -> list[str]: ... def slugify(value: str) -> SafeString: ... def stringformat(value: Any, arg: str) -> str: ... def title(value: str) -> str: ... def truncatechars(value: str, arg: SafeString | int) -> str: ... def truncatechars_html(value: str, arg: int | str) -> str: ... def truncatewords(value: str, arg: int | str) -> str: ... def truncatewords_html(value: str, arg: int | str) -> str: ... def upper(value: str) -> str: ... def urlencode(value: str, safe: SafeString | None = None) -> str: ... def urlize(value: str, autoescape: bool = True) -> SafeString: ... def urlizetrunc(value: str, limit: SafeString | int, autoescape: bool = True) -> SafeString: ... def wordcount(value: str) -> int: ... def wordwrap(value: str, arg: SafeString | int) -> str: ... def ljust(value: str, arg: SafeString | int) -> str: ... def rjust(value: str, arg: SafeString | int) -> str: ... def center(value: str, arg: SafeString | int) -> str: ... def cut(value: str, arg: str) -> str: ... def escape_filter(value: str) -> SafeString: ... def escapeseq(value: list[str]) -> list[SafeString]: ... def force_escape(value: str) -> SafeString: ... def linebreaks_filter(value: str, autoescape: bool = True) -> SafeString: ... def linebreaksbr(value: str, autoescape: bool = True) -> SafeString: ... def safe(value: str) -> SafeString: ... def safeseq(value: list[str]) -> list[SafeString]: ... def striptags(value: str) -> str: ... def dictsort(value: Any, arg: int | str) -> Any: ... def dictsortreversed(value: Any, arg: int | str) -> Any: ... def first(value: Any) -> Any: ... def join(value: Any, arg: str, autoescape: bool = True) -> Any: ... def last(value: list[str]) -> str: ... def length(value: Any) -> int: ... def random(value: list[str]) -> str: ... def slice_filter(value: Any, arg: str | int) -> Any: ... def unordered_list(value: Any, autoescape: bool = True) -> Any: ... def add(value: Any, arg: Any) -> Any: ... def get_digit(value: Any, arg: int) -> Any: ... def date(value: _date | datetime | str | None, arg: str | None = None) -> str: ... def time(value: datetime | _time | str | None, arg: str | None = None) -> str: ... def timesince_filter(value: _date | None, arg: _date | None = None) -> str: ... def timeuntil_filter(value: _date | None, arg: _date | None = None) -> str: ... def default(value: int | str | None, arg: int | str) -> int | str: ... def default_if_none(value: str | None, arg: int | str) -> int | str: ... def divisibleby(value: int, arg: int) -> bool: ... def yesno(value: int | None, arg: str | None = None) -> bool | str | None: ... def filesizeformat(bytes_: float | str) -> str: ... def pluralize(value: Any, arg: str = "s") -> str: ... def phone2numeric_filter(value: str) -> str: ... def pprint(value: Any) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/template/defaulttags.pyi000066400000000000000000000157011526064357400263120ustar00rootroot00000000000000from collections.abc import Iterator, Mapping, Sequence from datetime import date as real_date from typing import Any, NamedTuple from django.forms.widgets import Media from django.http.request import QueryDict from django.template.base import FilterExpression, Parser, PartialTemplate, Token from django.template.context import Context from django.utils.safestring import SafeString from typing_extensions import override from .base import Node, NodeList from .library import Library from .smartif import IfParser, Literal register: Any class AutoEscapeControlNode(Node): nodelist: NodeList setting: bool def __init__(self, setting: bool, nodelist: NodeList) -> None: ... class CommentNode(Node): ... class CsrfTokenNode(Node): ... class CycleNode(Node): cyclevars: list[FilterExpression] variable_name: str | None silent: bool def __init__( self, cyclevars: list[FilterExpression], variable_name: str | None = None, silent: bool = False ) -> None: ... def reset(self, context: Context) -> None: ... class DebugNode(Node): ... class FilterNode(Node): filter_expr: FilterExpression nodelist: NodeList def __init__(self, filter_expr: FilterExpression, nodelist: NodeList) -> None: ... class FirstOfNode(Node): vars: list[FilterExpression] asvar: str | None def __init__(self, variables: list[FilterExpression], asvar: str | None = None) -> None: ... class ForNode(Node): loopvars: list[str] | str sequence: FilterExpression | str child_nodelists: Any is_reversed: bool nodelist_loop: list[str] | NodeList nodelist_empty: list[str] | NodeList def __init__( self, loopvars: list[str] | str, sequence: FilterExpression | str, is_reversed: bool, nodelist_loop: list[str] | NodeList, nodelist_empty: list[str] | NodeList | None = None, ) -> None: ... class IfChangedNode(Node): nodelist_false: NodeList nodelist_true: NodeList child_nodelists: Any def __init__(self, nodelist_true: NodeList, nodelist_false: NodeList, *varlist: Any) -> None: ... class IfNode(Node): conditions_nodelists: list[tuple[TemplateLiteral | None, NodeList]] def __init__(self, conditions_nodelists: list[tuple[TemplateLiteral | None, NodeList]]) -> None: ... def __iter__(self) -> Iterator[Node]: ... @property def nodelist(self) -> NodeList: ... class LoremNode(Node): common: bool count: FilterExpression method: str def __init__(self, count: FilterExpression, method: str, common: bool) -> None: ... class GroupedResult(NamedTuple): grouper: Any list: list[Any] class RegroupNode(Node): expression: FilterExpression target: FilterExpression var_name: str def __init__(self, target: FilterExpression, expression: FilterExpression, var_name: str) -> None: ... def resolve_expression(self, obj: dict[str, real_date], context: Context) -> int | str: ... class LoadNode(Node): ... class NowNode(Node): format_string: str asvar: str | None def __init__(self, format_string: str, asvar: str | None = None) -> None: ... class PartialDefNode(Node): partial_name: str inline: bool nodelist: NodeList def __init__(self, partial_name: str, inline: bool, nodelist: NodeList) -> None: ... class PartialNode(Node): partial_name: str partial_mapping: Mapping[str, PartialTemplate] def __init__(self, partial_name: str, partial_mapping: Mapping[str, PartialTemplate]) -> None: ... class ResetCycleNode(Node): node: CycleNode def __init__(self, node: CycleNode) -> None: ... class SpacelessNode(Node): nodelist: NodeList def __init__(self, nodelist: NodeList) -> None: ... class TemplateTagNode(Node): mapping: Any tagtype: str def __init__(self, tagtype: str) -> None: ... class URLNode(Node): view_name: FilterExpression args: list[FilterExpression] kwargs: dict[str, FilterExpression] asvar: str | None def __init__( self, view_name: FilterExpression, args: list[FilterExpression], kwargs: dict[str, FilterExpression], asvar: str | None, ) -> None: ... class VerbatimNode(Node): content: SafeString def __init__(self, content: SafeString) -> None: ... class WidthRatioNode(Node): val_expr: FilterExpression max_expr: FilterExpression max_width: FilterExpression asvar: str | None def __init__( self, val_expr: FilterExpression, max_expr: FilterExpression, max_width: FilterExpression, asvar: str | None = None, ) -> None: ... class WithNode(Node): nodelist: NodeList extra_context: dict[str, Any] def __init__( self, var: str | None, name: str | None, nodelist: NodeList | Sequence[Node], extra_context: dict[str, Any] | None = None, ) -> None: ... def autoescape(parser: Parser, token: Token) -> AutoEscapeControlNode: ... def comment(parser: Parser, token: Token) -> CommentNode: ... def cycle(parser: Parser, token: Token) -> CycleNode: ... def csrf_token(parser: Parser, token: Token) -> CsrfTokenNode: ... def debug(parser: Parser, token: Token) -> DebugNode: ... def do_filter(parser: Parser, token: Token) -> FilterNode: ... def firstof(parser: Parser, token: Token) -> FirstOfNode: ... def do_for(parser: Parser, token: Token) -> ForNode: ... class TemplateLiteral(Literal): text: str def __init__(self, value: FilterExpression, text: str) -> None: ... @override def display(self) -> str: ... class TemplateIfParser(IfParser): current_token: TemplateLiteral pos: int tokens: list[TemplateLiteral] error_class: Any template_parser: Parser def __init__(self, parser: Parser, *args: Any, **kwargs: Any) -> None: ... def do_if(parser: Parser, token: Token) -> IfNode: ... def ifchanged(parser: Parser, token: Token) -> IfChangedNode: ... def find_library(parser: Parser, name: str) -> Library: ... def load_from_library(library: Library, label: str, names: list[str]) -> Library: ... def load(parser: Parser, token: Token) -> LoadNode: ... def lorem(parser: Parser, token: Token) -> LoremNode: ... def now(parser: Parser, token: Token) -> NowNode: ... def partial_func(parser: Parser, token: Token) -> PartialNode: ... def partialdef_func(parser: Parser, token: Token) -> PartialDefNode: ... def querystring(context: Context, query_dict: QueryDict | None = None, **kwargs: Any) -> str: ... def regroup(parser: Parser, token: Token) -> RegroupNode: ... def resetcycle(parser: Parser, token: Token) -> ResetCycleNode: ... def spaceless(parser: Parser, token: Token) -> SpacelessNode: ... def templatetag(parser: Parser, token: Token) -> TemplateTagNode: ... def url(parser: Parser, token: Token) -> URLNode: ... def verbatim(parser: Parser, token: Token) -> VerbatimNode: ... def widthratio(parser: Parser, token: Token) -> WidthRatioNode: ... def do_with(parser: Parser, token: Token) -> WithNode: ... def csp_nonce_attr(context: Context, media: Media | None = None) -> SafeString: ... typeddjango-django-stubs-fa03b48/django-stubs/template/engine.pyi000066400000000000000000000045641526064357400252610ustar00rootroot00000000000000from collections.abc import Callable, Sequence from typing import Any, ClassVar, TypeAlias from django.http.request import HttpRequest from django.template.base import Origin from django.template.context import Context from django.template.library import Library from django.template.loaders.base import Loader from django.utils.functional import cached_property from django.utils.safestring import SafeString from .base import Template _Loader: TypeAlias = Any class Engine: default_builtins: ClassVar[list[str]] dirs: list[str] app_dirs: bool autoescape: bool context_processors: list[str] | tuple[str, ...] debug: bool loaders: Sequence[_Loader] string_if_invalid: str file_charset: str libraries: dict[str, str] template_libraries: dict[str, Library] builtins: list[str] template_builtins: list[Library] def __init__( self, dirs: list[str] | None = None, app_dirs: bool = False, context_processors: list[str] | tuple[str, ...] | None = None, debug: bool = False, loaders: Sequence[_Loader] | None = None, string_if_invalid: str = "", file_charset: str = "utf-8", libraries: dict[str, str] | None = None, builtins: list[str] | None = None, autoescape: bool = True, ) -> None: ... @staticmethod def get_default() -> Engine: ... @cached_property def template_context_processors(self) -> Sequence[Callable[[HttpRequest], dict[str, Any]]]: ... def get_template_builtins(self, builtins: list[str]) -> list[Library]: ... def get_template_libraries(self, libraries: dict[str, str]) -> dict[str, Library]: ... @cached_property def template_loaders(self) -> list[Loader]: ... def get_template_loaders(self, template_loaders: Sequence[_Loader]) -> list[Loader]: ... def find_template_loader(self, loader: _Loader) -> Loader: ... def find_template( self, name: str, dirs: None = None, skip: list[Origin] | None = None ) -> tuple[Template, Origin]: ... def from_string(self, template_code: str) -> Template: ... def get_template(self, template_name: str) -> Template: ... def render_to_string( self, template_name: str | list[str] | tuple[str, ...], context: dict[str, Any] | Context | None = None ) -> SafeString: ... def select_template(self, template_name_list: list[str]) -> Template: ... typeddjango-django-stubs-fa03b48/django-stubs/template/exceptions.pyi000066400000000000000000000010021526064357400261550ustar00rootroot00000000000000from django.template.backends.base import BaseEngine from django.template.base import Origin class TemplateDoesNotExist(Exception): backend: BaseEngine | None tried: list[tuple[Origin, str]] chain: list[TemplateDoesNotExist] def __init__( self, msg: Origin | str, tried: list[tuple[Origin, str]] | None = None, backend: BaseEngine | None = None, chain: list[TemplateDoesNotExist] | None = None, ) -> None: ... class TemplateSyntaxError(Exception): ... typeddjango-django-stubs-fa03b48/django-stubs/template/library.pyi000066400000000000000000000110301526064357400254420ustar00rootroot00000000000000from collections.abc import Callable, Collection, Iterable, Mapping, Sequence, Sized from typing import Any, overload from django.template.base import FilterExpression, Parser from django.template.context import Context from django.utils.safestring import SafeString from typing_extensions import TypeVar from .base import Node, NodeList, Template class InvalidTemplateLibrary(Exception): ... _C = TypeVar("_C", bound=Callable[..., Any]) class Library: filters: dict[str, Callable[..., Any]] tags: dict[str, Callable[..., Any]] def __init__(self) -> None: ... @overload def tag(self, name: _C) -> _C: ... @overload def tag(self, name: str, compile_function: _C) -> _C: ... @overload def tag(self, name: str | None = None, compile_function: None = None) -> Callable[[_C], _C]: ... def tag_function(self, func: _C) -> _C: ... @overload def filter( self, name: _C, filter_func: None = None, *, is_safe: bool = False, needs_autoescape: bool = False, expects_localtime: bool = False, ) -> _C: ... @overload def filter( self, name: str | None, filter_func: _C, *, is_safe: bool = False, needs_autoescape: bool = False, expects_localtime: bool = False, ) -> _C: ... @overload def filter( self, name: str | None = None, filter_func: None = None, *, is_safe: bool = False, needs_autoescape: bool = False, expects_localtime: bool = False, ) -> Callable[[_C], _C]: ... def filter_function(self, func: _C, **flags: Any) -> _C: ... @overload def simple_tag(self, func: _C, takes_context: bool | None = None, name: str | None = None) -> _C: ... @overload def simple_tag( self, func: None = None, takes_context: bool | None = None, name: str | None = None ) -> Callable[[_C], _C]: ... @overload def simple_block_tag( self, func: _C, takes_context: bool | None = None, name: str | None = None, end_name: str | None = None, ) -> _C: ... @overload def simple_block_tag( self, func: None = None, takes_context: bool | None = None, name: str | None = None, end_name: str | None = None, ) -> Callable[[_C], _C]: ... @overload def inclusion_tag( self, filename: Template | str, func: _C, takes_context: bool | None = None, name: str | None = None, ) -> _C: ... @overload def inclusion_tag( self, filename: Template | str, func: None = None, takes_context: bool | None = None, name: str | None = None, ) -> Callable[[_C], _C]: ... class TagHelperNode(Node): func: Any takes_context: Any args: Any kwargs: Any def __init__( self, func: Callable[..., Any], takes_context: bool | None, args: list[FilterExpression], kwargs: dict[str, FilterExpression], ) -> None: ... def get_resolved_arguments(self, context: Context) -> tuple[list[int], dict[str, SafeString | int]]: ... class SimpleNode(TagHelperNode): args: list[FilterExpression] func: Callable[..., Any] kwargs: dict[str, FilterExpression] takes_context: bool | None target_var: str | None def __init__( self, func: Callable[..., Any], takes_context: bool | None, args: list[FilterExpression], kwargs: dict[str, FilterExpression], target_var: str | None, ) -> None: ... class SimpleBlockNode(SimpleNode): nodelist: NodeList def __init__( self, nodelist: NodeList, *args: Any, **kwargs: Any, ) -> None: ... class InclusionNode(TagHelperNode): args: list[FilterExpression] func: Callable[..., Any] kwargs: dict[str, FilterExpression] takes_context: bool | None filename: Template | str def __init__( self, func: Callable[..., Any], takes_context: bool | None, args: list[FilterExpression], kwargs: dict[str, FilterExpression], filename: Template | str | None, ) -> None: ... def parse_bits( parser: Parser, bits: Iterable[str], params: Sequence[str], varargs: str | None, varkw: str | None, defaults: Sized | None, kwonly: Collection[str], kwonly_defaults: Mapping[str, int] | None, name: str, ) -> tuple[list[FilterExpression], dict[str, FilterExpression]]: ... def import_library(name: str) -> Library: ... typeddjango-django-stubs-fa03b48/django-stubs/template/loader.pyi000066400000000000000000000012431526064357400252510ustar00rootroot00000000000000from collections.abc import Mapping, Sequence from typing import Any from django.http.request import HttpRequest from django.template.exceptions import TemplateDoesNotExist as TemplateDoesNotExist from django.utils.safestring import SafeString from .backends.base import _EngineTemplate def get_template(template_name: str, using: str | None = None) -> _EngineTemplate: ... def select_template(template_name_list: Sequence[str] | str, using: str | None = None) -> Any: ... def render_to_string( template_name: Sequence[str] | str, context: Mapping[str, Any] | None = None, request: HttpRequest | None = None, using: str | None = None, ) -> SafeString: ... typeddjango-django-stubs-fa03b48/django-stubs/template/loader_tags.pyi000066400000000000000000000044011526064357400262660ustar00rootroot00000000000000import collections from typing import Any from django.template.base import FilterExpression, NodeList, Parser, Token from django.template.context import Context from django.utils.safestring import SafeString from typing_extensions import override from .base import Node, Template register: Any BLOCK_CONTEXT_KEY: str class BlockContext: blocks: collections.defaultdict[str, list[BlockNode]] def __init__(self) -> None: ... def add_blocks(self, blocks: dict[str, BlockNode]) -> None: ... def pop(self, name: str) -> BlockNode: ... def push(self, name: str, block: BlockNode) -> None: ... def get_block(self, name: str) -> BlockNode: ... class BlockNode(Node): context: Context name: str nodelist: NodeList parent: Node | None def __init__(self, name: str, nodelist: NodeList, parent: Node | None = None) -> None: ... @override def render(self, context: Context) -> SafeString: ... def super(self) -> SafeString: ... class ExtendsNode(Node): must_be_first: bool context_key: str nodelist: NodeList parent_name: FilterExpression | Node template_dirs: list[Any] | None blocks: dict[str, BlockNode] def __init__( self, nodelist: NodeList, parent_name: FilterExpression | Node, template_dirs: list[Any] | None = None ) -> None: ... def find_template(self, template_name: str, context: Context) -> Template: ... def get_parent(self, context: Context) -> Template: ... @override def render(self, context: Context) -> Any: ... class IncludeNode(Node): context_key: str template: FilterExpression extra_context: dict[str, FilterExpression] isolated_context: bool def __init__( self, template: FilterExpression, *args: Any, extra_context: Any | None = None, isolated_context: bool = False, **kwargs: Any, ) -> None: ... @override def render(self, context: Context) -> SafeString: ... def do_block(parser: Parser, token: Token) -> BlockNode: ... def construct_relative_path( current_template_name: str | None, relative_name: str, allow_recursion: bool = False, ) -> str: ... def do_extends(parser: Parser, token: Token) -> ExtendsNode: ... def do_include(parser: Parser, token: Token) -> IncludeNode: ... typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/000077500000000000000000000000001526064357400247115ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/__init__.pyi000066400000000000000000000000001526064357400271610ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/app_directories.pyi000066400000000000000000000001301526064357400306020ustar00rootroot00000000000000from .filesystem import Loader as FilesystemLoader class Loader(FilesystemLoader): ... typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/base.pyi000066400000000000000000000006531526064357400263520ustar00rootroot00000000000000from collections.abc import Iterable from django.template.base import Origin, Template from django.template.engine import Engine class Loader: engine: Engine def __init__(self, engine: Engine) -> None: ... def get_template(self, template_name: str, skip: list[Origin] | None = None) -> Template: ... def get_template_sources(self, template_name: str) -> Iterable[Origin]: ... def reset(self) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/cached.pyi000066400000000000000000000012061526064357400266420ustar00rootroot00000000000000from collections.abc import Iterator, Sequence from pathlib import Path from typing import Any from django.template.base import Origin from django.template.engine import Engine from .base import Loader as BaseLoader class Loader(BaseLoader): get_template_cache: dict[str, Any] loaders: list[BaseLoader] def __init__(self, engine: Engine, loaders: Sequence[Any]) -> None: ... def get_dirs(self) -> Iterator[str | Path]: ... def get_contents(self, origin: Origin) -> str: ... def cache_key(self, template_name: str, skip: list[Origin] | None = None) -> str: ... def generate_hash(self, values: list[str]) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/filesystem.pyi000066400000000000000000000010741526064357400276220ustar00rootroot00000000000000from collections.abc import Iterator from pathlib import Path from django.template.base import Origin from django.template.engine import Engine from typing_extensions import override from .base import Loader as BaseLoader class Loader(BaseLoader): dirs: list[str | Path] | None def __init__(self, engine: Engine, dirs: list[str | Path] | None = None) -> None: ... def get_dirs(self) -> list[str | Path]: ... def get_contents(self, origin: Origin) -> str: ... @override def get_template_sources(self, template_name: str) -> Iterator[Origin]: ... typeddjango-django-stubs-fa03b48/django-stubs/template/loaders/locmem.pyi000066400000000000000000000005031526064357400267060ustar00rootroot00000000000000from django.template.base import Origin from django.template.engine import Engine from .base import Loader as BaseLoader class Loader(BaseLoader): templates_dict: dict[str, str] def __init__(self, engine: Engine, templates_dict: dict[str, str]) -> None: ... def get_contents(self, origin: Origin) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/template/response.pyi000066400000000000000000000040651526064357400256460ustar00rootroot00000000000000from collections.abc import Callable, Iterator, Sequence from http.cookies import SimpleCookie from typing import Any, TypeAlias from django.http import HttpResponse from django.http.request import HttpRequest from typing_extensions import override from .backends.base import _EngineTemplate _TemplateForResponseT: TypeAlias = Sequence[str] | _EngineTemplate | str class ContentNotRenderedError(Exception): ... class SimpleTemplateResponse(HttpResponse): content: Any closed: bool cookies: SimpleCookie status_code: int rendering_attrs: Any template_name: _TemplateForResponseT context_data: dict[str, Any] | None using: str | None def __init__( self, template: _TemplateForResponseT, context: dict[str, Any] | None = ..., content_type: str | None = ..., status: int | None = ..., charset: str | None = ..., using: str | None = ..., headers: dict[str, Any] | None = ..., ) -> None: ... def resolve_template(self, template: _TemplateForResponseT) -> _EngineTemplate: ... def resolve_context(self, context: dict[str, Any] | None) -> dict[str, Any] | None: ... @property def rendered_content(self) -> str: ... def add_post_render_callback(self, callback: Callable[..., Any]) -> None: ... def render(self) -> SimpleTemplateResponse: ... @property def is_rendered(self) -> bool: ... @override def __iter__(self) -> Iterator[Any]: ... class TemplateResponse(SimpleTemplateResponse): closed: bool context_data: dict[str, Any] | None cookies: SimpleCookie _request: HttpRequest status_code: int template_name: _TemplateForResponseT using: str | None rendering_attrs: Any def __init__( self, request: HttpRequest, template: _TemplateForResponseT, context: dict[str, Any] | None = ..., content_type: str | None = ..., status: int | None = ..., charset: str | None = ..., using: str | None = ..., headers: dict[str, Any] | None = ..., ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/template/smartif.pyi000066400000000000000000000022641526064357400254540ustar00rootroot00000000000000from typing import Any, TypeAlias from django.template.defaulttags import TemplateLiteral from typing_extensions import override _Token: TypeAlias = list[int] | int | str class TokenBase: id: Any value: Any first: Any second: Any lbp: int def nud(self, parser: Any) -> None: ... def led(self, left: Any, parser: Any) -> None: ... def display(self) -> Any: ... def infix(bp: Any, func: Any) -> type[TokenBase]: ... def prefix(bp: Any, func: Any) -> type[TokenBase]: ... OPERATORS: Any class Literal(TokenBase): id: str value: _Token | None def __init__(self, value: _Token | None) -> None: ... @override def display(self) -> str: ... def eval(self, context: dict[Any, Any]) -> _Token | None: ... EndToken: TokenBase class IfParser: error_class: Any tokens: Any pos: int current_token: Any def __init__(self, tokens: list[_Token | None]) -> None: ... def translate_token(self, token: _Token | None) -> Literal: ... def next_token(self) -> Literal: ... def parse(self) -> TemplateLiteral: ... def expression(self, rbp: int = 0) -> Literal: ... def create_var(self, value: _Token | None) -> Literal: ... typeddjango-django-stubs-fa03b48/django-stubs/template/utils.pyi000066400000000000000000000012641526064357400251460ustar00rootroot00000000000000from collections.abc import Iterator from pathlib import Path from typing import Any from django.core.exceptions import ImproperlyConfigured from django.template.backends.base import BaseEngine from django.utils.functional import cached_property class InvalidTemplateEngineError(ImproperlyConfigured): ... class EngineHandler: def __init__(self, templates: list[dict[str, Any]] | None = None) -> None: ... @cached_property def templates(self) -> dict[str, Any]: ... def __getitem__(self, alias: str) -> BaseEngine: ... def __iter__(self) -> Iterator[Any]: ... def all(self) -> list[BaseEngine]: ... def get_app_template_dirs(dirname: str) -> tuple[Path, ...]: ... typeddjango-django-stubs-fa03b48/django-stubs/templatetags/000077500000000000000000000000001526064357400241375ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/templatetags/__init__.pyi000066400000000000000000000000001526064357400264070ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/templatetags/cache.pyi000066400000000000000000000011651526064357400257300ustar00rootroot00000000000000from typing import Any from django.template import Node from django.template.base import FilterExpression, NodeList, Parser, Token register: Any class CacheNode(Node): nodelist: NodeList expire_time_var: FilterExpression fragment_name: str vary_on: list[FilterExpression] cache_name: FilterExpression | None def __init__( self, nodelist: NodeList, expire_time_var: FilterExpression, fragment_name: str, vary_on: list[FilterExpression], cache_name: FilterExpression | None, ) -> None: ... def do_cache(parser: Parser, token: Token) -> CacheNode: ... typeddjango-django-stubs-fa03b48/django-stubs/templatetags/i18n.pyi000066400000000000000000000071321526064357400254440ustar00rootroot00000000000000from typing import Any from django.template import Node from django.template.base import FilterExpression, NodeList, Parser, Token from django.template.context import Context from typing_extensions import override register: Any class GetAvailableLanguagesNode(Node): variable: str def __init__(self, variable: str) -> None: ... @override def render(self, context: Context) -> str: ... class GetLanguageInfoNode(Node): lang_code: FilterExpression variable: str def __init__(self, lang_code: FilterExpression, variable: str) -> None: ... @override def render(self, context: Context) -> str: ... class GetLanguageInfoListNode(Node): languages: FilterExpression variable: str def __init__(self, languages: FilterExpression, variable: str) -> None: ... def get_language_info(self, language: Any) -> Any: ... @override def render(self, context: Context) -> str: ... class GetCurrentLanguageNode(Node): variable: str def __init__(self, variable: str) -> None: ... @override def render(self, context: Context) -> str: ... class GetCurrentLanguageBidiNode(Node): variable: str def __init__(self, variable: str) -> None: ... @override def render(self, context: Context) -> str: ... class TranslateNode(Node): noop: bool asvar: str | None message_context: FilterExpression | None filter_expression: FilterExpression def __init__( self, filter_expression: FilterExpression, noop: bool, asvar: str | None = None, message_context: FilterExpression | None = None, ) -> None: ... @override def render(self, context: Context) -> str: ... class BlockTranslateNode(Node): extra_context: dict[str, FilterExpression] singular: list[Token] plural: list[Token] countervar: str | None counter: FilterExpression | None message_context: FilterExpression | None trimmed: bool asvar: str | None def __init__( self, extra_context: dict[str, FilterExpression], singular: list[Token], plural: list[Token] | None = None, countervar: str | None = None, counter: FilterExpression | None = None, message_context: FilterExpression | None = None, trimmed: bool = False, asvar: str | None = None, tag_name: str = "blocktranslate", ) -> None: ... def render_token_list(self, tokens: list[Token]) -> tuple[str, list[str]]: ... @override def render(self, context: Context, nested: bool = False) -> str: ... class LanguageNode(Node): nodelist: NodeList language: FilterExpression def __init__(self, nodelist: NodeList, language: FilterExpression) -> None: ... @override def render(self, context: Context) -> str: ... def do_get_available_languages(parser: Parser, token: Token) -> GetAvailableLanguagesNode: ... def do_get_language_info(parser: Parser, token: Token) -> GetLanguageInfoNode: ... def do_get_language_info_list(parser: Parser, token: Token) -> GetLanguageInfoListNode: ... def language_name(lang_code: str) -> str: ... def language_name_translated(lang_code: str) -> str: ... def language_name_local(lang_code: str) -> str: ... def language_bidi(lang_code: str) -> bool: ... def do_get_current_language(parser: Parser, token: Token) -> GetCurrentLanguageNode: ... def do_get_current_language_bidi(parser: Parser, token: Token) -> GetCurrentLanguageBidiNode: ... def do_translate(parser: Parser, token: Token) -> TranslateNode: ... def do_block_translate(parser: Parser, token: Token) -> BlockTranslateNode: ... def language(parser: Parser, token: Token) -> LanguageNode: ... typeddjango-django-stubs-fa03b48/django-stubs/templatetags/l10n.pyi000066400000000000000000000006321526064357400254350ustar00rootroot00000000000000from typing import Any from django.template import Node from django.template.base import Parser, Token register: Any def localize(value: Any) -> str: ... def unlocalize(value: Any) -> str: ... class LocalizeNode(Node): nodelist: list[Node] use_l10n: bool def __init__(self, nodelist: list[Node], use_l10n: bool) -> None: ... def localize_tag(parser: Parser, token: Token) -> LocalizeNode: ... typeddjango-django-stubs-fa03b48/django-stubs/templatetags/static.pyi000066400000000000000000000021651526064357400261550ustar00rootroot00000000000000from typing import Any from django import template from django.template.base import FilterExpression, Parser, Token from django.template.context import Context register: Any class PrefixNode(template.Node): varname: str | None name: str def __init__(self, varname: str | None = None, name: str | None = None) -> None: ... @classmethod def handle_token(cls, parser: Parser, token: Token, name: str) -> PrefixNode: ... @classmethod def handle_simple(cls, name: str) -> str: ... def get_static_prefix(parser: Parser, token: Token) -> PrefixNode: ... def get_media_prefix(parser: Parser, token: Token) -> PrefixNode: ... class StaticNode(template.Node): path: FilterExpression varname: str | None def __init__(self, varname: str | None = None, path: FilterExpression | None = None) -> None: ... def url(self, context: Context) -> str: ... @classmethod def handle_simple(cls, path: str) -> str: ... @classmethod def handle_token(cls, parser: Parser, token: Token) -> StaticNode: ... def do_static(parser: Parser, token: Token) -> StaticNode: ... def static(path: str) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/templatetags/tz.pyi000066400000000000000000000020171526064357400253170ustar00rootroot00000000000000from datetime import datetime, tzinfo from typing import Any from django.template import Node from django.template.base import FilterExpression, NodeList, Parser, Token register: Any class datetimeobject(datetime): ... def localtime(value: datetime | str | None) -> Any: ... def utc(value: datetime | str | None) -> Any: ... def do_timezone(value: datetime | str | None, arg: tzinfo | str | None) -> Any: ... class LocalTimeNode(Node): nodelist: NodeList use_tz: bool def __init__(self, nodelist: NodeList, use_tz: bool) -> None: ... class TimezoneNode(Node): nodelist: NodeList tz: FilterExpression def __init__(self, nodelist: NodeList, tz: FilterExpression) -> None: ... class GetCurrentTimezoneNode(Node): variable: str def __init__(self, variable: str) -> None: ... def localtime_tag(parser: Parser, token: Token) -> LocalTimeNode: ... def timezone_tag(parser: Parser, token: Token) -> TimezoneNode: ... def get_current_timezone_tag(parser: Parser, token: Token) -> GetCurrentTimezoneNode: ... typeddjango-django-stubs-fa03b48/django-stubs/test/000077500000000000000000000000001526064357400224245ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/test/__init__.pyi000066400000000000000000000023661526064357400247150ustar00rootroot00000000000000from .client import AsyncClient as AsyncClient from .client import AsyncRequestFactory as AsyncRequestFactory from .client import Client as Client from .client import RequestFactory as RequestFactory from .testcases import LiveServerTestCase as LiveServerTestCase from .testcases import SimpleTestCase as SimpleTestCase from .testcases import TestCase as TestCase from .testcases import TransactionTestCase as TransactionTestCase from .testcases import skipIfDBFeature as skipIfDBFeature from .testcases import skipUnlessAnyDBFeature as skipUnlessAnyDBFeature from .testcases import skipUnlessDBFeature as skipUnlessDBFeature from .utils import ignore_warnings as ignore_warnings from .utils import modify_settings as modify_settings from .utils import override_settings as override_settings from .utils import override_system_checks as override_system_checks from .utils import tag as tag __all__ = [ "AsyncClient", "AsyncRequestFactory", "Client", "LiveServerTestCase", "RequestFactory", "SimpleTestCase", "TestCase", "TransactionTestCase", "ignore_warnings", "modify_settings", "override_settings", "override_system_checks", "skipIfDBFeature", "skipUnlessAnyDBFeature", "skipUnlessDBFeature", "tag", ] typeddjango-django-stubs-fa03b48/django-stubs/test/client.pyi000066400000000000000000000405771526064357400244420ustar00rootroot00000000000000from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Callable, Iterable, Iterator, Mapping from http import HTTPStatus from http.cookies import SimpleCookie from io import BytesIO, IOBase from json import JSONEncoder from re import Pattern from typing import Any, Generic, Literal, NoReturn, TypeAlias, TypedDict, type_check_only from _typeshed import ExcInfo from asgiref.typing import ASGIVersions from django.contrib.auth.models import _User from django.contrib.sessions.backends.base import SessionBase from django.core.handlers.asgi import ASGIRequest from django.core.handlers.base import BaseHandler from django.core.handlers.wsgi import WSGIRequest from django.http.request import HttpRequest from django.http.response import HttpResponseBase from django.template.base import Template from django.test.utils import ContextList from django.urls import ResolverMatch from django.utils.functional import _StrOrPromise, cached_property from typing_extensions import TypeVar, override BOUNDARY: str MULTIPART_CONTENT: str CONTENT_TYPE_RE: Pattern[str] JSON_CONTENT_TYPE_RE: Pattern[str] REDIRECT_STATUS_CODES: frozenset[HTTPStatus] class RedirectCycleError(Exception): last_response: HttpResponseBase redirect_chain: list[tuple[str, int]] def __init__(self, message: str, last_response: HttpResponseBase) -> None: ... class FakePayload(IOBase): read_started: bool def __init__(self, initial_bytes: bytes | str | None = ...) -> None: ... def __len__(self) -> int: ... @override def read(self, size: int = ..., /) -> bytes: ... @override def readline(self, size: int | None = ..., /) -> bytes: ... @override def write(self, content: bytes | str, /) -> None: ... _T = TypeVar("_T") def closing_iterator_wrapper(iterable: Iterable[_T], close: Callable[[], Any]) -> Iterator[_T]: ... async def aclosing_iterator_wrapper(iterable: AsyncIterable[_T], close: Callable[[], Any]) -> AsyncIterator[_T]: ... def conditional_content_removal(request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: ... @type_check_only class _WSGIResponse(HttpResponseBase): wsgi_request: WSGIRequest @type_check_only class _ASGIResponse(HttpResponseBase): asgi_request: ASGIRequest class ClientHandler(BaseHandler): enforce_csrf_checks: bool def __init__(self, enforce_csrf_checks: bool = ..., *args: Any, **kwargs: Any) -> None: ... def __call__(self, environ: dict[str, Any]) -> _WSGIResponse: ... class AsyncClientHandler(BaseHandler): enforce_csrf_checks: bool def __init__(self, enforce_csrf_checks: bool = ..., *args: Any, **kwargs: Any) -> None: ... async def __call__(self, scope: dict[str, Any]) -> _ASGIResponse: ... def encode_multipart(boundary: str, data: dict[str, Any]) -> bytes: ... def encode_file(boundary: str, key: str, file: Any) -> list[bytes]: ... _GetDataType: TypeAlias = ( Mapping[str, str | bytes | int | Iterable[str | bytes | int]] | Iterable[tuple[str, str | bytes | int | Iterable[str | bytes | int]]] | None ) @type_check_only class _RequestFactory(Generic[_T]): json_encoder: type[JSONEncoder] defaults: dict[str, str] cookies: SimpleCookie errors: BytesIO def __init__( self, *, json_encoder: type[JSONEncoder] = ..., headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **defaults: Any, ) -> None: ... def request(self, **request: Any) -> _T: ... def get( self, path: _StrOrPromise, data: _GetDataType = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _T: ... def post( self, path: _StrOrPromise, data: Any = ..., content_type: str = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _T: ... def head( self, path: _StrOrPromise, data: Any = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _T: ... def trace( self, path: _StrOrPromise, secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _T: ... def options( self, path: _StrOrPromise, data: dict[str, str] | str = ..., content_type: str = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _T: ... def put( self, path: _StrOrPromise, data: Any = ..., content_type: str = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _T: ... def patch( self, path: _StrOrPromise, data: Any = ..., content_type: str = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _T: ... def delete( self, path: _StrOrPromise, data: Any = ..., content_type: str = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _T: ... def generic( self, method: str, path: _StrOrPromise, data: Any = ..., content_type: str | None = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _T: ... class RequestFactory(_RequestFactory[WSGIRequest]): ... # A non total duplication of `asgiref.typing.HTTPScope` @type_check_only class _HTTPScope(TypedDict, total=False): type: Literal["http"] asgi: ASGIVersions http_version: str method: str scheme: str path: str raw_path: bytes query_string: bytes root_path: str headers: Iterable[tuple[bytes, bytes]] client: tuple[str, int] | None server: tuple[str, int | None] | None state: dict[str, Any] extensions: dict[str, dict[object, object]] | None @type_check_only class _AsyncRequestFactory(_RequestFactory[_T]): defaults: _HTTPScope # type: ignore[assignment] class AsyncRequestFactory(_AsyncRequestFactory[ASGIRequest]): ... # fakes to distinguish WSGIRequest and ASGIRequest @type_check_only class _MonkeyPatchedWSGIResponse(_WSGIResponse): def json(self) -> Any: ... request: dict[str, Any] client: Client templates: list[Template] # `context` and `context_data` are populated based on whether you use the standard template # backend or a custom one respectively. # `context_data` only exists if the response was successful too as the return type changes. # `HTTPResponse` when API failed and `TemplateResponse` when successful. # https://docs.djangoproject.com/en/stable/topics/testing/tools/#django.test.Response.context context: ContextList | dict[str, Any] # Must match `django.template.response.SimpleTemplateResponse.context_data` context_data: dict[str, Any] | None content: bytes resolver_match: ResolverMatch redirect_chain: list[tuple[str, int]] @cached_property def text(self) -> str: ... @type_check_only class _MonkeyPatchedASGIResponse(_ASGIResponse): def json(self) -> Any: ... request: dict[str, Any] client: AsyncClient templates: list[Template] # `context` and `context_data` are populated based on whether you use the standard template # backend or a custom one respectively. # `context_data` only exists if the response was successful too as the return type changes. # `HTTPResponse` when API failed and `TemplateResponse` when successful. # https://docs.djangoproject.com/en/stable/topics/testing/tools/#django.test.Response.context context: ContextList | dict[str, Any] # Must match `django.template.response.SimpleTemplateResponse.context_data` context_data: dict[str, Any] | None content: bytes resolver_match: ResolverMatch redirect_chain: list[tuple[str, int]] class ClientMixin: def store_exc_info(self, **kwargs: object) -> None: ... def check_exception(self, response: HttpResponseBase) -> NoReturn: ... @property def session(self) -> SessionBase: ... async def asession(self) -> SessionBase: ... def login(self, **credentials: Any) -> bool: ... async def alogin(self, **credentials: Any) -> bool: ... def force_login(self, user: _User, backend: str | None = ...) -> None: ... async def aforce_login(self, user: _User, backend: str | None = ...) -> None: ... def logout(self) -> None: ... async def alogout(self) -> None: ... class Client(ClientMixin, _RequestFactory[_MonkeyPatchedWSGIResponse]): handler: ClientHandler raise_request_exception: bool exc_info: ExcInfo | None extra: dict[str, Any] | None headers: Mapping[str, str] | None def __init__( self, enforce_csrf_checks: bool = ..., raise_request_exception: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **defaults: Any, ) -> None: ... @override def request(self, **request: Any) -> _MonkeyPatchedWSGIResponse: ... @override def get( # type: ignore[override] self, path: _StrOrPromise, data: _GetDataType = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedWSGIResponse: ... @override def post( # type: ignore[override] self, path: _StrOrPromise, data: Any = ..., content_type: str = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedWSGIResponse: ... @override def head( # type: ignore[override] self, path: _StrOrPromise, data: Any = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedWSGIResponse: ... @override def options( # type: ignore[override] self, path: _StrOrPromise, data: dict[str, str] | str = ..., content_type: str = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedWSGIResponse: ... @override def put( # type: ignore[override] self, path: _StrOrPromise, data: Any = ..., content_type: str = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedWSGIResponse: ... @override def patch( # type: ignore[override] self, path: _StrOrPromise, data: Any = ..., content_type: str = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedWSGIResponse: ... @override def delete( # type: ignore[override] self, path: _StrOrPromise, data: Any = ..., content_type: str = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedWSGIResponse: ... @override def trace( # type: ignore[override] self, path: _StrOrPromise, data: Any = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedWSGIResponse: ... class AsyncClient(ClientMixin, _AsyncRequestFactory[Awaitable[_MonkeyPatchedASGIResponse]]): handler: AsyncClientHandler raise_request_exception: bool exc_info: ExcInfo | None extra: dict[str, Any] | None headers: Mapping[str, str] | None def __init__( self, enforce_csrf_checks: bool = ..., raise_request_exception: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **defaults: Any, ) -> None: ... @override async def request(self, **request: Any) -> _MonkeyPatchedASGIResponse: ... @override async def get( # type: ignore[override] self, path: _StrOrPromise, data: _GetDataType = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedASGIResponse: ... @override async def post( # type: ignore[override] self, path: _StrOrPromise, data: Any = ..., content_type: str = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedASGIResponse: ... @override async def head( # type: ignore[override] self, path: _StrOrPromise, data: Any = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedASGIResponse: ... @override async def options( # type: ignore[override] self, path: _StrOrPromise, data: dict[str, str] | str = ..., content_type: str = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedASGIResponse: ... @override async def put( # type: ignore[override] self, path: _StrOrPromise, data: Any = ..., content_type: str = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedASGIResponse: ... @override async def patch( # type: ignore[override] self, path: _StrOrPromise, data: Any = ..., content_type: str = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedASGIResponse: ... @override async def delete( # type: ignore[override] self, path: _StrOrPromise, data: Any = ..., content_type: str = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedASGIResponse: ... @override async def trace( # type: ignore[override] self, path: _StrOrPromise, data: Any = ..., follow: bool = ..., secure: bool = ..., *, headers: Mapping[str, str] | None = ..., query_params: Mapping[Any, Any] | None = ..., **extra: Any, ) -> _MonkeyPatchedASGIResponse: ... __all__ = ( "AsyncClient", "AsyncRequestFactory", "Client", "RedirectCycleError", "RequestFactory", "encode_file", "encode_multipart", ) typeddjango-django-stubs-fa03b48/django-stubs/test/html.pyi000066400000000000000000000024431526064357400241160ustar00rootroot00000000000000from collections.abc import Sequence from html.parser import HTMLParser from re import Pattern from typing import Any, TypeAlias ASCII_WHITESPACE: Pattern[str] BOOLEAN_ATTRIBUTES: set[str] def normalize_whitespace(string: str) -> str: ... def normalize_attributes(attributes: list[tuple[str, str | None]]) -> list[tuple[str, str | None]]: ... _ElementAttribute: TypeAlias = tuple[str, str | None] class Element: name: str | None attributes: list[_ElementAttribute] children: list[Any] def __init__(self, name: str | None, attributes: Sequence[_ElementAttribute]) -> None: ... def append(self, element: Element | str) -> None: ... def finalize(self) -> None: ... def __contains__(self, element: Element | str) -> bool: ... def count(self, element: Element | str) -> int: ... def __getitem__(self, key: int) -> Any: ... class RootElement(Element): def __init__(self) -> None: ... class HTMLParseError(Exception): ... class Parser(HTMLParser): root: Any open_tags: Any element_positions: Any def __init__(self) -> None: ... def error(self, msg: str) -> HTMLParseError: ... def format_position(self, position: Any = ..., element: Any = ...) -> str: ... @property def current(self) -> Element: ... def parse_html(html: str) -> Element: ... typeddjango-django-stubs-fa03b48/django-stubs/test/runner.pyi000066400000000000000000000172621526064357400244700ustar00rootroot00000000000000import logging import sys from argparse import ArgumentParser from collections.abc import Callable, Iterable, Iterator, Sequence from contextlib import AbstractContextManager from typing import Any, Literal from unittest import TestCase, TestLoader, TestResult, TestSuite, TextTestResult, TextTestRunner from django.db.backends.base.base import BaseDatabaseWrapper from django.test.testcases import SimpleTestCase from django.test.testcases import TestCase as DjangoTestCase from django.test.utils import TimeKeeperProtocol from typing_extensions import override class QueryFormatter(logging.Formatter): ... class DebugSQLTextTestResult(TextTestResult): logger: logging.Logger def __init__(self, stream: Any, descriptions: bool, verbosity: int) -> None: ... handler: logging.StreamHandler[Any] @override def startTest(self, test: TestCase) -> None: ... @override def stopTest(self, test: TestCase) -> None: ... @override def addError(self, test: Any, err: Any) -> None: ... @override def addFailure(self, test: Any, err: Any) -> None: ... class PDBDebugResult(TextTestResult): def debug(self, error: tuple[type[BaseException], BaseException, Any]) -> None: ... class DummyList: __slots__ = () def append(self, item: Any) -> None: ... class RemoteTestResult(TestResult): events: list[Any] def __init__(self, *args: Any, **kwargs: Any) -> None: ... @property def test_index(self) -> int: ... def _confirm_picklable(self, obj: Any) -> None: ... def check_picklable(self, test: Any, err: Any) -> None: ... def check_subtest_picklable(self, test: Any, subtest: Any) -> None: ... @override def startTestRun(self) -> None: ... @override def stopTestRun(self) -> None: ... @override def startTest(self, test: Any) -> None: ... @override def stopTest(self, test: Any) -> None: ... if sys.version_info >= (3, 12): @override def addDuration(self, test: Any, elapsed: Any) -> None: ... else: def addDuration(self, test: Any, elapsed: Any) -> None: ... @override def addError(self, test: Any, err: Any) -> None: ... @override def addFailure(self, test: Any, err: Any) -> None: ... @override def addSubTest(self, test: Any, subtest: Any, err: Any) -> None: ... @override def addSuccess(self, test: Any) -> None: ... @override def addSkip(self, test: Any, reason: Any) -> None: ... @override def addExpectedFailure(self, test: Any, err: Any) -> None: ... @override def addUnexpectedSuccess(self, test: Any) -> None: ... @override def wasSuccessful(self) -> bool: ... class RemoteTestRunner: resultclass: Any failfast: bool buffer: bool def __init__(self, failfast: bool = ..., resultclass: Any | None = ..., buffer: bool = ...) -> None: ... def run(self, test: Any) -> Any: ... def get_max_test_processes() -> int: ... def parallel_type(value: str) -> int | Literal["auto"]: ... class ParallelTestSuite(TestSuite): init_worker: Callable[..., Any] process_setup: Callable[..., Any] process_setup_args: tuple[Any, ...] run_subsuite: Callable[..., Any] runner_class: type[RemoteTestRunner] subsuites: list[TestSuite] processes: int failfast: bool debug_mode: bool buffer: bool initial_settings: dict[str, dict[str, Any]] | None serialized_contents: dict[str, str] | None used_aliases: set[str] | None def __init__( self, subsuites: list[TestSuite], processes: int, failfast: bool = ..., debug_mode: bool = ..., buffer: bool = ..., ) -> None: ... @override def run(self, result: Any) -> Any: ... # type: ignore[override] def handle_event(self, result: Any, tests: list[TestSuite], event: Sequence[Any]) -> None: ... def initialize_suite(self) -> None: ... class Shuffler: hash_algorithm: str seed: int seed_source: str def __init__(self, seed: int | None = ...) -> None: ... @property def seed_display(self) -> str: ... def shuffle(self, items: Iterable[Any], key: Callable[[Any], str]) -> list[Any]: ... class DiscoverRunner: test_suite: type[TestSuite] parallel_test_suite: type[ParallelTestSuite] test_runner: type[TextTestRunner] test_loader: TestLoader reorder_by: tuple[type[DjangoTestCase], type[SimpleTestCase]] pattern: str | None top_level: str | None verbosity: int interactive: bool failfast: bool keepdb: bool reverse: bool debug_mode: bool debug_sql: bool parallel: int tags: set[str] exclude_tags: set[str] pdb: bool buffer: bool test_name_patterns: set[str] | None time_keeper: TimeKeeperProtocol shuffle: int | Literal[False] logger: logging.Logger | None durations: int | None def __init__( self, pattern: str | None = ..., top_level: str | None = ..., verbosity: int = ..., interactive: bool = ..., failfast: bool = ..., keepdb: bool = ..., reverse: bool = ..., debug_mode: bool = ..., debug_sql: bool = ..., parallel: int = ..., tags: list[str] | None = ..., exclude_tags: list[str] | None = ..., test_name_patterns: list[str] | None = ..., pdb: bool = ..., buffer: bool = ..., enable_faulthandler: bool = ..., timing: bool = ..., shuffle: int | Literal[False] = ..., logger: logging.Logger | None = ..., durations: int | None = ..., **kwargs: Any, ) -> None: ... @classmethod def add_arguments(cls, parser: ArgumentParser) -> None: ... @property def shuffle_seed(self) -> int | None: ... def log(self, msg: str, level: int | None = ...) -> None: ... def setup_test_environment(self, **kwargs: Any) -> None: ... def setup_shuffler(self) -> None: ... def load_with_patterns(self) -> AbstractContextManager[None]: ... def load_tests_for_label(self, label: str, discover_kwargs: dict[str, str]) -> TestSuite: ... def build_suite(self, test_labels: Sequence[str] | None = ..., **kwargs: Any) -> TestSuite: ... def setup_databases(self, **kwargs: Any) -> list[tuple[BaseDatabaseWrapper, str, bool]]: ... def get_resultclass(self) -> type[TextTestResult] | None: ... def get_test_runner_kwargs(self) -> dict[str, Any]: ... def run_checks(self, databases: set[str]) -> None: ... def run_suite(self, suite: TestSuite, **kwargs: Any) -> TextTestResult: ... def teardown_databases(self, old_config: list[tuple[BaseDatabaseWrapper, str, bool]], **kwargs: Any) -> None: ... def teardown_test_environment(self, **kwargs: Any) -> None: ... def suite_result(self, suite: TestSuite, result: TextTestResult, **kwargs: Any) -> int: ... def _get_databases(self, suite: TestSuite) -> set[str]: ... def get_databases(self, suite: TestSuite) -> set[str]: ... def run_tests(self, test_labels: list[str], **kwargs: Any) -> int: ... def try_importing(label: str) -> tuple[bool, bool]: ... def find_top_level(top_level: str) -> str: ... def shuffle_tests(tests: Iterable[TestCase], shuffler: Shuffler) -> Iterator[TestCase]: ... def reorder_test_bin( tests: Sequence[TestCase], shuffler: Shuffler | None = ..., reverse: bool = ... ) -> Iterator[TestCase]: ... def reorder_tests( tests: Iterable[TestCase], classes: Sequence[type[TestCase]], reverse: bool = ..., shuffler: Shuffler | None = ..., ) -> Iterator[TestCase]: ... def partition_suite_by_case(suite: TestSuite) -> list[TestSuite]: ... def test_match_tags(test: TestCase, tags: set[str], exclude_tags: set[str]) -> bool: ... def filter_tests_by_tags(tests: Iterable[TestCase], tags: set[str], exclude_tags: set[str]) -> Iterator[TestCase]: ... typeddjango-django-stubs-fa03b48/django-stubs/test/selenium.pyi000066400000000000000000000045311526064357400247730ustar00rootroot00000000000000from collections.abc import Callable, Sequence from contextlib import AbstractContextManager from types import TracebackType from typing import Any, Self, TypeAlias from _typeshed import Self as MetaclassSelf # noqa: TID251 from django.test import LiveServerTestCase from typing_extensions import TypeVar _F = TypeVar("_F", bound=Callable[..., Any]) _WebDriver: TypeAlias = Any _Options: TypeAlias = Any class SeleniumTestCaseBase(type): browsers: Any selenium_hub: str | None = None external_host: str | None = None browser: Any headless: bool = False def __new__( cls: type[MetaclassSelf], name: str, bases: tuple[type, ...], attrs: dict[str, Any] ) -> MetaclassSelf: ... @classmethod def import_webdriver(cls, browser: Any) -> type[_WebDriver]: ... @classmethod def import_options(cls, browser: Any) -> type[_Options]: ... @classmethod def get_capability(cls, browser: Any) -> dict[str, Any]: ... def create_options(self) -> _Options: ... def create_webdriver(self) -> _WebDriver: ... class ChangeWindowSize: def __init__(self, width: int, height: int, selenium: Any) -> None: ... def __enter__(self) -> Self: ... def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None, ) -> None: ... class SeleniumTestCase(LiveServerTestCase, metaclass=SeleniumTestCaseBase): tags: set[str] implicit_wait: int external_host: str | None = None screenshots: bool = False selenium: Any def desktop_size(self) -> AbstractContextManager[None]: ... def small_screen_size(self) -> AbstractContextManager[None]: ... def mobile_size(self) -> AbstractContextManager[None]: ... def rtl(self) -> AbstractContextManager[None]: ... def dark(self) -> AbstractContextManager[None]: ... def set_emulated_media(self, *, media: str | None = None, features: list[dict[str, str]] | None = None) -> None: ... def high_contrast(self) -> AbstractContextManager[None]: ... def take_screenshot(self, name: str) -> None: ... def get_browser_logs(self, source: str | None = None, level: str = "ALL") -> list[dict[str, Any]]: ... def disable_implicit_wait(self) -> AbstractContextManager[None]: ... def screenshot_cases(method_names: str | Sequence[str]) -> Callable[[_F], _F]: ... typeddjango-django-stubs-fa03b48/django-stubs/test/signals.pyi000066400000000000000000000025431526064357400246130ustar00rootroot00000000000000from typing import Any from django.core.signals import setting_changed as setting_changed template_rendered: Any COMPLEX_OVERRIDE_SETTINGS: Any def clear_cache_handlers(*, setting: str, **kwargs: Any) -> None: ... def update_installed_apps(*, setting: str, **kwargs: Any) -> None: ... def update_connections_time_zone(*, setting: str, **kwargs: Any) -> None: ... def clear_routers_cache(*, setting: str, **kwargs: Any) -> None: ... def reset_template_engines(*, setting: str, **kwargs: Any) -> None: ... def storages_changed(*, setting: str, **kwargs: Any) -> None: ... def clear_serializers_cache(*, setting: str, **kwargs: Any) -> None: ... def language_changed(*, setting: str, **kwargs: Any) -> None: ... def localize_settings_changed(*, setting: str, **kwargs: Any) -> None: ... def complex_setting_changed(*, setting: str, enter: bool, **kwargs: Any) -> None: ... def root_urlconf_changed(*, setting: str, **kwargs: Any) -> None: ... def static_storage_changed(*, setting: str, **kwargs: Any) -> None: ... def static_finders_changed(*, setting: str, **kwargs: Any) -> None: ... def form_renderer_changed(*, setting: str, **kwargs: Any) -> None: ... def auth_password_validators_changed(*, setting: str, **kwargs: Any) -> None: ... def user_model_swapped(*, setting: str, **kwargs: Any) -> None: ... def update_logging_config(*, setting: str, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/test/testcases.pyi000066400000000000000000000245401526064357400251520ustar00rootroot00000000000000import threading import unittest from collections.abc import Callable, Iterable, Iterator, Mapping, Sequence from contextlib import AbstractContextManager from types import TracebackType from typing import Any, Literal, Self, overload from _typeshed import Unused from django.core.exceptions import ImproperlyConfigured from django.core.handlers.wsgi import WSGIHandler from django.core.servers.basehttp import ThreadedWSGIServer, WSGIRequestHandler from django.db import connections as connections from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.base import Model from django.db.models.query import QuerySet, RawQuerySet from django.forms import BaseForm, BaseFormSet from django.forms.fields import EmailField from django.http import HttpRequest from django.http.response import FileResponse, HttpResponseBase from django.template.base import Template from django.test.client import AsyncClient, Client from django.test.html import Element from django.test.utils import CaptureQueriesContext, ContextList from django.utils.functional import _StrOrPromise, classproperty from typing_extensions import override def to_list(value: Any) -> list[Any]: ... def assert_and_parse_html(self: Any, html: str, user_msg: str, msg: str) -> Element: ... class _AssertNumQueriesContext(CaptureQueriesContext): test_case: SimpleTestCase num: int def __init__(self, test_case: Any, num: Any, connection: BaseDatabaseWrapper) -> None: ... class _AssertTemplateUsedContext: test_case: SimpleTestCase template_name: str rendered_templates: list[Template] context: ContextList def __init__(self, test_case: Any, template_name: Any, msg_prefix: str = "", count: int | None = None) -> None: ... def on_template_render(self, sender: Any, signal: Any, template: Any, context: Any, **kwargs: Any) -> None: ... @property def rendered_template_names(self) -> list[str]: ... def test(self) -> None: ... def __enter__(self) -> Self: ... def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None, ) -> None: ... class _AssertTemplateNotUsedContext(_AssertTemplateUsedContext): ... class _DatabaseFailure: wrapped: Any message: str def __init__(self, wrapped: Any, message: str) -> None: ... def __call__(self, *args: Unused, **kwargs: Unused) -> None: ... class SimpleTestCase(unittest.TestCase): client_class: type[Client] client: Client async_client_class: type[AsyncClient] async_client: AsyncClient databases: set[str] | Literal["__all__"] @classmethod def ensure_connection_patch_method(cls) -> None: ... @override def __call__(self, result: unittest.TestResult | None = None) -> None: ... def settings(self, **kwargs: Any) -> Any: ... def modify_settings(self, **kwargs: Any) -> Any: ... def assertRedirects( self, response: HttpResponseBase, expected_url: str, status_code: int = 302, target_status_code: int = 200, msg_prefix: str = "", fetch_redirect_response: bool = True, ) -> None: ... def assertURLEqual( self, url1: _StrOrPromise, url2: _StrOrPromise, msg_prefix: str = "", ) -> None: ... def assertContains( self, response: HttpResponseBase, text: bytes | int | _StrOrPromise, count: int | None = None, status_code: int = 200, msg_prefix: str = "", html: bool = False, ) -> None: ... def assertNotContains( self, response: HttpResponseBase, text: bytes | int | _StrOrPromise, status_code: int = 200, msg_prefix: str = "", html: bool = False, ) -> None: ... def assertFormError( self, form: BaseForm, field: str | None, errors: list[str] | str, msg_prefix: str = "", ) -> None: ... def assertFormSetError( self, formset: BaseFormSet[Any], form_index: int | None, field: str | None, errors: list[str] | str, msg_prefix: str = "", ) -> None: ... # with self.assertTemplateUsed("template.html"): ... @overload def assertTemplateUsed( self, response: str, template_name: None = None, msg_prefix: str = "", count: int | None = None, ) -> _AssertTemplateUsedContext: ... # with self.assertTemplateUsed(template_name="template.html"): ... @overload def assertTemplateUsed( self, response: None = None, template_name: str | None = None, msg_prefix: str = "", count: int | None = None, ) -> _AssertTemplateUsedContext: ... # self.assertTemplateUsed(response, "template.html") @overload def assertTemplateUsed( self, response: HttpResponseBase, template_name: str | None = None, msg_prefix: str = "", count: int | None = None, ) -> None: ... # with self.assertTemplateNotUsed("template.html"): ... @overload def assertTemplateNotUsed( self, response: str, template_name: None = None, msg_prefix: str = "" ) -> _AssertTemplateNotUsedContext: ... # with self.assertTemplateNotUsed(template_name="template.html"): ... @overload def assertTemplateNotUsed( self, response: None = None, template_name: str | None = None, msg_prefix: str = "" ) -> _AssertTemplateNotUsedContext: ... # self.assertTemplateNotUsed(response, "template.html") @overload def assertTemplateNotUsed( self, response: HttpResponseBase, template_name: str | None = None, msg_prefix: str = "" ) -> None: ... def assertRaisesMessage( self, expected_exception: type[Exception], expected_message: str, *args: Any, **kwargs: Any ) -> Any: ... def assertWarnsMessage( self, expected_warning: type[Exception], expected_message: str, *args: Any, **kwargs: Any ) -> Any: ... def assertFieldOutput( self, fieldclass: type[EmailField], valid: dict[str, str], invalid: dict[str, list[str]], field_args: Iterable[Any] | None = None, field_kwargs: Mapping[str, Any] | None = None, empty_value: str = "", ) -> Any: ... def assertHTMLEqual(self, html1: str, html2: str, msg: str | None = None) -> None: ... def assertHTMLNotEqual(self, html1: str, html2: str, msg: str | None = None) -> None: ... def assertInHTML(self, needle: str, haystack: str, count: int | None = None, msg_prefix: str = "") -> None: ... def assertNotInHTML(self, needle: str, haystack: str, msg_prefix: str = "") -> None: ... def assertJSONEqual( self, raw: str | bytes | bytearray, expected_data: dict[str, Any] | list[Any] | str | int | float | bool | None, msg: str | None = None, ) -> None: ... def assertJSONNotEqual( self, raw: str | bytes | bytearray, expected_data: dict[str, Any] | list[Any] | str | int | float | bool | None, msg: str | None = None, ) -> None: ... def assertXMLEqual(self, xml1: str, xml2: str, msg: str | None = None) -> None: ... def assertXMLNotEqual(self, xml1: str, xml2: str, msg: str | None = None) -> None: ... class TransactionTestCase(SimpleTestCase): reset_sequences: bool available_apps: Any fixtures: Any serialized_rollback: bool def assertQuerySetEqual( self, qs: Iterator[Any] | list[Model] | QuerySet[Any] | RawQuerySet[Any], values: Iterable[Any], transform: Callable[[Model], Any] | type[str] | None = None, ordered: bool = True, msg: str | None = None, ) -> None: ... @overload def assertNumQueries(self, num: int, func: None = None, *, using: str = ...) -> _AssertNumQueriesContext: ... @overload def assertNumQueries( self, num: int, func: Callable[..., Any], *args: Any, using: str = ..., **kwargs: Any ) -> None: ... class TestCase(TransactionTestCase): @classmethod def setUpTestData(cls) -> None: ... @classmethod def captureOnCommitCallbacks( cls, *, using: str = "default", execute: bool = False ) -> AbstractContextManager[list[Callable[[], Any]]]: ... class CheckCondition: conditions: Sequence[tuple[Callable[..., Any], str]] def __init__(self, *conditions: tuple[Callable[..., Any], str]) -> None: ... def add_condition(self, condition: Callable[..., Any], reason: str) -> CheckCondition: ... def __get__(self, instance: None, cls: type[TransactionTestCase] | None = ...) -> bool: ... def connections_support_transactions(aliases: Iterable[str] | None = None) -> bool: ... def skipIfDBFeature(*features: Any) -> Callable[..., Any]: ... def skipUnlessDBFeature(*features: Any) -> Callable[..., Any]: ... def skipUnlessAnyDBFeature(*features: Any) -> Callable[..., Any]: ... class QuietWSGIRequestHandler(WSGIRequestHandler): ... class FSFilesHandler(WSGIHandler): application: Any base_url: Any def __init__(self, application: Any) -> None: ... def file_path(self, url: Any) -> str: ... def serve(self, request: HttpRequest) -> FileResponse: ... class _StaticFilesHandler(FSFilesHandler): def get_base_dir(self) -> str: ... def get_base_url(self) -> str: ... class _MediaFilesHandler(FSFilesHandler): def get_base_dir(self) -> str: ... def get_base_url(self) -> str: ... class LiveServerThread(threading.Thread): host: str port: int is_ready: threading.Event error: ImproperlyConfigured | None static_handler: type[WSGIHandler] connections_override: dict[str, BaseDatabaseWrapper] | None server_class: type[ThreadedWSGIServer] def __init__( self, host: str, static_handler: type[WSGIHandler], connections_override: dict[str, BaseDatabaseWrapper] | None = None, port: int = 0, ) -> None: ... httpd: ThreadedWSGIServer def terminate(self) -> None: ... class LiveServerTestCase(TransactionTestCase): host: str port: int server_thread_class: type[Any] server_thread: Any static_handler: Any @classproperty def live_server_url(cls: Any) -> str: ... @classproperty def allowed_host(cls: Any) -> str: ... class SerializeMixin: lockfile: Any @classmethod def setUpClass(cls) -> None: ... __all__ = ("SimpleTestCase", "TestCase", "TransactionTestCase", "skipIfDBFeature", "skipUnlessDBFeature") typeddjango-django-stubs-fa03b48/django-stubs/test/utils.pyi000066400000000000000000000163121526064357400243120ustar00rootroot00000000000000import decimal from collections.abc import Callable, Iterable, Iterator, Mapping from contextlib import AbstractContextManager from decimal import Decimal from io import StringIO from logging import Logger from types import TracebackType from typing import Any, Protocol, Self, SupportsIndex, TypeAlias, type_check_only from django.apps.registry import Apps from django.conf import LazySettings, Settings from django.core.checks.registry import CheckRegistry from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.lookups import Lookup, Transform from django.db.models.query_utils import RegisterLookupMixin from django.test.runner import DiscoverRunner from django.test.testcases import SimpleTestCase from typing_extensions import TypeVar, override _TestClass: TypeAlias = type[SimpleTestCase] _DecoratedTest: TypeAlias = Callable[..., Any] | _TestClass _DT = TypeVar("_DT", bound=_DecoratedTest) # Django's TestContextDecorator.__call__ only checks isinstance(decorated, type) # or callable(decorated) with no fixed signature — decorate_callable wraps using # *args, **kwargs since the decorated function/method can have varying signatures. # See: https://github.com/django/django/blob/main/django/test/utils.py _C = TypeVar("_C", bound=Callable[..., Any]) # Any callable TZ_SUPPORT: bool class Approximate: val: decimal.Decimal | float places: int def __init__(self, val: Decimal | float, places: int = ...) -> None: ... class ContextList(list[dict[str, Any]]): @override def __getitem__(self, key: str | SupportsIndex | slice) -> Any: ... def get(self, key: str, default: Any | None = ...) -> Any: ... @override def __contains__(self, key: object) -> bool: ... def keys(self) -> set[str]: ... class _TestState: ... def setup_test_environment(debug: bool | None = ...) -> None: ... def teardown_test_environment() -> None: ... def get_runner(settings: LazySettings, test_runner_class: str | None = ...) -> type[DiscoverRunner]: ... class TestContextDecorator: attr_name: str | None kwarg_name: str | None def __init__(self, attr_name: str | None = ..., kwarg_name: str | None = ...) -> None: ... def enable(self) -> Any: ... def disable(self) -> None: ... def __enter__(self) -> Apps | None: ... def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, exc_tb: TracebackType | None, ) -> None: ... def decorate_class(self, cls: _TestClass) -> _TestClass: ... def decorate_callable(self, func: _C) -> _C: ... def __call__(self, decorated: _DT) -> _DT: ... class override_settings(TestContextDecorator): enable_exception: Exception | None options: dict[str, Any] def __init__(self, **kwargs: Any) -> None: ... wrapped: Settings def save_options(self, test_func: _DecoratedTest) -> None: ... @override def decorate_class(self, cls: type) -> type: ... class modify_settings(override_settings): wrapped: Settings operations: list[tuple[str, dict[str, list[str] | str]]] def __init__(self, *args: Any, **kwargs: Any) -> None: ... @override def save_options(self, test_func: _DecoratedTest) -> None: ... options: dict[str, list[tuple[str, str] | str]] class override_system_checks(TestContextDecorator): registry: CheckRegistry new_checks: list[Callable[..., Any]] deployment_checks: list[Callable[..., Any]] | None def __init__( self, new_checks: list[Callable[..., Any]], deployment_checks: list[Callable[..., Any]] | None = ... ) -> None: ... old_checks: set[Callable[..., Any]] old_deployment_checks: set[Callable[..., Any]] # Private API removed, iterable-based class CaptureQueriesContext: connection: BaseDatabaseWrapper force_debug_cursor: bool initial_queries: int final_queries: int | None def __init__(self, connection: BaseDatabaseWrapper) -> None: ... def __iter__(self) -> Iterator[dict[str, str]]: ... def __getitem__(self, index: int) -> dict[str, str]: ... def __len__(self) -> int: ... @property def captured_queries(self) -> list[dict[str, str]]: ... def __enter__(self) -> Self: ... def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, exc_tb: TracebackType | None, ) -> None: ... class ignore_warnings(TestContextDecorator): ignore_kwargs: dict[str, Any] filter_func: Callable[..., Any] def __init__(self, **kwargs: Any) -> None: ... catch_warnings: AbstractContextManager[list[Any] | None] requires_tz_support: Any def isolate_lru_cache(lru_cache_object: Callable[..., Any]) -> AbstractContextManager[None]: ... class override_script_prefix(TestContextDecorator): prefix: str def __init__(self, prefix: str) -> None: ... old_prefix: str class LoggingCaptureMixin: logger: Logger old_stream: Any logger_output: Any def setUp(self) -> None: ... def tearDown(self) -> None: ... class isolate_apps(TestContextDecorator): installed_apps: tuple[str, ...] def __init__(self, *installed_apps: Any, **kwargs: Any) -> None: ... old_apps: Apps def extend_sys_path(*paths: str) -> AbstractContextManager[None]: ... def captured_output(stream_name: str) -> AbstractContextManager[StringIO]: ... def captured_stdin() -> AbstractContextManager[StringIO]: ... def captured_stdout() -> AbstractContextManager[StringIO]: ... def captured_stderr() -> AbstractContextManager[StringIO]: ... def freeze_time(t: float) -> AbstractContextManager[None]: ... def tag(*tags: str) -> Callable[[_C], _C]: ... _Signature: TypeAlias = str _TestDatabase: TypeAlias = tuple[str, list[str]] @type_check_only class TimeKeeperProtocol(Protocol): def timed(self, name: Any) -> AbstractContextManager[None]: ... def print_results(self) -> None: ... def dependency_ordered( test_databases: Iterable[tuple[_Signature, _TestDatabase]], dependencies: Mapping[str, list[str]] ) -> list[tuple[_Signature, _TestDatabase]]: ... def get_unique_databases_and_mirrors( aliases: set[str] | None = ..., ) -> tuple[dict[_Signature, _TestDatabase], dict[str, Any]]: ... def setup_databases( verbosity: int, interactive: bool, *, time_keeper: TimeKeeperProtocol | None = ..., keepdb: bool = ..., debug_sql: bool = ..., parallel: int = ..., aliases: Mapping[str, Any] | None = ..., serialized_aliases: Iterable[str] | None = ..., **kwargs: Any, ) -> list[tuple[BaseDatabaseWrapper, str, bool]]: ... def teardown_databases( old_config: Iterable[tuple[Any, str, bool]], verbosity: int, parallel: int = ..., keepdb: bool = ... ) -> None: ... def require_jinja2(test_func: _C) -> _C: ... def register_lookup( field: type[RegisterLookupMixin], *lookups: type[Lookup | Transform], lookup_name: str | None = ... ) -> AbstractContextManager[None]: ... def garbage_collect() -> None: ... __all__ = ( "Approximate", "CaptureQueriesContext", "ContextList", "garbage_collect", "get_runner", "ignore_warnings", "isolate_apps", "isolate_lru_cache", "modify_settings", "override_settings", "override_system_checks", "requires_tz_support", "setup_databases", "setup_test_environment", "tag", "teardown_test_environment", ) typeddjango-django-stubs-fa03b48/django-stubs/urls/000077500000000000000000000000001526064357400224325ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/urls/__init__.pyi000066400000000000000000000040521526064357400247150ustar00rootroot00000000000000from typing import TypeAlias # noinspection PyUnresolvedReferences from .base import clear_script_prefix as clear_script_prefix from .base import clear_url_caches as clear_url_caches from .base import get_script_prefix as get_script_prefix from .base import get_urlconf as get_urlconf from .base import is_valid_path as is_valid_path from .base import resolve as resolve from .base import reverse as reverse from .base import reverse_lazy as reverse_lazy from .base import set_script_prefix as set_script_prefix from .base import set_urlconf as set_urlconf from .base import translate_url as translate_url # noinspection PyUnresolvedReferences from .conf import include as include from .conf import path as path from .conf import re_path as re_path # noinspection PyUnresolvedReferences from .converters import register_converter as register_converter # noinspection PyUnresolvedReferences from .exceptions import NoReverseMatch as NoReverseMatch from .exceptions import Resolver404 as Resolver404 # noinspection PyUnresolvedReferences from .resolvers import LocalePrefixPattern as LocalePrefixPattern from .resolvers import ResolverMatch as ResolverMatch from .resolvers import URLPattern as URLPattern from .resolvers import URLResolver as URLResolver from .resolvers import get_ns_resolver as get_ns_resolver from .resolvers import get_resolver as get_resolver # noinspection PyUnresolvedReferences from .utils import get_callable as get_callable from .utils import get_mod_func as get_mod_func _AnyURL: TypeAlias = URLPattern | URLResolver # noqa: PYI047 __all__ = [ "LocalePrefixPattern", "NoReverseMatch", "Resolver404", "ResolverMatch", "URLPattern", "URLResolver", "clear_script_prefix", "clear_url_caches", "get_callable", "get_mod_func", "get_ns_resolver", "get_resolver", "get_script_prefix", "get_urlconf", "include", "is_valid_path", "path", "re_path", "register_converter", "resolve", "reverse", "reverse_lazy", "set_script_prefix", "set_urlconf", "translate_url", ] typeddjango-django-stubs-fa03b48/django-stubs/urls/base.pyi000066400000000000000000000034111526064357400240660ustar00rootroot00000000000000from collections.abc import Callable, Mapping, Sequence from typing import Any, Literal, TypeAlias from django.http.request import QueryDict from django.http.response import HttpResponseBase from django.urls.resolvers import ResolverMatch from django.utils.functional import _StrPromise # https://github.com/python/typeshed/blob/87f599dc8312ac67b941b5f2b47274534a1a2d3a/stdlib/urllib/parse.pyi#L136-L138 _QueryType: TypeAlias = ( Mapping[Any, Any] | Mapping[Any, Sequence[Any]] | Sequence[tuple[Any, Any]] | Sequence[tuple[Any, Sequence[Any]]] ) def resolve(path: str | _StrPromise, urlconf: str | None = None) -> ResolverMatch: ... # NOTE: make sure `reverse` and `reverse_lazy` objects are in sync: def reverse( viewname: Callable[..., HttpResponseBase] | str | None, urlconf: str | None = None, args: Sequence[Any] | None = None, kwargs: dict[str, Any] | None = None, current_app: str | None = None, *, query: QueryDict | _QueryType | None = None, fragment: str | None = None, ) -> str: ... def reverse_lazy( viewname: Callable[..., HttpResponseBase] | str | None, urlconf: str | None = None, args: Sequence[Any] | None = None, kwargs: dict[str, Any] | None = None, current_app: str | None = None, *, query: QueryDict | _QueryType | None = None, fragment: str | None = None, ) -> _StrPromise: ... def clear_url_caches() -> None: ... def set_script_prefix(prefix: str) -> None: ... def get_script_prefix() -> str: ... def clear_script_prefix() -> None: ... def set_urlconf(urlconf_name: str | None) -> None: ... def get_urlconf(default: str | None = None) -> str | None: ... def is_valid_path(path: str, urlconf: str | None = None) -> Literal[False] | ResolverMatch: ... def translate_url(url: str, lang_code: str) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/urls/conf.pyi000066400000000000000000000037341526064357400241110ustar00rootroot00000000000000from collections.abc import Callable, Coroutine, Sequence from types import ModuleType from typing import Any, TypeAlias, overload from django.urls import URLPattern, URLResolver, _AnyURL from django.utils.functional import _StrOrPromise from ..http.response import HttpResponseBase _URLConf: TypeAlias = str | ModuleType | Sequence[_AnyURL] _IncludedURLConf: TypeAlias = tuple[Sequence[URLResolver | URLPattern], str | None, str | None] def include(arg: _URLConf | tuple[_URLConf, str], namespace: str | None = None) -> _IncludedURLConf: ... # path() @overload def path( route: _StrOrPromise, view: Callable[..., HttpResponseBase], kwargs: dict[str, Any] | None = None, name: str | None = None, ) -> URLPattern: ... @overload def path( route: _StrOrPromise, view: Callable[..., Coroutine[Any, Any, HttpResponseBase]], kwargs: dict[str, Any] | None = None, name: str | None = None, ) -> URLPattern: ... @overload def path( route: _StrOrPromise, view: _IncludedURLConf, kwargs: dict[str, Any] | None = None, name: str | None = None ) -> URLResolver: ... @overload def path( route: _StrOrPromise, view: Sequence[URLResolver | str], kwargs: dict[str, Any] | None = None, name: str | None = None, ) -> URLResolver: ... # re_path() @overload def re_path( route: _StrOrPromise, view: Callable[..., HttpResponseBase], kwargs: dict[str, Any] | None = None, name: str | None = None, ) -> URLPattern: ... @overload def re_path( route: _StrOrPromise, view: Callable[..., Coroutine[Any, Any, HttpResponseBase]], kwargs: dict[str, Any] | None = None, name: str | None = None, ) -> URLPattern: ... @overload def re_path( route: _StrOrPromise, view: _IncludedURLConf, kwargs: dict[str, Any] | None = None, name: str | None = None ) -> URLResolver: ... @overload def re_path( route: _StrOrPromise, view: Sequence[URLResolver | str], kwargs: dict[str, Any] | None = None, name: str | None = None, ) -> URLResolver: ... typeddjango-django-stubs-fa03b48/django-stubs/urls/converters.pyi000066400000000000000000000017151526064357400253530ustar00rootroot00000000000000from typing import Any, Protocol, type_check_only from uuid import UUID @type_check_only class _Converter(Protocol): regex: str def __init__(self) -> None: ... def to_python(self, value: str) -> Any: ... def to_url(self, value: Any) -> str: ... class IntConverter: regex: str def to_python(self, value: str) -> int: ... def to_url(self, value: str | int) -> str: ... class StringConverter: regex: str def to_python(self, value: str) -> str: ... def to_url(self, value: str) -> str: ... class UUIDConverter: regex: str def to_python(self, value: str) -> UUID: ... def to_url(self, value: str | UUID) -> str: ... class SlugConverter(StringConverter): ... class PathConverter(StringConverter): ... DEFAULT_CONVERTERS: dict[str, _Converter] REGISTERED_CONVERTERS: dict[str, _Converter] def register_converter(converter: type[_Converter], type_name: str) -> None: ... def get_converters() -> dict[str, _Converter]: ... typeddjango-django-stubs-fa03b48/django-stubs/urls/exceptions.pyi000066400000000000000000000001461526064357400253370ustar00rootroot00000000000000from django.http import Http404 class Resolver404(Http404): ... class NoReverseMatch(Exception): ... typeddjango-django-stubs-fa03b48/django-stubs/urls/resolvers.pyi000066400000000000000000000115701526064357400252050ustar00rootroot00000000000000from collections.abc import Callable, Iterator, Sequence from re import Pattern from types import ModuleType from typing import Any, TypeAlias, overload from django.core.checks.messages import CheckMessage from django.http import HttpRequest, HttpResponse from django.urls import _AnyURL from django.utils.datastructures import MultiValueDict from django.utils.functional import cached_property class ResolverMatch: func: Callable[..., Any] args: tuple[Any, ...] kwargs: dict[str, Any] url_name: str | None app_names: list[str] app_name: str namespaces: list[str] namespace: str view_name: str route: str tried: Any | None _func_path: str def __init__( self, func: Callable[..., Any], args: tuple[Any, ...], kwargs: dict[str, Any], url_name: str | None = None, app_names: list[str | None] | None = None, namespaces: list[str | None] | None = None, route: str | None = None, tried: Any | None = None, captured_kwargs: dict[str, Any] | None = None, extra_kwargs: dict[str, Any] | None = None, ) -> None: ... def __getitem__(self, index: int) -> Any: ... # for tuple unpacking -- python/mypy#2220 def __iter__(self) -> Iterator[Any]: ... def get_resolver(urlconf: str | None = None) -> URLResolver: ... def get_ns_resolver(ns_pattern: str, resolver: URLResolver, converters: tuple[Any, ...]) -> URLResolver: ... _Pattern: TypeAlias = RegexPattern | RoutePattern | LocalePrefixPattern class LocaleRegexDescriptor: @overload def __get__(self, instance: None, cls: type[_Pattern] | None = None) -> LocaleRegexDescriptor: ... @overload def __get__(self, instance: _Pattern, cls: type[_Pattern] | None = None) -> Pattern[str]: ... class CheckURLMixin: def describe(self) -> str: ... class RegexPattern(CheckURLMixin): regex: LocaleRegexDescriptor name: str | None converters: dict[str, Any] def __init__(self, regex: str, name: str | None = None, is_endpoint: bool = False) -> None: ... def match(self, path: str) -> tuple[str, tuple[Any, ...], dict[str, str]] | None: ... def check(self) -> list[CheckMessage]: ... whitespace_set: frozenset[str] class LocaleRegexRouteDescriptor: def __get__(self, instance: RoutePattern | None, cls: type | None = None) -> Pattern[str]: ... class RoutePattern(CheckURLMixin): regex: LocaleRegexRouteDescriptor name: str | None converters: dict[str, Any] def __init__(self, route: str, name: str | None = None, is_endpoint: bool = False) -> None: ... def match(self, path: str) -> tuple[str, tuple[Any, ...], dict[str, int | str]] | None: ... def check(self) -> list[CheckMessage]: ... class LocalePrefixPattern: prefix_default_language: bool converters: dict[str, Any] def __init__(self, prefix_default_language: bool = True) -> None: ... @property def regex(self) -> Pattern[str]: ... @property def language_prefix(self) -> str: ... def match(self, path: str) -> tuple[str, tuple[Any, ...], dict[str, Any]] | None: ... def check(self) -> list[CheckMessage]: ... def describe(self) -> str: ... class URLPattern: pattern: _Pattern callback: Callable[..., Any] default_args: dict[str, Any] name: str | None def __init__( self, pattern: _Pattern, callback: Callable[..., Any], default_args: dict[str, Any] | None = None, name: str | None = None, ) -> None: ... def check(self) -> list[CheckMessage]: ... def resolve(self, path: str) -> ResolverMatch | None: ... @cached_property def lookup_str(self) -> str: ... class URLResolver: pattern: _Pattern urlconf_name: str | Sequence[_AnyURL] | ModuleType callback: None default_kwargs: dict[str, Any] namespace: str | None app_name: str | None _local: Any _reverse_dict: MultiValueDict[Any, Any] def __init__( self, pattern: _Pattern, urlconf_name: str | Sequence[_AnyURL] | ModuleType, default_kwargs: dict[str, Any] | None = None, app_name: str | None = None, namespace: str | None = None, ) -> None: ... @property def reverse_dict(self) -> MultiValueDict[Any, Any]: ... @property def namespace_dict(self) -> dict[str, tuple[str, URLResolver]]: ... @property def app_dict(self) -> dict[str, list[str]]: ... @cached_property def urlconf_module(self) -> ModuleType | Sequence[_AnyURL] | None: ... @cached_property def url_patterns(self) -> list[_AnyURL]: ... def check(self) -> list[CheckMessage]: ... def _populate(self) -> None: ... def _is_callback(self, name: str) -> bool: ... def resolve(self, path: str) -> ResolverMatch: ... def resolve_error_handler(self, view_type: int) -> Callable[[HttpRequest], HttpResponse]: ... def reverse(self, lookup_view: str, *args: Any, **kwargs: Any) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/urls/utils.pyi000066400000000000000000000003101526064357400243070ustar00rootroot00000000000000from collections.abc import Callable from typing import Any def get_callable(lookup_view: Callable[..., Any] | str) -> Callable[..., Any]: ... def get_mod_func(callback: str) -> tuple[str, str]: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/000077500000000000000000000000001526064357400226055ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/utils/__init__.pyi000066400000000000000000000000001526064357400250550ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/utils/_os.pyi000066400000000000000000000006251526064357400241130ustar00rootroot00000000000000from pathlib import Path from _typeshed import StrPath def makedirs(name: StrPath, mode: int = 0o777, exist_ok: bool = False, *, parent_mode: int | None = None) -> None: ... def safe_makedirs(name: StrPath, mode: int = 0o777, exist_ok: bool = False) -> None: ... def safe_join(base: StrPath, *paths: StrPath) -> str: ... def symlinks_supported() -> bool: ... def to_path(value: Path | str) -> Path: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/archive.pyi000066400000000000000000000030211526064357400247450ustar00rootroot00000000000000from collections.abc import Iterable, Sequence from types import TracebackType from typing import Any, Self from typing_extensions import override class ArchiveException(Exception): ... class UnrecognizedArchiveFormat(ArchiveException): ... def extract(path: str, to_path: str) -> None: ... class Archive: def __init__(self, file: str) -> None: ... def __enter__(self) -> Self: ... def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None, ) -> None: ... def extract(self, to_path: str) -> None: ... def list(self) -> None: ... def close(self) -> None: ... class BaseArchive: def split_leading_dir(self, path: str) -> Sequence[str]: ... def has_leading_dir(self, paths: Iterable[str]) -> bool: ... def target_filename(self, to_path: str, name: str) -> str: ... def extract(self, to_path: str) -> None: ... def list(self, *args: Any, **kwargs: Any) -> None: ... class TarArchive(BaseArchive): def __init__(self, file: str) -> None: ... @override def list(self, *args: Any, **kwargs: Any) -> None: ... def close(self) -> None: ... @override def extract(self, to_path: str) -> None: ... class ZipArchive(BaseArchive): def __init__(self, file: str) -> None: ... @override def list(self, *args: Any, **kwargs: Any) -> None: ... @override def extract(self, to_path: str) -> None: ... def close(self) -> None: ... extension_map: dict[str, type[BaseArchive]] typeddjango-django-stubs-fa03b48/django-stubs/utils/asyncio.pyi000066400000000000000000000004231526064357400247740ustar00rootroot00000000000000from collections.abc import Callable from typing import Any, overload from typing_extensions import TypeVar _C = TypeVar("_C", bound=Callable[..., Any]) @overload def async_unsafe(message: str) -> Callable[[_C], _C]: ... @overload def async_unsafe(message: _C) -> _C: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/autoreload.pyi000066400000000000000000000060031526064357400254660ustar00rootroot00000000000000import threading import types from collections import defaultdict from collections.abc import Callable, Iterable, Iterator from logging import Logger from pathlib import Path from typing import Any from _typeshed import StrPath from django.apps.registry import Apps from django.dispatch import Signal from django.utils.functional import cached_property from typing_extensions import ParamSpec, override _P = ParamSpec("_P") logger: Logger autoreload_started: Signal file_changed: Signal DJANGO_AUTORELOAD_ENV: str def is_django_module(module: types.ModuleType) -> bool: ... def is_django_path(path: StrPath) -> bool: ... def check_errors(fn: Callable[_P, Any]) -> Callable[_P, None]: ... def raise_last_exception() -> None: ... def ensure_echo_on() -> None: ... def iter_all_python_module_files() -> set[Path]: ... def iter_modules_and_files(modules: Iterable[types.ModuleType], extra_files: Iterable[StrPath]) -> frozenset[Path]: ... def common_roots(paths: Iterable[Path]) -> Iterable[Path]: ... def sys_path_directories() -> Iterator[Path]: ... def get_child_arguments() -> list[str]: ... def trigger_reload(filename: str) -> None: ... def restart_with_reloader() -> int: ... class BaseReloader: extra_files: set[Path] directory_globs: dict[Path, set[str]] def __init__(self) -> None: ... def watch_dir(self, path: StrPath, glob: str) -> None: ... def watched_files(self, include_globs: bool = True) -> Iterator[Path]: ... def wait_for_apps_ready(self, app_reg: Apps, django_main_thread: threading.Thread) -> bool: ... def run(self, django_main_thread: threading.Thread) -> None: ... def run_loop(self) -> None: ... def tick(self) -> Iterator[None]: ... @classmethod def check_availability(cls) -> bool | None: ... def notify_file_changed(self, path: StrPath) -> None: ... @property def should_stop(self) -> bool: ... def stop(self) -> None: ... class StatReloader(BaseReloader): SLEEP_TIME: int def snapshot_files(self) -> Iterator[tuple[Path, float]]: ... @classmethod @override def check_availability(cls) -> bool: ... class WatchmanUnavailable(RuntimeError): ... class WatchmanReloader(BaseReloader): roots: defaultdict[Any, set[Any]] processed_request: threading.Event client_timeout: int def __init__(self) -> None: ... @cached_property def client(self) -> Any: ... # Any: pywatchman.client (optional third-party) def watched_roots(self, watched_files: Iterable[Path]) -> frozenset[Path]: ... def update_watches(self) -> None: ... def request_processed(self, **kwargs: Any) -> None: ... @override def stop(self) -> None: ... def check_server_status(self, inner_ex: BaseException | None = None) -> bool: ... @classmethod @override def check_availability(cls) -> None: ... def get_reloader() -> BaseReloader: ... def start_django(reloader: BaseReloader, main_func: Callable[..., Any], *args: Any, **kwargs: Any) -> None: ... def run_with_reloader(main_func: Callable[..., Any], *args: Any, **kwargs: Any) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/cache.pyi000066400000000000000000000024641526064357400244010ustar00rootroot00000000000000from collections.abc import Iterable from typing import Any from django.core.cache.backends.base import BaseCache from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseBase def patch_cache_control(response: HttpResponseBase, **kwargs: Any) -> None: ... def get_max_age(response: HttpResponseBase) -> int | None: ... def set_response_etag(response: HttpResponseBase) -> HttpResponseBase: ... def get_conditional_response( request: HttpRequest, etag: str | None = None, last_modified: int | None = None, response: HttpResponse | None = None, ) -> HttpResponse | None: ... def patch_response_headers(response: HttpResponseBase, cache_timeout: int | None = None) -> None: ... def add_never_cache_headers(response: HttpResponseBase) -> None: ... def patch_vary_headers(response: HttpResponseBase, newheaders: Iterable[str]) -> None: ... def has_vary_header(response: HttpResponseBase, header_query: str) -> bool: ... def get_cache_key( request: HttpRequest, key_prefix: str | None = None, method: str = "GET", cache: BaseCache | None = None ) -> str | None: ... def learn_cache_key( request: HttpRequest, response: HttpResponseBase, cache_timeout: float | None = None, key_prefix: str | None = None, cache: BaseCache | None = None, ) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/choices.pyi000066400000000000000000000027551526064357400247560ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Iterator, Mapping from typing import Any, Protocol, TypeAlias, type_check_only from django.db.models import Choices from typing_extensions import TypeVar _Choice: TypeAlias = tuple[Any, Any] _ChoiceNamedGroup: TypeAlias = tuple[str, Iterable[_Choice]] _Choices: TypeAlias = Iterable[_Choice | _ChoiceNamedGroup] _ChoicesMapping: TypeAlias = Mapping[Any, Any] _ChoicesPrimitive: TypeAlias = _Choices | _ChoicesMapping | type[Choices] _ChoicesInput: TypeAlias = _ChoicesPrimitive | Callable[[], _ChoicesPrimitive] # noqa: PYI047 @type_check_only class _ChoicesCallable(Protocol): def __call__(self) -> _Choices: ... class BaseChoiceIterator: def __getitem__(self, index: int) -> _Choice | _ChoiceNamedGroup: ... def __iter__(self) -> Iterator[_Choice | _ChoiceNamedGroup]: ... class BlankChoiceIterator(BaseChoiceIterator): choices: _Choices blank_choice: _Choices def __init__(self, choices: _Choices, blank_choice: _Choices) -> None: ... class CallableChoiceIterator(BaseChoiceIterator): func: _ChoicesCallable def __init__(self, func: _ChoicesCallable) -> None: ... _V = TypeVar("_V") _L = TypeVar("_L") def flatten_choices(choices: Iterable[tuple[_V, _L | Iterable[tuple[_V, _L]]]]) -> Iterator[tuple[_V, _L]]: ... def normalize_choices(value: Any, *, depth: int = 0) -> Any: ... __all__ = [ "BaseChoiceIterator", "BlankChoiceIterator", "CallableChoiceIterator", "flatten_choices", "normalize_choices", ] typeddjango-django-stubs-fa03b48/django-stubs/utils/connection.pyi000066400000000000000000000027011526064357400254670ustar00rootroot00000000000000from collections.abc import Iterator, Sequence from typing import Any, Generic from django.db.models.query import _SupportsContains from django.utils.functional import cached_property from typing_extensions import TypeVar, override _T = TypeVar("_T") class ConnectionProxy(Generic[_T]): def __init__(self, connections: BaseConnectionHandler[_T], alias: str) -> None: ... def __getattr__(self, item: str) -> Any: ... @override def __setattr__(self, name: str, value: Any) -> None: ... @override def __delattr__(self, name: str) -> None: ... def __contains__(self, key: str) -> bool: ... @override def __eq__(self, other: object) -> bool: ... class ConnectionDoesNotExist(Exception): ... class BaseConnectionHandler(_SupportsContains[str], Generic[_T]): settings_name: str | None exception_class: type[Exception] thread_critical: bool @cached_property def settings(self) -> dict[str, Any]: ... def __init__(self, settings: Any | None = None) -> None: ... def configure_settings(self, settings: dict[str, Any] | None) -> dict[str, Any]: ... def create_connection(self, alias: str) -> _T: ... def __getitem__(self, alias: str) -> _T: ... def __setitem__(self, key: str, value: _T) -> None: ... def __delitem__(self, key: str) -> None: ... def __iter__(self) -> Iterator[str]: ... def all(self, initialized_only: bool = False) -> Sequence[_T]: ... def close_all(self) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/copy.pyi000066400000000000000000000005241526064357400243030ustar00rootroot00000000000000from typing import Any, Protocol, type_check_only from typing_extensions import TypeVar _RT_co = TypeVar("_RT_co", covariant=True) @type_check_only class _SupportsReplace(Protocol[_RT_co]): def __replace__(self, /, *_: Any, **changes: Any) -> _RT_co: ... def replace(obj: _SupportsReplace[_RT_co], /, **changes: Any) -> _RT_co: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/crypto.pyi000066400000000000000000000017461526064357400246600ustar00rootroot00000000000000from collections.abc import Callable from hmac import HMAC from typing import Any, overload from typing_extensions import deprecated RANDOM_STRING_CHARS: str class InvalidAlgorithm(ValueError): ... @overload @deprecated( "The default argument for algorithm in salted_hmac() will change from 'sha1' to 'sha256' in " "Django 7.0. Pass an explicit algorithm to silence this warning.", ) def salted_hmac( key_salt: bytes | str, value: bytes | str, secret: bytes | str | None = None, *, algorithm: None = None ) -> HMAC: ... @overload def salted_hmac( key_salt: bytes | str, value: bytes | str, secret: bytes | str | None = None, *, algorithm: str = ... ) -> HMAC: ... def get_random_string(length: int, allowed_chars: str = ...) -> str: ... def constant_time_compare(val1: bytes | str, val2: bytes | str) -> bool: ... def pbkdf2( password: bytes | str, salt: bytes | str, iterations: int, dklen: int = 0, digest: Callable[[], Any] | None = None, ) -> bytes: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/csp.pyi000066400000000000000000000021421526064357400241140ustar00rootroot00000000000000from collections.abc import Collection, Mapping from enum import StrEnum as _StrEnum from django.forms import Media from django.template import Context from django.utils.functional import SimpleLazyObject from django.utils.safestring import SafeString from typing_extensions import override CONTEXT_KEY: str class CSP(_StrEnum): HEADER_ENFORCE = "Content-Security-Policy" HEADER_REPORT_ONLY = "Content-Security-Policy-Report-Only" NONE = "'none'" REPORT_SAMPLE = "'report-sample'" SELF = "'self'" STRICT_DYNAMIC = "'strict-dynamic'" UNSAFE_EVAL = "'unsafe-eval'" UNSAFE_HASHES = "'unsafe-hashes'" UNSAFE_INLINE = "'unsafe-inline'" WASM_UNSAFE_EVAL = "'wasm-unsafe-eval'" NONCE = "" class LazyNonce(SimpleLazyObject[str]): def __init__(self) -> None: ... @override def __bool__(self) -> bool: ... def nonce_attr(context: Context, media: Media | None = None) -> SafeString: ... def generate_nonce() -> str: ... def build_policy( config: Mapping[str, Collection[str] | str], nonce: SimpleLazyObject[str] | str | None = None ) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/datastructures.pyi000066400000000000000000000144671526064357400264210ustar00rootroot00000000000000from collections.abc import Collection, Iterable, Iterator, Mapping, MutableMapping, MutableSet from typing import Any, Generic, NoReturn, Protocol, Self, TypeAlias, overload, type_check_only from _typeshed import Incomplete from typing_extensions import TypeVar, override _K = TypeVar("_K") _V = TypeVar("_V") _Z = TypeVar("_Z") _I = TypeVar("_I", covariant=True) # Unfortunately, there's often check `if isinstance(var, (list, tuple))` in django # codebase. So we need sometimes to declare exactly list or tuple. _ListOrTuple: TypeAlias = list[_K] | tuple[_K, ...] | tuple[()] # noqa: PYI047 @type_check_only class _PropertyDescriptor(Generic[_K, _V]): """ This helper property descriptor allows defining asynmetric getter/setters which mypy currently doesn't support with either: class HttpResponse: @property def content(...): ... @property.setter def content(...): ... or: class HttpResponse: def _get_content(...): ... def _set_content(...): ... content = property(_get_content, _set_content) """ def __get__(self, instance: Any, owner: Any | None) -> _V: ... def __set__(self, instance: Any, value: _K) -> None: ... @type_check_only class _IndexableCollection(Protocol[_I], Collection[_I]): # noqa: PYI046 @overload def __getitem__(self, index: int) -> _I: ... @overload def __getitem__(self, index: slice) -> Self: ... class OrderedSet(MutableSet[_K]): dict: dict[_K, None] def __init__(self, iterable: Iterable[_K] | None = None) -> None: ... @override def add(self, item: _K) -> None: ... @override def remove(self, item: _K) -> None: ... @override def discard(self, item: _K) -> None: ... @override def __iter__(self) -> Iterator[_K]: ... def __reversed__(self) -> Iterator[_K]: ... @override def __contains__(self, item: object) -> bool: ... def __bool__(self) -> bool: ... @override def __len__(self) -> int: ... class MultiValueDictKeyError(KeyError): ... class MultiValueDict(dict[_K, _V]): @overload def __init__(self, key_to_list_mapping: Mapping[_K, list[_V] | None]) -> None: ... @overload def __init__(self, key_to_list_mapping: Iterable[tuple[_K, list[_V]]] = ()) -> None: ... @override def __getitem__(self, key: _K) -> _V | list[object]: ... # type: ignore[override] @override def __setitem__(self, key: _K, value: _V) -> None: ... def __copy__(self) -> Self: ... def __deepcopy__(self, memo: MutableMapping[int, Incomplete]) -> Self: ... @overload @override def get(self, key: _K, default: None = None) -> _V | None: ... @overload def get(self, key: _K, default: _V) -> _V: ... @overload def get(self, key: _K, default: _Z) -> _V | _Z: ... def getlist(self, key: _K, default: _Z | None = None) -> list[_V] | _Z: ... def setlist(self, key: _K, list_: list[_V]) -> None: ... @overload @override def setdefault(self: MultiValueDict[_K, _V | None], key: _K, default: None = None) -> _V | None: ... @overload def setdefault(self, key: _K, default: _V) -> _V: ... def setlistdefault(self, key: _K, default_list: list[_V] | None = None) -> list[_V]: ... def appendlist(self, key: _K, value: _V) -> None: ... @override def items(self) -> Iterator[tuple[_K, _V | list[object]]]: ... # type: ignore[override] def lists(self) -> Iterable[tuple[_K, list[_V]]]: ... # Fake to make `values` work properly @override def values(self) -> Iterator[_V | list[object]]: ... # type: ignore[override] @override def copy(self) -> Self: ... def dict(self) -> dict[_K, _V | list[object]]: ... # These overrides are needed to convince mypy that this isn't an abstract class @override def __delitem__(self, item: _K, /) -> None: ... @override def __len__(self) -> int: ... @override def __iter__(self) -> Iterator[_K]: ... class ImmutableList(tuple[_V, ...]): warning: str def __new__(cls, *args: object, warning: str = "ImmutableList object is immutable.", **kwargs: object) -> Self: ... def complain(self, *args: object, **kwargs: object) -> NoReturn: ... def __delitem__(self, *args: object, **kwargs: object) -> NoReturn: ... def __delslice__(self, *args: object, **kwargs: object) -> NoReturn: ... def __iadd__(self, *args: object, **kwargs: object) -> NoReturn: ... # type: ignore[misc] def __imul__(self, *args: object, **kwargs: object) -> NoReturn: ... def __setitem__(self, *args: object, **kwargs: object) -> NoReturn: ... def __setslice__(self, *args: object, **kwargs: object) -> NoReturn: ... def append(self, *args: object, **kwargs: object) -> NoReturn: ... def extend(self, *args: object, **kwargs: object) -> NoReturn: ... def insert(self, *args: object, **kwargs: object) -> NoReturn: ... def pop(self, *args: object, **kwargs: object) -> NoReturn: ... def remove(self, *args: object, **kwargs: object) -> NoReturn: ... def sort(self, *args: object, **kwargs: object) -> NoReturn: ... def reverse(self, *args: object, **kwargs: object) -> NoReturn: ... @type_check_only class _ItemCallable(Protocol[_V]): """Don't mess with arguments when assigning in class body in stub""" def __call__(self, value: _V, /) -> _V: ... class DictWrapper(dict[str, _V]): func: _ItemCallable[_V] prefix: str @overload def __init__(self, data: Mapping[str, _V], func: _ItemCallable[_V], prefix: str) -> None: ... @overload def __init__(self, data: Iterable[tuple[str, _V]], func: _ItemCallable[_V], prefix: str) -> None: ... @override def __getitem__(self, key: str) -> _V: ... class CaseInsensitiveMapping(Mapping[str, _V]): _store: dict[str, tuple[str, _V]] def __init__(self, data: Mapping[str, _V] | Iterable[tuple[str, _V]]) -> None: ... @override def __getitem__(self, key: str) -> _V: ... @override def __len__(self) -> int: ... @override def __eq__(self, other: object) -> bool: ... @override def __iter__(self) -> Iterator[str]: ... def copy(self) -> Self: ... class DeferredSubDict(Generic[_K, _V]): parent_dict: dict[Any, dict[_K, _V]] deferred_key: Any def __init__(self, parent_dict: dict[Any, dict[_K, _V]], deferred_key: Any) -> None: ... def __getitem__(self, key: _K) -> _V: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/dateformat.pyi000066400000000000000000000036751526064357400254710ustar00rootroot00000000000000from datetime import date, tzinfo from datetime import datetime as builtin_datetime from datetime import time as builtin_time from re import Pattern from typing import Literal re_formatchars: Pattern[str] re_escaped: Pattern[str] class Formatter: def format(self, formatstr: str) -> str: ... class TimeFormat(Formatter): data: builtin_datetime | builtin_time timezone: tzinfo | None def __init__(self, obj: builtin_datetime | builtin_time) -> None: ... def a(self) -> str: ... def A(self) -> str: ... def e(self) -> str: ... def f(self) -> int | str: ... def g(self) -> int: ... def G(self) -> int: ... def h(self) -> str: ... def H(self) -> str: ... def i(self) -> str: ... def O(self) -> str: ... def P(self) -> str: ... def s(self) -> str: ... def T(self) -> str: ... def u(self) -> str: ... def Z(self) -> int | Literal[""]: ... class DateFormat(TimeFormat): data: builtin_datetime | date | builtin_time # type: ignore[assignment] timezone: tzinfo | None def __init__(self, obj: builtin_datetime | builtin_time | date) -> None: ... def b(self) -> str: ... def c(self) -> str: ... def d(self) -> str: ... def D(self) -> str: ... def E(self) -> str: ... def F(self) -> str: ... def I(self) -> str: ... def j(self) -> int: ... def l(self) -> str: ... def L(self) -> bool: ... def m(self) -> str: ... def M(self) -> str: ... def n(self) -> int: ... def N(self) -> str: ... def o(self) -> int: ... def r(self) -> str: ... def S(self) -> str: ... def t(self) -> str: ... def U(self) -> int: ... def w(self) -> int: ... def W(self) -> int: ... def y(self) -> str: ... def Y(self) -> int: ... def z(self) -> int: ... def format(value: builtin_datetime | date | builtin_time, format_string: str) -> str: ... def time_format(value: builtin_datetime | builtin_time, format_string: str) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/dateparse.pyi000066400000000000000000000007711526064357400253050ustar00rootroot00000000000000from datetime import date, time, timedelta from datetime import datetime as builtin_datetime from re import Pattern date_re: Pattern[str] time_re: Pattern[str] datetime_re: Pattern[str] standard_duration_re: Pattern[str] iso8601_duration_re: Pattern[str] postgres_interval_re: Pattern[str] def parse_date(value: str) -> date | None: ... def parse_time(value: str) -> time | None: ... def parse_datetime(value: str) -> builtin_datetime | None: ... def parse_duration(value: str) -> timedelta | None: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/dates.pyi000066400000000000000000000002341526064357400244270ustar00rootroot00000000000000WEEKDAYS: dict[int, str] WEEKDAYS_ABBR: dict[int, str] MONTHS: dict[int, str] MONTHS_3: dict[int, str] MONTHS_AP: dict[int, str] MONTHS_ALT: dict[int, str] typeddjango-django-stubs-fa03b48/django-stubs/utils/deconstruct.pyi000066400000000000000000000012011526064357400256570ustar00rootroot00000000000000from collections.abc import Callable, Sequence from typing import Any, Self, overload, type_check_only from typing_extensions import TypeVar # Contains additions from a class being decorated with '@deconstructible' @type_check_only class _Deconstructible: def __new__(cls, *args: Any, **kwargs: Any) -> Self: ... def deconstruct(obj) -> tuple[str, Sequence[Any], dict[str, Any]]: ... _T = TypeVar("_T") _TCallable = TypeVar("_TCallable", bound=Callable[..., Any]) @overload def deconstructible(_type: type[_T]) -> type[_T]: ... @overload def deconstructible(*, path: str | None = None) -> Callable[[_TCallable], _TCallable]: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/decorators.pyi000066400000000000000000000027111526064357400254760ustar00rootroot00000000000000from collections.abc import Callable, Iterable from typing import Any, Protocol, TypeAlias, type_check_only from django.http.response import HttpResponseBase from django.utils.deprecation import MiddlewareMixin from django.views.generic.base import View from typing_extensions import TypeVar @type_check_only class _MiddlewareClass(Protocol): def __call__(self, get_response: Callable[..., Any], *args: Any, **kwargs: Any) -> Any: ... _ViewType = TypeVar("_ViewType", bound=View | Callable[..., Any]) # Any callable _CallableType = TypeVar("_CallableType", bound=Callable[..., Any]) _ViewDecorator: TypeAlias = Callable[ [Callable[..., HttpResponseBase]], Callable[..., HttpResponseBase], ] _DecoratorFactory: TypeAlias = Callable[..., _ViewDecorator] classonlymethod = classmethod def method_decorator( decorator: _ViewDecorator | _DecoratorFactory | Iterable[_ViewDecorator | _DecoratorFactory], name: str = "", ) -> Callable[[_ViewType], _ViewType]: ... def decorator_from_middleware_with_args(middleware_class: _MiddlewareClass) -> _DecoratorFactory: ... def decorator_from_middleware(middleware_class: _MiddlewareClass) -> _ViewDecorator: ... def make_middleware_decorator(middleware_class: type[MiddlewareMixin]) -> _DecoratorFactory: ... def sync_and_async_middleware(func: _CallableType) -> _CallableType: ... def sync_only_middleware(func: _CallableType) -> _CallableType: ... def async_only_middleware(func: _CallableType) -> _CallableType: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/deprecation.pyi000066400000000000000000000045411526064357400256310ustar00rootroot00000000000000from collections.abc import Awaitable, Callable, Sequence from types import FunctionType, MethodType from typing import Any, ClassVar, Protocol, TypeAlias, type_check_only from _typeshed import Self as MetaclassSelf # noqa: TID251 from django.http.request import HttpRequest from django.http.response import HttpResponseBase from typing_extensions import TypeVar _C = TypeVar("_C", bound=Callable[..., Any]) def django_file_prefixes() -> tuple[str, ...]: ... class RemovedInNextVersionWarning(DeprecationWarning): ... class RemovedInDjango70Warning(PendingDeprecationWarning): ... RemovedAfterNextVersionWarning: TypeAlias = RemovedInDjango70Warning def warn_about_external_use( message: str, category: type[Warning] | None, *, skip_name_prefixes: str | tuple[str, ...] | None = None, skip_frames: int = 0, internal_modules: tuple[str, ...] | None = None, ) -> None: ... def warn_about_implementation( message: str, category: type[Warning] | None, target: FunctionType | MethodType | classmethod[Any, Any, Any] | property | staticmethod[Any, Any] | type, ) -> None: ... class warn_about_renamed_method: class_name: str old_method_name: str new_method_name: str deprecation_warning: type[DeprecationWarning] def __init__( self, class_name: str, old_method_name: str, new_method_name: str, deprecation_warning: type[DeprecationWarning] ) -> None: ... def __call__(self, f: _C) -> _C: ... class RenameMethodsBase(type): renamed_methods: tuple[tuple[str, str, type[DeprecationWarning]], ...] def __new__( cls: type[MetaclassSelf], name: str, bases: tuple[type, ...], attrs: dict[str, Any] ) -> MetaclassSelf: ... def deprecate_posargs(deprecation_warning: type[Warning], remappable_names: Sequence[str], /) -> Callable[[_C], _C]: ... @type_check_only class _AnyGetResponseCallable(Protocol): def __call__(self, request: HttpRequest, /) -> HttpResponseBase | Awaitable[HttpResponseBase]: ... class MiddlewareMixin: sync_capable: ClassVar[bool] async_capable: ClassVar[bool] get_response: _AnyGetResponseCallable async_mode: bool def __init__(self, get_response: _AnyGetResponseCallable) -> None: ... def __call__(self, request: HttpRequest) -> HttpResponseBase | Awaitable[HttpResponseBase]: ... async def __acall__(self, request: HttpRequest) -> HttpResponseBase: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/duration.pyi000066400000000000000000000003061526064357400251540ustar00rootroot00000000000000from datetime import timedelta def duration_string(duration: timedelta) -> str: ... def duration_iso_string(duration: timedelta) -> str: ... def duration_microseconds(delta: timedelta) -> int: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/encoding.pyi000066400000000000000000000062451526064357400251250ustar00rootroot00000000000000import datetime from decimal import Decimal from typing import Any, Literal, TypeGuard, overload from django.utils.functional import Promise from typing_extensions import TypeVar class DjangoUnicodeDecodeError(UnicodeDecodeError): ... _P = TypeVar("_P", bound=Promise) _S = TypeVar("_S", bound=str) _B = TypeVar("_B", bound=bytes) _PT = TypeVar("_PT", bound=int | float | Decimal | datetime.date | datetime.time | None) @overload def smart_str(s: object, encoding: str = "utf-8", *, errors: str = "strict") -> str: ... @overload def smart_str(s: _P, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _P: ... # type: ignore[overload-overlap] @overload def smart_str(s: _PT, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _PT: ... # type: ignore[overload-overlap] @overload def smart_str(s: _S, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _S: ... @overload def smart_str(s: object, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> str: ... def is_protected_type(obj: Any) -> TypeGuard[_PT]: ... @overload def force_str(s: object, encoding: str = "utf-8", *, errors: str = "strict") -> str: ... @overload def force_str(s: _PT, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _PT: ... # type: ignore[overload-overlap] @overload def force_str(s: _S, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _S: ... @overload def force_str(s: object, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> str: ... @overload def smart_bytes(s: object, encoding: str = "utf-8", *, errors: str = "strict") -> bytes: ... @overload def smart_bytes(s: _P, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _P: ... # type: ignore[overload-overlap] @overload def smart_bytes(s: _PT, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _PT: ... # type: ignore[overload-overlap] @overload def smart_bytes(s: _B, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _B: ... @overload def smart_bytes(s: object, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> bytes: ... @overload def force_bytes(s: object, encoding: str = "utf-8", *, errors: str = "strict") -> bytes: ... @overload def force_bytes(s: _PT, encoding: str = "utf-8", *, strings_only: Literal[True], errors: str = "strict") -> _PT: ... # type: ignore[overload-overlap] @overload def force_bytes(s: object, encoding: str = "utf-8", strings_only: bool = False, errors: str = "strict") -> bytes: ... @overload def iri_to_uri(iri: None) -> None: ... @overload def iri_to_uri(iri: str | Promise) -> str: ... @overload def uri_to_iri(uri: None) -> None: ... @overload def uri_to_iri(uri: str | bytes) -> str: ... def escape_uri_path(path: str) -> str: ... def punycode(domain: str) -> str: ... def repercent_broken_unicode(path: bytes) -> bytes: ... @overload def filepath_to_uri(path: None) -> None: ... @overload def filepath_to_uri(path: str) -> str: ... def get_system_encoding() -> str: ... DEFAULT_LOCALE_ENCODING: str typeddjango-django-stubs-fa03b48/django-stubs/utils/feedgenerator.pyi000066400000000000000000000062131526064357400261440ustar00rootroot00000000000000import datetime from collections.abc import Sequence from typing import Any, TypeAlias from django.utils.xmlutils import SimplerXMLGenerator def rfc2822_date(date: datetime.date) -> str: ... def rfc3339_date(date: datetime.date) -> str: ... def get_tag_uri(url: str, date: datetime.date | None) -> str: ... class Stylesheet: def __init__( self, url: str, mimetype: str = "", media: str = "screen", ) -> None: ... media: str @property def url(self) -> str: ... @property def mimetype(self) -> str: ... class SyndicationFeed: feed: dict[str, Any] items: list[dict[str, Any]] def __init__( self, title: str, link: str, description: str | None, language: str | None = None, author_email: str | None = None, author_name: str | None = None, author_link: str | None = None, subtitle: str | None = None, categories: tuple[str, str] | None = None, feed_url: str | None = None, feed_copyright: str | None = None, feed_guid: str | None = None, ttl: int | None = None, stylesheets: list[Stylesheet] | None = None, **kwargs: Any, ) -> None: ... def add_item( self, title: str, link: str, description: str, author_email: str | None = None, author_name: str | None = None, author_link: str | None = None, pubdate: datetime.datetime | None = None, comments: str | None = None, unique_id: str | None = None, unique_id_is_permalink: bool | None = None, categories: Sequence[str | None] = (), item_copyright: str | None = None, ttl: int | None = None, updateddate: datetime.datetime | None = None, enclosures: list[Enclosure] | None = None, **kwargs: Any, ) -> None: ... def num_items(self) -> int: ... def root_attributes(self) -> dict[str, str]: ... def add_root_elements(self, handler: SimplerXMLGenerator) -> None: ... def add_stylesheets(self, handler: SimplerXMLGenerator) -> None: ... def item_attributes(self, item: dict[str, Any]) -> dict[str, str]: ... def add_item_elements( self, handler: SimplerXMLGenerator, item: dict[str, Any], ) -> None: ... def write(self, outfile: Any, encoding: str) -> None: ... # Any: file-like object (IO[bytes]) def writeString(self, encoding: str) -> str: ... def latest_post_date(self) -> datetime.datetime: ... class Enclosure: length: int | str mime_type: str url: str def __init__(self, url: str, length: int | str, mime_type: str) -> None: ... class RssFeed(SyndicationFeed): content_type: str def rss_attributes(self) -> dict[str, str]: ... def write_items(self, handler: SimplerXMLGenerator) -> None: ... def endChannelElement(self, handler: SimplerXMLGenerator) -> None: ... class RssUserland091Feed(RssFeed): ... class Rss201rev2Feed(RssFeed): ... class Atom1Feed(SyndicationFeed): content_type: str ns: str def write_items(self, handler: SimplerXMLGenerator) -> None: ... DefaultFeed: TypeAlias = Rss201rev2Feed typeddjango-django-stubs-fa03b48/django-stubs/utils/formats.pyi000066400000000000000000000035251526064357400250100ustar00rootroot00000000000000import types from collections.abc import Iterator from datetime import date, time from datetime import datetime as builtin_datetime from decimal import Decimal from typing import Any, overload from typing_extensions import TypeVar ISO_INPUT_FORMATS: dict[str, list[str]] FORMAT_SETTINGS: frozenset[str] def reset_format_cache() -> None: ... def iter_format_modules(lang: str, format_module_path: list[str] | str | None = None) -> Iterator[types.ModuleType]: ... def get_format_modules(lang: str | None = None) -> list[types.ModuleType]: ... def get_format(format_type: str, lang: str | None = None, use_l10n: bool | None = None) -> Any: ... get_format_lazy: Any # Any: lazy wrapper around get_format def date_format( value: date | builtin_datetime | str, format: str | None = None, use_l10n: bool | None = None ) -> str: ... def time_format( value: time | builtin_datetime | str, format: str | None = None, use_l10n: bool | None = None ) -> str: ... def number_format( value: Decimal | float | str, decimal_pos: int | None = None, use_l10n: bool | None = None, force_grouping: bool = False, ) -> str: ... _T = TypeVar("_T") # Mypy considers this invalid (overlapping signatures), but thanks to implementation # details it works as expected (all values from the union are `localize`d to str, # while type of others is preserved) @overload def localize(value: builtin_datetime | date | time | Decimal | float | str, use_l10n: bool | None = None) -> str: ... @overload def localize(value: _T, use_l10n: bool | None = None) -> _T: ... @overload def localize_input( value: builtin_datetime | date | time | Decimal | float | str, default: str | None = None ) -> str: ... @overload def localize_input(value: _T, default: str | None = None) -> _T: ... def sanitize_strftime_format(fmt: str) -> str: ... def sanitize_separators(value: _T) -> _T: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/functional.pyi000066400000000000000000000113421526064357400254730ustar00rootroot00000000000000from collections.abc import Callable, Iterable, Iterator # Mypy has special handling for functools.cached_property, reuse typeshed's definition instead of defining our own from functools import cached_property as cached_property from typing import Any, Generic, Protocol, Self, SupportsIndex, TypeAlias, overload, type_check_only from django.db.models.base import Model from typing_extensions import TypeVar, override _T = TypeVar("_T") # Promise is only subclassed by a proxy class defined in the lazy function # so it makes sense for it to have all the methods available in that proxy class class Promise: def __init__(self, args: Any, kw: Any) -> None: ... @override def __reduce__(self) -> tuple[Any, tuple[Any]]: ... def __lt__(self, other: Any, /) -> bool: ... def __mod__(self, rhs: Any) -> Any: ... def __add__(self, other: Any) -> Any: ... def __radd__(self, other: Any) -> Any: ... def __deepcopy__(self, memo: Any) -> Self: ... @type_check_only class _StrPromise(Promise): def __add__(self, s: str, /) -> str: ... # type: ignore[explicit-override] def __radd__(self, other: str) -> str: ... # type: ignore[explicit-override] def __contains__(self, o: str, /) -> bool: ... def __ge__(self, x: str, /) -> bool: ... def __getitem__(self, i: SupportsIndex | slice, /) -> str: ... def __gt__(self, x: str, /) -> bool: ... def __le__(self, x: str, /) -> bool: ... # __len__ needed here because it defined abstract in Sequence[str] def __len__(self) -> int: ... def __lt__(self, x: str, /) -> bool: ... # type: ignore[explicit-override] def __mod__(self, x: Any, /) -> str: ... # type: ignore[explicit-override] def __mul__(self, n: SupportsIndex, /) -> str: ... def __rmul__(self, n: SupportsIndex, /) -> str: ... # Mypy requires this for the attribute hook to take effect def __getattribute__(self, name: str, /) -> Any: ... # type: ignore[explicit-override] _StrOrPromise: TypeAlias = str | _StrPromise # noqa: PYI047 _C = TypeVar("_C", bound=Callable[..., Any]) def lazy(func: _C, *resultclasses: Any) -> _C: ... def lazystr(text: Any) -> _StrPromise: ... def keep_lazy(*resultclasses: Any) -> Callable[[_C], _C]: ... def keep_lazy_text(func: _C) -> _C: ... empty: object def new_method_proxy(func: Callable[..., _T]) -> Callable[..., _T]: ... class LazyObject(Generic[_T]): def __init__(self) -> None: ... def __getattr__(self, name: str) -> Any: ... @override def __setattr__(self, name: str, value: Any) -> None: ... @override def __delattr__(self, name: str) -> None: ... @override def __reduce__(self) -> tuple[Callable[..., Any], tuple[Model]]: ... def __copy__(self) -> Self | _T: ... def __deepcopy__(self, memo: dict[int, Any]) -> Self | _T: ... def __bytes__(self) -> bytes: ... def __bool__(self) -> bool: ... @override def __dir__(self) -> list[str]: ... @override def __eq__(self, other: object) -> bool: ... def __lt__(self, other: Any) -> bool: ... def __gt__(self, other: Any) -> bool: ... @override def __hash__(self) -> int: ... def __getitem__(self, key: Any) -> Any: ... def __setitem__(self, key: Any, value: Any) -> None: ... def __delitem__(self, key: Any) -> None: ... def __iter__(self) -> Iterator[Any]: ... def __len__(self) -> int: ... def __contains__(self, item: Any) -> bool: ... def unpickle_lazyobject(wrapped: Model) -> Model: ... class SimpleLazyObject(LazyObject[_T]): def __init__(self, func: Callable[[], _T]) -> None: ... @override def __copy__(self) -> Self | _T: ... def __add__(self, other: Any) -> Any: ... def __radd__(self, other: Any) -> Any: ... _Get = TypeVar("_Get", covariant=True) class classproperty(Generic[_Get]): fget: Callable[[Any], _Get] | None def __init__(self, method: Callable[[Any], _Get] | None = None) -> None: ... def __get__(self, instance: Any | None, cls: type[Any] | None = None) -> _Get: ... def getter(self, method: Callable[[Any], _Get]) -> classproperty[_Get]: ... _PartitionMember = TypeVar("_PartitionMember") def partition( predicate: Callable[[_PartitionMember], int | bool], values: Iterable[_PartitionMember] ) -> tuple[list[_PartitionMember], list[_PartitionMember]]: ... @type_check_only class _Getter(Protocol[_Get]): # noqa: PYI046 """ Type fake to declare some read-only properties (until `property` builtin is generic). We can use something like `_Getter[str] | str` in base class to avoid errors when redefining attribute with property or property with attribute. """ @overload def __get__(self, instance: None, typeobj: type[Any] | None, /) -> Self: ... @overload def __get__(self, instance: Any, typeobj: type[Any] | None, /) -> _Get: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/hashable.pyi000066400000000000000000000001021526064357400250700ustar00rootroot00000000000000from typing import Any def make_hashable(value: Any) -> Any: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/html.pyi000066400000000000000000000063021526064357400242750ustar00rootroot00000000000000from collections.abc import Iterable from html.parser import HTMLParser from json import JSONEncoder from re import Pattern from typing import Any, overload from django.utils.functional import _StrOrPromise, cached_property from django.utils.safestring import SafeData, SafeString from typing_extensions import deprecated, override VOID_ELEMENTS: frozenset[str] MAX_URL_LENGTH: int MAX_STRIP_TAGS_DEPTH: int long_open_tag_without_closing_re: Pattern[str] def escape(text: Any) -> SafeString: ... def escapejs(value: Any) -> SafeString: ... def json_script(value: Any, element_id: str | None = None, encoder: type[JSONEncoder] | None = None) -> SafeString: ... # conditional_escape could use a protocol to be more precise, see https://github.com/typeddjango/django-stubs/issues/1474 def conditional_escape(text: _StrOrPromise | SafeData) -> SafeString: ... @overload @deprecated("Calling format_html() without passing args or kwargs is deprecated.") def format_html(format_string: str) -> SafeString: ... @overload def format_html(format_string: str, *args: Any, **kwargs: Any) -> SafeString: ... def format_html_join(sep: str, format_string: str, args_generator: Iterable[Iterable[Any]]) -> SafeString: ... def linebreaks(value: Any, autoescape: bool = False) -> str: ... class MLStripper(HTMLParser): fed: list[str] def __init__(self) -> None: ... @override def handle_data(self, d: str) -> None: ... @override def handle_entityref(self, name: str) -> None: ... @override def handle_charref(self, name: str) -> None: ... def get_data(self) -> str: ... def strip_tags(value: str) -> str: ... def strip_spaces_between_tags(value: str) -> str: ... def smart_urlquote(url: str) -> str: ... class CountsDict(dict[str, Any]): word: str def __init__(self, *args: Any, word: str, **kwargs: Any) -> None: ... def __missing__(self, key: str) -> Any: ... class Urlizer: trailing_punctuation_chars: str wrapping_punctuation: list[tuple[str, str]] word_split_re: Pattern[str] simple_url_re: Pattern[str] simple_url_2_re: Pattern[str] mailto_template: str url_template: str def __call__( self, text: _StrOrPromise | SafeData, trim_url_limit: int | None = None, nofollow: bool = False, autoescape: bool = False, ) -> str: ... def handle_word( self, word: str, *, safe_input: bool, trim_url_limit: int | None = None, nofollow: bool = False, autoescape: bool = False, ) -> str: ... def trim_url(self, x: str, *, limit: int | None) -> str: ... def trim_punctuation(self, word: str) -> tuple[str, str, str]: ... @staticmethod def is_email_simple(value: str) -> bool: ... @cached_property def wrapping_punctuation_openings(self) -> str: ... @cached_property def trailing_punctuation_chars_no_semicolon(self) -> str: ... @cached_property def trailing_punctuation_chars_has_semicolon(self) -> bool: ... urlizer: Urlizer def urlize( text: _StrOrPromise | SafeData, trim_url_limit: int | None = None, nofollow: bool = False, autoescape: bool = False ) -> str: ... def avoid_wrapping(value: str) -> str: ... def html_safe(klass: type) -> type: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/http.pyi000066400000000000000000000032501526064357400243070ustar00rootroot00000000000000from collections.abc import Iterable, Iterator, Mapping from re import Pattern from typing import Literal, overload ETAG_MATCH: Pattern[str] MONTHS: list[str] RFC1123_DATE: Pattern[str] RFC850_DATE: Pattern[str] ASCTIME_DATE: Pattern[str] RFC3986_GENDELIMS: str RFC3986_SUBDELIMS: str MAX_URL_LENGTH: int MAX_URL_REDIRECT_LENGTH: int MAX_HEADER_LENGTH: int def urlencode( query: ( Mapping[str, str | bytes | int | Iterable[str | bytes | int]] | Iterable[tuple[str, str | bytes | int | Iterable[str | bytes | int]]] | None ), doseq: bool = False, ) -> str: ... def http_date(epoch_seconds: float | None = None) -> str: ... def parse_http_date(date: str) -> int: ... def parse_http_date_safe(date: str) -> int | None: ... def base36_to_int(s: str) -> int: ... def int_to_base36(i: int) -> str: ... def urlsafe_base64_encode(s: bytes) -> str: ... def urlsafe_base64_decode(s: str) -> bytes: ... def split_header_value(value: str, sep: str = ",") -> Iterator[str]: ... def split_directive_names(value: str) -> Iterator[str]: ... def parse_etags(etag_str: str) -> list[str]: ... def quote_etag(etag_str: str) -> str: ... def is_same_domain(host: str, pattern: str) -> bool: ... def url_has_allowed_host_and_scheme( url: str | None, allowed_hosts: str | Iterable[str] | None, require_https: bool = False ) -> bool: ... def escape_leading_slashes(url: str) -> str: ... def parse_header_parameters(line: str, max_length: int | None = 10000) -> tuple[str, dict[str, str]]: ... @overload def content_disposition_header(as_attachment: Literal[True], filename: str) -> str: ... @overload def content_disposition_header(as_attachment: bool, filename: str) -> str | None: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/inspect.pyi000066400000000000000000000021471526064357400250010ustar00rootroot00000000000000import functools import sys import threading from collections.abc import Callable from contextlib import AbstractContextManager from inspect import FullArgSpec, Signature, _ParameterKind from types import FunctionType from typing import Any, TypeGuard ARG_KINDS: frozenset[_ParameterKind] if sys.version_info >= (3, 14): lock: threading.Lock safe_signature_from_callable: functools.partial[Signature] def get_func_args(func: Callable[..., Any]) -> list[str]: ... def get_func_full_args(func: Callable[..., Any]) -> list[tuple[str, str] | tuple[str]]: ... def func_accepts_kwargs(func: Callable[..., Any]) -> bool: ... def func_accepts_var_args(func: Callable[..., Any]) -> bool: ... def method_has_no_args(meth: Callable[..., Any]) -> bool: ... def func_supports_parameter(func: Callable[..., Any], name: str) -> bool: ... def is_module_level_function(func: Callable[..., Any]) -> TypeGuard[FunctionType]: ... def lazy_annotations() -> AbstractContextManager[None]: ... def getfullargspec(*args: Any, annotation_format: Any | None = None, **kwargs: Any) -> FullArgSpec: ... def signature(obj: Any) -> Signature: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/ipv6.pyi000066400000000000000000000004341526064357400242150ustar00rootroot00000000000000from ipaddress import IPv6Address from typing import Any MAX_IPV6_ADDRESS_LENGTH: int def clean_ipv6_address( ip_str: Any, unpack_ipv4: bool = False, error_message: str = ..., max_length: int = 39 ) -> str: ... def is_valid_ipv6_address(ip_addr: str | IPv6Address) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/json.pyi000066400000000000000000000003241526064357400243000ustar00rootroot00000000000000from typing import Any, TypeAlias _JsonPrimitive: TypeAlias = str | int | float | bool | None _JsonValue: TypeAlias = _JsonPrimitive | list[Any] | dict[str, Any] def normalize_json(obj: Any) -> _JsonValue: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/log.pyi000066400000000000000000000045211526064357400241130ustar00rootroot00000000000000import logging.config from collections.abc import Callable from logging import Logger, LogRecord from typing import Any, overload from django.core.management.color import Style from django.http import HttpRequest, HttpResponse from django.utils.functional import _StrOrPromise from typing_extensions import deprecated, override request_logger: Logger DEFAULT_LOGGING: Any def configure_logging(logging_config: str, logging_settings: dict[str, Any]) -> None: ... class AdminEmailHandler(logging.Handler): include_html: bool email_backend: str | None reporter_class: type[Any] @overload def __init__( self, include_html: bool = False, reporter_class: str | None = None, using: str | None = None, ) -> None: ... @overload @deprecated("The 'email_backend' argument is deprecated. Use 'using' instead.") def __init__( self, include_html: bool = False, email_backend: str | None = None, reporter_class: str | None = None, ) -> None: ... def send_mail(self, subject: _StrOrPromise, message: _StrOrPromise, *args: Any, **kwargs: Any) -> None: ... def format_subject(self, subject: str) -> str: ... class CallbackFilter(logging.Filter): callback: Callable[[str | LogRecord], bool] def __init__(self, callback: Callable[[str | LogRecord], bool]) -> None: ... @override def filter(self, record: str | LogRecord) -> bool: ... class RequireDebugFalse(logging.Filter): @override def filter(self, record: str | LogRecord) -> bool: ... class RequireDebugTrue(logging.Filter): @override def filter(self, record: str | LogRecord) -> bool: ... class ServerFormatter(logging.Formatter): default_time_format: str style: Style def __init__(self, *args: Any, **kwargs: Any) -> None: ... def uses_server_time(self) -> bool: ... def log_message( logger: Logger, message: str, *args: object, level: str | None = None, status_code: int | None = None, request: HttpRequest | None = None, exception: BaseException | None = None, **extra: object, ) -> None: ... def log_response( message: str, *args: object, response: HttpResponse | None = None, request: HttpRequest | None = None, logger: Logger = ..., level: str | None = None, exception: BaseException | None = None, ) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/lorem_ipsum.pyi000066400000000000000000000003641526064357400256660ustar00rootroot00000000000000from typing import Any COMMON_P: str WORDS: Any COMMON_WORDS: Any def sentence() -> str: ... def paragraph() -> str: ... def paragraphs(count: int, common: bool = True) -> list[str]: ... def words(count: int, common: bool = True) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/module_loading.pyi000066400000000000000000000004701526064357400263130ustar00rootroot00000000000000from typing import Any def cached_import(module_path: str, class_name: str) -> Any: ... def import_string(dotted_path: str) -> Any: ... def autodiscover_modules(*args: Any, **kwargs: Any) -> None: ... def module_has_submodule(package: Any, module_name: str) -> bool: ... def module_dir(module: Any) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/numberformat.pyi000066400000000000000000000005001526064357400260240ustar00rootroot00000000000000from collections.abc import Iterable from decimal import Decimal def format( number: Decimal | float | str, decimal_sep: str, decimal_pos: int | None = None, grouping: int | Iterable[int] = 0, thousand_sep: str = "", force_grouping: bool = False, use_l10n: bool | None = None, ) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/regex_helper.pyi000066400000000000000000000017051526064357400260040ustar00rootroot00000000000000from collections.abc import Iterator, Mapping from re import Pattern from typing import Any from typing_extensions import TypeVar ESCAPE_MAPPINGS: Mapping[str, str | None] class Choice(list[Any]): ... class Group(list[Any]): ... class NonCapture(list[Any]): ... def normalize(pattern: str) -> list[tuple[str, list[str]]]: ... def next_char(input_iter: Iterator[str]) -> Iterator[tuple[str, bool]]: ... def walk_to_end(ch: str, input_iter: Iterator[tuple[str, bool]]) -> None: ... def get_quantifier(ch: str, input_iter: Iterator[tuple[str, bool]]) -> tuple[int, str | None]: ... def contains(source: Group | NonCapture | str, inst: type[Group]) -> bool: ... def flatten_result( source: list[Choice | Group | str] | Group | NonCapture | None, ) -> tuple[list[str], list[list[str]]]: ... # Returns SimpleLazyObject, but we can safely ignore it _P = TypeVar("_P", str, bytes) def _lazy_re_compile(regex: _P | Pattern[_P], flags: int = 0) -> Pattern[_P]: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/safestring.pyi000066400000000000000000000012531526064357400254760ustar00rootroot00000000000000from collections.abc import Callable from typing import Any, Self, TypeAlias, overload from django.utils.functional import _StrOrPromise from typing_extensions import TypeVar, override _SD = TypeVar("_SD", bound=SafeData) class SafeData: def __html__(self) -> Self: ... class SafeString(str, SafeData): @overload @override def __add__(self, rhs: SafeString) -> SafeString: ... @overload def __add__(self, rhs: str) -> str: ... SafeText: TypeAlias = SafeString _C = TypeVar("_C", bound=Callable[..., Any]) @overload def mark_safe(s: _SD) -> _SD: ... @overload def mark_safe(s: _C) -> _C: ... @overload def mark_safe(s: _StrOrPromise) -> SafeString: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/termcolors.pyi000066400000000000000000000011601526064357400255170ustar00rootroot00000000000000from collections.abc import Callable, Sequence from typing import Any, Literal color_names: tuple[str, ...] foreground: dict[str, str] background: dict[str, str] RESET: Literal["0"] opt_dict: dict[str, str] def colorize(text: str | None = "", opts: Sequence[str] = (), *, fg: str = ..., bg: str = ...) -> str: ... def make_style(opts: Sequence[str] = (), *, fg: str = ..., bg: str = ...) -> Callable[[str | None], str]: ... NOCOLOR_PALETTE: str DARK_PALETTE: str LIGHT_PALETTE: str PALETTES: Any DEFAULT_PALETTE: str def parse_color_setting(config_string: str) -> dict[str, dict[str, tuple[str, ...] | str]] | None: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/text.pyi000066400000000000000000000057051526064357400243230ustar00rootroot00000000000000from collections import deque from collections.abc import AsyncIterable, AsyncIterator, Iterable, Iterator from html.parser import HTMLParser from io import BytesIO from re import Pattern from typing import Any, ClassVar, overload from django.db.models.base import Model from django.utils.functional import SimpleLazyObject, _StrOrPromise, _StrPromise, cached_property from typing_extensions import TypeVar, override _StrOrPromiseT = TypeVar("_StrOrPromiseT", bound=_StrOrPromise) _StrOrPromiseOrNoneT = TypeVar("_StrOrPromiseOrNoneT", bound=_StrOrPromise | None) def capfirst(x: _StrOrPromiseOrNoneT) -> _StrOrPromiseOrNoneT: ... re_newlines: Pattern[str] re_camel_case: Pattern[str] def wrap(text: _StrOrPromiseT, width: int) -> _StrOrPromiseT: ... def add_truncation_text(text: str, truncate: str | None = None) -> str: ... def calculate_truncate_chars_length(length: int, replacement: str | None) -> int: ... class TruncateHTMLParser(HTMLParser): TruncationCompleted: ClassVar[type[Exception]] tags: deque[str] output: str remaining: int replacement: str | None def __init__(self, *, length: int, replacement: str | None, convert_charrefs: bool = True) -> None: ... @cached_property def void_elements(self) -> frozenset[str]: ... class TruncateCharsHTMLParser(TruncateHTMLParser): length: int processed_chars: int def process(self, data: str) -> tuple[str, str]: ... class TruncateWordsHTMLParser(TruncateHTMLParser): def process(self, data: str) -> tuple[str, str]: ... class Truncator(SimpleLazyObject[str]): def __init__(self, text: Model | str) -> None: ... def chars(self, num: int, truncate: str | None = None, html: bool = False) -> str: ... def words(self, num: int, truncate: str | None = None, html: bool = False) -> str: ... def get_valid_filename(name: _StrOrPromiseT) -> _StrOrPromiseT: ... @overload def get_text_list(list_: list[str], last_word: str = ...) -> str: ... @overload def get_text_list(list_: list[_StrOrPromise], last_word: _StrOrPromise = ...) -> _StrOrPromise: ... def normalize_newlines(text: _StrOrPromiseT) -> _StrOrPromiseT: ... def phone2numeric(phone: _StrOrPromiseT) -> _StrOrPromiseT: ... def compress_string(s: bytes, *, max_random_bytes: int | None = None) -> bytes: ... class StreamingBuffer(BytesIO): @override def read(self) -> bytes: ... # type: ignore[override] def compress_sequence(sequence: Iterable[bytes], *, max_random_bytes: int | None = None) -> Iterator[bytes]: ... def acompress_sequence( sequence: AsyncIterable[bytes], *, max_random_bytes: int | None = None ) -> AsyncIterator[bytes]: ... smart_split_re: Pattern[str] def smart_split(text: str) -> Iterator[str]: ... def unescape_string_literal(s: _StrOrPromiseT) -> _StrOrPromiseT: ... def slugify(value: _StrOrPromiseT, allow_unicode: bool = False) -> _StrOrPromiseT: ... def camel_case_to_spaces(value: str) -> str: ... def format_lazy(format_string: _StrOrPromise, *args: Any, **kwargs: Any) -> _StrPromise: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/timesince.pyi000066400000000000000000000006511526064357400253120ustar00rootroot00000000000000from datetime import date TIME_STRINGS: dict[str, str] TIME_STRINGS_KEYS: list[str] TIME_CHUNKS: list[int] MONTHS_DAYS: tuple[int, ...] def timesince( d: date, now: date | None = None, reversed: bool = False, time_strings: dict[str, str] | None = None, depth: int = 2, ) -> str: ... def timeuntil(d: date, now: date | None = None, time_strings: dict[str, str] | None = None, depth: int = 2) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/timezone.pyi000066400000000000000000000034631526064357400251700ustar00rootroot00000000000000import zoneinfo from contextlib import ContextDecorator from datetime import date, datetime, time, timedelta, timezone, tzinfo from types import TracebackType from typing import Literal, overload def get_fixed_timezone(offset: timedelta | int) -> timezone: ... def get_default_timezone() -> zoneinfo.ZoneInfo: ... def get_default_timezone_name() -> str: ... def get_current_timezone() -> zoneinfo.ZoneInfo: ... def get_current_timezone_name() -> str: ... def activate(timezone: tzinfo | str) -> None: ... def deactivate() -> None: ... class override(ContextDecorator): timezone: str | tzinfo | None old_timezone: tzinfo | None def __init__(self, timezone: str | tzinfo | None) -> None: ... def __enter__(self) -> None: ... def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None, ) -> None: ... def localtime(value: datetime | None = None, timezone: tzinfo | None = None) -> datetime: ... def localdate(value: datetime | None = None, timezone: tzinfo | None = None) -> date: ... def now() -> datetime: ... @overload def is_aware(value: time) -> Literal[False]: ... @overload def is_aware(value: datetime) -> bool: ... @overload def is_naive(value: time) -> Literal[True]: ... @overload def is_naive(value: datetime) -> bool: ... def make_aware(value: datetime, timezone: tzinfo | None = None) -> datetime: ... def make_naive(value: datetime, timezone: tzinfo | None = None) -> datetime: ... __all__ = [ "activate", "deactivate", "get_current_timezone", "get_current_timezone_name", "get_default_timezone", "get_default_timezone_name", "get_fixed_timezone", "is_aware", "is_naive", "localdate", "localtime", "make_aware", "make_naive", "now", "override", ] typeddjango-django-stubs-fa03b48/django-stubs/utils/translation/000077500000000000000000000000001526064357400251435ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/utils/translation/__init__.pyi000066400000000000000000000046641526064357400274370ustar00rootroot00000000000000from contextlib import ContextDecorator from types import TracebackType from typing import Any from django.http.request import HttpRequest from django.utils.functional import _StrPromise class TranslatorCommentWarning(SyntaxWarning): ... def gettext_noop(message: str) -> str: ... def gettext(message: str) -> str: ... def ngettext(singular: str, plural: str, number: float) -> str: ... def pgettext(context: str, message: str) -> str: ... def npgettext(context: str, singular: str, plural: str, number: float) -> str: ... # lazy evaluated translation functions def gettext_lazy(message: str) -> _StrPromise: ... def pgettext_lazy(context: str, message: str) -> _StrPromise: ... def ngettext_lazy(singular: str, plural: str, number: int | str | None = None) -> _StrPromise: ... def npgettext_lazy(context: str, singular: str, plural: str, number: int | str | None = None) -> _StrPromise: ... def activate(language: str) -> None: ... def deactivate() -> None: ... class override(ContextDecorator): language: str | None deactivate: bool def __init__(self, language: str | None, deactivate: bool = False) -> None: ... old_language: str | None def __enter__(self) -> None: ... def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None, ) -> None: ... def get_language() -> str: ... def get_language_bidi() -> bool: ... def check_for_language(lang_code: str | None) -> bool: ... def to_language(locale: str) -> str: ... def to_locale(language: str) -> str: ... def get_language_from_request(request: HttpRequest, check_path: bool = False) -> str: ... def get_language_from_path(path: str) -> str | None: ... def get_supported_language_variant(lang_code: str, *, strict: bool = False) -> str: ... def templatize(src: str, **kwargs: Any) -> str: ... def deactivate_all() -> None: ... def get_language_info(lang_code: str) -> Any: ... def trim_whitespace(s: str) -> str: ... def round_away_from_one(value: int) -> int: ... __all__ = [ "activate", "check_for_language", "deactivate", "deactivate_all", "get_language", "get_language_bidi", "get_language_from_request", "get_language_info", "gettext", "gettext_lazy", "gettext_noop", "ngettext", "ngettext_lazy", "npgettext", "npgettext_lazy", "override", "pgettext", "pgettext_lazy", "templatize", "to_language", "to_locale", ] typeddjango-django-stubs-fa03b48/django-stubs/utils/translation/reloader.pyi000066400000000000000000000004361526064357400274660ustar00rootroot00000000000000from pathlib import Path from typing import Any from django.utils.autoreload import BaseReloader def watch_for_translation_changes(sender: BaseReloader, **kwargs: Any) -> None: ... def translation_file_changed(sender: BaseReloader | None, file_path: Path, **kwargs: Any) -> bool: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/translation/template.pyi000066400000000000000000000005201526064357400274760ustar00rootroot00000000000000from re import Pattern TRANSLATOR_COMMENT_MARK: str dot_re: Pattern[str] def blankout(src: str, char: str) -> str: ... context_re: Pattern[str] inline_re: Pattern[str] block_re: Pattern[str] endblock_re: Pattern[str] plural_re: Pattern[str] constant_re: Pattern[str] def templatize(src: str, origin: str | None = None) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/translation/trans_null.pyi000066400000000000000000000014451526064357400300530ustar00rootroot00000000000000from django.http.request import HttpRequest def gettext(message: str) -> str: ... gettext_noop = gettext gettext_lazy = gettext _ = gettext def ngettext(singular: str, plural: str, number: int) -> str: ... ngettext_lazy = ngettext def pgettext(context: str, message: str) -> str: ... def npgettext(context: str, singular: str, plural: str, number: int) -> str: ... def activate(x: str) -> None: ... def deactivate() -> None: ... deactivate_all = deactivate def get_language() -> str: ... def get_language_bidi() -> bool: ... def check_for_language(x: str) -> bool: ... def get_language_from_request(request: HttpRequest, check_path: bool = False) -> str: ... def get_language_from_path(request: str) -> None: ... def get_supported_language_variant(lang_code: str, strict: bool = False) -> str: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/translation/trans_real.pyi000066400000000000000000000060241526064357400300220ustar00rootroot00000000000000import gettext as gettext_module from collections.abc import Iterator from gettext import NullTranslations from re import Pattern # switch to tuple once https://github.com/python/mypy/issues/11098 is fixed from typing import Any, Literal, Protocol, TypeAlias, type_check_only from django.http.request import HttpRequest from typing_extensions import TypeVar, override CONTEXT_SEPARATOR: Literal["\x04"] LANGUAGE_CODE_MAX_LENGTH: int accept_language_re: Pattern[str] language_code_re: Pattern[str] language_code_prefix_re: Pattern[str] @type_check_only class _PluralCallable(Protocol): def __call__(self, n: int, /) -> int: ... def reset_cache(*, setting: str, **kwargs: Any) -> None: ... # switch to tuple once https://github.com/python/mypy/issues/11098 is fixed _KeyT: TypeAlias = str | tuple[str, int] _Z = TypeVar("_Z") class TranslationCatalog: _catalogs: list[dict[_KeyT, str]] def __init__(self, trans: gettext_module.NullTranslations | None = None) -> None: ... def __getitem__(self, key: _KeyT) -> str: ... def __setitem__(self, key: _KeyT, value: str) -> None: ... def __contains__(self, key: _KeyT) -> bool: ... def items(self) -> Iterator[tuple[_KeyT, str]]: ... def keys(self) -> Iterator[_KeyT]: ... def update(self, trans: gettext_module.NullTranslations) -> None: ... def get(self, key: _KeyT, default: _Z | None = None) -> str | _Z: ... def plural(self, msgid: str, num: int) -> str: ... class DjangoTranslation(gettext_module.GNUTranslations): domain: str plural: _PluralCallable def __init__(self, language: str, domain: str | None = None, localedirs: list[str] | None = None) -> None: ... def merge(self, other: NullTranslations) -> None: ... def language(self) -> str: ... def to_language(self) -> str: ... @override def ngettext(self, msgid1: str, msgid2: str, n: int) -> str: ... def translation(language: str) -> DjangoTranslation: ... def activate(language: str) -> None: ... def deactivate() -> None: ... def deactivate_all() -> None: ... def get_language() -> str: ... def get_language_bidi() -> bool: ... def catalog() -> DjangoTranslation: ... def gettext(message: str) -> str: ... def pgettext(context: str, message: str) -> str: ... def gettext_noop(message: str) -> str: ... def do_ntranslate(singular: str, plural: str, number: float, translation_function: str) -> str: ... def ngettext(singular: str, plural: str, number: float) -> str: ... def npgettext(context: str, singular: str, plural: str, number: int) -> str: ... def all_locale_paths() -> list[str]: ... def check_for_language(lang_code: str | None) -> bool: ... def translation_catalog_exists(lang_code: str) -> bool: ... def get_languages() -> dict[str, str]: ... def get_supported_language_variant(lang_code: str | None, strict: bool = False) -> str: ... def get_language_from_path(path: str, strict: bool = False) -> str | None: ... def get_language_from_request(request: HttpRequest, check_path: bool = False) -> str: ... def parse_accept_lang_header(lang_string: str) -> tuple[tuple[str, float], ...]: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/tree.pyi000066400000000000000000000020161526064357400242660ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any, Self, TypeAlias from django.db.models.sql.where import NothingNode from typing_extensions import override _NodeChildren: TypeAlias = list[Node | NothingNode | Sequence[Any]] class Node: children: _NodeChildren default: str connector: str negated: bool def __init__( self, children: _NodeChildren | None = None, connector: str | None = None, negated: bool = False ) -> None: ... @classmethod def create( cls, children: _NodeChildren | None = None, connector: str | None = None, negated: bool = False ) -> Self: ... def copy(self) -> Self: ... def __copy__(self) -> Self: ... def __deepcopy__(self, memodict: dict[Any, Any]) -> Self: ... def __len__(self) -> int: ... def __bool__(self) -> bool: ... def __contains__(self, other: tuple[str, int]) -> bool: ... @override def __hash__(self) -> int: ... def add(self, data: Any, conn_type: str) -> Any: ... def negate(self) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/version.pyi000066400000000000000000000010031526064357400250070ustar00rootroot00000000000000from typing import TypeAlias PYPY: bool PY310: bool PY311: bool PY312: bool PY313: bool PY314: bool PY315: bool _VT: TypeAlias = tuple[int, int, int, str, int] def get_version(version: _VT | None = None) -> str: ... def get_main_version(version: _VT | None = None) -> str: ... def get_complete_version(version: _VT | None = None) -> _VT: ... def get_docs_version(version: _VT | None = None) -> str: ... def get_git_changeset() -> str | None: ... def get_version_tuple(version: str) -> tuple[int, int, int]: ... typeddjango-django-stubs-fa03b48/django-stubs/utils/xmlutils.pyi000066400000000000000000000011041526064357400252050ustar00rootroot00000000000000from xml.sax.saxutils import XMLGenerator from xml.sax.xmlreader import AttributesImpl from typing_extensions import override class UnserializableContentError(ValueError): def __init__(self, msg: str = "Control characters are not supported in XML 1.0"): ... class SimplerXMLGenerator(XMLGenerator): def addQuickElement(self, name: str, contents: str | None = None, attrs: dict[str, str] | None = None) -> None: ... @override def characters(self, content: str) -> None: ... @override def startElement(self, name: str, attrs: AttributesImpl) -> None: ... typeddjango-django-stubs-fa03b48/django-stubs/views/000077500000000000000000000000001526064357400226025ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/views/__init__.pyi000066400000000000000000000000731526064357400250640ustar00rootroot00000000000000from .generic.base import View as View __all__ = ["View"] typeddjango-django-stubs-fa03b48/django-stubs/views/csrf.pyi000066400000000000000000000005031526064357400242600ustar00rootroot00000000000000from pathlib import Path from django.http.request import HttpRequest from django.http.response import HttpResponseForbidden CSRF_FAILURE_TEMPLATE_NAME: str def builtin_template_path(name: str) -> Path: ... def csrf_failure(request: HttpRequest, reason: str = ..., template_name: str = ...) -> HttpResponseForbidden: ... typeddjango-django-stubs-fa03b48/django-stubs/views/debug.pyi000066400000000000000000000060771526064357400244250ustar00rootroot00000000000000import re from collections.abc import Callable, ItemsView, Iterator from pathlib import Path from types import TracebackType from typing import Any from django.http.request import HttpRequest, QueryDict from django.http.response import Http404, HttpResponse from django.template import Engine from django.utils.safestring import SafeString DEBUG_ENGINE: Engine class CallableSettingWrapper: def __init__(self, callable_setting: Callable[..., Any] | type[Any]) -> None: ... class ExceptionCycleWarning(UserWarning): ... def technical_500_response( request: HttpRequest, exc_type: type[BaseException] | None, exc_value: BaseException | None, tb: TracebackType | None, status_code: int = ..., ) -> HttpResponse: ... def get_default_exception_reporter_filter() -> SafeExceptionReporterFilter: ... def get_exception_reporter_filter(request: HttpRequest | None) -> SafeExceptionReporterFilter: ... class SafeExceptionReporterFilter: cleansed_substitute: str hidden_settings: re.Pattern[str] def cleanse_setting(self, key: int | str, value: Any) -> Any: ... def get_safe_settings(self) -> dict[str, Any]: ... def get_safe_request_meta(self, request: HttpRequest) -> dict[str, Any]: ... def get_safe_cookies(self, request: HttpRequest) -> dict[str, Any]: ... def is_active(self, request: HttpRequest | None) -> bool: ... def get_cleansed_multivaluedict(self, request: HttpRequest, multivaluedict: QueryDict) -> QueryDict: ... def get_post_parameters(self, request: HttpRequest | None) -> dict[str, Any]: ... def cleanse_special_types(self, request: HttpRequest | None, value: Any) -> Any: ... def get_traceback_frame_variables(self, request: Any, tb_frame: Any) -> ItemsView[str, Any]: ... class ExceptionReporter: request: HttpRequest | None filter: SafeExceptionReporterFilter exc_type: type[BaseException] | None exc_value: BaseException | None tb: TracebackType | None is_email: bool template_info: Any | None template_does_not_exist: bool postmortem: Any | None @property def html_template_path(self) -> Path: ... @property def text_template_path(self) -> Path: ... def __init__( self, request: HttpRequest | None, exc_type: type[BaseException] | None, exc_value: BaseException | None, tb: TracebackType | None, is_email: bool = ..., ) -> None: ... def get_traceback_data(self) -> dict[str, Any]: ... def get_traceback_html(self) -> SafeString: ... def get_traceback_text(self) -> SafeString: ... def get_traceback_frames(self) -> list[Any]: ... def get_exception_traceback_frames( self, exc_value: BaseException | None, tb: TracebackType | None ) -> Iterator[dict[str, Any]]: ... def technical_404_response(request: HttpRequest, exception: Http404) -> HttpResponse: ... def default_urlconf(request: HttpResponse | None) -> HttpResponse: ... def builtin_template_path(name: str) -> Path: ... def get_caller(request: HttpRequest) -> str: ... def get_exception_reporter_class(request: HttpRequest) -> ExceptionReporter: ... typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/000077500000000000000000000000001526064357400247475ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/__init__.pyi000066400000000000000000000000001526064357400272170ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/cache.pyi000066400000000000000000000005711526064357400265400ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from typing_extensions import TypeVar _F = TypeVar("_F", bound=Callable[..., Any]) def cache_page( timeout: float | None, *, cache: Any | None = ..., key_prefix: Any | None = ... ) -> Callable[[_F], _F]: ... def cache_control(**kwargs: Any) -> Callable[[_F], _F]: ... def never_cache(view_func: _F) -> _F: ... typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/clickjacking.pyi000066400000000000000000000004601526064357400301060ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from typing_extensions import TypeVar _F = TypeVar("_F", bound=Callable[..., Any]) def xframe_options_deny(view_func: _F) -> _F: ... def xframe_options_sameorigin(view_func: _F) -> _F: ... def xframe_options_exempt(view_func: _F) -> _F: ... typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/common.pyi000066400000000000000000000003001526064357400267530ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from typing_extensions import TypeVar _C = TypeVar("_C", bound=Callable[..., Any]) def no_append_slash(view_func: _C) -> _C: ... typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/csp.pyi000066400000000000000000000005451526064357400262630ustar00rootroot00000000000000from collections.abc import Callable, Collection, Mapping from typing import Any from typing_extensions import TypeVar _F = TypeVar("_F", bound=Callable[..., Any]) def csp_override(config: Mapping[str, Collection[str] | str]) -> Callable[[_F], _F]: ... def csp_report_only_override(config: Mapping[str, Collection[str] | str]) -> Callable[[_F], _F]: ... typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/csrf.pyi000066400000000000000000000007101526064357400264250ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from django.middleware.csrf import CsrfViewMiddleware from typing_extensions import TypeVar csrf_protect: Callable[[_F], _F] class _EnsureCsrfToken(CsrfViewMiddleware): ... requires_csrf_token: Callable[[_F], _F] class _EnsureCsrfCookie(CsrfViewMiddleware): ... ensure_csrf_cookie: Callable[[_F], _F] _F = TypeVar("_F", bound=Callable[..., Any]) def csrf_exempt(view_func: _F) -> _F: ... typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/debug.pyi000066400000000000000000000006071526064357400265630ustar00rootroot00000000000000from collections.abc import Callable from typing import Any, Literal from typing_extensions import TypeVar _F = TypeVar("_F", bound=Callable[..., Any]) coroutine_functions_to_sensitive_variables: dict[int, Literal["__ALL__"] | tuple[str, ...]] def sensitive_variables(*variables: str) -> Callable[[_F], _F]: ... def sensitive_post_parameters(*parameters: str) -> Callable[[_F], _F]: ... typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/gzip.pyi000066400000000000000000000002601526064357400264410ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from typing_extensions import TypeVar _C = TypeVar("_C", bound=Callable[..., Any]) gzip_page: Callable[[_C], _C] typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/http.pyi000066400000000000000000000013541526064357400264540ustar00rootroot00000000000000from collections.abc import Callable, Container from datetime import datetime from typing import Any from typing_extensions import TypeVar _F = TypeVar("_F", bound=Callable[..., Any]) conditional_page: Callable[[_F], _F] def require_http_methods(request_method_list: Container[str]) -> Callable[[_F], _F]: ... require_GET: Callable[[_F], _F] require_POST: Callable[[_F], _F] require_safe: Callable[[_F], _F] def condition( etag_func: Callable[..., str | None] | None = ..., last_modified_func: Callable[..., datetime | None] | None = ... ) -> Callable[[_F], _F]: ... def etag(etag_func: Callable[..., str | None]) -> Callable[[_F], _F]: ... def last_modified(last_modified_func: Callable[..., datetime | None]) -> Callable[[_F], _F]: ... typeddjango-django-stubs-fa03b48/django-stubs/views/decorators/vary.pyi000066400000000000000000000003701526064357400264530ustar00rootroot00000000000000from collections.abc import Callable from typing import Any from typing_extensions import TypeVar _F = TypeVar("_F", bound=Callable[..., Any]) def vary_on_headers(*headers: str) -> Callable[[_F], _F]: ... def vary_on_cookie(func: _F) -> _F: ... typeddjango-django-stubs-fa03b48/django-stubs/views/defaults.pyi000066400000000000000000000014471526064357400251420ustar00rootroot00000000000000from django.http.request import HttpRequest from django.http.response import ( HttpResponseBadRequest, HttpResponseForbidden, HttpResponseNotFound, HttpResponseServerError, ) ERROR_404_TEMPLATE_NAME: str ERROR_403_TEMPLATE_NAME: str ERROR_400_TEMPLATE_NAME: str ERROR_500_TEMPLATE_NAME: str ERROR_PAGE_TEMPLATE: str def page_not_found( request: HttpRequest, exception: Exception | None, template_name: str = ... ) -> HttpResponseNotFound: ... def server_error(request: HttpRequest, template_name: str = ...) -> HttpResponseServerError: ... def bad_request(request: HttpRequest, exception: Exception, template_name: str = ...) -> HttpResponseBadRequest: ... def permission_denied( request: HttpRequest, exception: Exception, template_name: str = ... ) -> HttpResponseForbidden: ... typeddjango-django-stubs-fa03b48/django-stubs/views/generic/000077500000000000000000000000001526064357400242165ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/django-stubs/views/generic/__init__.pyi000066400000000000000000000022021526064357400264740ustar00rootroot00000000000000from .base import RedirectView as RedirectView from .base import TemplateView as TemplateView from .base import View as View from .dates import ArchiveIndexView as ArchiveIndexView from .dates import DateDetailView as DateDetailView from .dates import DayArchiveView as DayArchiveView from .dates import MonthArchiveView as MonthArchiveView from .dates import TodayArchiveView as TodayArchiveView from .dates import WeekArchiveView as WeekArchiveView from .dates import YearArchiveView as YearArchiveView from .detail import DetailView as DetailView from .edit import CreateView as CreateView from .edit import DeleteView as DeleteView from .edit import FormView as FormView from .edit import UpdateView as UpdateView from .list import ListView as ListView class GenericViewError(Exception): ... __all__ = [ "ArchiveIndexView", "CreateView", "DateDetailView", "DayArchiveView", "DeleteView", "DetailView", "FormView", "GenericViewError", "ListView", "MonthArchiveView", "RedirectView", "TemplateView", "TodayArchiveView", "UpdateView", "View", "WeekArchiveView", "YearArchiveView", ] typeddjango-django-stubs-fa03b48/django-stubs/views/generic/base.pyi000066400000000000000000000053741526064357400256640ustar00rootroot00000000000000import logging from collections.abc import Callable, Mapping, Sequence from typing import Any, Generic from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponseBase from django.utils.functional import _Getter from typing_extensions import TypeVar, override logger: logging.Logger class ContextMixin: extra_context: Mapping[str, Any] | None def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ... _ViewResponse = TypeVar("_ViewResponse", bound=HttpResponseBase, default=HttpResponseBase) class View(Generic[_ViewResponse]): http_method_names: Sequence[str] request: HttpRequest args: Any kwargs: Any def __init__(self, **kwargs: Any) -> None: ... view_is_async: _Getter[bool] | bool @classmethod def as_view(cls: Any, **initkwargs: Any) -> Callable[..., _ViewResponse]: ... def setup(self, request: HttpRequest, *args: Any, **kwargs: Any) -> None: ... def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ... def http_method_not_allowed(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def options(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ... _TemplateResponse = TypeVar("_TemplateResponse", bound=HttpResponse, default=HttpResponse) class TemplateResponseMixin(Generic[_TemplateResponse]): template_name: str | None template_engine: str | None response_class: type[_TemplateResponse] content_type: str | None request: HttpRequest def render_to_response(self, context: dict[str, Any], **response_kwargs: Any) -> _TemplateResponse: ... def get_template_names(self) -> list[str]: ... class TemplateView(TemplateResponseMixin[_TemplateResponse], ContextMixin, View[_TemplateResponse]): def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> _TemplateResponse: ... class RedirectView(View): permanent: bool url: str | None pattern_name: str | None query_string: bool preserve_request: bool def get_redirect_url(self, *args: Any, **kwargs: Any) -> str | None: ... def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ... def head(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ... def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ... @override def options(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ... def delete(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ... def put(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ... def patch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: ... typeddjango-django-stubs-fa03b48/django-stubs/views/generic/dates.pyi000066400000000000000000000112241526064357400260410ustar00rootroot00000000000000import datetime from collections.abc import Sequence from typing import Any, TypeAlias from django.db import models from django.db.models.query import QuerySet, _OrderByFieldName from django.http import HttpRequest, HttpResponse from django.utils.datastructures import _IndexableCollection from django.utils.functional import _Getter from django.views.generic.base import View from django.views.generic.detail import BaseDetailView, SingleObjectTemplateResponseMixin from django.views.generic.list import MultipleObjectMixin, MultipleObjectTemplateResponseMixin from typing_extensions import TypeVar, override _M = TypeVar("_M", bound=models.Model) _DatedItems: TypeAlias = tuple[_IndexableCollection[datetime.date] | None, _IndexableCollection[_M], dict[str, Any]] class YearMixin: year_format: str year: str | None def get_year_format(self) -> str: ... def get_year(self) -> str: ... def get_next_year(self, date: datetime.date) -> datetime.date | None: ... def get_previous_year(self, date: datetime.date) -> datetime.date | None: ... class MonthMixin: month_format: str month: str | None def get_month_format(self) -> str: ... def get_month(self) -> str: ... def get_next_month(self, date: datetime.date) -> datetime.date | None: ... def get_previous_month(self, date: datetime.date) -> datetime.date | None: ... class DayMixin: day_format: str day: str | None def get_day_format(self) -> str: ... def get_day(self) -> str: ... def get_next_day(self, date: datetime.date) -> datetime.date | None: ... def get_previous_day(self, date: datetime.date) -> datetime.date | None: ... class WeekMixin: week_format: str week: str | None def get_week_format(self) -> str: ... def get_week(self) -> str: ... def get_next_week(self, date: datetime.date) -> datetime.date | None: ... def get_previous_week(self, date: datetime.date) -> datetime.date | None: ... class DateMixin: date_field: str | None allow_future: bool def get_date_field(self) -> str: ... def get_allow_future(self) -> bool: ... uses_datetime_field: _Getter[bool] | bool class BaseDateListView(MultipleObjectMixin[_M], DateMixin, View): date_list_period: str def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def get_dated_items(self) -> _DatedItems[_M]: ... @override def get_ordering(self) -> str | Sequence[_OrderByFieldName]: ... def get_dated_queryset(self, **lookup: Any) -> models.query.QuerySet[_M]: ... def get_date_list_period(self) -> str: ... def get_date_list( self, queryset: models.query.QuerySet[_M], date_type: str | None = ..., ordering: str = ... ) -> models.query.QuerySet[_M]: ... class BaseArchiveIndexView(BaseDateListView[_M]): context_object_name: str @override def get_dated_items(self) -> _DatedItems[_M]: ... class ArchiveIndexView(MultipleObjectTemplateResponseMixin, BaseArchiveIndexView[_M]): template_name_suffix: str class BaseYearArchiveView(YearMixin, BaseDateListView[_M]): date_list_period: str make_object_list: bool @override def get_dated_items(self) -> _DatedItems[_M]: ... def get_make_object_list(self) -> bool: ... class YearArchiveView(MultipleObjectTemplateResponseMixin, BaseYearArchiveView[_M]): template_name_suffix: str class BaseMonthArchiveView(YearMixin, MonthMixin, BaseDateListView[_M]): date_list_period: str @override def get_dated_items(self) -> _DatedItems[_M]: ... class MonthArchiveView(MultipleObjectTemplateResponseMixin, BaseMonthArchiveView[_M]): template_name_suffix: str class BaseWeekArchiveView(YearMixin, WeekMixin, BaseDateListView[_M]): @override def get_dated_items(self) -> _DatedItems[_M]: ... class WeekArchiveView(MultipleObjectTemplateResponseMixin, BaseWeekArchiveView[_M]): template_name_suffix: str class BaseDayArchiveView(YearMixin, MonthMixin, DayMixin, BaseDateListView[_M]): @override def get_dated_items(self) -> _DatedItems[_M]: ... class DayArchiveView(MultipleObjectTemplateResponseMixin, BaseDayArchiveView[_M]): template_name_suffix: str class BaseTodayArchiveView(BaseDayArchiveView[_M]): @override def get_dated_items(self) -> _DatedItems[_M]: ... class TodayArchiveView(MultipleObjectTemplateResponseMixin, BaseTodayArchiveView[_M]): template_name_suffix: str class BaseDateDetailView(YearMixin, MonthMixin, DayMixin, DateMixin, BaseDetailView[_M]): @override def get_object(self, queryset: QuerySet[_M] | None = ...) -> _M: ... class DateDetailView(SingleObjectTemplateResponseMixin, BaseDateDetailView[_M]): template_name_suffix: str def timezone_today() -> datetime.date: ... typeddjango-django-stubs-fa03b48/django-stubs/views/generic/detail.pyi000066400000000000000000000023241526064357400262040ustar00rootroot00000000000000from typing import Any, Generic, overload from django.db import models from django.http import HttpRequest, HttpResponse from django.views.generic.base import ContextMixin, TemplateResponseMixin, View from typing_extensions import TypeVar _M = TypeVar("_M", bound=models.Model) class SingleObjectMixin(ContextMixin, Generic[_M]): model: type[_M] queryset: models.query.QuerySet[_M] | None slug_field: str context_object_name: str | None slug_url_kwarg: str pk_url_kwarg: str query_pk_and_slug: bool def get_object(self, queryset: models.query.QuerySet[_M] | None = ...) -> _M: ... def get_queryset(self) -> models.query.QuerySet[_M]: ... def get_slug_field(self) -> str: ... @overload def get_context_object_name(self, obj: _M) -> str: ... @overload def get_context_object_name(self, obj: Any) -> str | None: ... class BaseDetailView(SingleObjectMixin[_M], View): object: _M def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... class SingleObjectTemplateResponseMixin(TemplateResponseMixin): template_name_field: str | None template_name_suffix: str class DetailView(SingleObjectTemplateResponseMixin, BaseDetailView[_M]): ... typeddjango-django-stubs-fa03b48/django-stubs/views/generic/edit.pyi000066400000000000000000000072601526064357400256730ustar00rootroot00000000000000from typing import Any, Generic, Literal from django.db import models from django.forms.forms import BaseForm, Form from django.forms.models import BaseModelForm, ModelForm from django.http import HttpRequest, HttpResponse from django.utils.datastructures import _ListOrTuple from django.utils.functional import _StrOrPromise from django.views.generic.base import ContextMixin, TemplateResponseMixin, View from django.views.generic.detail import BaseDetailView, SingleObjectMixin, SingleObjectTemplateResponseMixin from typing_extensions import TypeVar, override _M = TypeVar("_M", bound=models.Model) _FormT = TypeVar("_FormT", bound=BaseForm) _DeleteFormT = TypeVar("_DeleteFormT", bound=BaseForm, default=Form) _ModelFormT = TypeVar("_ModelFormT", bound=BaseModelForm[Any], default=ModelForm[_M]) class FormMixin(ContextMixin, Generic[_FormT]): initial: dict[str, Any] form_class: type[_FormT] | None success_url: _StrOrPromise | None = None prefix: str | None def get_initial(self) -> dict[str, Any]: ... def get_prefix(self) -> str | None: ... def get_form_class(self) -> type[_FormT]: ... def get_form(self, form_class: type[_FormT] | None = ...) -> _FormT: ... def get_form_kwargs(self) -> dict[str, Any]: ... def get_success_url(self) -> str: ... def form_valid(self, form: _FormT) -> HttpResponse: ... def form_invalid(self, form: _FormT) -> HttpResponse: ... @override def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ... class ModelFormMixin(FormMixin[_ModelFormT], SingleObjectMixin[_M], Generic[_M, _ModelFormT]): fields: _ListOrTuple[str] | Literal["__all__"] | None @override def get_form_class(self) -> type[_ModelFormT]: ... @override def get_form_kwargs(self) -> dict[str, Any]: ... @override def get_success_url(self) -> str: ... @override def form_valid(self, form: _ModelFormT) -> HttpResponse: ... class ProcessFormView(View): def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def put(self, *args: Any, **kwargs: Any) -> HttpResponse: ... class BaseFormView(FormMixin[_FormT], ProcessFormView): ... class FormView(TemplateResponseMixin, BaseFormView[_FormT]): ... class BaseCreateView(ModelFormMixin[_M, _ModelFormT], ProcessFormView): object: _M | None @override def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... @override def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... class CreateView(SingleObjectTemplateResponseMixin, BaseCreateView[_M, _ModelFormT]): template_name_suffix: str class BaseUpdateView(ModelFormMixin[_M, _ModelFormT], ProcessFormView): object: _M @override def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... @override def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... class UpdateView(SingleObjectTemplateResponseMixin, BaseUpdateView[_M, _ModelFormT]): template_name_suffix: str class DeletionMixin(Generic[_M]): success_url: _StrOrPromise | None = None object: _M def post(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def delete(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def get_success_url(self) -> str: ... class BaseDeleteView(DeletionMixin[_M], FormMixin[_DeleteFormT], BaseDetailView[_M], Generic[_M, _DeleteFormT]): object: _M class DeleteView(SingleObjectTemplateResponseMixin, BaseDeleteView[_M, _DeleteFormT], Generic[_M, _DeleteFormT]): object: _M template_name_suffix: str typeddjango-django-stubs-fa03b48/django-stubs/views/generic/list.pyi000066400000000000000000000043701526064357400257200ustar00rootroot00000000000000from collections.abc import Sequence from typing import Any, Generic, Protocol, overload, type_check_only from django.core.paginator import Page, Paginator, _SupportsPagination from django.db.models import Model, QuerySet from django.db.models.query import _OrderByFieldName from django.http import HttpRequest, HttpResponse from django.views.generic.base import ContextMixin, TemplateResponseMixin, View from typing_extensions import TypeVar, override _M = TypeVar("_M", bound=Model) @type_check_only class _HasModel(Protocol): @property def model(self) -> type[Model]: ... class MultipleObjectMixin(ContextMixin, Generic[_M]): allow_empty: bool queryset: QuerySet[_M] | None model: type[_M] | None paginate_by: int | None paginate_orphans: int context_object_name: str | None paginator_class: type[Paginator[Any]] page_kwarg: str ordering: str | Sequence[_OrderByFieldName] | None def get_queryset(self) -> QuerySet[_M]: ... def get_ordering(self) -> str | Sequence[_OrderByFieldName] | None: ... def paginate_queryset( self, queryset: _SupportsPagination[_M], page_size: int ) -> tuple[Paginator[Any], Page[Any], _SupportsPagination[_M], bool]: ... def get_paginate_by(self, queryset: QuerySet[_M]) -> int | None: ... def get_paginator( self, queryset: _SupportsPagination[_M], per_page: int, orphans: int = ..., allow_empty_first_page: bool = ..., **kwargs: Any, ) -> Paginator[Any]: ... def get_paginate_orphans(self) -> int: ... def get_allow_empty(self) -> bool: ... @overload def get_context_object_name(self, object_list: _HasModel) -> str: ... @overload def get_context_object_name(self, object_list: Any) -> str | None: ... @override def get_context_data( self, *, object_list: _SupportsPagination[_M] | None = ..., **kwargs: Any ) -> dict[str, Any]: ... class BaseListView(MultipleObjectMixin[_M], View): object_list: _SupportsPagination[_M] def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... class MultipleObjectTemplateResponseMixin(TemplateResponseMixin): template_name_suffix: str class ListView(MultipleObjectTemplateResponseMixin, BaseListView[_M]): ... typeddjango-django-stubs-fa03b48/django-stubs/views/i18n.pyi000066400000000000000000000021151526064357400241030ustar00rootroot00000000000000from collections.abc import Callable from pathlib import Path from typing import Any from django.http.request import HttpRequest from django.http.response import HttpResponse from django.utils.translation.trans_real import DjangoTranslation from django.views.generic import View LANGUAGE_QUERY_PARAMETER: str def builtin_template_path(name: str) -> Path: ... def set_language(request: HttpRequest) -> HttpResponse: ... def get_formats() -> dict[str, list[str] | int | str]: ... class JavaScriptCatalog(View): head: Callable[..., Any] domain: str packages: list[str] | None translation: DjangoTranslation def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def get_paths(self, packages: list[str]) -> list[str]: ... def get_plural(self) -> list[str] | None: ... def get_catalog(self) -> dict[str, list[str] | str]: ... def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ... def render_to_response(self, context: dict[str, Any], **response_kwargs: Any) -> HttpResponse: ... class JSONCatalog(JavaScriptCatalog): ... typeddjango-django-stubs-fa03b48/django-stubs/views/static.pyi000066400000000000000000000010071526064357400246120ustar00rootroot00000000000000from pathlib import Path from typing import Any from django.http import FileResponse, HttpResponse from django.http.request import HttpRequest def builtin_template_path(name: str) -> Path: ... def serve( request: HttpRequest, path: str, document_root: str | None = None, show_indexes: bool = False ) -> HttpResponse | FileResponse: ... template_translatable: Any def directory_index(path: Any, fullpath: Any) -> HttpResponse: ... def was_modified_since(header: str | None = None, mtime: float = 0) -> bool: ... typeddjango-django-stubs-fa03b48/ext/000077500000000000000000000000001526064357400176455ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/ext/LICENSE.md000066400000000000000000000020631526064357400212520ustar00rootroot00000000000000Copyright (c) Maxim Kurnikov. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. typeddjango-django-stubs-fa03b48/ext/README.md000066400000000000000000000045731526064357400211350ustar00rootroot00000000000000# Extensions and monkey-patching for django-stubs [![test](https://github.com/typeddjango/django-stubs/actions/workflows/test.yml/badge.svg?branch=master&event=push)](https://github.com/typeddjango/django-stubs/actions/workflows/test.yml) [![Checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/) [![StackOverflow](https://shields.io/badge/ask-stackoverflow-orange?logo=stackoverflow)](https://stackoverflow.com/questions/tagged/django-stubs?tab=Active) This package contains extensions and monkey-patching functions for the [django-stubs](https://github.com/typeddjango/django-stubs) package. Certain features of django-stubs (i.e. generic django classes that don't define the `__class_getitem__` method) require runtime monkey-patching, which can't be done with type stubs. These extensions were split into a separate package so library consumers don't need `mypy` as a runtime dependency ([#526](https://github.com/typeddjango/django-stubs/pull/526#pullrequestreview-525798031)). ## Installation ```bash pip install django-stubs-ext ``` ## Usage In your Django application, use the following code: ```py import django_stubs_ext django_stubs_ext.monkeypatch() ``` This only needs to be called once, so the call to `monkeypatch` should be placed in your top-level settings. Real-life example [can be found here](https://github.com/wemake-services/wemake-django-template/blob/5bf1569e2710e11befc6991893f94419136d74bd/%7B%7Bcookiecutter.project_name%7D%7D/server/settings/__init__.py#L14-L19). ## Version compatibility Since django-stubs supports multiple Django versions, this package takes care to only monkey-patch the features needed by your django version, and decides which features to patch at runtime. This is completely safe, as (currently) we only add a `__class_getitem__` method that does nothing: ```py @classmethod def __class_getitem__(cls, *args, **kwargs): return cls ``` ## To get help For help with django-stubs, please view the main repository at ## Contributing The django-stubs-ext package is part of the [django-stubs](https://github.com/typeddjango/django-stubs) monorepo. If you would like to contribute, please view the django-stubs [contribution guide](https://github.com/typeddjango/django-stubs/blob/master/CONTRIBUTING.md). You can always also reach out in gitter to discuss your contributions! typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/000077500000000000000000000000001526064357400232075ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/__init__.py000066400000000000000000000014241526064357400253210ustar00rootroot00000000000000from __future__ import annotations from .aliases import FieldOpts as FieldOpts from .aliases import FieldsetSpec as FieldsetSpec from .aliases import QuerySetAny as QuerySetAny from .aliases import StrOrPromise, StrPromise from .aliases import ValuesQuerySet as ValuesQuerySet from .annotations import Annotations as Annotations from .annotations import WithAnnotations as WithAnnotations from .patch import monkeypatch as monkeypatch from .types import AnyAttrAllowed as AnyAttrAllowed from .types import MutableHttpRequest as MutableHttpRequest __all__ = [ "Annotations", "AnyAttrAllowed", "FieldOpts", "FieldsetSpec", "MutableHttpRequest", "QuerySetAny", "StrOrPromise", "StrPromise", "ValuesQuerySet", "WithAnnotations", "monkeypatch", ] typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/aliases.py000066400000000000000000000017101526064357400252010ustar00rootroot00000000000000from __future__ import annotations import typing if typing.TYPE_CHECKING: from django.contrib.admin.options import _FieldOpts as FieldOpts from django.contrib.admin.options import _FieldsetSpec as FieldsetSpec from django.db.models.query import _QuerySet from django.utils.functional import _StrOrPromise as StrOrPromise from django.utils.functional import _StrPromise as StrPromise # Deprecated type aliases. Use the QuerySet class directly instead. QuerySetAny = _QuerySet ValuesQuerySet = _QuerySet else: from django.db.models.query import QuerySet from django.utils.functional import Promise as StrPromise StrOrPromise = str | StrPromise FieldOpts = dict FieldsetSpec = list # Deprecated type aliases. Use the QuerySet class directly instead. QuerySetAny = QuerySet ValuesQuerySet = QuerySet __all__ = ["FieldOpts", "FieldsetSpec", "QuerySetAny", "StrOrPromise", "StrPromise", "ValuesQuerySet"] typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/annotations.py000066400000000000000000000012751526064357400261230ustar00rootroot00000000000000from __future__ import annotations from collections.abc import Mapping from typing import Annotated, Any, Generic from django.db.models.base import Model from typing_extensions import TypeVar # Really, we would like to use TypedDict as a bound, but it's not possible _Annotations = TypeVar("_Annotations", covariant=True, bound=Mapping[str, Any]) class Annotations(Generic[_Annotations]): """Use as `Annotations[MyTypedDict]`""" pass _T = TypeVar("_T", bound=Model) WithAnnotations = Annotated[_T, Annotations[_Annotations]] """Alias to make it easy to annotate the model `_T` as having annotations `_Annotations` (a `TypedDict`). Use as `WithAnnotations[MyModel, MyTypedDict]`. """ typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/db/000077500000000000000000000000001526064357400235745ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/db/__init__.py000066400000000000000000000000001526064357400256730ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/db/models/000077500000000000000000000000001526064357400250575ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/db/models/__init__.py000066400000000000000000000037121526064357400271730ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING if TYPE_CHECKING: from collections.abc import Sequence from typing import ClassVar from django.db.models import BaseConstraint, Index from django.db.models.expressions import Combinable from django.utils.datastructures import _ListOrTuple from django_stubs_ext import StrOrPromise class TypedModelMeta: """ Typed base class for Django Model `class Meta:` inner class. At runtime this is just an alias to `object`. Most attributes are the same as `django.db.models.options.Options`. Options has some additional attributes and some values are normalized by Django. """ abstract: ClassVar[bool] # default: False app_label: ClassVar[str] base_manager_name: ClassVar[str] db_table: ClassVar[str] db_table_comment: ClassVar[str] db_tablespace: ClassVar[str] default_manager_name: ClassVar[str] default_related_name: ClassVar[str] get_latest_by: ClassVar[str | Sequence[str]] managed: ClassVar[bool] # default: True order_with_respect_to: ClassVar[str] ordering: ClassVar[Sequence[str | Combinable]] permissions: ClassVar[_ListOrTuple[tuple[str, StrOrPromise]]] default_permissions: ClassVar[Sequence[str]] # default: ("add", "change", "delete", "view") proxy: ClassVar[bool] # default: False required_db_features: ClassVar[_ListOrTuple[str]] required_db_vendor: ClassVar[str] select_on_save: ClassVar[bool] # default: False indexes: ClassVar[_ListOrTuple[Index]] unique_together: ClassVar[Sequence[Sequence[str]]] index_together: ClassVar[Sequence[Sequence[str]]] # Deprecated in Django 4.2 constraints: ClassVar[_ListOrTuple[BaseConstraint]] verbose_name: ClassVar[StrOrPromise] verbose_name_plural: ClassVar[StrOrPromise] else: TypedModelMeta = object typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/db/models/manager.py000066400000000000000000000015641526064357400270510ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING # Re-export stubs-only classes RelatedManger and ManyRelatedManager. # These are fake, Django defines these inside function body. if TYPE_CHECKING: # noinspection PyUnresolvedReferences from django.db.models.fields.related_descriptors import ManyRelatedManager as ManyRelatedManager # noinspection PyUnresolvedReferences from django.db.models.fields.related_descriptors import RelatedManager as RelatedManager else: from typing import Protocol from typing_extensions import TypeVar _T = TypeVar("_T") _Through = TypeVar("_Through") # Define as `Protocol` to prevent them being used with `isinstance()`. # These actually inherit from `BaseManager`. class RelatedManager(Protocol[_T]): pass class ManyRelatedManager(Protocol[_T, _Through]): pass typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/db/router.py000066400000000000000000000016331526064357400254710ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING if TYPE_CHECKING: from typing import Any from django.db.models import Model class TypedDatabaseRouter: """ Typed base class for Django's DATABASE_ROUTERS setting. At runtime this is just an alias to `object`. All methods are optional. Django documentation: https://docs.djangoproject.com/en/stable/topics/db/multi-db/#automatic-database-routing """ def db_for_read(self, model: type[Model], **hints: Any) -> str | None: ... def db_for_write(self, model: type[Model], **hints: Any) -> str | None: ... def allow_relation(self, obj1: Model, obj2: Model, **hints: Any) -> bool | None: ... def allow_migrate( self, db: str, app_label: str, model_name: str | None = None, **hints: Any ) -> bool | None: ... else: TypedDatabaseRouter = object typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/patch.py000066400000000000000000000136471526064357400246730ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, Any, Generic from django import VERSION from django.contrib.admin import ModelAdmin from django.contrib.admin.options import BaseModelAdmin from django.contrib.messages.views import SuccessMessageMixin from django.contrib.sessions.backends.db import SessionStore from django.contrib.sitemaps import Sitemap from django.contrib.syndication.views import Feed from django.core.files.utils import FileProxyMixin from django.core.paginator import Paginator from django.db.models.expressions import ExpressionWrapper, Func, Subquery from django.db.models.fields import Field from django.db.models.fields.related import ForeignKey from django.db.models.fields.related_descriptors import ( ForwardManyToOneDescriptor, ReverseManyToOneDescriptor, ReverseOneToOneDescriptor, ) from django.db.models.lookups import Lookup from django.db.models.manager import BaseManager from django.db.models.options import Options from django.db.models.query import BaseIterable, ModelIterable, Prefetch, QuerySet, RawQuerySet from django.forms.formsets import BaseFormSet from django.forms.models import BaseModelForm, BaseModelFormSet, ModelChoiceField, ModelChoiceIterator, ModelFormOptions from django.utils.connection import BaseConnectionHandler, ConnectionProxy from django.utils.datastructures import OrderedSet from django.utils.functional import LazyObject, classproperty from django.views import View from django.views.generic.base import TemplateResponseMixin from django.views.generic.detail import SingleObjectMixin from django.views.generic.edit import DeletionMixin, FormMixin from django.views.generic.list import MultipleObjectMixin from typing_extensions import TypeVar, override if TYPE_CHECKING: from collections.abc import Iterable __all__ = ["monkeypatch"] _T = TypeVar("_T") _VersionSpec = tuple[int, int] class MPGeneric(Generic[_T]): """Create a data class to hold metadata about the generic classes needing monkeypatching. The `version` param is optional, and a value of `None` means that the monkeypatch is version-independent. This is slightly overkill for our purposes, but useful for future-proofing against any possible issues we may run into with this method. """ def __init__(self, cls: type[_T], version: _VersionSpec | None = None) -> None: """Set the data fields, basic constructor.""" self.version = version self.cls = cls @override def __repr__(self) -> str: """Better representation in tests and debug.""" return "".format(self.cls, self.version or "all") # certain django classes need to be generic, but lack the __class_getitem__ dunder needed to # annotate them: https://github.com/typeddjango/django-stubs/issues/507 # this list stores them so `monkeypatch` can fix them when called _need_generic: list[MPGeneric[Any]] = [ MPGeneric(ModelAdmin), MPGeneric(SingleObjectMixin), MPGeneric(FormMixin), MPGeneric(DeletionMixin), MPGeneric(MultipleObjectMixin), MPGeneric(BaseModelAdmin), MPGeneric(Field), MPGeneric(Paginator), MPGeneric(BaseFormSet), MPGeneric(BaseModelForm), MPGeneric(BaseModelFormSet), MPGeneric(ModelChoiceField), MPGeneric(ModelChoiceIterator), MPGeneric(Feed), MPGeneric(Sitemap), MPGeneric(SuccessMessageMixin), MPGeneric(FileProxyMixin), MPGeneric(Lookup), MPGeneric(BaseConnectionHandler), MPGeneric(ExpressionWrapper), MPGeneric(Func), MPGeneric(Subquery), MPGeneric(ReverseManyToOneDescriptor), MPGeneric(ModelIterable), MPGeneric(View), MPGeneric(TemplateResponseMixin), # These types do have native `__class_getitem__` method since django 3.1: MPGeneric(QuerySet, (3, 1)), MPGeneric(BaseManager, (3, 1)), # These types do have native `__class_getitem__` method since django 4.1: MPGeneric(ForeignKey, (4, 1)), MPGeneric(RawQuerySet), MPGeneric(classproperty), MPGeneric(LazyObject), MPGeneric(ConnectionProxy), MPGeneric(ModelFormOptions), MPGeneric(Options), MPGeneric(BaseIterable), MPGeneric(ForwardManyToOneDescriptor), MPGeneric(ReverseOneToOneDescriptor), MPGeneric(Prefetch), MPGeneric(SessionStore), MPGeneric(OrderedSet), ] if VERSION >= (6, 0): from django.core.paginator import AsyncPage, AsyncPaginator, BasePaginator from django.tasks import Task, TaskContext, TaskResult from django.utils.datastructures import DeferredSubDict _need_generic.extend( [ MPGeneric(Task), MPGeneric(TaskContext), MPGeneric(TaskResult), MPGeneric(BasePaginator), MPGeneric(AsyncPaginator), MPGeneric(AsyncPage), MPGeneric(DeferredSubDict), ] ) def _make_class_getitem(patched_cls: type) -> Any: def __class_getitem__(cls: type, item: Any) -> Any: # A patched class may shadow `Generic.__class_getitem__` in a subclass MRO. # Delegate to the next implementation when present, otherwise keep the # existing no-op behavior. mro = cls.__mro__ for base in mro[mro.index(patched_cls) + 1 : -1]: getitem = base.__dict__.get("__class_getitem__") if getitem is not None: return getitem.__get__(None, cls)(item) return cls return classmethod(__class_getitem__) def monkeypatch(extra_classes: Iterable[type] | None = None) -> None: """Monkey patch django as necessary to work properly with mypy.""" # Add the __class_getitem__ dunder. suited_for_this_version = filter( lambda spec: spec.version is None or VERSION[:2] <= spec.version, _need_generic, ) for el in suited_for_this_version: el.cls.__class_getitem__ = _make_class_getitem(el.cls) if extra_classes: for cls in extra_classes: cls.__class_getitem__ = _make_class_getitem(cls) # type: ignore[attr-defined] typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/py.typed000066400000000000000000000000001526064357400246740ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/settings.py000066400000000000000000000007301526064357400254210ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, Any, NotRequired, TypedDict, type_check_only if TYPE_CHECKING: from pathlib import Path @type_check_only class TemplatesSetting(TypedDict): """Typing helper if you want to type `TEMPLATE` setting.""" BACKEND: str NAME: NotRequired[str] DIRS: NotRequired[list[str | Path]] APP_DIRS: NotRequired[bool] OPTIONS: NotRequired[dict[str, Any]] __all__ = ["TemplatesSetting"] typeddjango-django-stubs-fa03b48/ext/django_stubs_ext/types.py000066400000000000000000000014571526064357400247340ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, Any, Protocol from typing_extensions import override if TYPE_CHECKING: from django.http.request import HttpRequest, QueryDict class MutableHttpRequest(HttpRequest): """A request with mutable query dictionaries, as used in tests.""" GET: QueryDict # type: ignore[assignment] POST: QueryDict # type: ignore[assignment] else: # The runtime class is Django's regular HttpRequest; mutability is a type-checking distinction only. from django.http import HttpRequest MutableHttpRequest = HttpRequest # Used internally by mypy_django_plugin. class AnyAttrAllowed(Protocol): def __getattr__(self, item: str) -> Any: ... @override def __setattr__(self, item: str, value: Any) -> None: ... typeddjango-django-stubs-fa03b48/ext/pyproject.toml000066400000000000000000000027261526064357400225700ustar00rootroot00000000000000[project] name = "django-stubs-ext" # NB! For clarity, keep version major.minor.patch in sync with django-stubs. # It's fine to skip django-stubs-ext releases, but when doing a release, update this to newest django-stubs version. version = "6.1.2" description = "Monkey-patching and extensions for django-stubs" readme = "README.md" license = "MIT" license-files = ["LICENSE.md"] maintainers = [ { name = "Marti Raudsepp", email = "marti@juffo.org" }, { name = "Nikita Sobolev", email = "mail@sobolevn.me" }, { name = "Petter Friberg", email = "petter_friberg@hotmail.com" }, { name = "Adam Johnson", email = "me@adamj.eu" }, ] authors = [ { name = "Simula Proxy" }, ] requires-python = ">=3.11" classifiers = [ "Operating System :: OS Independent", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Typing :: Typed", "Framework :: Django", "Framework :: Django :: 5.2", "Framework :: Django :: 6.0", "Framework :: Django :: 6.1", ] dependencies = [ "django", "typing-extensions", ] [project.urls] Homepage = "https://github.com/typeddjango/django-stubs" Funding = "https://github.com/sponsors/typeddjango" "Release notes" = "https://github.com/typeddjango/django-stubs/releases" [build-system] requires = ["uv_build>=0.12.0,<0.13.0"] build-backend = "uv_build" [tool.uv.build-backend] module-name = ["django_stubs_ext"] module-root = "" typeddjango-django-stubs-fa03b48/ext/tests/000077500000000000000000000000001526064357400210075ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/ext/tests/test_aliases.py000066400000000000000000000003151526064357400240400ustar00rootroot00000000000000from __future__ import annotations from typing import Any from django_stubs_ext import ValuesQuerySet def test_extends_values_queryset() -> None: class MyQS(ValuesQuerySet[Any, Any]): pass typeddjango-django-stubs-fa03b48/ext/tests/test_monkeypatching.py000066400000000000000000000077011526064357400254450ustar00rootroot00000000000000from __future__ import annotations from contextlib import suppress from typing import TYPE_CHECKING, Generic, Protocol, get_args, get_origin import pytest from django.db.models import Model from django.forms.models import ModelForm from django.views import View from typing_extensions import TypeVar import django_stubs_ext from django_stubs_ext import patch from django_stubs_ext.patch import _need_generic, _VersionSpec if TYPE_CHECKING: from collections.abc import Iterable class _MakeGenericClasses(Protocol): """Used to represent a type of ``make_generic_classes`` fixture.""" def __call__( self, django_version: _VersionSpec | None = None, extra_classes: Iterable[type] | None = None, ) -> None: ... @pytest.fixture(scope="function") def make_generic_classes( request: pytest.FixtureRequest, monkeypatch: pytest.MonkeyPatch, ) -> _MakeGenericClasses: _extra_classes: list[type] = [] def fin() -> None: for el in _need_generic: with suppress(AttributeError): delattr(el.cls, "__class_getitem__") for cls in _extra_classes: with suppress(AttributeError): delattr(cls, "__class_getitem__") _extra_classes.clear() def factory( django_version: _VersionSpec | None = None, extra_classes: Iterable[type] | None = None, ) -> None: if extra_classes: _extra_classes.extend(extra_classes) if django_version is not None: monkeypatch.setattr(patch, "VERSION", django_version) django_stubs_ext.monkeypatch(extra_classes=extra_classes) request.addfinalizer(fin) return factory def test_patched_generics(make_generic_classes: _MakeGenericClasses) -> None: """Test that the generics actually get patched.""" make_generic_classes() for el in _need_generic: if el.version is None: assert el.cls[type] is el.cls # `type` is arbitrary class TestForm(ModelForm[Model]): pass def test_patched_extra_classes_generics(make_generic_classes: _MakeGenericClasses) -> None: """Test that the generics actually get patched for extra classes.""" class _NotGeneric: pass extra_classes = [_NotGeneric] make_generic_classes(django_version=None, extra_classes=extra_classes) for cls in extra_classes: assert cls[type] is cls # type: ignore[misc] class _TestGeneric(_NotGeneric[Model]): # type: ignore[type-arg] pass def test_patched_class_real_generic_subclass(make_generic_classes: _MakeGenericClasses) -> None: """Test that real `Generic` subclasses of patched classes keep runtime parametrization.""" make_generic_classes() assert View[int] is View # type: ignore[type-var, comparison-overlap] _T = TypeVar("_T") class _Controller(View, Generic[_T]): pass alias = _Controller[int] assert get_origin(alias) is _Controller assert get_args(alias) == (int,) class _Concrete(_Controller[int]): pass assert _Concrete.__orig_bases__ == (_Controller[int],) # type: ignore[attr-defined] class _PlainView(View): pass assert _PlainView[int] is _PlainView # type: ignore[misc] class _CustomGetitem: def __class_getitem__(cls, item: object) -> object: return ("custom", cls, item) class _WithCustom(View, _CustomGetitem): pass assert _WithCustom[int] == ("custom", _WithCustom, int) # type: ignore[misc] @pytest.mark.parametrize( "django_version", [ (2, 2), (3, 0), (3, 1), (3, 2), (4, 0), (4, 1), ], ) def test_patched_version_specific( django_version: _VersionSpec, make_generic_classes: _MakeGenericClasses, ) -> None: """Test version specific types.""" make_generic_classes(django_version) for el in _need_generic: if el.version is not None and django_version <= el.version: assert el.cls[int] is el.cls typeddjango-django-stubs-fa03b48/ext/tests/typecheck/000077500000000000000000000000001526064357400227665ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/ext/tests/typecheck/test_aliases.yml000066400000000000000000000007121526064357400261710ustar00rootroot00000000000000- case: alias_values_query_set main: | from django_stubs_ext import ValuesQuerySet from myapp.models import Blog a: ValuesQuerySet[Blog, Blog] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Blog(models.Model): created_at = models.DateTimeField() typeddjango-django-stubs-fa03b48/justfile000066400000000000000000000043451526064357400206230ustar00rootroot00000000000000# List all available recipes _default: @just --list --unsorted # Bootstrap dev environment: install pre-commit hooks and sync dependencies [group('dev')] bootstrap: uv tool install pre-commit uv sync pre-commit install --install-hooks # Run pre-commit hooks on all files [group('dev')] lint: pre-commit run --all-files # Run all checks before submitting a PR [group('dev')] pre-mr-check: lint typecheck-all mypy-self stubtest ext-test test # Remove mypy cache [group('dev')] clean-cache: rm -rf .mypy_cache rm -rf .pytest_cache rm -rf .ruff_cache # Run mypy on the internal python code. [group('typecheck')] mypy-self: uv run mypy ext scripts mypy_django_plugin uv run mypy --cache-dir=/dev/null --no-incremental django-stubs # Run mypy on test cases (default), or on the given files [group('typecheck')] mypy *files="tests/assert_type": uv run mypy {{ files }} # Run pyright on test cases (default), or on the given files [group('typecheck')] pyright *files="tests/assert_type": uv run pyright {{ files }} # Run pyrefly on test cases (default), or on the given files [group('typecheck')] pyrefly *files="tests/assert_type": uv run pyrefly check {{ files }} # Run ty on test cases (default), or on the given files [group('typecheck')] ty *files="tests/assert_type": uv run ty check {{ files }} # Run all typecheckers on test cases (default), or on the given files [group('typecheck')] typecheck-all *files="tests/assert_type": #!/usr/bin/env bash failed=() for checker in pyrefly ty pyright mypy; do printf '=================================== %s ===================================\n' "$checker" just "$checker" {{ files }} || failed+=("$checker") done [[ ${#failed[@]} -eq 0 ]] || { echo "Failed: ${failed[*]}"; exit 1; } # Run pytest tests [group('test')] test +args="-n auto tests": uv run pytest {{ args }} # Run stubtest to check stubs match runtime [group('test')] stubtest *args: uv run ./scripts/stubtest.sh {{ args }} # Run django-stubs-ext tests [group('test')] ext-test: uv run pytest ext # Build all packages [group('build')] build: uv build --all-packages # Check that uv.lock is up to date [group('build')] lock-check: uv lock --check typeddjango-django-stubs-fa03b48/logo.svg000066400000000000000000000312421526064357400205300ustar00rootroot00000000000000 typeddjango-django-stubs-fa03b48/mypy.ini000066400000000000000000000016341526064357400205500ustar00rootroot00000000000000# Regular configuration file (can be used as base in other projects, runs in CI) [mypy] # Modified in `tests.yml` incremental = true disallow_any_generics = true strict = true strict_equality_for_none = true warn_unreachable = true enable_error_code = deprecated, exhaustive-match, explicit-override, ignore-without-code, possibly-undefined, redundant-expr, redundant-self, truthy-bool, truthy-iterable, unimported-reveal, unused-awaitable, fixed_format_cache = true show_traceback = true plugins = mypy_django_plugin.main, mypy.plugins.proper_plugin # `tests/assert_type` uses bare generics on purpose, to test real world cases. # The yml tests do too, they are handled in `scripts/tests_extension_hook.py`. [mypy-tests.assert_type.*] disallow_any_generics = false # Our settings: [mypy.plugins.django-stubs] django_settings_module = scripts.django_tests_settings typeddjango-django-stubs-fa03b48/mypy_django_plugin/000077500000000000000000000000001526064357400227435ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/mypy_django_plugin/__init__.py000066400000000000000000000000001526064357400250420ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/mypy_django_plugin/config.py000066400000000000000000000131701526064357400245640ustar00rootroot00000000000000from __future__ import annotations import configparser import os import textwrap import tomllib from functools import partial from pathlib import Path from typing import TYPE_CHECKING, Any, NoReturn if TYPE_CHECKING: from collections.abc import Callable INI_USAGE = """ (config) ... [mypy.plugins.django-stubs] django_settings_module = str (default: `os.getenv("DJANGO_SETTINGS_MODULE")`) strict_settings = bool (default: true) strict_model_abstract_attrs = bool (default: true) ... """ TOML_USAGE = """ (config) ... [tool.django-stubs] django_settings_module = str (default: `os.getenv("DJANGO_SETTINGS_MODULE")`) strict_settings = bool (default: true) strict_model_abstract_attrs = bool (default: true) ... """ INVALID_FILE = "mypy config file is not specified or found" COULD_NOT_LOAD_FILE = "could not load configuration file" MISSING_SECTION = "no section [{section}] found" DJANGO_SETTINGS_ENV_VAR = "DJANGO_SETTINGS_MODULE" MISSING_DJANGO_SETTINGS = ( "missing required 'django_settings_module' config.\n" f"Either specify this config or set your `{DJANGO_SETTINGS_ENV_VAR}` env var" ) INVALID_BOOL_SETTING = "invalid {key!r}: the setting must be a boolean" def exit_with_error(msg: str, is_toml: bool = False) -> NoReturn: """Using mypy's argument parser, raise `SystemExit` to fail hard if validation fails. Considering that the plugin's startup duration is around double as long as mypy's, this aims to import and construct objects only when that's required - which happens once and terminates the run. Considering that most of the runs are successful, there's no need for this to linger in the global scope. """ from mypy.main import CapturableArgumentParser handler = CapturableArgumentParser( prog="(django-stubs) mypy", usage=textwrap.dedent(TOML_USAGE if is_toml else INI_USAGE) ) handler.error(msg) class DjangoPluginConfig: __slots__ = ("django_settings_module", "strict_model_abstract_attrs", "strict_settings") django_settings_module: str strict_settings: bool def __init__(self, config_file: str | None) -> None: if not config_file: exit_with_error(INVALID_FILE) filepath = Path(config_file) if not filepath.is_file(): exit_with_error(INVALID_FILE) if filepath.suffix.lower() == ".toml": self.parse_toml_file(filepath) else: self.parse_ini_file(filepath) def parse_toml_file(self, filepath: Path) -> None: toml_exit: Callable[[str], NoReturn] = partial(exit_with_error, is_toml=True) try: with filepath.open(mode="rb") as f: data = tomllib.load(f) except (tomllib.TOMLDecodeError, OSError): toml_exit(COULD_NOT_LOAD_FILE) try: config: dict[str, Any] = data["tool"]["django-stubs"] except KeyError: if not os.getenv(DJANGO_SETTINGS_ENV_VAR): toml_exit(MISSING_SECTION.format(section="tool.django-stubs")) config = {} django_settings_module = config.get("django_settings_module") or os.getenv(DJANGO_SETTINGS_ENV_VAR) if not django_settings_module: toml_exit(MISSING_DJANGO_SETTINGS) self.django_settings_module = django_settings_module if not isinstance(self.django_settings_module, str): toml_exit("invalid 'django_settings_module': the setting must be a string") self.strict_settings = config.get("strict_settings", True) if not isinstance(self.strict_settings, bool): toml_exit(INVALID_BOOL_SETTING.format(key="strict_settings")) self.strict_model_abstract_attrs = config.get("strict_model_abstract_attrs", True) if not isinstance(self.strict_model_abstract_attrs, bool): toml_exit(INVALID_BOOL_SETTING.format(key="strict_model_abstract_attrs")) def parse_ini_file(self, filepath: Path) -> None: parser = configparser.ConfigParser() try: with filepath.open(encoding="utf-8") as f: parser.read_file(f, source=str(filepath)) except OSError: exit_with_error(COULD_NOT_LOAD_FILE) section = "mypy.plugins.django-stubs" if not parser.has_section(section): if not os.getenv(DJANGO_SETTINGS_ENV_VAR): exit_with_error(MISSING_SECTION.format(section=section)) if parser.has_section(section) and parser.has_option(section, "django_settings_module"): django_settings_module = parser.get(section, "django_settings_module").strip("'\"") else: django_settings_module = os.getenv(DJANGO_SETTINGS_ENV_VAR, "") if not django_settings_module: exit_with_error(MISSING_DJANGO_SETTINGS) self.django_settings_module = django_settings_module try: self.strict_settings = parser.getboolean(section, "strict_settings", fallback=True) except ValueError: exit_with_error(INVALID_BOOL_SETTING.format(key="strict_settings")) try: self.strict_model_abstract_attrs = parser.getboolean(section, "strict_model_abstract_attrs", fallback=True) except ValueError: exit_with_error(INVALID_BOOL_SETTING.format(key="strict_model_abstract_attrs")) def to_json(self, extra_data: dict[str, Any]) -> dict[str, Any]: """We use this method to reset mypy cache via `report_config_data` hook.""" return { "django_settings_module": self.django_settings_module, "strict_settings": self.strict_settings, "strict_model_abstract_attrs": self.strict_model_abstract_attrs, **dict(sorted(extra_data.items())), } typeddjango-django-stubs-fa03b48/mypy_django_plugin/django/000077500000000000000000000000001526064357400242055ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/mypy_django_plugin/django/__init__.py000066400000000000000000000000001526064357400263040ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/mypy_django_plugin/django/context.py000066400000000000000000000650711526064357400262540ustar00rootroot00000000000000from __future__ import annotations import os import sys from collections import defaultdict from contextlib import contextmanager from functools import cached_property from typing import TYPE_CHECKING, Any, Literal from django.core.exceptions import FieldDoesNotExist, FieldError from django.db import models from django.db.models.base import Model from django.db.models.constants import LOOKUP_SEP from django.db.models.fields import AutoField, CharField, Field from django.db.models.fields.related import ForeignKey, RelatedField from django.db.models.fields.reverse_related import ForeignObjectRel from django.db.models.lookups import Exact, In from django.db.models.sql.query import Query from mypy.typeanal import make_optional_type from mypy.types import AnyType, Instance, ProperType, TypeOfAny, UnionType, get_proper_type from mypy.types import Type as MypyType from mypy_django_plugin.exceptions import UnregisteredModelError from mypy_django_plugin.lib import fullnames, helpers # This import fails when `psycopg2` is not installed, avoid crashing the plugin. try: from django.contrib.postgres.fields import ArrayField except ImportError: class ArrayField: # type: ignore[no-redef] pass if TYPE_CHECKING: from collections.abc import Iterable, Iterator, Mapping, Sequence from django.apps.registry import Apps from django.conf import LazySettings from django.db.models.expressions import Expression from django.db.models.options import _AnyField from mypy.checker import TypeChecker from mypy.nodes import TypeInfo from mypy.plugin import MethodContext @contextmanager def temp_environ() -> Iterator[None]: """Allow the ability to set os.environ temporarily""" environ = dict(os.environ) try: yield finally: os.environ.clear() os.environ.update(environ) def initialize_django(settings_module: str) -> tuple[Apps, LazySettings]: with temp_environ(): os.environ["DJANGO_SETTINGS_MODULE"] = settings_module # add current directory to sys.path sys.path.append(os.getcwd()) from django.apps import apps from django.conf import settings apps.get_swappable_settings_name.cache_clear() # type: ignore[attr-defined] apps.clear_cache() if not settings.configured: settings._setup() # type: ignore[misc] apps.populate(settings.INSTALLED_APPS) assert apps.apps_ready, "Apps are not ready" assert settings.configured, "Settings are not configured" return apps, settings class LookupsAreUnsupported(Exception): pass def get_field_type_from_model_type_info(info: TypeInfo | None, field_name: str) -> Instance | None: if info is None: return None field_node = info.get(field_name) if field_node is None: return None field_type = get_proper_type(field_node.type) if not isinstance(field_type, Instance): return None # Field declares a set and a get type arg. Fallback to `None` when we can't find any args. # Not every model attribute is a field, # a reverse o2o accessor is a two arg descriptor whose args would be misread as set/get types. if len(field_type.args) != 2 or not field_type.type.has_base(fullnames.FIELD_FULLNAME): return None return field_type def _get_field_set_type_from_model_type_info(info: TypeInfo | None, field_name: str) -> MypyType | None: field_type = get_field_type_from_model_type_info(info, field_name) if field_type is not None: return field_type.args[0] return None def _get_field_get_type_from_model_type_info(info: TypeInfo | None, field_name: str) -> MypyType | None: field_type = get_field_type_from_model_type_info(info, field_name) if field_type is not None: return field_type.args[1] return None class DjangoContext: def __init__(self, django_settings_module: str) -> None: self.django_settings_module = django_settings_module apps, settings = initialize_django(self.django_settings_module) self.apps_registry = apps self.settings = settings @cached_property def model_modules(self) -> dict[str, dict[str, type[Model]]]: """All modules that contain Django models.""" modules: dict[str, dict[str, type[Model]]] = defaultdict(dict) for concrete_model_cls in self.apps_registry.get_models(include_auto_created=True, include_swapped=True): modules[concrete_model_cls.__module__][concrete_model_cls.__name__] = concrete_model_cls # collect abstract=True models for model_cls in concrete_model_cls.mro()[1:]: if issubclass(model_cls, Model) and hasattr(model_cls, "_meta") and model_cls._meta.abstract: modules[model_cls.__module__][model_cls.__name__] = model_cls return modules def get_model_class_by_fullname(self, fullname: str) -> type[Model] | None: """Returns None if Model is abstract""" module, _, model_cls_name = fullname.rpartition(".") return self.model_modules.get(module, {}).get(model_cls_name) def get_model_fields(self, model_cls: type[Model]) -> Iterator[Field[Any, Any]]: for field in model_cls._meta.get_fields(): if isinstance(field, Field): yield field def get_model_foreign_keys(self, model_cls: type[Model]) -> Iterator[ForeignKey[Any, Any]]: for field in model_cls._meta.get_fields(): if isinstance(field, ForeignKey): yield field def get_model_related_fields(self, model_cls: type[Model]) -> Iterator[RelatedField[Any, Any]]: """Get model forward relations""" for field in model_cls._meta.get_fields(): if isinstance(field, RelatedField): yield field def get_model_relations(self, model_cls: type[Model]) -> Iterator[ForeignObjectRel]: """Get model reverse relations""" for field in model_cls._meta.get_fields(): if isinstance(field, ForeignObjectRel): yield field def get_field_lookup_exact_type(self, api: TypeChecker, field: _AnyField) -> MypyType: if isinstance(field, RelatedField | ForeignObjectRel): related_model_cls = self.get_field_related_model_cls(field) rel_model_info = helpers.lookup_class_typeinfo(api, related_model_cls) if rel_model_info is None: return AnyType(TypeOfAny.explicit) primary_key_field = self.get_primary_key_field(related_model_cls) primary_key_type = self.get_field_get_type(api, rel_model_info, primary_key_field, method="init") model_and_primary_key_type = UnionType.make_union([Instance(rel_model_info, []), primary_key_type]) return make_optional_type(model_and_primary_key_type) field_info = helpers.lookup_class_typeinfo(api, field.__class__) if field_info is None: return AnyType(TypeOfAny.explicit) return helpers.get_private_descriptor_type(field_info, "_pyi_lookup_exact_type", is_nullable=field.null) def get_related_target_field( self, related_model_cls: type[Model], field: ForeignKey[Any, Any] ) -> Field[Any, Any] | None: # ForeignKey only supports one `to_fields` item (ForeignObject supports many) assert len(field.to_fields) == 1 to_field_name = field.to_fields[0] if to_field_name: rel_field = related_model_cls._meta.get_field(to_field_name) if not isinstance(rel_field, Field): return None # Not supported return rel_field return self.get_primary_key_field(related_model_cls) def get_primary_key_field(self, model_cls: type[Model]) -> Field[Any, Any]: for field in model_cls._meta.get_fields(): if isinstance(field, Field): if field.primary_key: return field raise ValueError("No primary key defined") def get_expected_types(self, api: TypeChecker, model_cls: type[Model], *, method: str) -> dict[str, MypyType]: contenttypes_in_apps = self.apps_registry.is_installed("django.contrib.contenttypes") expected_types = {} # add pk if not abstract=True if not model_cls._meta.abstract: primary_key_field = self.get_primary_key_field(model_cls) field_set_type = self.get_field_set_type(api, primary_key_field, method=method) expected_types["pk"] = field_set_type model_info = helpers.lookup_class_typeinfo(api, model_cls) for field in model_cls._meta.get_fields(): if contenttypes_in_apps: from django.contrib.contenttypes.fields import GenericForeignKey if isinstance(field, GenericForeignKey): # it's generic, so cannot set specific model field_name = field.name gfk_info = helpers.lookup_class_typeinfo(api, field.__class__) if gfk_info is None: gfk_set_type: MypyType = AnyType(TypeOfAny.unannotated) else: gfk_set_type = helpers.get_private_descriptor_type( gfk_info, "_pyi_private_set_type", is_nullable=True ) expected_types[field_name] = gfk_set_type continue if isinstance(field, Field): field_name = getattr(field, "attname", field.name) # Can not determine target_field for recursive relationship when model is abstract # We add type ignores here because the plugin might have to check bogus code instantiating # recursive abstract model and we need to not crash and gracefully exit. if field.related_model == "self" and model_cls._meta.abstract: # type: ignore[comparison-overlap, unreachable] continue # type: ignore[unreachable] # Try to retrieve set type from a model's TypeInfo object and fallback to retrieving it manually # from django-stubs own declaration. This is to align with the setter types declared for # assignment. field_set_type = _get_field_set_type_from_model_type_info( model_info, field_name ) or self.get_field_set_type(api, field, method=method) expected_types[field_name] = field_set_type if isinstance(field, ForeignKey): field_name = field.name foreign_key_info = helpers.lookup_class_typeinfo(api, field.__class__) if foreign_key_info is None: # maybe there's no type annotation for the field expected_types[field_name] = AnyType(TypeOfAny.unannotated) continue try: related_model = self.get_field_related_model_cls(field) except UnregisteredModelError: # Recognise the field but don't say anything about its type.. expected_types[field_name] = AnyType(TypeOfAny.from_error) continue if related_model._meta.proxy_for_model is not None: related_model = related_model._meta.proxy_for_model related_model_info = helpers.lookup_class_typeinfo(api, related_model) if related_model_info is None: expected_types[field_name] = AnyType(TypeOfAny.unannotated) continue is_nullable = self.get_field_nullability(field, method) foreign_key_set_type = helpers.get_private_descriptor_type( foreign_key_info, "_pyi_private_set_type", is_nullable=is_nullable ) model_set_type = helpers.convert_any_to_type(foreign_key_set_type, Instance(related_model_info, [])) expected_types[field_name] = model_set_type return expected_types @cached_property def all_registered_model_classes(self) -> set[type[models.Model]]: model_classes = self.apps_registry.get_models() all_model_bases = set() for model_cls in model_classes: for base_cls in model_cls.mro(): if issubclass(base_cls, models.Model): all_model_bases.add(base_cls) return all_model_bases @cached_property def _model_class_fullnames_by_label_lower(self) -> Mapping[str, str]: return { klass._meta.label_lower: helpers.get_class_fullname(klass) for klass in self.all_registered_model_classes if klass is not models.Model } def model_class_fullname_for_label(self, label: str) -> str | None: """Model names are case-insensitive, app labels are not (as in `Apps.get_model`).""" app_label, _, model_name = label.partition(".") return self._model_class_fullnames_by_label_lower.get(f"{app_label}.{model_name.lower()}") def get_field_nullability(self, field: _AnyField, method: str | None) -> bool: if method in ("values", "values_list"): return field.null nullable = field.null if not nullable and isinstance(field, CharField) and field.blank: return True if method == "__init__": if (isinstance(field, Field) and field.primary_key) or isinstance(field, ForeignKey): return True if method == "create": if isinstance(field, AutoField): return True if isinstance(field, Field) and field.has_default(): return True return nullable def get_field_set_type(self, api: TypeChecker, field: _AnyField, *, method: str) -> MypyType: """Get a type of __set__ for this specific Django field.""" target_field = field if isinstance(field, ForeignKey): try: # We gotta be careful for exceptions when we're triggering '__get__'. # Related model could very well be unresolvable target_field = field.target_field except ValueError: return AnyType(TypeOfAny.from_error) field_info = helpers.lookup_class_typeinfo(api, target_field.__class__) if field_info is None: return AnyType(TypeOfAny.from_error) field_set_type = helpers.get_private_descriptor_type( field_info, "_pyi_private_set_type", is_nullable=self.get_field_nullability(field, method) ) if isinstance(target_field, ArrayField): argument_field_type = self.get_field_set_type(api, target_field.base_field, method=method) field_set_type = helpers.convert_any_to_type(field_set_type, argument_field_type) return field_set_type def get_field_get_type( self, api: TypeChecker, model_info: TypeInfo | None, field: _AnyField, *, method: str, ) -> MypyType: """Get a type of __get__ for this specific Django field.""" if isinstance(field, Field): get_type = _get_field_get_type_from_model_type_info(model_info, getattr(field, "attname", field.name)) if get_type is not None: return get_type field_info = helpers.lookup_class_typeinfo(api, field.__class__) if field_info is None: return AnyType(TypeOfAny.unannotated) is_nullable = self.get_field_nullability(field, method) if isinstance(field, RelatedField): related_model_cls = self.get_field_related_model_cls(field) rel_model_info = helpers.lookup_class_typeinfo(api, related_model_cls) if method in ("values", "values_list"): primary_key_field = self.get_primary_key_field(related_model_cls) return self.get_field_get_type(api, rel_model_info, primary_key_field, method=method) model_info = helpers.lookup_class_typeinfo(api, related_model_cls) if model_info is None: return AnyType(TypeOfAny.unannotated) return Instance(model_info, []) return helpers.get_private_descriptor_type(field_info, "_pyi_private_get_type", is_nullable=is_nullable) def get_field_related_model_cls(self, field: RelatedField[Any, Any] | ForeignObjectRel) -> type[Model]: if isinstance(field, RelatedField): related_model_cls = field.remote_field.model else: related_model_cls = field.field.model if related_model_cls is None: # type: ignore[comparison-overlap] raise UnregisteredModelError if isinstance(related_model_cls, str): if related_model_cls == "self": # type: ignore[unreachable] # same model related_model_cls = field.model elif "." not in related_model_cls: # same file model related_model_fullname = f"{field.model.__module__}.{related_model_cls}" related_model_cls = self.get_model_class_by_fullname(related_model_fullname) if related_model_cls is None: raise UnregisteredModelError else: try: related_model_cls = self.apps_registry.get_model(related_model_cls) except LookupError as e: raise UnregisteredModelError from e return related_model_cls def _resolve_field_from_parts( self, field_parts: Iterable[str], model_cls: type[Model] ) -> tuple[_AnyField, type[Model]]: currently_observed_model = model_cls field: _AnyField | None = None for field_part in field_parts: if field_part == "pk": field = self.get_primary_key_field(currently_observed_model) continue field = currently_observed_model._meta.get_field(field_part) if isinstance(field, RelatedField): currently_observed_model = self.get_field_related_model_cls(field) model_name = currently_observed_model._meta.model_name if model_name is not None and field_part == (model_name + "_id"): field = self.get_primary_key_field(currently_observed_model) if isinstance(field, ForeignObjectRel): currently_observed_model = self.get_field_related_model_cls(field) # Guaranteed by `query.solve_lookup_type` before. assert isinstance(field, Field | ForeignObjectRel) return field, currently_observed_model def solve_lookup_type( self, model_cls: type[Model], lookup: str ) -> tuple[Sequence[str], Sequence[str], Expression | Literal[False]] | None: query = Query(model_cls) if (lookup == "pk" or lookup.startswith("pk__")) and query.get_meta().pk is None: # type: ignore[comparison-overlap] # Primary key lookup when no primary key field is found, model is presumably # abstract and we can't say anything about 'pk'. return None try: return query.solve_lookup_type(lookup) # This occurs when the following conditions are met: # - model_cls._meta.abstract = True # - part of the lookup is a foreign key defined on model_cls where the 'to' argument is a string # On abstract models the 'to' parameter is only coalesced into the actual class whenever a subclass of it is # instantiated, therefore it is never swapped out for abstract base classes. except AttributeError: pass query_parts = lookup.split(LOOKUP_SEP) try: field = query.get_meta().get_field(query_parts[0]) except FieldDoesNotExist: return None if len(query_parts) == 1: return [], [query_parts[0]], False if not isinstance(field, RelatedField | ForeignObjectRel): return None related_model = self.get_field_related_model_cls(field) sub_query = Query(related_model).solve_lookup_type(LOOKUP_SEP.join(query_parts[1:])) entire_query_parts = [query_parts[0], *sub_query[1]] return sub_query[0], entire_query_parts, sub_query[2] def resolve_lookup_into_field(self, model_cls: type[Model], lookup: str) -> tuple[_AnyField | None, type[Model]]: solved_lookup = self.solve_lookup_type(model_cls, lookup) if solved_lookup is None: return None, model_cls lookup_parts, field_parts, _ = solved_lookup if lookup_parts: raise LookupsAreUnsupported() return self._resolve_field_from_parts(field_parts, model_cls) def _resolve_lookup_type_from_lookup_class( self, ctx: MethodContext, lookup_cls: type, field: _AnyField | None = None ) -> MypyType | None: """Resolve the expected type for a lookup class (used both for regular fields and annotated fields) Args: ctx lookup_cls: The Django lookup class (e.g., IsNull, Contains) field: Optional field for resolving Field-dependent types (None for annotated fields) Returns: The resolved type, or None if it couldn't be determined """ lookup_info = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), lookup_cls) if lookup_info is None: return None for lookup_base in helpers.iter_bases(lookup_info): if lookup_base.args and isinstance((lookup_type := get_proper_type(lookup_base.args[0])), Instance): # if it's Field, consider lookup_type a __get__ of current field if lookup_type.type.fullname == fullnames.FIELD_FULLNAME: if field is None: # No field available (e.g., annotation), can't resolve further return None field_info = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), field.__class__) if field_info is None: return None return get_proper_type( helpers.get_private_descriptor_type(field_info, "_pyi_private_get_type", is_nullable=field.null) ) return lookup_type return None def _resolve_annotated_field_lookup( self, ctx: MethodContext, lookup: str, model_instance: Instance ) -> MypyType | None: """Resolve the expected type for a lookup on an annotated field. Args: ctx lookup: The full lookup string (e.g., 'total__gte' or 'total'). model_instance: The model instance containing extra_attrs from annotations. Returns: The resolved mypy type for the lookup, or None if the base field is not found in the model's annotations. """ if not helpers.is_annotated_model(model_instance.type) or not model_instance.extra_attrs: return None lookup_base_field, *annotation_lookup_parts = lookup.split(LOOKUP_SEP) annotation_type = model_instance.extra_attrs.attrs.get(lookup_base_field) if not annotation_lookup_parts: return annotation_type lookup_cls = Field().get_lookup(annotation_lookup_parts[-1]) if lookup_cls is None: return annotation_type if annotation_type is not None and issubclass(lookup_cls, In): return ctx.api.named_generic_type("typing.Iterable", [annotation_type]) lookup_type = self._resolve_lookup_type_from_lookup_class(ctx, lookup_cls) return annotation_type if lookup_type is None else lookup_type def resolve_lookup_expected_type( self, ctx: MethodContext, model_cls: type[Model], lookup: str, model_instance: Instance ) -> MypyType: try: # solve_lookup_type uses Django's Query.solve_lookup_type(), which raises # FieldError for annotated fields since they don't exist on the actual model... solved_lookup = self.solve_lookup_type(model_cls, lookup) except FieldError as exc: # ...so we handle annotation lookups here annotation_lookup = self._resolve_annotated_field_lookup(ctx, lookup, model_instance) if annotation_lookup is not None: return annotation_lookup msg = exc.args[0] if model_instance.extra_attrs: msg = ", ".join((msg, *model_instance.extra_attrs.attrs.keys())) ctx.api.fail(msg, ctx.context) return AnyType(TypeOfAny.from_error) if solved_lookup is None: return AnyType(TypeOfAny.implementation_artifact) lookup_parts, field_parts, is_expression = solved_lookup if is_expression: return AnyType(TypeOfAny.explicit) field, _ = self._resolve_field_from_parts(field_parts, model_cls) lookup_cls = None if lookup_parts: lookup = lookup_parts[-1] lookup_cls = field.get_lookup(lookup) if lookup_cls is None: # unknown lookup return AnyType(TypeOfAny.explicit) # The lookup chain may contain intermediate transforms, e.g. 'year' in # 'start_date__year__in'. The expected type must be resolved against the # transform's output field rather than the original one, otherwise a # DateField 'year' transform would incorrectly expect 'date' values # instead of 'int'. If any transform in the chain cannot be resolved # to a concrete output field, keep the original field as a fallback. for transform_name in lookup_parts[:-1]: transform_cls = field.get_transform(transform_name) if isinstance(field, Field) else None output_field = getattr(transform_cls, "output_field", None) if not isinstance(output_field, Field): break field = output_field if lookup_cls is None or issubclass(lookup_cls, Exact): return self.get_field_lookup_exact_type(helpers.get_typechecker_api(ctx), field) if issubclass(lookup_cls, In): exact_type = self.get_field_lookup_exact_type(helpers.get_typechecker_api(ctx), field) return ctx.api.named_generic_type("typing.Iterable", [exact_type]) resolved_type = self._resolve_lookup_type_from_lookup_class(ctx, lookup_cls, field) if resolved_type is not None: return resolved_type return AnyType(TypeOfAny.explicit) def resolve_f_expression_type(self, f_expression_type: Instance) -> ProperType: return AnyType(TypeOfAny.explicit) @cached_property def is_contrib_auth_installed(self) -> bool: return "django.contrib.auth" in self.settings.INSTALLED_APPS typeddjango-django-stubs-fa03b48/mypy_django_plugin/errorcodes.py000066400000000000000000000002611526064357400254630ustar00rootroot00000000000000from __future__ import annotations from mypy.errorcodes import ErrorCode MANAGER_MISSING = ErrorCode("django-manager-missing", "Couldn't resolve manager for model", "Django") typeddjango-django-stubs-fa03b48/mypy_django_plugin/exceptions.py000066400000000000000000000001761526064357400255020ustar00rootroot00000000000000from __future__ import annotations class UnregisteredModelError(Exception): """The requested model is not registered""" typeddjango-django-stubs-fa03b48/mypy_django_plugin/lib/000077500000000000000000000000001526064357400235115ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/mypy_django_plugin/lib/__init__.py000066400000000000000000000000001526064357400256100ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/mypy_django_plugin/lib/field_validation.py000066400000000000000000000055071526064357400273670ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from django.core.exceptions import FieldDoesNotExist if TYPE_CHECKING: from django.db.models.base import Model from django.db.models.options import _AnyField from mypy.plugin import MethodContext def try_get_field( ctx: MethodContext, model_cls: type[Model], field_name: str, *, resolve_pk: bool = False ) -> _AnyField | None: opts = model_cls._meta resolved_name = opts.pk.name if resolve_pk and field_name == "pk" else field_name try: return opts.get_field(resolved_name) except FieldDoesNotExist as e: ctx.api.fail(str(e), ctx.context) return None def check_field_concrete(ctx: MethodContext, field: _AnyField, field_name: str, method: str) -> bool: if not field.concrete or field.many_to_many: ctx.api.fail(f'"{method}()" can only be used with concrete fields. Got "{field_name}"', ctx.context) return False return True def check_field_unique( ctx: MethodContext, model_cls: type[Model], field: _AnyField, field_name: str, method: str ) -> bool: unique_fields = [c.fields[0] for c in model_cls._meta.total_unique_constraints if len(c.fields) == 1] if not getattr(field, "unique", None) and field_name not in unique_fields: ctx.api.fail(f'"{method}()"\'s field_name must be a unique field but "{field_name}" isn\'t', ctx.context) return False return True def check_field_not_pk( ctx: MethodContext, model_cls: type[Model], field: _AnyField, field_name: str, method: str, *, attr_name: str | None = None, ) -> bool: opts = model_cls._meta all_pk_fields = set(getattr(opts, "pk_fields", [opts.pk])) for parent in getattr(opts, "all_parents", opts.get_parent_list()): all_pk_fields.update(getattr(parent._meta, "pk_fields", [parent._meta.pk])) if field in all_pk_fields: param_str = f' in "{attr_name}="' if attr_name else "" ctx.api.fail(f'"{method}()" does not support primary key fields{param_str}. Got "{field_name}"', ctx.context) return False return True def validate_non_pk_concrete_field( ctx: MethodContext, model_cls: type[Model], field_name: str, method: str, *, attr_name: str | None = None ) -> bool: """Check that ``field_name`` is a concrete, non-primary-key field of ``model_cls``. Mirrors Django's ``Options._non_pk_concrete_field_names``: the set of fields that may appear in a database ``UPDATE`` (e.g. ``bulk_update`` fields, ``save(update_fields=...)``). Foreign key attnames such as ``author_id`` are accepted. """ return ( (field := try_get_field(ctx, model_cls, field_name)) is not None and check_field_concrete(ctx, field, field_name, method) and check_field_not_pk(ctx, model_cls, field, field_name, method, attr_name=attr_name) ) typeddjango-django-stubs-fa03b48/mypy_django_plugin/lib/fullnames.py000066400000000000000000000075001526064357400260530ustar00rootroot00000000000000from __future__ import annotations from typing import Final ABSTRACT_BASE_USER_MODEL_FULLNAME: Final = "django.contrib.auth.base_user.AbstractBaseUser" ABSTRACT_USER_MODEL_FULLNAME: Final = "django.contrib.auth.models.AbstractUser" PERMISSION_MIXIN_CLASS_FULLNAME: Final = "django.contrib.auth.models.PermissionsMixin" APPS_FULLNAME: Final = "django.apps.registry.Apps" STATE_APPS_FULLNAME: Final = "django.db.migrations.state.StateApps" MODEL_METACLASS_FULLNAME: Final = "django.db.models.base.ModelBase" MODEL_CLASS_FULLNAME: Final = "django.db.models.base.Model" FIELD_FULLNAME: Final = "django.db.models.fields.Field" ARRAY_FIELD_FULLNAME: Final = "django.contrib.postgres.fields.array.ArrayField" FOREIGN_OBJECT_FULLNAME: Final = "django.db.models.fields.related.ForeignObject" FOREIGN_KEY_FULLNAME: Final = "django.db.models.fields.related.ForeignKey" ONETOONE_FIELD_FULLNAME: Final = "django.db.models.fields.related.OneToOneField" MANYTOMANY_FIELD_FULLNAME: Final = "django.db.models.fields.related.ManyToManyField" DUMMY_SETTINGS_BASE_CLASS: Final = "django.conf._DjangoConfLazyObject" AUTH_USER_MODEL_FULLNAME: Final = "django.conf.settings.AUTH_USER_MODEL" QUERYSET_CLASS_FULLNAME: Final = "django.db.models.query.QuerySet" BASE_MANAGER_CLASS_FULLNAME: Final = "django.db.models.manager.BaseManager" MANAGER_CLASS_FULLNAME: Final = "django.db.models.manager.Manager" RELATED_MANAGER_CLASS: Final = "django.db.models.fields.related_descriptors.RelatedManager" PREFETCH_CLASS_FULLNAME: Final = "django.db.models.query.Prefetch" GENERIC_PREFETCH_CLASS_FULLNAME: Final = "django.contrib.contenttypes.prefetch.GenericPrefetch" CHOICES_CLASS_FULLNAME: Final = "django.db.models.enums.Choices" CHOICES_TYPE_METACLASS_FULLNAME: Final = "django.db.models.enums.ChoicesType" WITH_ANNOTATIONS_FULLNAME: Final = "django_stubs_ext.annotations.WithAnnotations" ANNOTATIONS_FULLNAME: Final = "django_stubs_ext.annotations.Annotations" ANNOTATED_TYPES_FULLNAMES: Final = { "typing.Annotated", "typing_extensions.Annotated", WITH_ANNOTATIONS_FULLNAME, } BASEFORM_CLASS_FULLNAME: Final = "django.forms.forms.BaseForm" FORM_MIXIN_CLASS_FULLNAME: Final = "django.views.generic.edit.FormMixin" REVERSE_ONE_TO_ONE_DESCRIPTOR: Final = "django.db.models.fields.related_descriptors.ReverseOneToOneDescriptor" REVERSE_MANY_TO_ONE_DESCRIPTOR: Final = "django.db.models.fields.related_descriptors.ReverseManyToOneDescriptor" MANY_TO_MANY_DESCRIPTOR: Final = "django.db.models.fields.related_descriptors.ManyToManyDescriptor" MANY_RELATED_MANAGER: Final = "django.db.models.fields.related_descriptors.ManyRelatedManager" RELATED_FIELDS_CLASSES: Final = frozenset( ( FOREIGN_OBJECT_FULLNAME, FOREIGN_KEY_FULLNAME, ONETOONE_FIELD_FULLNAME, ) ) OPTIONS_CLASS_FULLNAME: Final = "django.db.models.options.Options" QUERYDICT_CLASS_FULLNAME: Final = "django.http.request.QueryDict" COMBINABLE_EXPRESSION_FULLNAME: Final = "django.db.models.expressions.Combinable" F_EXPRESSION_FULLNAME: Final = "django.db.models.expressions.F" FUNC_EXPRESSION_FULLNAME: Final = "django.db.models.expressions.Func" AGGREGATE_CLASS_FULLNAME: Final = "django.db.models.aggregates.Aggregate" ANY_ATTR_ALLOWED_CLASS_FULLNAME: Final = "django_stubs_ext.AnyAttrAllowed" TYPED_MODEL_META_FULLNAME: Final = "django_stubs_ext.db.models.TypedModelMeta" STR_PROMISE_FULLNAME: Final = "django.utils.functional._StrPromise" OBJECT_DOES_NOT_EXIST: Final = "django.core.exceptions.ObjectDoesNotExist" OBJECT_NOT_UPDATED: Final = "django.core.exceptions.ObjectNotUpdated" MULTIPLE_OBJECTS_RETURNED: Final = "django.core.exceptions.MultipleObjectsReturned" DJANGO_ABSTRACT_MODELS: Final = frozenset( ( ABSTRACT_BASE_USER_MODEL_FULLNAME, ABSTRACT_USER_MODEL_FULLNAME, PERMISSION_MIXIN_CLASS_FULLNAME, "django.contrib.sessions.base_session.AbstractBaseSession", ) ) typeddjango-django-stubs-fa03b48/mypy_django_plugin/lib/helpers.py000066400000000000000000000644331526064357400255370ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, Any, NamedTuple, Self, TypedDict, cast from mypy import checker from mypy.checker import TypeChecker from mypy.checkmember import analyze_member_access as _mypy_analyze_member_access from mypy.lookup import lookup_fully_qualified from mypy.maptype import map_instance_to_supertype from mypy.mro import calculate_mro from mypy.nodes import ( GDEF, MDEF, ArgKind, AssignmentStmt, Block, CallExpr, ClassDef, Context, Expression, MemberExpr, MypyFile, NameExpr, Node, RefExpr, StrExpr, SymbolTable, SymbolTableNode, TypeInfo, Var, ) from mypy.plugin import ( AttributeContext, CheckerPluginInterface, ClassDefContext, DynamicClassDefContext, FunctionContext, MethodContext, ) from mypy.semanal import SemanticAnalyzer from mypy.typeanal import make_optional_type from mypy.types import ( AnyType, CallableType, ExtraAttrs, Instance, LiteralType, NoneTyp, ProperType, TupleType, Type, TypedDictType, TypeOfAny, UnionType, get_proper_type, ) from mypy.types import Type as MypyType from mypy.typevars import fill_typevars, fill_typevars_with_any from mypy.version import __version__ as mypy_version from mypy_django_plugin.lib import fullnames mypy_version_info = tuple(map(int, mypy_version.partition("+")[0].split("."))) if TYPE_CHECKING: from collections.abc import Iterable, Iterator, Mapping from django.db.models.base import Model from mypy_django_plugin.django.context import DjangoContext class DjangoTypeMetadata(TypedDict, total=False): is_abstract_model: bool is_annotated_model: bool from_queryset_manager: str reverse_managers: dict[str, str] m2m_throughs: dict[str, str] m2m_managers: dict[str, str] manager_to_model: str def get_django_metadata(model_info: TypeInfo) -> DjangoTypeMetadata: return cast("DjangoTypeMetadata", model_info.metadata.setdefault("django", {})) def get_reverse_manager_info( api: TypeChecker | SemanticAnalyzer, model_info: TypeInfo, derived_from: str ) -> TypeInfo | None: manager_fullname = get_django_metadata(model_info).get("reverse_managers", {}).get(derived_from) if not manager_fullname: return None return lookup_fully_qualified_typeinfo(api, manager_fullname) def set_reverse_manager_info(model_info: TypeInfo, derived_from: str, fullname: str) -> None: get_django_metadata(model_info).setdefault("reverse_managers", {})[derived_from] = fullname def get_many_to_many_manager_info( api: TypeChecker | SemanticAnalyzer, *, to: TypeInfo, derived_from: str ) -> TypeInfo | None: manager_fullname = get_django_metadata(to).get("m2m_managers", {}).get(derived_from) if not manager_fullname: return None return lookup_fully_qualified_typeinfo(api, manager_fullname) def set_many_to_many_manager_info(to: TypeInfo, derived_from: str, manager_info: TypeInfo) -> None: get_django_metadata(to).setdefault("m2m_managers", {})[derived_from] = manager_info.fullname def mark_as_annotated_model(model: TypeInfo) -> None: get_django_metadata(model)["is_annotated_model"] = True def is_annotated_model(model: TypeInfo) -> bool: return get_django_metadata(model).get("is_annotated_model", False) def get_or_create_annotated_type(api: SemanticAnalyzer, model_info: TypeInfo, annotations_info: TypeInfo) -> TypeInfo: """Look up or create the `Model@AnnotatedWith` synthetic class for *model_info*.""" annotated_model_name = model_info.name + "@AnnotatedWith" annotated_model = lookup_fully_qualified_typeinfo(api, model_info.fullname + "@AnnotatedWith") if annotated_model is None: model_type = fill_typevars_with_any(model_info) assert isinstance(model_type, Instance) annotations_type = fill_typevars(annotations_info) assert isinstance(annotations_type, Instance) model_module = api.modules[model_info.module_name] annotated_model = add_new_class_for_module( model_module, name=annotated_model_name, bases=[model_type, annotations_type] ) annotated_model.defn.type_vars = annotations_info.defn.type_vars annotated_model.add_type_vars() mark_as_annotated_model(annotated_model) return annotated_model class IncompleteDefnException(Exception): pass def lookup_fully_qualified_typeinfo(api: TypeChecker | SemanticAnalyzer, fullname: str) -> TypeInfo | None: sym = lookup_fully_qualified(fullname, api.modules) node = sym.node if sym is not None else None if not isinstance(node, TypeInfo): return None return node def lookup_class_typeinfo(api: TypeChecker, klass: type | None) -> TypeInfo | None: if klass is None: return None fullname = get_class_fullname(klass) return lookup_fully_qualified_typeinfo(api, fullname) def get_class_fullname(klass: type) -> str: return klass.__module__ + "." + klass.__qualname__ def get_min_argument_count(ctx: MethodContext | FunctionContext) -> int: """ Return the number of non-star arguments passed to the function. Excludes *args and **kwargs since their count is indeterminate. """ return sum(not kind.is_star() for kinds in ctx.arg_kinds for kind in kinds) class DjangoModel(NamedTuple): """A small wrapper around a django model runtime object and associated mypy type info""" # The Django model at runtime cls: type[Model] # The associated Mypy Instance typ: Instance # Is an annotated variant of a model ie `MyModel@AnnotatedWith`. See `AddAnnotateUtilities` is_annotated: bool @property def info(self) -> TypeInfo: return self.typ.type @classmethod def from_model_type(cls, model_type: Instance, django_context: DjangoContext) -> Self | None: model_info = model_type.type is_annotated = is_annotated_model(model_info) model_cls = ( django_context.get_model_class_by_fullname(model_info.bases[0].type.fullname) if is_annotated else django_context.get_model_class_by_fullname(model_info.fullname) ) if model_cls is None: return None return cls(cls=model_cls, typ=model_type, is_annotated=is_annotated) def extract_model_type_from_queryset(queryset_type: Instance) -> Instance | None: """Extract the django model `Instance` associated to a queryset `Instance`""" for base_type in [queryset_type, *queryset_type.type.bases]: if ( # Queryset/Manager subclasses providing the model type as a type param # Ex: # class MyQuerySet(models.QuerySet[MyModel]): # ... not len(base_type.args) # Manager generated by `ProcessManyToManyFields.create_many_related_manager` # type param is the Through model, not the model associated with the queryset. # We need to skip in that case to get it from the parent `ManyRelatedManager` Instance. or base_type.type.has_base(fullnames.MANY_RELATED_MANAGER) ): continue model = get_proper_type(base_type.args[0]) if isinstance(model, Instance) and is_model_type(model.type): return model return None def get_model_info_from_qs_ctx( ctx: MethodContext, django_context: DjangoContext, ) -> DjangoModel | None: """ Extract DjangoModel details from a queryset/manager `MethodContext` """ if not (isinstance(ctx.type, Instance) and (model_type := extract_model_type_from_queryset(ctx.type))): return None return DjangoModel.from_model_type(model_type, django_context) def _get_class_init_type(call: CallExpr) -> CallableType | None: callee_node: Node | None = call.callee if isinstance(callee_node, RefExpr): callee_node = callee_node.node if ( isinstance(callee_node, TypeInfo) and (init_sym := callee_node.get("__init__")) and isinstance((init_type := get_proper_type(init_sym.type)), CallableType) ): return init_type return None def get_class_init_argument_by_name(call: CallExpr, name: str) -> Expression | None: """Adaptation of `mypy.plugins.common._get_argument` for class initializers""" callee_type = _get_class_init_type(call) if not callee_type: return None argument = callee_type.argument_by_name(name) if not argument: return None assert argument.name for i, (attr_name, attr_value) in enumerate( zip(call.arg_names, call.args, strict=False), start=1, # Start at one to skip first `self` arg ): if argument.pos is not None and not attr_name and i == argument.pos: return attr_value if attr_name == argument.name: return attr_value return None def get_call_argument_by_name(ctx: FunctionContext | MethodContext, name: str) -> Expression | None: """ Return the expression for the specific argument. This helper supports named and positional arguments and should only be used with non-star arguments. Ex: Given `def my_func(a: int, b: str), `get_call_argument_by_name(ctx, "b")` works for` - `my_func(1, b="x")` - `my_func(1, "x")` """ # try and pull the named argument from the caller first for kinds, argnames, args in zip(ctx.arg_kinds, ctx.arg_names, ctx.args, strict=False): for kind, argname, arg in zip(kinds, argnames, args, strict=False): if kind == ArgKind.ARG_NAMED and argname == name: return arg if name not in ctx.callee_arg_names: return None idx = ctx.callee_arg_names.index(name) args = ctx.args[idx] if len(args) != 1: # Either an error or no value passed. return None return args[0] def get_bool_call_argument_by_name(ctx: FunctionContext | MethodContext, name: str, *, default: bool) -> bool: """ Return the boolean value for an argument or the default if it's not found. """ arg_value = get_call_argument_by_name(ctx, name) if arg_value is not None: parsed_value = parse_bool(arg_value) if parsed_value is not None: return parsed_value return default def get_call_argument_type_by_name(ctx: FunctionContext | MethodContext, name: str) -> MypyType | None: """Return the type for the specific argument. This helper should only be used with non-star arguments. """ if name not in ctx.callee_arg_names: return None idx = ctx.callee_arg_names.index(name) arg_types = ctx.arg_types[idx] if len(arg_types) != 1: # Either an error or no value passed. return None return arg_types[0] def is_optional(typ: MypyType) -> bool: typ = get_proper_type(typ) return isinstance(typ, UnionType) and any(isinstance(get_proper_type(item), NoneTyp) for item in typ.items) # Duplicating mypy.semanal_shared.parse_bool because importing it directly caused ImportError (#1784) def parse_bool(expr: Expression) -> bool | None: if isinstance(expr, NameExpr): if expr.fullname == "builtins.True": return True if expr.fullname == "builtins.False": return False return None def get_literal_str_type(typ: Type) -> str | None: """Extract the str value of a string like type if possible""" typ = get_proper_type(typ) if (isinstance(typ, LiteralType) and isinstance((literal_value := typ.value), str)) or ( isinstance(typ, Instance) and isinstance(typ.last_known_value, LiteralType) and isinstance((literal_value := typ.last_known_value.value), str) ): return literal_value return None def has_any_of_bases(info: TypeInfo, bases: Iterable[str]) -> bool: for base_fullname in bases: if info.has_base(base_fullname): return True return False def iter_bases(info: TypeInfo) -> Iterator[Instance]: for base in info.bases: yield base yield from iter_bases(base.type) def get_private_descriptor_type(type_info: TypeInfo, private_field_name: str, is_nullable: bool) -> MypyType: """Return declared type of type_info's private_field_name (used for private Field attributes)""" sym = type_info.get(private_field_name) if sym is None: return AnyType(TypeOfAny.explicit) node = sym.node if isinstance(node, Var): descriptor_type = node.type if descriptor_type is None: return AnyType(TypeOfAny.explicit) if is_nullable: descriptor_type = make_optional_type(descriptor_type) return descriptor_type return AnyType(TypeOfAny.explicit) class FieldTypeArgs(NamedTuple): set: ProperType get: ProperType def get_field_type_args(field_type: Instance) -> FieldTypeArgs | None: """Extract (_ST, _GT) from a Field instance by mapping to the base Field class.""" base_field_info = next((base for base in field_type.type.mro if base.fullname == fullnames.FIELD_FULLNAME), None) if base_field_info is None: return None mapped = map_instance_to_supertype(field_type, base_field_info) return FieldTypeArgs(set=get_proper_type(mapped.args[0]), get=get_proper_type(mapped.args[1])) def get_nested_meta_node_for_current_class(info: TypeInfo) -> TypeInfo | None: metaclass_sym = info.names.get("Meta") if metaclass_sym is not None and isinstance(metaclass_sym.node, TypeInfo): return metaclass_sym.node return None def create_type_info(name: str, module: str, bases: list[Instance]) -> TypeInfo: # make new class expression classdef = ClassDef(name, Block([])) classdef.fullname = module + "." + name # make new TypeInfo new_typeinfo = TypeInfo(SymbolTable(), classdef, module) new_typeinfo.bases = bases calculate_mro(new_typeinfo) new_typeinfo.metaclass_type = new_typeinfo.calculate_metaclass_type() classdef.info = new_typeinfo return new_typeinfo def add_new_class_for_module( module: MypyFile, name: str, bases: list[Instance], fields: dict[str, MypyType] | None = None, no_serialize: bool = False, ) -> TypeInfo: new_class_unique_name = checker.gen_unique_name(name, module.names) new_typeinfo = create_type_info(new_class_unique_name, module.fullname, bases) # add fields if fields: for field_name, field_type in fields.items(): var = Var(field_name, type=field_type) var.info = new_typeinfo var._fullname = new_typeinfo.fullname + "." + field_name new_typeinfo.names[field_name] = SymbolTableNode( MDEF, var, plugin_generated=True, no_serialize=no_serialize ) module.names[new_class_unique_name] = SymbolTableNode( GDEF, new_typeinfo, plugin_generated=True, no_serialize=no_serialize ) return new_typeinfo def build_reparametrized_subclass( module: MypyFile, base_info: TypeInfo, name: str, *, unique_name: bool, line: int = -1 ) -> TypeInfo: """ Create a `TypeInfo` subclassing generic `base_info`, generic over the same type vars. """ base_instance = fill_typevars(base_info) assert isinstance(base_instance, Instance) if unique_name: info = add_new_class_for_module(module, name, bases=[base_instance]) else: info = create_type_info(name, module.fullname, bases=[base_instance]) info.defn.type_vars = base_info.defn.type_vars.copy() info.add_type_vars() info.set_line(line) info.defn.set_line(line) return info def get_current_module(api: TypeChecker) -> MypyFile: """ Scope is guaranteed to be initialized with the module as the first element of the stack. Inspired from https://github.com/python/mypy/blob/15b8ca967cc6187effcab23e6613da2db4546584/mypy/checker.py#L5788 """ current_module = api.scope.stack[0] assert isinstance(current_module, MypyFile) return current_module def make_oneoff_named_tuple( api: TypeChecker, name: str, fields: dict[str, MypyType], extra_bases: list[Instance] | None = None ) -> TupleType: current_module = get_current_module(api) if extra_bases is None: extra_bases = [] namedtuple_info = add_new_class_for_module( current_module, name, bases=[api.named_generic_type("typing.NamedTuple", []), *extra_bases], fields=fields ) return TupleType(list(fields.values()), fallback=Instance(namedtuple_info, [])) def extend_oneoff_named_tuple( api: TypeChecker, name: str, original: TupleType, extra_fields: Mapping[str, MypyType] ) -> TupleType: existing_fields = { field_name: sym.node.type or AnyType(TypeOfAny.special_form) for field_name, sym in original.partial_fallback.type.names.items() if sym.plugin_generated and isinstance(sym.node, Var) } return make_oneoff_named_tuple(api, name, {**existing_fields, **extra_fields}) def make_tuple(api: TypeChecker, fields: list[MypyType]) -> TupleType: # fallback for tuples is any builtins.tuple instance fallback = api.named_generic_type("builtins.tuple", [AnyType(TypeOfAny.special_form)]) return TupleType(fields, fallback=fallback) def convert_any_to_type(typ: MypyType, referred_to_type: MypyType) -> MypyType: proper_type = get_proper_type(typ) if isinstance(proper_type, UnionType): converted_items = [] for item in proper_type.items: converted_items.append(convert_any_to_type(item, referred_to_type)) return UnionType.make_union(converted_items, line=typ.line, column=typ.column) if isinstance(proper_type, Instance): args = [] for default_arg in proper_type.args: default_arg = get_proper_type(default_arg) if isinstance(default_arg, AnyType): args.append(referred_to_type) else: args.append(default_arg) return proper_type.copy_modified(args=args) if isinstance(proper_type, AnyType): return referred_to_type return typ def _get_fallback_typeddict(api: SemanticAnalyzer | CheckerPluginInterface) -> Instance: if isinstance(api, CheckerPluginInterface): return api.named_generic_type("typing._TypedDict", []) return api.named_type("typing._TypedDict", []) def make_typeddict( api: SemanticAnalyzer | CheckerPluginInterface, fields: dict[str, MypyType], ) -> TypedDictType: """Create a TypedDict from a python dict of field names and types.""" return TypedDictType( items=fields, required_keys=set(fields.keys()), readonly_keys=set(), fallback=_get_fallback_typeddict(api), ) def merge_typeddict( api: SemanticAnalyzer | CheckerPluginInterface, left: TypedDictType, right: TypedDictType, ) -> TypedDictType: """Merge two TypedDictType type into one with anonymous fallback.""" return TypedDictType( items={**left.items, **right.items}, required_keys={*left.required_keys, *right.required_keys}, readonly_keys={*left.readonly_keys, *right.readonly_keys}, fallback=_get_fallback_typeddict(api), ) def resolve_string_attribute_value(attr_expr: Expression, django_context: DjangoContext) -> str | None: if isinstance(attr_expr, StrExpr): return attr_expr.value if isinstance(attr_expr, NameExpr) and isinstance(attr_expr.node, Var) and attr_expr.node.type is not None: return get_literal_str_type(attr_expr.node.type) # support extracting from settings, in general case it's unresolvable yet if isinstance(attr_expr, MemberExpr): member_name = attr_expr.name if isinstance(attr_expr.expr, NameExpr) and attr_expr.expr.fullname == "django.conf.settings": if hasattr(django_context.settings, member_name): return getattr(django_context.settings, member_name) # type: ignore[no-any-return] return None def get_semanal_api(ctx: ClassDefContext | DynamicClassDefContext) -> SemanticAnalyzer: if not isinstance(ctx.api, SemanticAnalyzer): raise ValueError("Not a SemanticAnalyzer") return ctx.api def get_typechecker_api(ctx: AttributeContext | MethodContext | FunctionContext) -> TypeChecker: if not isinstance(ctx.api, TypeChecker): raise ValueError("Not a TypeChecker") return ctx.api def check_types_compatible( ctx: FunctionContext | MethodContext, *, expected_type: MypyType, actual_type: MypyType, error_message: str ) -> None: api = get_typechecker_api(ctx) api.check_subtype(actual_type, expected_type, ctx.context, error_message, "got", "expected") def add_new_sym_for_info( info: TypeInfo, name: str, sym_type: MypyType, *, no_serialize: bool = False, is_classvar: bool = False ) -> None: # type=: type of the variable itself var = Var(name=name, type=sym_type) # var.info: type of the object variable is bound to var.info = info var._fullname = info.fullname + "." + name var.is_initialized_in_class = True var.is_inferred = True var.is_classvar = is_classvar info.names[name] = SymbolTableNode(MDEF, var, plugin_generated=True, no_serialize=no_serialize) def is_abstract_model(model: TypeInfo) -> bool: if model.fullname in fullnames.DJANGO_ABSTRACT_MODELS: return True if not is_model_type(model): return False metadata = get_django_metadata(model) if metadata.get("is_abstract_model") is not None: return metadata["is_abstract_model"] meta = model.names.get("Meta") # Check if 'abstract' is declared in this model's 'class Meta' as # 'abstract = True' won't be inherited from a parent model. if meta is not None and isinstance(meta.node, TypeInfo) and "abstract" in meta.node.names: for stmt in meta.node.defn.defs.body: if ( # abstract = isinstance(stmt, AssignmentStmt) and len(stmt.lvalues) == 1 and isinstance(stmt.lvalues[0], NameExpr) and stmt.lvalues[0].name == "abstract" ): # abstract = True (builtins.bool) rhs_is_true = parse_bool(stmt.rvalue) is True # abstract: Literal[True] stmt_type = get_proper_type(stmt.type) is_literal_true = isinstance(stmt_type, LiteralType) and stmt_type.value is True metadata["is_abstract_model"] = rhs_is_true or is_literal_true return metadata["is_abstract_model"] metadata["is_abstract_model"] = False return False def resolve_lazy_reference( reference: str, *, api: TypeChecker | SemanticAnalyzer, django_context: DjangoContext, ctx: Context ) -> TypeInfo | None: """ Attempts to resolve a lazy reference(e.g. ".") to a 'TypeInfo' instance. """ if "." not in reference: # -- needs prefix of . We can't implicitly solve # what app label this should be, yet. return None # Reference conforms to the structure of a lazy reference: '.' fullname = django_context.model_class_fullname_for_label(reference) if fullname is not None: model_info = lookup_fully_qualified_typeinfo(api, fullname) if model_info is not None: return model_info if isinstance(api, SemanticAnalyzer) and not api.final_iteration: # Getting this far, where Django matched the reference but we still can't # find it, we want to defer api.defer() else: api.fail("Could not match lazy reference with any model", ctx) return None def is_model_type(info: TypeInfo) -> bool: return info.metaclass_type is not None and info.metaclass_type.type.has_base(fullnames.MODEL_METACLASS_FULLNAME) def get_model_from_expression( expr: Expression, *, self_model: TypeInfo, api: TypeChecker | SemanticAnalyzer, django_context: DjangoContext, ) -> Instance | None: """ Attempts to resolve an expression to a 'TypeInfo' instance. Any lazy reference argument(e.g. ".") to a Django model is also attempted. """ if isinstance(expr, RefExpr) and isinstance(expr.node, TypeInfo): if is_model_type(expr.node): return Instance(expr.node, []) if isinstance(expr, StrExpr) and expr.value == "self": return Instance(self_model, []) lazy_reference = None if isinstance(expr, StrExpr): lazy_reference = expr.value elif ( isinstance(expr, MemberExpr) and isinstance(expr.expr, NameExpr) and f"{expr.expr.fullname}.{expr.name}" == fullnames.AUTH_USER_MODEL_FULLNAME ): lazy_reference = django_context.settings.AUTH_USER_MODEL if lazy_reference is not None: model_info = resolve_lazy_reference(lazy_reference, api=api, django_context=django_context, ctx=expr) if model_info is not None: return Instance(model_info, []) return None def fill_manager(manager: TypeInfo, typ: MypyType) -> Instance: return Instance(manager, [typ] if manager.is_generic() else []) def merge_extra_attrs( base_extra_attrs: ExtraAttrs | None, *, new_attrs: dict[str, MypyType] | None = None, new_immutable: set[str] | None = None, ) -> ExtraAttrs: """ Create a new `ExtraAttrs` by merging new attributes/immutable fields into a base. If base_extra_attrs is None, creates a fresh ExtraAttrs with only the new values. """ if base_extra_attrs: return ExtraAttrs( attrs={**base_extra_attrs.attrs, **new_attrs} if new_attrs is not None else base_extra_attrs.attrs.copy(), immutable=( base_extra_attrs.immutable | new_immutable if new_immutable is not None else base_extra_attrs.immutable.copy() ), mod_name=None, ) return ExtraAttrs( attrs=new_attrs or {}, immutable=new_immutable, mod_name=None, ) def analyze_member_access( name: str, typ: MypyType, context: Context, *, is_lvalue: bool, is_super: bool, is_operator: bool, original_type: MypyType, chk: TypeChecker, ) -> MypyType: # TODO: [mypy 1.16+] Remove this workaround for passing `msg` to `analyze_member_access()`. extra: dict[str, Any] = {} if mypy_version_info < (1, 16): extra["msg"] = chk.msg return _mypy_analyze_member_access( name, typ, context, is_lvalue=is_lvalue, is_super=is_super, is_operator=is_operator, original_type=original_type, chk=chk, **extra, ) typeddjango-django-stubs-fa03b48/mypy_django_plugin/main.py000066400000000000000000000445251526064357400242530ustar00rootroot00000000000000from __future__ import annotations import importlib.metadata import itertools import sys from functools import cache, cached_property, partial from typing import TYPE_CHECKING, Any, Final from mypy.build import PRI_MED, PRI_MYPY from mypy.modulefinder import mypy_path from mypy.nodes import Import, ImportFrom, MypyFile, TypeInfo from mypy.plugin import ( AnalyzeTypeContext, AttributeContext, ClassDefContext, DynamicClassDefContext, FunctionContext, MethodContext, Plugin, ReportConfigContext, ) from typing_extensions import override from mypy_django_plugin.config import DjangoPluginConfig from mypy_django_plugin.django.context import DjangoContext from mypy_django_plugin.exceptions import UnregisteredModelError from mypy_django_plugin.lib import fullnames, helpers from mypy_django_plugin.transformers import ( apps, choices, fields, forms, init_create, manytomany, manytoone, meta, orm_lookups, querysets, save, settings, ) from mypy_django_plugin.transformers.auth import get_user_model from mypy_django_plugin.transformers.functional import resolve_str_promise_attribute from mypy_django_plugin.transformers.managers import ( add_as_manager_to_queryset_class, create_new_manager_class_from_from_queryset_method, reparametrize_any_field_hook, reparametrize_any_manager_hook, reparametrize_any_queryset_hook, resolve_manager_method, ) from mypy_django_plugin.transformers.models import ( MetaclassAdjustments, handle_annotated_type, process_model_class, set_auth_user_model_boolean_fields, ) from mypy_django_plugin.transformers.request import check_querydict_is_mutable if TYPE_CHECKING: from collections.abc import Callable from mypy.options import Options from mypy.types import Type as MypyType _APPS_MODULES: Final = frozenset({"django.apps", "django.apps.registry"}) class NewSemanalDjangoPlugin(Plugin): def __init__(self, options: Options) -> None: super().__init__(options) self.plugin_config = DjangoPluginConfig(options.config_file) # Add paths from MYPYPATH env var sys.path.extend(mypy_path()) # Add paths from mypy_path config option sys.path.extend(options.mypy_path) self.django_context = DjangoContext(self.plugin_config.django_settings_module) def _get_typeinfo_or_none(self, class_name: str) -> TypeInfo | None: sym = self.lookup_fully_qualified(class_name) if sym is not None and isinstance(sym.node, TypeInfo): return sym.node return None def _new_dependency(self, module: str, priority: int = PRI_MYPY) -> tuple[int, str, int]: fake_lineno = -1 return (priority, module, fake_lineno) def _file_imports_apps_module(self, file: MypyFile) -> bool: for import_node in file.imports: if isinstance(import_node, Import): if any(module in _APPS_MODULES for module, _ in import_node.ids): return True elif isinstance(import_node, ImportFrom) and import_node.id in _APPS_MODULES: return True return False @override def get_additional_deps(self, file: MypyFile) -> list[tuple[int, str, int]]: # for settings if file.fullname == "django.conf" and self.django_context.django_settings_module: return [self._new_dependency(self.django_context.django_settings_module, PRI_MED)] # for values / values_list if file.fullname == "django.db.models": return [self._new_dependency("typing"), self._new_dependency("django_stubs_ext")] # for `get_user_model()` if file.fullname == "django.contrib.auth" or file.fullname in {"django.http", "django.http.request"}: auth_user_model_name = self.django_context.settings.AUTH_USER_MODEL try: auth_user_module = self.django_context.apps_registry.get_model(auth_user_model_name).__module__ except LookupError: # get_user_model() model app is not installed return [] return [self._new_dependency(auth_user_module), self._new_dependency("django_stubs_ext")] deps: set[tuple[int, str, int]] = set() # A file using `apps.get_model()` may depend on any model module. # Skip stubs to keep Django's own build graph untouched. if not file.is_stub and self._file_imports_apps_module(file): deps.update( self._new_dependency(module) for module in self.django_context.model_modules if module != file.fullname ) # ensure that all mentions to='someapp.SomeModel' are loaded with corresponding related Fields defined_model_classes = self.django_context.model_modules.get(file.fullname) if not defined_model_classes: return list(deps) for model_class in defined_model_classes.values(): for field in itertools.chain( # forward relations self.django_context.get_model_related_fields(model_class), # reverse relations - `related_objects` is private API (according to docstring) model_class._meta.related_objects, ): try: related_model_cls = self.django_context.get_field_related_model_cls(field) # type: ignore[arg-type] except UnregisteredModelError: continue related_model_module = related_model_cls.__module__ if related_model_module != file.fullname: deps.add(self._new_dependency(related_model_module)) return [ *deps, # For `QuerySet.annotate` self._new_dependency("django_stubs_ext"), # For `TypedModelMeta` lookup in model transformers self._new_dependency("django_stubs_ext.db.models"), # For `Manager.from_queryset` self._new_dependency("django.db.models.query"), ] @override def get_function_hook(self, fullname: str) -> Callable[[FunctionContext], MypyType] | None: info = self._get_typeinfo_or_none(fullname) if not info: return None if info.has_base(fullnames.FIELD_FULLNAME): return partial(fields.transform_into_proper_return_type, django_context=self.django_context) if helpers.is_model_type(info): return partial(init_create.typecheck_model_init, django_context=self.django_context) if info.has_base(fullnames.BASE_MANAGER_CLASS_FULLNAME): return querysets.determine_proper_manager_type if info.has_base(fullnames.PREFETCH_CLASS_FULLNAME): return partial(querysets.specialize_prefetch_type, django_context=self.django_context) if info.has_base(fullnames.FUNC_EXPRESSION_FULLNAME): return querysets.reparameterize_func_output_field return None @cached_property def manager_and_queryset_method_hooks(self) -> dict[str, Callable[[MethodContext], MypyType]]: typecheck_filtering_method = partial(orm_lookups.typecheck_queryset_filter, django_context=self.django_context) return { "values": partial(querysets.extract_proper_type_queryset_values, django_context=self.django_context), "values_list": partial( querysets.extract_proper_type_queryset_values_list, django_context=self.django_context ), "alias": partial(querysets.extract_proper_type_queryset_annotate, django_context=self.django_context), "annotate": partial(querysets.extract_proper_type_queryset_annotate, django_context=self.django_context), "create": partial(init_create.typecheck_model_create, django_context=self.django_context), "acreate": partial(init_create.typecheck_model_acreate, django_context=self.django_context), "filter": typecheck_filtering_method, "get": typecheck_filtering_method, "aget": typecheck_filtering_method, "get_or_create": typecheck_filtering_method, "aget_or_create": typecheck_filtering_method, "update_or_create": typecheck_filtering_method, "aupdate_or_create": typecheck_filtering_method, "exclude": typecheck_filtering_method, "prefetch_related": partial( querysets.extract_prefetch_related_annotations, django_context=self.django_context ), "select_related": partial(querysets.validate_select_related, django_context=self.django_context), "bulk_update": partial( querysets.validate_bulk_update, django_context=self.django_context, method="bulk_update" ), "abulk_update": partial( querysets.validate_bulk_update, django_context=self.django_context, method="abulk_update" ), "bulk_create": partial( querysets.validate_bulk_create, django_context=self.django_context, method="bulk_create" ), "abulk_create": partial( querysets.validate_bulk_create, django_context=self.django_context, method="abulk_create" ), "order_by": partial(querysets.validate_order_by, django_context=self.django_context), "earliest": partial(querysets.validate_order_by, django_context=self.django_context), "aearliest": partial(querysets.validate_order_by, django_context=self.django_context), "latest": partial(querysets.validate_order_by, django_context=self.django_context), "alatest": partial(querysets.validate_order_by, django_context=self.django_context), "defer": partial(querysets.validate_defer_only, django_context=self.django_context, is_defer=True), "only": partial(querysets.validate_defer_only, django_context=self.django_context, is_defer=False), "distinct": partial(querysets.validate_distinct, django_context=self.django_context), "update": partial(querysets.validate_update, django_context=self.django_context), "aupdate": partial(querysets.validate_update, django_context=self.django_context), "in_bulk": partial(querysets.validate_in_bulk, django_context=self.django_context), "ain_bulk": partial(querysets.validate_in_bulk, django_context=self.django_context), } @override def get_method_hook(self, fullname: str) -> Callable[[MethodContext], MypyType] | None: class_fullname, _, method_name = fullname.rpartition(".") # Methods called very often -- short circuit for minor speed up if method_name == "__init_subclass__" or fullname.startswith("builtins."): return None if method_name == "__get__": hooks = { fullnames.MANYTOMANY_FIELD_FULLNAME: manytomany.refine_many_to_many_related_manager, fullnames.MANY_TO_MANY_DESCRIPTOR: manytomany.refine_many_to_many_related_manager, fullnames.REVERSE_MANY_TO_ONE_DESCRIPTOR: manytoone.refine_many_to_one_related_manager, } return hooks.get(class_fullname) info = self._get_typeinfo_or_none(class_fullname) if not info: return None if class_fullname.endswith("QueryDict") and info.has_base(fullnames.QUERYDICT_CLASS_FULLNAME): return check_querydict_is_mutable if method_name in self.manager_and_queryset_method_hooks and helpers.has_any_of_bases( info, [fullnames.QUERYSET_CLASS_FULLNAME, fullnames.MANAGER_CLASS_FULLNAME] ): return self.manager_and_queryset_method_hooks[method_name] if method_name in ("save", "asave") and helpers.is_model_type(info): return partial(save.validate_save_update_fields, django_context=self.django_context, method=method_name) if method_name == "get_field" and info.has_base(fullnames.OPTIONS_CLASS_FULLNAME): return partial(meta.return_proper_field_type_from_get_field, django_context=self.django_context) if ( method_name == "get_model" and info.has_base(fullnames.APPS_FULLNAME) # `StateApps` returns historical models rebuilt from migration state whose fields # differ from the current definitions, so narrowing to the current model is wrong. and not info.has_base(fullnames.STATE_APPS_FULLNAME) ): return partial(apps.resolve_model_for_get_model, django_context=self.django_context) if helpers.has_any_of_bases(info, [fullnames.QUERYSET_CLASS_FULLNAME, fullnames.MANAGER_CLASS_FULLNAME]): return partial(querysets.merge_annotations_from_custom_method, django_context=self.django_context) return None @override def get_customize_class_mro_hook(self, fullname: str) -> Callable[[ClassDefContext], None] | None: info = self._get_typeinfo_or_none(fullname) if not info: return None if info.has_base(fullnames.BASE_MANAGER_CLASS_FULLNAME): return reparametrize_any_manager_hook if info.has_base(fullnames.QUERYSET_CLASS_FULLNAME): return reparametrize_any_queryset_hook if info.has_base(fullnames.FIELD_FULLNAME): return reparametrize_any_field_hook return None @override def get_metaclass_hook(self, fullname: str) -> Callable[[ClassDefContext], None] | None: if fullname == fullnames.MODEL_METACLASS_FULLNAME: return partial(MetaclassAdjustments.adjust_model_class, plugin_config=self.plugin_config) return None @override def get_base_class_hook(self, fullname: str) -> Callable[[ClassDefContext], None] | None: info = self._get_typeinfo_or_none(fullname) if not info: return None # Base class is a Model class definition if helpers.is_model_type(info): return partial(process_model_class, django_context=self.django_context) # Base class is a Form class definition if info.has_base(fullnames.BASEFORM_CLASS_FULLNAME): return forms.make_meta_nested_class_inherit_from_any # Base class is a QuerySet class definition if info.has_base(fullnames.QUERYSET_CLASS_FULLNAME): return add_as_manager_to_queryset_class return None @override def get_attribute_hook(self, fullname: str) -> Callable[[AttributeContext], MypyType] | None: class_name, _, attr_name = fullname.rpartition(".") # Lookup of a settings variable if class_name == fullnames.DUMMY_SETTINGS_BASE_CLASS: return partial( settings.get_type_of_settings_attribute, django_context=self.django_context, plugin_config=self.plugin_config, ) info = self._get_typeinfo_or_none(class_name) if not info: return None # Lookup of the '.is_superuser' attribute if info.has_base(fullnames.PERMISSION_MIXIN_CLASS_FULLNAME) and attr_name == "is_superuser": return partial(set_auth_user_model_boolean_fields, django_context=self.django_context) # Lookup of the 'user.is_staff' or 'user.is_active' attribute if info.has_base(fullnames.ABSTRACT_USER_MODEL_FULLNAME) and attr_name in ("is_staff", "is_active"): return partial(set_auth_user_model_boolean_fields, django_context=self.django_context) # Lookup of a method on a dynamically generated manager class # i.e. a manager class only existing while mypy is running, not collected from the AST if info.has_base( fullnames.BASE_MANAGER_CLASS_FULLNAME ) and "from_queryset_manager" in helpers.get_django_metadata(info): return resolve_manager_method if info.has_base(fullnames.STR_PROMISE_FULLNAME): return resolve_str_promise_attribute if ( info.has_base(fullnames.CHOICES_TYPE_METACLASS_FULLNAME) and attr_name in {"choices", "labels", "values", "__empty__"} ) or (info.has_base(fullnames.CHOICES_CLASS_FULLNAME) and attr_name in {"label", "value"}): return choices.transform_into_proper_attr_type return None @override def get_type_analyze_hook(self, fullname: str) -> Callable[[AnalyzeTypeContext], MypyType] | None: if fullname in fullnames.ANNOTATED_TYPES_FULLNAMES: return partial(handle_annotated_type, fullname=fullname) if fullname == "django.contrib.auth.models._User": return partial(get_user_model, django_context=self.django_context) return None @override def get_dynamic_class_hook(self, fullname: str) -> Callable[[DynamicClassDefContext], None] | None: # Create a new manager class definition when a manager's '.from_queryset' classmethod is called class_name, _, method_name = fullname.rpartition(".") if method_name == "from_queryset": info = self._get_typeinfo_or_none(class_name) if info and info.has_base(fullnames.BASE_MANAGER_CLASS_FULLNAME): return create_new_manager_class_from_from_queryset_method return None @cached_property def _report_config_data(self) -> dict[str, Any]: # Cache would be cleared if any settings do change. extra_data = { # The additional deps depend on the installed apps "INSTALLED_APPS": list(self.django_context.settings.INSTALLED_APPS), # The user model determines the `_User` alias expansion "AUTH_USER_MODEL": self.django_context.settings.AUTH_USER_MODEL, # The implicit `pk` field type depends on `DEFAULT_AUTO_FIELD` "DEFAULT_AUTO_FIELD": self.django_context.settings.DEFAULT_AUTO_FIELD, "django_version": _package_version("django"), "django_stubs_version": _package_version("django-stubs"), } if (django_stubs_ext_version := _package_version("django-stubs-ext")) is not None: extra_data["django_stubs_ext_version"] = django_stubs_ext_version return self.plugin_config.to_json(extra_data) @override def report_config_data(self, ctx: ReportConfigContext) -> dict[str, Any]: return self._report_config_data @cache def _package_version(package: str) -> str | None: try: return importlib.metadata.version(package) except importlib.metadata.PackageNotFoundError: return None def plugin(version: str) -> type[NewSemanalDjangoPlugin]: return NewSemanalDjangoPlugin typeddjango-django-stubs-fa03b48/mypy_django_plugin/py.typed000066400000000000000000000000001526064357400244300ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/000077500000000000000000000000001526064357400254705ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/__init__.py000066400000000000000000000000001526064357400275670ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/apps.py000066400000000000000000000035351526064357400270130ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from mypy.nodes import StrExpr from mypy.types import Instance, TypeType from mypy.types import Type as MypyType from mypy_django_plugin.lib import helpers if TYPE_CHECKING: from mypy.plugin import MethodContext from mypy_django_plugin.django.context import DjangoContext def _get_model_lazy_reference(ctx: MethodContext) -> str | None: """Resolve a `get_model` call to a `.` lazy reference.""" app_label = helpers.get_call_argument_by_name(ctx, "app_label") model_name = helpers.get_call_argument_by_name(ctx, "model_name") if not isinstance(app_label, StrExpr): return None if model_name is None: # Shortcut form: `app_label` is already ".". return app_label.value if isinstance(model_name, StrExpr): return f"{app_label.value}.{model_name.value}" return None def resolve_model_for_get_model(ctx: MethodContext, django_context: DjangoContext) -> MypyType: """Narrow the return type of an `apps.get_model()` call to the referenced model. apps.get_model("myapp.MyModel") # -> type[myapp.models.MyModel] apps.get_model("myapp", "MyModel") # -> type[myapp.models.MyModel] The model name is case-insensitive, so `"myapp.mymodel"` resolves too. Non-literal arguments keep the permissive `type[Any]` fallback: apps.get_model(app_label, model_name) # -> type[Any] """ if (lazy_reference := _get_model_lazy_reference(ctx)) and ( model_info := helpers.resolve_lazy_reference( lazy_reference, api=helpers.get_typechecker_api(ctx), django_context=django_context, ctx=ctx.context, ) ): return TypeType(Instance(model_info, [])) return ctx.default_return_type typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/auth.py000066400000000000000000000034121526064357400270030ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from mypy.nodes import TypeInfo from mypy.semanal import SemanticAnalyzer from mypy.typeanal import TypeAnalyser from mypy.types import PlaceholderType, ProperType from mypy.types import Type as MypyType from mypy.typevars import fill_typevars_with_any from mypy_django_plugin.lib import fullnames, helpers if TYPE_CHECKING: from mypy.plugin import AnalyzeTypeContext from mypy_django_plugin.django.context import DjangoContext def _get_abstract_base_user(api: SemanticAnalyzer) -> ProperType: sym = api.lookup_fully_qualified(fullnames.ABSTRACT_BASE_USER_MODEL_FULLNAME) assert isinstance(sym.node, TypeInfo) return fill_typevars_with_any(sym.node) def get_user_model(ctx: AnalyzeTypeContext, django_context: DjangoContext) -> MypyType: assert isinstance(ctx.api, TypeAnalyser) assert isinstance(ctx.api.api, SemanticAnalyzer) if not django_context.is_contrib_auth_installed: return _get_abstract_base_user(ctx.api.api) auth_user_model = django_context.settings.AUTH_USER_MODEL model_info = helpers.resolve_lazy_reference( auth_user_model, api=ctx.api.api, django_context=django_context, ctx=ctx.context ) if model_info is None: fullname = django_context.model_class_fullname_for_label(auth_user_model) if fullname is not None: # When we've tried to resolve 'AUTH_USER_MODEL' but got no class back but # we notice that its value is recognised we'll return a placeholder for # the class as we expect it to exist later on. return PlaceholderType(fullname=fullname, args=[], line=ctx.context.line) return _get_abstract_base_user(ctx.api.api) return fill_typevars_with_any(model_info) typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/choices.py000066400000000000000000000253761526064357400274740ustar00rootroot00000000000000from __future__ import annotations from enum import Enum, auto from typing import TYPE_CHECKING from django.db.models.constants import LOOKUP_SEP from mypy.nodes import MemberExpr, NameExpr, SuperExpr, TypeAlias, TypeInfo, Var from mypy.typeanal import make_optional_type from mypy.types import ( AnyType, Instance, LiteralType, Overloaded, ProperType, TupleType, TypeOfAny, TypeType, TypeVarType, UnionType, get_proper_type, ) from mypy.types import Type as MypyType from mypy_django_plugin.lib import fullnames if TYPE_CHECKING: from mypy.plugin import AttributeContext # TODO: [mypy 1.14+] Remove this backport of `TypeInfo.enum_members`. def _get_enum_members(info: TypeInfo) -> list[str]: try: return info.enum_members except AttributeError: # mypy < 1.14 pass return [ name for name, sym in info.names.items() if ( isinstance(sym.node, Var) and name not in ("_ignore_", "_order_", "__order__") and not name.startswith(LOOKUP_SEP) and sym.node.has_explicit_value ) ] class _LabelLaziness(Enum): LAZY = auto() NON_LAZY = auto() MIXED = auto() @classmethod def make(cls, lazy: bool | None) -> _LabelLaziness: return cls.LAZY if lazy else cls.NON_LAZY def _is_lazy_string(ty: MypyType | None) -> bool: proper_type = get_proper_type(ty) return isinstance(proper_type, Instance) and proper_type.type.has_base(fullnames.STR_PROMISE_FULLNAME) def _is_lazy_member(node: TypeInfo, member_name: str) -> bool: if (sym := node.get(member_name)) is None: return False _member_type = get_proper_type(sym.type) if not isinstance(_member_type, TupleType): # Member has auto-generated plain string label - enum.auto() or no explicit label. return False if _member_type.length() < 2: # There need to be at least two items in the tuple. return False return _is_lazy_string(_member_type.items[-1]) def _label_laziness(node: TypeInfo) -> _LabelLaziness: """ Check whether a choices type has lazy strings for labels. This is used to determine whether a choices type uses lazy strings or non-lazy string for labels such that a more simple type can be used instead of the default in the stubs. """ assert node.is_enum if (sym := node.get("__empty__")) is not None: lazy = _is_lazy_string(sym.type) else: lazy = None # TODO: [mypy 1.14+] Use `node.enum_members` and remove `_get_enum_members()` backport. for member_name in _get_enum_members(node): member_lazy = _is_lazy_member(node, member_name) if lazy is None: lazy = member_lazy elif lazy != member_lazy: return _LabelLaziness.MIXED return _LabelLaziness.make(lazy) def _try_replace_label(typ: ProperType, label_laziness: _LabelLaziness) -> MypyType: """ Attempt to replace a label with a modified version. If there are no lazy strings for labels, remove the lazy string type, and vice-versa. """ if label_laziness is _LabelLaziness.MIXED: return typ if not isinstance(typ, UnionType): # If it's not a union, then it already is likely just `str` and not lazy. return typ items = [ t for t in map(get_proper_type, typ.items) if isinstance(t, Instance) and t.type.has_base(fullnames.STR_PROMISE_FULLNAME) == (label_laziness is _LabelLaziness.LAZY) ] # If we only have one item use that, otherwise make a new union. return UnionType.make_union(items) if len(items) > 1 else items[0] def _try_replace_value(typ: ProperType, base_type: Instance | None, has_empty_label: bool) -> MypyType: """ Attempt to replace a label with a modified version. If the value is of any type, then attempt to use the base type of the choices type. If the choices type has `__empty__` defined, then make the value type optional. """ has_unknown_base = isinstance(typ, AnyType) if has_empty_label and has_unknown_base and base_type is not None: return make_optional_type(base_type) if has_empty_label: return make_optional_type(typ) if has_unknown_base and base_type is not None: return base_type return typ def _get_enum_type_from_union_of_literals(typ: UnionType) -> MypyType: """ Attempts to resolve a single enum type from a union of enum literals. If this cannot be resolved, the original is returned. """ types = set() for item in typ.items: item = get_proper_type(item) if not isinstance(item, LiteralType) or not item.fallback.type.is_enum: # If anything that isn't a literal of an enum type is encountered, return the original. return typ types.add(item.fallback) # If there is only one enum type seen, return that otherwise return the original. return types.pop() if len(types) == 1 else typ def transform_into_proper_attr_type(ctx: AttributeContext) -> MypyType: """ A `get_attribute_hook` to make `.choices` and `.values` optional if `__empty__` is defined. When the `__empty__` label is specified, the `choices` and `values` properties can return a blank choice/value. This hook will amend the type returned by those properties. """ if isinstance(ctx.context, MemberExpr): expr = ctx.context.expr name = ctx.context.name elif isinstance(ctx.context, SuperExpr): expr = ctx.context name = ctx.context.name else: ctx.api.fail("Unable to resolve type of property", ctx.context) return AnyType(TypeOfAny.from_error) node: TypeInfo | None = None if isinstance(expr, MemberExpr | NameExpr): if isinstance(expr.node, TypeInfo): node = expr.node elif isinstance(expr.node, TypeAlias): alias = get_proper_type(expr.node.target) if isinstance(alias, Instance): node = alias.type elif isinstance(expr, SuperExpr): node = expr.info _node_type: ProperType | None = None if node is None: _node_type = get_proper_type(ctx.api.get_expression_type(expr)) if isinstance(_node_type, UnionType): # If this is a union of enum literals, check if they're all of the same enum type and # use that type instead. This situation often occurs where there is comparison to an # enum member in a branch. _node_type = get_proper_type(_get_enum_type_from_union_of_literals(_node_type)) if isinstance(_node_type, LiteralType) and _node_type.is_enum_literal(): _node_type = _node_type.fallback if isinstance(_node_type, TypeType): _node_type = _node_type.item if isinstance(_node_type, TypeVarType): _node_type = get_proper_type(_node_type.upper_bound) if isinstance(_node_type, Instance): node = _node_type.type if isinstance(_node_type, Overloaded) and _node_type.is_type_obj(): node = _node_type.type_object() if node is None: if isinstance(_node_type, UnionType): # Suppress the error for a known case where there are multiple base choices types in a # union. In theory this is something that could be handled by extracting all of the # base types and making the following code consider all of these types, but that's # quite a bit of effort. return ctx.default_attr_type ctx.api.fail(f"Unable to resolve type of {name} property", ctx.context) return AnyType(TypeOfAny.from_error) default_attr_type = get_proper_type(ctx.default_attr_type) if not node.is_enum or not node.has_base(fullnames.CHOICES_CLASS_FULLNAME): return default_attr_type # Enums with more than one base will treat the first base as the mixed-in type. base_type = node.bases[0] if len(node.bases) > 1 else None # When `__empty__` is defined, the `.choices` and `.values` properties will include `None` for # the blank choice which is labelled by the value of `__empty__`. empty_label = node.get("__empty__") # When `__empty__` is not a lazy string and the labels on all members are not lazy strings, the # label can be simplified to only be a simple string type. This keeps the benefits of accurate # typing when the lazy labels are being used, but reduces the pain of having to manage a union # of a simple and lazy string type where it's not necessary. label_laziness = _label_laziness(node) if ( name == "choices" and isinstance(default_attr_type, Instance) and default_attr_type.type.fullname == "builtins.list" and len(default_attr_type.args) == 1 ): choice_arg = get_proper_type(default_attr_type.args[0]) if isinstance(choice_arg, TupleType) and choice_arg.length() == 2: value_arg, label_arg = choice_arg.items label_arg = get_proper_type(label_arg) value_arg = get_proper_type(value_arg) new_label_arg = _try_replace_label(label_arg, label_laziness) new_value_arg = _try_replace_value(value_arg, base_type, empty_label is not None) if new_label_arg is not label_arg or new_value_arg is not value_arg: new_choice_arg = choice_arg.copy_modified(items=[new_value_arg, new_label_arg]) return default_attr_type.copy_modified(args=[new_choice_arg]) elif ( name == "labels" and isinstance(default_attr_type, Instance) and default_attr_type.type.fullname == "builtins.list" and len(default_attr_type.args) == 1 ): label_arg = get_proper_type(default_attr_type.args[0]) new_label_arg = _try_replace_label(label_arg, label_laziness) if new_label_arg is not label_arg: return default_attr_type.copy_modified(args=[new_label_arg]) elif ( name == "values" and isinstance(default_attr_type, Instance) and default_attr_type.type.fullname == "builtins.list" and len(default_attr_type.args) == 1 ): value_arg = get_proper_type(default_attr_type.args[0]) new_value_arg = _try_replace_value(value_arg, base_type, empty_label is not None) if new_value_arg is not value_arg: return default_attr_type.copy_modified(args=[new_value_arg]) elif name == "label": return _try_replace_label(default_attr_type, label_laziness) elif name == "__empty__" and empty_label is not None: return _try_replace_label(default_attr_type, _LabelLaziness.make(_is_lazy_string(empty_label.type))) elif name == "value": # Pass in `False` because `.value` will never return `None`. return _try_replace_value(default_attr_type, base_type, False) return default_attr_type typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/fields.py000066400000000000000000000252231526064357400273140ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, NamedTuple, cast from django.core.exceptions import FieldDoesNotExist from django.db.models.fields import AutoField from django.db.models.fields.related import RelatedField from mypy.nodes import AssignmentStmt, NameExpr, TypeInfo from mypy.types import AnyType, Instance, NoneType, ProperType, TypeOfAny, UninhabitedType, UnionType, get_proper_type from mypy.types import Type as MypyType from mypy_django_plugin.exceptions import UnregisteredModelError from mypy_django_plugin.lib import fullnames, helpers from mypy_django_plugin.transformers import manytomany if TYPE_CHECKING: from django.db.models.options import _AnyField from mypy.plugin import FunctionContext from mypy_django_plugin.django.context import DjangoContext def _get_current_field_from_assignment(ctx: FunctionContext, django_context: DjangoContext) -> _AnyField | None: outer_model_info = helpers.get_typechecker_api(ctx).scope.active_class() if outer_model_info is None or not helpers.is_model_type(outer_model_info): return None field_name = None for stmt in outer_model_info.defn.defs.body: if isinstance(stmt, AssignmentStmt): if stmt.rvalue == ctx.context: if not isinstance(stmt.lvalues[0], NameExpr): return None field_name = stmt.lvalues[0].name break if field_name is None: return None model_cls = django_context.get_model_class_by_fullname(outer_model_info.fullname) if model_cls is None: return None try: return model_cls._meta.get_field(field_name) except FieldDoesNotExist: return None def reparametrize_related_field_type(related_field_type: Instance, set_type: MypyType, get_type: MypyType) -> Instance: args = [ helpers.convert_any_to_type(related_field_type.args[0], set_type), helpers.convert_any_to_type(related_field_type.args[1], get_type), ] return related_field_type.copy_modified(args=args) def fill_descriptor_types_for_related_field(ctx: FunctionContext, django_context: DjangoContext) -> MypyType: current_field = _get_current_field_from_assignment(ctx, django_context) if current_field is None: return AnyType(TypeOfAny.from_error) assert isinstance(current_field, RelatedField) try: related_model_cls = django_context.get_field_related_model_cls(current_field) except UnregisteredModelError: return AnyType(TypeOfAny.from_error) default_related_field_type = set_descriptor_types_for_field(ctx) # self reference with abstract=True on the model where ForeignKey is defined current_model_cls = current_field.model if current_model_cls._meta.abstract and current_model_cls == related_model_cls: # for all derived non-abstract classes, set variable with this name to # __get__/__set__ of ForeignKey of derived model for model_cls in django_context.all_registered_model_classes: if issubclass(model_cls, current_model_cls) and not model_cls._meta.abstract: derived_model_info = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), model_cls) if derived_model_info is not None: fk_ref_type = Instance(derived_model_info, []) derived_fk_type = reparametrize_related_field_type( default_related_field_type, set_type=fk_ref_type, get_type=fk_ref_type ) helpers.add_new_sym_for_info(derived_model_info, name=current_field.name, sym_type=derived_fk_type) related_model = related_model_cls related_model_to_set = related_model_cls if related_model_to_set._meta.proxy_for_model is not None: related_model_to_set = related_model_to_set._meta.proxy_for_model typechecker_api = helpers.get_typechecker_api(ctx) related_model_info = helpers.lookup_class_typeinfo(typechecker_api, related_model) related_model_type: ProperType if related_model_info is None: # maybe no type stub related_model_type = AnyType(TypeOfAny.unannotated) else: related_model_type = Instance(related_model_info, []) related_model_to_set_info = helpers.lookup_class_typeinfo(typechecker_api, related_model_to_set) related_model_to_set_type: ProperType if related_model_to_set_info is None: # maybe no type stub related_model_to_set_type = AnyType(TypeOfAny.unannotated) else: related_model_to_set_type = Instance(related_model_to_set_info, []) # replace Any with referred_to_type return reparametrize_related_field_type( default_related_field_type, set_type=related_model_to_set_type, get_type=related_model_type ) class FieldDescriptorTypes(NamedTuple): set: MypyType get: MypyType def get_field_descriptor_types( field_info: TypeInfo, *, is_set_nullable: bool, is_get_nullable: bool ) -> FieldDescriptorTypes: set_type = helpers.get_private_descriptor_type(field_info, "_pyi_private_set_type", is_nullable=is_set_nullable) get_type = helpers.get_private_descriptor_type(field_info, "_pyi_private_get_type", is_nullable=is_get_nullable) return FieldDescriptorTypes(set=set_type, get=get_type) def set_descriptor_types_for_field_callback(ctx: FunctionContext, django_context: DjangoContext) -> MypyType: current_field = _get_current_field_from_assignment(ctx, django_context) if current_field is not None: if isinstance(current_field, AutoField): return set_descriptor_types_for_field(ctx, is_set_nullable=True) return set_descriptor_types_for_field(ctx) def set_descriptor_types_for_field( ctx: FunctionContext, *, is_set_nullable: bool = False, is_get_nullable: bool = False ) -> Instance: default_return_type = cast("Instance", ctx.default_return_type) is_nullable = helpers.get_bool_call_argument_by_name(ctx, "null", default=False) is_primary_key = helpers.get_bool_call_argument_by_name(ctx, "primary_key", default=False) # Allow setting field value to `None` when a field is primary key and has a default that can produce a value default_expr = helpers.get_call_argument_by_name(ctx, "default") if default_expr is not None: is_set_nullable = is_primary_key set_type, get_type = get_field_descriptor_types( default_return_type.type, is_set_nullable=is_set_nullable or is_nullable, is_get_nullable=is_get_nullable or is_nullable, ) # reconcile set and get types with the base field class mapped_types = helpers.get_field_type_args(default_return_type) assert mapped_types is not None # bail if either mapped set or get type is Never if not (isinstance(mapped_types.set, UninhabitedType) or isinstance(mapped_types.get, UninhabitedType)): # always replace set_type and get_type with (non-Any) mapped types set_type = helpers.convert_any_to_type(mapped_types.set, set_type) get_type = get_proper_type(helpers.convert_any_to_type(mapped_types.get, get_type)) # the get_type must be optional if the field is nullable if (is_get_nullable or is_nullable) and not ( isinstance(get_type, NoneType) or helpers.is_optional(get_type) or isinstance(get_type, AnyType) ): ctx.api.fail( f"{default_return_type.type.name} is nullable but its generic get type parameter is not optional", ctx.context, ) return default_return_type.copy_modified(args=[set_type, get_type]) def determine_type_of_array_field(ctx: FunctionContext, django_context: DjangoContext) -> MypyType: default_return_type = set_descriptor_types_for_field(ctx) base_field_arg_type = get_proper_type(helpers.get_call_argument_type_by_name(ctx, "base_field")) if not base_field_arg_type or not isinstance(base_field_arg_type, Instance): return default_return_type def drop_combinable(_type: MypyType) -> MypyType | None: _type = get_proper_type(_type) if isinstance(_type, Instance) and _type.type.has_base(fullnames.COMBINABLE_EXPRESSION_FULLNAME): return None if isinstance(_type, UnionType): items_without_combinable = [] for item in _type.items: reduced = drop_combinable(item) if reduced is not None: items_without_combinable.append(reduced) if len(items_without_combinable) > 1: return UnionType( items_without_combinable, line=_type.line, column=_type.column, is_evaluated=_type.is_evaluated, uses_pep604_syntax=_type.uses_pep604_syntax, ) if len(items_without_combinable) == 1: return items_without_combinable[0] return None return _type # Both base_field and return type should derive from Field and thus expect 2 arguments assert len(base_field_arg_type.args) == len(default_return_type.args) == 2 args = [] for new_type, default_arg in zip(base_field_arg_type.args, default_return_type.args, strict=False): # Drop any base_field Combinable type reduced = drop_combinable(new_type) if reduced is None: ctx.api.fail( f"Can't have ArrayField expecting {fullnames.COMBINABLE_EXPRESSION_FULLNAME!r} as data type", ctx.context, ) else: new_type = reduced args.append(helpers.convert_any_to_type(default_arg, new_type)) return default_return_type.copy_modified(args=args) def transform_into_proper_return_type(ctx: FunctionContext, django_context: DjangoContext) -> MypyType: default_return_type = get_proper_type(ctx.default_return_type) assert isinstance(default_return_type, Instance) outer_model_info = helpers.get_typechecker_api(ctx).scope.active_class() if outer_model_info is None or not helpers.is_model_type(outer_model_info): return set_descriptor_types_for_field(ctx) assert isinstance(outer_model_info, TypeInfo) if default_return_type.type.has_base(fullnames.MANYTOMANY_FIELD_FULLNAME): return manytomany.fill_model_args_for_many_to_many_field( ctx=ctx, model_info=outer_model_info, django_context=django_context ) if helpers.has_any_of_bases(default_return_type.type, fullnames.RELATED_FIELDS_CLASSES): return fill_descriptor_types_for_related_field(ctx, django_context) if default_return_type.type.has_base(fullnames.ARRAY_FIELD_FULLNAME): return determine_type_of_array_field(ctx, django_context) return set_descriptor_types_for_field_callback(ctx, django_context) typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/forms.py000066400000000000000000000007331526064357400271730ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from mypy_django_plugin.lib import helpers if TYPE_CHECKING: from mypy.plugin import ClassDefContext def make_meta_nested_class_inherit_from_any(ctx: ClassDefContext) -> None: meta_node = helpers.get_nested_meta_node_for_current_class(ctx.cls.info) if meta_node is None: if not ctx.api.final_iteration: ctx.api.defer() else: meta_node.fallback_to_any = True typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/functional.py000066400000000000000000000024731526064357400302120ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from mypy.errorcodes import ATTR_DEFINED from mypy.nodes import CallExpr, MemberExpr from mypy.types import AnyType, Instance, TypeOfAny from mypy.types import Type as MypyType from mypy_django_plugin.lib import helpers if TYPE_CHECKING: from mypy.plugin import AttributeContext def resolve_str_promise_attribute(ctx: AttributeContext) -> MypyType: if isinstance(ctx.context, MemberExpr): method_name = ctx.context.name elif isinstance(ctx.context, CallExpr) and isinstance(ctx.context.callee, MemberExpr): method_name = ctx.context.callee.name else: ctx.api.fail(f'Cannot resolve the attribute of "{ctx.type}"', ctx.context, code=ATTR_DEFINED) return AnyType(TypeOfAny.from_error) str_info = helpers.lookup_fully_qualified_typeinfo(helpers.get_typechecker_api(ctx), "builtins.str") assert str_info is not None str_type = Instance(str_info, []) return helpers.analyze_member_access( method_name, str_type, ctx.context, is_lvalue=False, is_super=False, # operators are already handled with magic methods defined in the stubs for _StrPromise is_operator=False, original_type=ctx.type, chk=helpers.get_typechecker_api(ctx), ) typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/init_create.py000066400000000000000000000101261526064357400303300ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from mypy.errorcodes import CALL_ARG from mypy.types import Instance, get_proper_type from mypy.types import Type as MypyType from mypy_django_plugin.lib import helpers if TYPE_CHECKING: from django.db.models.base import Model from mypy.plugin import FunctionContext, MethodContext from mypy_django_plugin.django.context import DjangoContext def get_actual_types(ctx: MethodContext | FunctionContext, expected_keys: list[str]) -> list[tuple[str, MypyType]]: actual_types = [] # positionals for pos, (actual_name, actual_type) in enumerate(zip(ctx.arg_names[0], ctx.arg_types[0], strict=False)): if actual_name is None: if ctx.callee_arg_names[0] == "kwargs" or pos >= len(expected_keys): # unpacked dict as kwargs is not supported continue actual_name = expected_keys[pos] actual_types.append((actual_name, actual_type)) # kwargs if len(ctx.callee_arg_names) > 1: for actual_name, actual_type in zip(ctx.arg_names[1], ctx.arg_types[1], strict=False): if actual_name is None: # unpacked dict as kwargs is not supported continue actual_types.append((actual_name, actual_type)) return actual_types def typecheck_model_method( ctx: FunctionContext | MethodContext, django_context: DjangoContext, model_cls: type[Model], method: str, ) -> None: """Type-checks positional and keyword arguments for Model methods like __init__(), create(), and acreate().""" typechecker_api = helpers.get_typechecker_api(ctx) expected_types = django_context.get_expected_types(typechecker_api, model_cls, method=method) expected_keys = [key for key in expected_types.keys() if key != "pk"] min_arg_count = helpers.get_min_argument_count(ctx) for actual_name, actual_type in get_actual_types(ctx, expected_keys): if actual_name not in expected_types: ctx.api.fail(f'Unexpected attribute "{actual_name}" for model "{model_cls.__name__}"', ctx.context) min_arg_count -= 1 # To avoid double error (Unexpected attribute + too many arguments) continue helpers.check_types_compatible( ctx, expected_type=expected_types[actual_name], actual_type=actual_type, error_message=f'Incompatible type for "{actual_name}" of "{model_cls.__name__}"', ) if min_arg_count > len(expected_keys): ctx.api.fail(f'Too many arguments for "{model_cls.__name__}"', ctx.context, code=CALL_ARG) def typecheck_model_init(ctx: FunctionContext, django_context: DjangoContext) -> MypyType: default_return_type = get_proper_type(ctx.default_return_type) if ( isinstance(default_return_type, Instance) and (model_cls := django_context.get_model_class_by_fullname(default_return_type.type.fullname)) is not None ): typecheck_model_method(ctx, django_context, model_cls, "__init__") return ctx.default_return_type def typecheck_model_create(ctx: MethodContext, django_context: DjangoContext) -> MypyType: default_return_type = get_proper_type(ctx.default_return_type) if ( isinstance(default_return_type, Instance) and (model_cls := django_context.get_model_class_by_fullname(default_return_type.type.fullname)) is not None ): typecheck_model_method(ctx, django_context, model_cls, "create") return ctx.default_return_type def typecheck_model_acreate(ctx: MethodContext, django_context: DjangoContext) -> MypyType: default_return_type = get_proper_type(ctx.default_return_type) if ( isinstance(default_return_type, Instance) # default_return_type at this point should be of type Coroutine[Any, Any, ] and isinstance((model := get_proper_type(default_return_type.args[-1])), Instance) and (model_cls := django_context.get_model_class_by_fullname(model.type.fullname)) is not None ): typecheck_model_method(ctx, django_context, model_cls, "acreate") return ctx.default_return_type typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/managers.py000066400000000000000000000614201526064357400276420ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, Final from mypy.nodes import ( GDEF, CallExpr, Decorator, FuncBase, FuncDef, MemberExpr, Node, OverloadedFuncDef, PlaceholderNode, RefExpr, StrExpr, SymbolTableNode, TypeInfo, ) from mypy.plugins.common import add_method_to_class from mypy.semanal_shared import has_placeholder from mypy.subtypes import find_member from mypy.types import AnyType, CallableType, Instance, ProperType, TypeOfAny, TypeType, UnionType, get_proper_type from mypy.types import Type as MypyType from mypy_django_plugin.lib import fullnames, helpers if TYPE_CHECKING: from mypy.checker import TypeChecker from mypy.plugin import AttributeContext, ClassDefContext, DynamicClassDefContext from mypy.semanal import SemanticAnalyzer MANAGER_METHODS_RETURNING_QUERYSET: Final = frozenset( ( "alias", "all", "annotate", "complex_filter", "defer", "difference", "distinct", "exclude", "extra", "filter", "intersection", "none", "only", "order_by", "prefetch_related", "reverse", "select_for_update", "select_related", "union", "using", ) ) def get_method_type_from_dynamic_manager( api: TypeChecker, method_name: str, manager_instance: Instance ) -> ProperType | None: """ Attempt to resolve a method on a manager that was built from '.from_queryset' """ manager_type_info = manager_instance.type.get_containing_type_info(method_name) if ( manager_type_info is None or "django" not in manager_type_info.metadata or "from_queryset_manager" not in manager_type_info.metadata["django"] ): # Manager isn't dynamically added return None queryset_fullname = manager_type_info.metadata["django"]["from_queryset_manager"] assert isinstance(queryset_fullname, str) queryset_info = helpers.lookup_fully_qualified_typeinfo(api, queryset_fullname) assert queryset_info is not None manager_model = get_proper_type(find_member("model", manager_instance, manager_instance)) assert isinstance(manager_model, TypeType), manager_model # Resolve the method as if it was accessed on the queryset, parametrized with the manager's model. queryset_instance = Instance(queryset_info, (manager_model.item,) * len(queryset_info.type_vars)) method_type = find_member(method_name, queryset_instance, queryset_instance) # For methods on the manager that return a queryset we need to override the # return type to be the actual queryset class, not the base QuerySet that's # used by the typing stubs. if method_name in MANAGER_METHODS_RETURNING_QUERYSET and isinstance( (method_proper_type := get_proper_type(method_type)), CallableType ): method_type = method_proper_type.copy_modified(ret_type=queryset_instance) return get_proper_type(method_type) if method_type is not None else None def _get_funcdef_type(definition: Node | None) -> ProperType | None: if isinstance(definition, FuncBase): return definition.type if isinstance(definition, Decorator): return definition.func.type return None def resolve_manager_method_from_instance(instance: Instance, method_name: str, ctx: AttributeContext) -> MypyType: api = helpers.get_typechecker_api(ctx) method_type = get_method_type_from_dynamic_manager(api, method_name, instance) return method_type if method_type is not None else ctx.default_attr_type def resolve_manager_method(ctx: AttributeContext) -> MypyType: """ A 'get_attribute_hook' that is intended to be invoked whenever the TypeChecker encounters an attribute on a class that has 'django.db.models.BaseManager' as a base. """ # Skip (method) type that is currently something other than Any of type `implementation_artifact` default_attr_type = get_proper_type(ctx.default_attr_type) if not isinstance(default_attr_type, AnyType): return ctx.default_attr_type if default_attr_type.type_of_any != TypeOfAny.implementation_artifact: return ctx.default_attr_type # (Current state is:) We wouldn't end up here when looking up a method from a custom _manager_. # That's why we only attempt to lookup the method for either a dynamically added or reverse manager. if isinstance(ctx.context, MemberExpr): method_name = ctx.context.name elif isinstance(ctx.context, CallExpr) and isinstance(ctx.context.callee, MemberExpr): method_name = ctx.context.callee.name else: ctx.api.fail("Unable to resolve return type of queryset/manager method", ctx.context) return AnyType(TypeOfAny.from_error) if isinstance(ctx.type, Instance): return resolve_manager_method_from_instance(instance=ctx.type, method_name=method_name, ctx=ctx) if isinstance(ctx.type, UnionType) and all(isinstance(get_proper_type(item), Instance) for item in ctx.type.items): resolved = tuple( resolve_manager_method_from_instance(instance=instance, method_name=method_name, ctx=ctx) for item in ctx.type.items if isinstance((instance := get_proper_type(item)), Instance) ) return UnionType(resolved) ctx.api.fail(f'Unable to resolve return type of queryset/manager method "{method_name}"', ctx.context) return AnyType(TypeOfAny.from_error) def create_new_manager_class_from_from_queryset_method(ctx: DynamicClassDefContext) -> None: """ Insert a new manager class node for a: ' = .from_queryset()'. When the assignment expression lives at module level. class level cases are resolved in `AddManagers.try_create_manager_from_from_queryset` """ semanal_api = helpers.get_semanal_api(ctx) # TODO: Emit an error when called in a class scope if semanal_api.is_class_scope(): return # Don't redeclare the manager class if we've already defined it. manager_sym = semanal_api.lookup_current_scope(ctx.name) if manager_sym and isinstance(manager_sym.node, TypeInfo): # This is just a deferral run where our work is already finished return new_manager_info = create_manager_info_from_from_queryset_call(semanal_api, ctx.call, ctx.name) if new_manager_info is None: if not ctx.api.final_iteration: # Only add PlaceholderNode if it doesn't already exist to prevent # infinite semantic analysis iterations (fixes #2373) if not (manager_sym and isinstance(manager_sym.node, PlaceholderNode)): # XXX: hack for python/mypy#17402 ph = PlaceholderNode(ctx.api.qualified_name(ctx.name), ctx.call, ctx.call.line, becomes_typeinfo=True) ctx.api.add_symbol_table_node(ctx.name, SymbolTableNode(GDEF, ph)) ctx.api.defer() return def register_dynamically_created_manager(fullname: str, manager_name: str, manager_base: TypeInfo) -> None: manager_base.metadata.setdefault("from_queryset_managers", {}) # The `__module__` value of the manager type created by Django's # `.from_queryset` is `django.db.models.manager`. But we put new type(s) in the # module currently being processed, so we'll map those together through metadata. runtime_fullname = ".".join(["django.db.models.manager", manager_name]) manager_base.metadata["from_queryset_managers"][runtime_fullname] = fullname def create_manager_info_from_from_queryset_call( api: SemanticAnalyzer, call_expr: CallExpr, name: str | None = None ) -> TypeInfo | None: """ Extract manager and queryset TypeInfo from a from_queryset call. """ if ( # Check that this is a from_queryset call on a manager subclass not isinstance(call_expr.callee, MemberExpr) or not isinstance(call_expr.callee.expr, RefExpr) or not isinstance(call_expr.callee.expr.node, TypeInfo) or not call_expr.callee.expr.node.has_base(fullnames.BASE_MANAGER_CLASS_FULLNAME) or not call_expr.callee.name == "from_queryset" # Check that the call has one or two arguments and that the first is a # QuerySet subclass or not 1 <= len(call_expr.args) <= 2 or not isinstance(call_expr.args[0], RefExpr) or not isinstance(call_expr.args[0].node, TypeInfo) or not call_expr.args[0].node.has_base(fullnames.QUERYSET_CLASS_FULLNAME) ): return None base_manager_info, queryset_info = call_expr.callee.expr.node, call_expr.args[0].node if queryset_info.fullname is None: # type: ignore[comparison-overlap] # In some cases, due to the way the semantic analyzer works, only # passed_queryset.name is available. But it should be analyzed again, # so this isn't a problem. return None # type: ignore[unreachable] if len(call_expr.args) == 2 and isinstance(call_expr.args[1], StrExpr): manager_name = call_expr.args[1].value else: manager_name = f"{base_manager_info.name}From{queryset_info.name}" # Always look in global scope, as that's where we'll declare dynamic manager classes manager_sym = api.globals.get(manager_name) if ( manager_sym is not None and isinstance(manager_sym.node, TypeInfo) and manager_sym.node.has_base(base_manager_info.fullname) and manager_sym.node.metadata.get("django", {}).get("from_queryset_manager") == queryset_info.fullname ): # Reuse an identical, already generated, manager new_manager_info = manager_sym.node else: # Create a new `TypeInfo` instance for the manager type try: new_manager_info = create_manager_class( api=api, base_manager_info=base_manager_info, name=manager_name, line=call_expr.line, with_unique_name=name is not None and name != manager_name, ) except helpers.IncompleteDefnException: return None populate_manager_from_queryset(new_manager_info, queryset_info) register_dynamically_created_manager( fullname=new_manager_info.fullname, manager_name=manager_name, manager_base=base_manager_info, ) # Add the new manager to the current module # TODO: use proper SemanticAnalyzer API for that. module = api.modules[api.cur_mod_id] if name is not None and name != new_manager_info.name: # Unless names are equal, there's 2 symbol names that needs the manager info module.names[name] = SymbolTableNode(GDEF, new_manager_info, plugin_generated=True) module.names[new_manager_info.name] = SymbolTableNode(GDEF, new_manager_info, plugin_generated=True) return new_manager_info def create_manager_class( api: SemanticAnalyzer, base_manager_info: TypeInfo, name: str, line: int, with_unique_name: bool ) -> TypeInfo: # If any of the type vars are undefined we need to defer. This is handled by the caller if any(has_placeholder(type_var) for type_var in base_manager_info.defn.type_vars): raise helpers.IncompleteDefnException return helpers.build_reparametrized_subclass( api.modules[api.cur_mod_id], base_manager_info, name, unique_name=with_unique_name, line=line ) def populate_manager_from_queryset(manager_info: TypeInfo, queryset_info: TypeInfo) -> None: """ Add methods from the QuerySet class to the manager. """ # Stash the queryset fullname which was passed to .from_queryset So that # our 'resolve_manager_method' attribute hook can fetch the method from # that QuerySet class django_metadata = helpers.get_django_metadata(manager_info) django_metadata["from_queryset_manager"] = queryset_info.fullname # We collect and mark up all methods before django.db.models.query.QuerySet as class members for class_mro_info in queryset_info.mro: if class_mro_info.fullname == fullnames.QUERYSET_CLASS_FULLNAME: break for name, sym in class_mro_info.names.items(): if not isinstance(sym.node, FuncDef | OverloadedFuncDef | Decorator): continue # private, magic methods are not copied # https://github.com/django/django/blob/5.0.4/django/db/models/manager.py#L101 if name.startswith("_"): continue # Insert the queryset method name as a class member. Note that the type of # the method is set as Any. Figuring out the type is the job of the # 'resolve_manager_method' attribute hook, which comes later. # # class BaseManagerFromMyQuerySet(BaseManager): # queryset_method: Any = ... # helpers.add_new_sym_for_info( manager_info, name=name, sym_type=AnyType(TypeOfAny.implementation_artifact), ) # For methods on BaseManager that return a queryset we need to update # the return type to be the actual queryset subclass used. This is done # by adding the methods as attributes with type Any to the manager # class. The actual type of these methods are resolved in # resolve_manager_method. for method_name in MANAGER_METHODS_RETURNING_QUERYSET: helpers.add_new_sym_for_info( manager_info, name=method_name, sym_type=AnyType(TypeOfAny.implementation_artifact), ) def _get_or_create_manager_class_for_queryset( semanal_api: SemanticAnalyzer, queryset_info: TypeInfo, *, base_manager_info: TypeInfo, runtime_manager_base: TypeInfo, ) -> TypeInfo: """Get or create the generated manager for `.as_manager()`. A new manager is populated from the queryset, registered, and inserted into the module. It subclasses `base_manager_info` but is named and registered after `runtime_manager_base` — the base Django subclasses at runtime. Raises `IncompleteDefnException` to defer. """ name = f"{runtime_manager_base.name}From{queryset_info.name}" current_module = semanal_api.modules[semanal_api.cur_mod_id] existing_sym = current_module.names.get(name) if ( existing_sym is not None and isinstance(existing_sym.node, TypeInfo) and existing_sym.node.has_base(fullnames.MANAGER_CLASS_FULLNAME) and existing_sym.node.metadata.get("django", {}).get("from_queryset_manager") == queryset_info.fullname ): # Reuse an identical, already generated, manager new_manager_info = existing_sym.node else: new_manager_info = create_manager_class( api=semanal_api, base_manager_info=base_manager_info, name=name, line=queryset_info.line, with_unique_name=True, ) populate_manager_from_queryset(new_manager_info, queryset_info) register_dynamically_created_manager( fullname=new_manager_info.fullname, manager_name=name, manager_base=runtime_manager_base, ) # Insert at module level, keyed by the manager's unique `name` to sidestep # collisions with other module-level objects. current_module.names[new_manager_info.name] = SymbolTableNode(GDEF, new_manager_info, plugin_generated=True) return new_manager_info def add_as_manager_to_queryset_class(ctx: ClassDefContext) -> None: """ Insert a new manager class node for a: ' = .as_manager()'. Similar to `create_manager_info_from_from_queryset_call` """ semanal_api = helpers.get_semanal_api(ctx) def _defer() -> None: if not semanal_api.final_iteration: semanal_api.defer() queryset_info = semanal_api.type if queryset_info is None: return _defer() # If any of the queryset's type vars have unresolved bounds (placeholders), # defer to avoid generating methods with unresolved types that crash mypy. if any(has_placeholder(tv) for tv in queryset_info.defn.type_vars): return _defer() existing_as_manager = queryset_info.names.get("as_manager") if existing_as_manager is not None and existing_as_manager.plugin_generated: # We generated `as_manager` on a previous pass; nothing left to do. return # If `as_manager` is still present, the user declared it (ours returned above). # Track it so we generate the manager but don't overwrite their method below. user_defined_as_manager = existing_as_manager is not None base_as_manager = queryset_info.get("as_manager") if base_as_manager is None: return manager_sym = semanal_api.lookup_fully_qualified_or_none(fullnames.MANAGER_CLASS_FULLNAME) if manager_sym is None or not isinstance(manager_sym.node, TypeInfo): return _defer() manager_base = manager_sym.node # The generated manager subclasses `base_manager_info`; `runtime_manager_base` is the # base Django uses at runtime, which drives the generated name (see below). base_manager_info = manager_base runtime_manager_base = manager_base if base_as_manager.fullname != f"{fullnames.QUERYSET_CLASS_FULLNAME}.as_manager": # `as_manager` is overridden (by a parent queryset's generated method or a # user override); use its return type as the manager base. base_as_manager_type = _get_funcdef_type(base_as_manager.node) if not isinstance(base_as_manager_type, CallableType): return # A user override's return annotation may still be unanalyzed here, so # resolve it explicitly (a no-op if already analyzed); defer if incomplete. # Suppress resolution errors: a not-yet-analyzed cross-module override may # reference names private to its defining module — bail out, don't report. with semanal_api.msg.filter_errors() as resolution_errors: base_as_manager_ret_type = semanal_api.anal_type(base_as_manager_type.ret_type) if resolution_errors.has_new_errors(): return if base_as_manager_ret_type is None: return _defer() base_as_manager_ret_type = get_proper_type(base_as_manager_ret_type) if not isinstance(base_as_manager_ret_type, Instance): return base_manager_info = base_as_manager_ret_type.type # A real override builds the runtime manager as `.from_queryset(cls)()`, # which Django names f"{Manager}From{QuerySet}". Match that name and register # under `` so the model's manager resolves; a generated stub has no # runtime counterpart and stays on the plain `Manager`. if not base_as_manager.plugin_generated and base_manager_info.has_base(fullnames.MANAGER_CLASS_FULLNAME): runtime_manager_base = base_manager_info try: new_manager_info = _get_or_create_manager_class_for_queryset( semanal_api, queryset_info, base_manager_info=base_manager_info, runtime_manager_base=runtime_manager_base, ) except helpers.IncompleteDefnException: return _defer() if user_defined_as_manager: # Leave the user's own `as_manager` signature intact; the model resolves # its manager via the registration above, not this method's return type. return add_method_to_class( semanal_api, ctx.cls, "as_manager", args=[], return_type=Instance(new_manager_info, [AnyType(TypeOfAny.from_omitted_generics)]), is_classmethod=True, ) def _is_omitted_generic(arg: MypyType) -> bool: """True if ``arg`` is the ``Any`` mypy substitutes for an unparametrized generic.""" proper_arg = get_proper_type(arg) return isinstance(proper_arg, AnyType) and proper_arg.type_of_any is TypeOfAny.from_omitted_generics def reparametrize_generic_class( ctx: ClassDefContext, base_class_fullname: str, *, bind_explicit_args: bool = False, ) -> None: """ Add implicit generics to classes that are defined without generic. When ``bind_explicit_args`` is True, also reparametrize partially or fully-explicit parametrizations by binding each explicit arg as both the bound and the PEP 696 default of a synthesized covariant TypeVar. Note that this does not happen if mypy is run with disallow_any_generics = True, as not specifying the generic type is then considered an error. """ if ctx.api.options.disallow_any_generics: # Let mypy's own "missing type arguments" error stand rather than silently reparametrize. return class_info = ctx.api.lookup_fully_qualified_or_none(ctx.cls.fullname) if class_info is None or class_info.node is None: return assert isinstance(class_info.node, TypeInfo) if class_info.node.type_vars: # We've already been here or the class is already declared with generic types return parent_class = next( (base for base in class_info.node.bases if base.type.has_base(base_class_fullname)), None, ) if parent_class is None or not parent_class.args: return # Bind explicit args only when the direct parent is the canonical base class is_direct_parent = parent_class.type.fullname == base_class_fullname if not (bind_explicit_args and is_direct_parent): if not _is_omitted_generic(parent_class.args[0]): return type_vars = list(parent_class.type.defn.type_vars) else: type_vars = [] for type_var, parent_type_var in zip(parent_class.type.defn.type_vars, parent_class.args, strict=True): if _is_omitted_generic(parent_type_var): # Arg was omitted -- reuse the parent's TypeVar so its existing # PEP 696 default (e.g. ``_Row = TypeVar(default=_Model)``) is preserved. type_vars.append(type_var) else: # Arg was supplied explicitly -- synthesize a TypeVar bounded by the # user's arg so the subclass stays effectively concrete in user-facing # contexts (defaults + bound + covariance) while still being generic # enough for the plugin to flow annotation row types through. type_vars.append( type_var.copy_modified( id=type_var.id, upper_bound=parent_type_var, default=parent_type_var, ) ) # If we end up with placeholders we need to defer so the placeholders are # resolved in a future iteration if any(has_placeholder(type_var) for type_var in type_vars): if not ctx.api.final_iteration: ctx.api.defer() else: return parent_class.args = tuple(type_vars) class_info.node.defn.type_vars = type_vars class_info.node.add_type_vars() def reparametrize_any_queryset_hook(ctx: ClassDefContext) -> None: """ Add implicit generics to QuerySet subclasses that are defined without generic. This is required for `.annotate` / `.values` call to update the typevars accordingly. Eg. class MyQuerySet(models.QuerySet): ... is interpreted as: _Model = TypeVar('_Model', bound=Model, covariant=True) _Row = TypeVar('_Row', covariant=True, default=_Model) class MyQuerySet(models.QuerySet[_Model, _Row]): ... And class BookQuerySet(models.QuerySet["Book"]): ... is interpreted as: _Model = TypeVar('_Model', bound=Book, covariant=True, default=Book) _Row = TypeVar('_Row', bound=Book, covariant=True, default=Book) class BookQuerySet(models.QuerySet[_Model, _Row]): ... Note that this does not happen if mypy is run with disallow_any_generics = True, as not specifying the generic type is then considered an error. """ reparametrize_generic_class(ctx, fullnames.QUERYSET_CLASS_FULLNAME, bind_explicit_args=True) def reparametrize_any_manager_hook(ctx: ClassDefContext) -> None: """ Add implicit generics to manager classes that are defined without generic. Eg. class MyManager(models.Manager): ... is interpreted as: _T = TypeVar('_T', covariant=True) class MyManager(models.Manager[_T]): ... Note that this does not happen if mypy is run with disallow_any_generics = True, as not specifying the generic type is then considered an error. """ reparametrize_generic_class(ctx, fullnames.BASE_MANAGER_CLASS_FULLNAME) def reparametrize_any_field_hook(ctx: ClassDefContext) -> None: """ Add implicit generics to Field subclasses that omit the parent's TypeVars. Eg. class HTMLField(models.TextField): ... is interpreted as: class HTMLField(models.TextField[_ST_Text, _GT_Text]): ... Without this, mypy treats `HTMLField` as non-Generic and the set/get args assigned by the field function hook don't propagate through `__get__`. """ reparametrize_generic_class(ctx, fullnames.FIELD_FULLNAME) typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/manytomany.py000066400000000000000000000161111526064357400302360ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, NamedTuple from mypy.nodes import AssignmentStmt, NameExpr, Node, TypeInfo from mypy.types import AnyType, Instance, ProperType, UninhabitedType, get_proper_type from mypy.types import Type as MypyType from mypy_django_plugin.lib import fullnames, helpers if TYPE_CHECKING: from mypy.plugin import FunctionContext, MethodContext from mypy_django_plugin.django.context import DjangoContext class M2MThrough(NamedTuple): arg: Node | None model: ProperType class M2MTo(NamedTuple): arg: Node model: ProperType self: bool # ManyToManyField('self', ...) class M2MArguments(NamedTuple): to: M2MTo through: M2MThrough | None def _through_arg_is_unset(m2m_field: Instance) -> bool: """Whether the 'through' type argument was left unsolved, or fell back on its 'Any' default.""" if len(m2m_field.args) < 2: return False through_arg = get_proper_type(m2m_field.args[1]) return isinstance(through_arg, (UninhabitedType, AnyType)) def fill_model_args_for_many_to_many_field( *, ctx: FunctionContext, model_info: TypeInfo, django_context: DjangoContext, ) -> MypyType: default_return_type = get_proper_type(ctx.default_return_type) if not ( ctx.args and ctx.args[0] and isinstance(default_return_type, Instance) and len(default_return_type.args) >= 2 and (args := get_m2m_arguments(ctx=ctx, model_info=model_info, django_context=django_context)) ): return ctx.default_return_type default_to_arg = get_proper_type(default_return_type.args[0]) to_arg: MypyType if isinstance(default_to_arg, UninhabitedType): to_arg = args.to.model else: # Avoid overwriting a decent 'to' argument to_arg = default_return_type.args[0] if _through_arg_is_unset(default_return_type): if helpers.is_abstract_model(model_info): # Many to many on abstract models doesn't create any implicit, concrete # through model, so we populate it with the upper bound to avoid error messages through_arg = default_return_type.type.defn.type_vars[1].upper_bound elif args.through is None: through_arg = UninhabitedType() else: through_arg = args.through.model else: # Avoid overwriting a decent 'through' argument through_arg = default_return_type.args[1] return default_return_type.copy_modified(args=[to_arg, through_arg]) def get_m2m_arguments( *, ctx: FunctionContext, model_info: TypeInfo, django_context: DjangoContext, ) -> M2MArguments | None: checker = helpers.get_typechecker_api(ctx) to_arg = ctx.args[0][0] to_model = helpers.get_model_from_expression( to_arg, self_model=model_info, api=checker, django_context=django_context ) if to_model is None: # 'ManyToManyField()' requires the 'to' argument return None to = M2MTo(arg=to_arg, model=to_model, self=to_model.type == model_info) through = None if len(ctx.args) > 5 and ctx.args[5]: # 'ManyToManyField(..., through=)' was called through_arg = ctx.args[5][0] through_model = helpers.get_model_from_expression( through_arg, self_model=model_info, api=checker, django_context=django_context ) if through_model is not None: through = M2MThrough(arg=through_arg, model=through_model) elif not helpers.is_abstract_model(model_info): # No explicit 'through' argument was provided and model is concrete. We need # to dig up any generated through model for this 'ManyToManyField()' field through_arg = None m2m_throughs = helpers.get_django_metadata(model_info).get("m2m_throughs", {}) if m2m_throughs: field_name = None for defn in model_info.defn.defs.body: if ( isinstance(defn, AssignmentStmt) and defn.rvalue is ctx.context and len(defn.lvalues) == 1 and isinstance(defn.lvalues[0], NameExpr) ): field_name = defn.lvalues[0].name break if field_name is not None: through_model_fullname = m2m_throughs.get(field_name) if through_model_fullname is not None: through_model_info = helpers.lookup_fully_qualified_typeinfo(checker, through_model_fullname) if through_model_info is not None: through = M2MThrough(arg=through_arg, model=Instance(through_model_info, [])) return M2MArguments(to=to, through=through) def get_related_manager_and_model(ctx: MethodContext) -> tuple[Instance, Instance, Instance] | None: """ Returns a 3-tuple consisting of: 1. A `ManyRelatedManager` instance 2. The first type parameter (_To) instance of 1. when it's a model 3. The second type parameter (_Through) instance of 1. when it's a model When encountering a `ManyRelatedManager` that has populated its 2 first type parameters with models. Otherwise `None` is returned. For example: if given a `ManyRelatedManager[A, B]` where `A` and `B` are models the following 3-tuple is returned: `(ManyRelatedManager[A, B], A, B)`. """ default_return_type = get_proper_type(ctx.default_return_type) if ( isinstance(default_return_type, Instance) and default_return_type.type.fullname == fullnames.MANY_RELATED_MANAGER ): # This is a call to '__get__' overload with a model instance of 'ManyToManyDescriptor'. # Returning a 'ManyRelatedManager'. Which we want to, just like Django, build from the # default manager of the related model. many_related_manager = default_return_type # Require first and second type argument of 'ManyRelatedManager' to be models if ( len(many_related_manager.args) >= 2 and isinstance((_To := get_proper_type(many_related_manager.args[0])), Instance) and helpers.is_model_type(_To.type) and isinstance((_Through := get_proper_type(many_related_manager.args[1])), Instance) and helpers.is_model_type(_Through.type) ): return many_related_manager, _To, _Through return None def refine_many_to_many_related_manager(ctx: MethodContext) -> MypyType: """ Updates the 'ManyRelatedManager' returned by e.g. 'ManyToManyDescriptor' to be a subclass of 'ManyRelatedManager' and the related model's default manager. """ related_objects = get_related_manager_and_model(ctx) if related_objects is None: return ctx.default_return_type _, related_model_instance, through_model_instance = related_objects checker = helpers.get_typechecker_api(ctx) related_manager_info = helpers.get_many_to_many_manager_info( checker, to=related_model_instance.type, derived_from="_default_manager" ) if related_manager_info is None: return ctx.default_return_type return Instance(related_manager_info, [through_model_instance]) typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/manytoone.py000066400000000000000000000040641526064357400300570ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from mypy.types import Instance, get_proper_type from mypy.types import Type as MypyType from mypy_django_plugin.lib import fullnames, helpers if TYPE_CHECKING: from mypy.plugin import MethodContext def get_model_of_related_manager(ctx: MethodContext) -> Instance | None: """ Returns the type parameter (_To) instance of a `RelatedManager` instance when it's a model. Otherwise `None` is returned. For example: if given a `RelatedManager[A]` where `A` is a model then `A` is returned. """ default_return_type = get_proper_type(ctx.default_return_type) if ( isinstance(default_return_type, Instance) and default_return_type.type.fullname == fullnames.RELATED_MANAGER_CLASS ): # This is a call to '__get__' overload with a model instance of # 'ReverseManyToOneDescriptor'. Returning a 'RelatedManager'. Which we want to, # just like Django, build from the default manager of the related model. related_manager = default_return_type # Require first type argument of 'RelatedManager' to be a model if ( len(related_manager.args) >= 1 and isinstance((_To := get_proper_type(related_manager.args[0])), Instance) and helpers.is_model_type(_To.type) ): return _To return None def refine_many_to_one_related_manager(ctx: MethodContext) -> MypyType: """ Updates the 'RelatedManager' returned by e.g. 'ReverseManyToOneDescriptor' to be a subclass of 'RelatedManager' and the related model's default manager. """ to_model_instance = get_model_of_related_manager(ctx) if to_model_instance is None: return ctx.default_return_type checker = helpers.get_typechecker_api(ctx) related_manager_info = helpers.get_reverse_manager_info( checker, to_model_instance.type, derived_from="_default_manager" ) if related_manager_info is None: return ctx.default_return_type return Instance(related_manager_info, []) typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/meta.py000066400000000000000000000043671526064357400270020ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from django.core.exceptions import FieldDoesNotExist from mypy.nodes import Var from mypy.types import AnyType, Instance, TypeOfAny, get_proper_type from mypy.types import Type as MypyType from mypy_django_plugin.django.context import DjangoContext, get_field_type_from_model_type_info from mypy_django_plugin.lib import helpers from mypy_django_plugin.lib.helpers import DjangoModel if TYPE_CHECKING: from mypy.plugin import MethodContext def return_proper_field_type_from_get_field(ctx: MethodContext, django_context: DjangoContext) -> MypyType: if not ( isinstance(ctx.type, Instance) and ctx.type.args and isinstance(model_type := get_proper_type(ctx.type.args[0]), Instance) and (field_name_expr := helpers.get_call_argument_by_name(ctx, "field_name")) is not None and (field_name := helpers.resolve_string_attribute_value(field_name_expr, django_context)) is not None ): return ctx.default_return_type field_type = get_field_type_from_model_type_info(model_type.type, field_name) if field_type is not None: return field_type # Fields of a model defined further down the module aren't inferred yet; defer to a later pass. field_sym = model_type.type.get(field_name) if field_sym is not None and isinstance(field_sym.node, Var) and not field_sym.node.is_ready: typechecker_api = helpers.get_typechecker_api(ctx) # Deferral re-checks the enclosing top-level function, so without one there is nothing to defer. if typechecker_api.scope.top_level_function() is not None: typechecker_api.handle_cannot_determine_type(field_name, ctx.context) return ctx.default_return_type if (django_model := DjangoModel.from_model_type(model_type, django_context)) is None: return ctx.default_return_type try: field = django_model.cls._meta.get_field(field_name) if field_info := helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), field.__class__): return Instance(field_info, []) except FieldDoesNotExist as e: ctx.api.fail(str(e), ctx.context) return AnyType(TypeOfAny.from_error) return ctx.default_return_type typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/models.py000066400000000000000000001550201526064357400273300ustar00rootroot00000000000000from __future__ import annotations from collections import deque from functools import cached_property from typing import TYPE_CHECKING, Any, cast from django.db.models.fields import DateField, DateTimeField, Field from django.db.models.fields.reverse_related import ForeignObjectRel, ManyToManyRel, OneToOneRel from mypy.nodes import ( ARG_STAR2, MDEF, Argument, AssignmentStmt, CallExpr, Context, FakeInfo, NameExpr, RefExpr, Statement, SymbolTableNode, TypeInfo, Var, ) from mypy.plugins import common from mypy.semanal import SemanticAnalyzer from mypy.semanal_shared import has_placeholder from mypy.typeanal import TypeAnalyser from mypy.types import AnyType, Instance, ProperType, TypedDictType, TypeOfAny, TypeType, TypeVarType, get_proper_type from mypy.types import Type as MypyType from typing_extensions import override from mypy_django_plugin.errorcodes import MANAGER_MISSING from mypy_django_plugin.exceptions import UnregisteredModelError from mypy_django_plugin.lib import fullnames, helpers from mypy_django_plugin.lib.fullnames import ANNOTATIONS_FULLNAME from mypy_django_plugin.transformers.fields import FieldDescriptorTypes, get_field_descriptor_types from mypy_django_plugin.transformers.managers import ( MANAGER_METHODS_RETURNING_QUERYSET, create_manager_info_from_from_queryset_call, ) from mypy_django_plugin.transformers.manytomany import M2MArguments, M2MThrough, M2MTo if TYPE_CHECKING: from collections.abc import Iterable from django.db.models import Manager, Model from mypy.checker import TypeChecker from mypy.nodes import MypyFile from mypy.plugin import AnalyzeTypeContext, AttributeContext, ClassDefContext from mypy_django_plugin.config import DjangoPluginConfig from mypy_django_plugin.django.context import DjangoContext class ModelClassInitializer: api: SemanticAnalyzer def __init__(self, ctx: ClassDefContext, django_context: DjangoContext) -> None: self.api = cast("SemanticAnalyzer", ctx.api) self.model_classdef = ctx.cls self.django_context = django_context self.ctx = ctx @property def is_model_abstract(self) -> bool: return helpers.is_abstract_model(self.model_classdef.info) def lookup_typeinfo(self, fullname: str) -> TypeInfo | None: return helpers.lookup_fully_qualified_typeinfo(self.api, fullname) def lookup_typeinfo_or_incomplete_defn_error(self, fullname: str) -> TypeInfo: info = self.lookup_typeinfo(fullname) if info is None: raise helpers.IncompleteDefnException(f"No {fullname!r} found") return info def lookup_class_typeinfo_or_incomplete_defn_error(self, klass: type) -> TypeInfo: fullname = helpers.get_class_fullname(klass) return self.lookup_typeinfo_or_incomplete_defn_error(fullname) def create_new_var(self, name: str, typ: MypyType) -> Var: # type=: type of the variable itself var = Var(name=name, type=typ) # var.info: type of the object variable is bound to var.info = self.model_classdef.info var._fullname = self.model_classdef.info.fullname + "." + name var.is_initialized_in_class = True var.is_inferred = True return var def add_new_var_to_model_class( self, name: str, typ: MypyType, *, no_serialize: bool = False, is_classvar: bool = False ) -> None: helpers.add_new_sym_for_info( self.model_classdef.info, name=name, sym_type=typ, no_serialize=no_serialize, is_classvar=is_classvar ) @property def current_module(self) -> MypyFile: return self.api.modules[self.model_classdef.info.module_name] def add_new_class_for_current_module(self, name: str, bases: list[Instance]) -> TypeInfo: return helpers.add_new_class_for_module(self.current_module, name=name, bases=bases) def run(self) -> None: model_cls = self.django_context.get_model_class_by_fullname(self.model_classdef.fullname) if model_cls is None: return self.run_with_model_cls(model_cls) def get_generated_manager_mappings(self, base_manager_fullname: str) -> dict[str, str]: base_manager_info = self.lookup_typeinfo(base_manager_fullname) if base_manager_info is None or "from_queryset_managers" not in base_manager_info.metadata: return {} return base_manager_info.metadata["from_queryset_managers"] def get_generated_manager_info(self, manager_fullname: str, base_manager_fullname: str) -> TypeInfo | None: generated_managers = self.get_generated_manager_mappings(base_manager_fullname) real_manager_fullname = generated_managers.get(manager_fullname) if real_manager_fullname: return self.lookup_typeinfo(real_manager_fullname) # Not a generated manager return None def get_or_create_manager_with_any_fallback(self) -> TypeInfo | None: """ Create a Manager subclass with fallback to Any for unknown attributes and methods. This is used for unresolved managers, where we don't know the actual type of the manager. The created class is reused if multiple unknown managers are encountered. """ name = "UnknownManager" # Check if we've already created a fallback manager class for this # module, and if so reuse that. manager_info = self.lookup_typeinfo(f"{self.model_classdef.info.module_name}.{name}") if manager_info and manager_info.metadata.get("django", {}).get("any_fallback_manager"): return manager_info fallback_queryset = self.get_or_create_queryset_with_any_fallback() if fallback_queryset is None: return None base_manager_fullname = fullnames.MANAGER_CLASS_FULLNAME base_manager_info = self.lookup_typeinfo(base_manager_fullname) if base_manager_info is None: return None manager_info = helpers.build_reparametrized_subclass( self.current_module, base_manager_info, name, unique_name=True ) manager_info.fallback_to_any = True # For methods on BaseManager that return a queryset we need to update # the return type to be the actual queryset subclass used. This is done # by adding the methods as attributes with type Any to the manager # class. The actual type of these methods are resolved in # resolve_manager_method. for method_name in MANAGER_METHODS_RETURNING_QUERYSET: helpers.add_new_sym_for_info( manager_info, name=method_name, sym_type=AnyType(TypeOfAny.implementation_artifact) ) manager_info.metadata["django"] = { "any_fallback_manager": True, "from_queryset_manager": fallback_queryset.fullname, } return manager_info def get_or_create_queryset_with_any_fallback(self) -> TypeInfo | None: """ Create a QuerySet subclass with fallback to Any for unknown attributes and methods. This is used for the manager returned by the method above. """ name = "UnknownQuerySet" # Check if we've already created a fallback queryset class for this # module, and if so reuse that. queryset_info = self.lookup_typeinfo(f"{self.model_classdef.info.module_name}.{name}") if queryset_info and queryset_info.metadata.get("django", {}).get("any_fallback_queryset"): return queryset_info base_queryset_info = self.lookup_typeinfo(fullnames.QUERYSET_CLASS_FULLNAME) if base_queryset_info is None: return None queryset_info = helpers.build_reparametrized_subclass( self.current_module, base_queryset_info, name, unique_name=True ) queryset_info.metadata["django"] = { "any_fallback_queryset": True, } queryset_info.fallback_to_any = True return queryset_info def run_with_model_cls(self, model_cls: type[Model]) -> None: raise NotImplementedError(f"Implement this in subclass {self.__class__.__name__}") class AddAnnotateUtilities(ModelClassInitializer): """ Creates a model subclass that will be used when the model's manager/queryset calls 'annotate' to hold on to attributes that Django adds to a model instance. Example: class MyModel(models.Model): ... class MyModel@AnnotatedWith(MyModel, django_stubs_ext.Annotations[_Annotations]): ... """ @override def run(self) -> None: annotations = self.lookup_typeinfo_or_incomplete_defn_error("django_stubs_ext.Annotations") annotated_model = helpers.get_or_create_annotated_type(self.api, self.model_classdef.info, annotations) if self.is_model_abstract: # Below are abstract attributes, and in a stub file mypy requires # explicit ABCMeta if not all abstract attributes are implemented i.e. # class is kept abstract. So we add the attributes to get mypy off our # back exception_bases = { model_exc_name: self.lookup_typeinfo_or_incomplete_defn_error(base_exc_name) for model_exc_name, base_exc_name in [ ("DoesNotExist", fullnames.OBJECT_DOES_NOT_EXIST), ("NotUpdated", fullnames.OBJECT_NOT_UPDATED), ("MultipleObjectsReturned", fullnames.MULTIPLE_OBJECTS_RETURNED), ] } for model_exc_name, base_exc_type in exception_bases.items(): helpers.add_new_sym_for_info( annotated_model, model_exc_name, TypeType(Instance(base_exc_type, [])), ) class InjectAnyAsBaseForNestedMeta(ModelClassInitializer): """ Replaces class MyModel(models.Model): class Meta: pass with class MyModel(models.Model): class Meta(TypedModelMeta): pass to provide proper typing of attributes in Meta inner classes. If TypedModelMeta is not available, fallback to Any as a base to get around incompatible Meta inner classes for different models. """ @override def run(self) -> None: meta_node = helpers.get_nested_meta_node_for_current_class(self.model_classdef.info) if meta_node is None: return None meta_node.fallback_to_any = True typed_model_meta_info = self.lookup_typeinfo(fullnames.TYPED_MODEL_META_FULLNAME) if typed_model_meta_info and not meta_node.has_base(fullnames.TYPED_MODEL_META_FULLNAME): # Insert TypedModelMeta just before `object` to leverage mypy's class-body semantic analysis. meta_node.mro.insert(-1, typed_model_meta_info) return None class AddDefaultPrimaryKey(ModelClassInitializer): @override def run_with_model_cls(self, model_cls: type[Model]) -> None: auto_field = model_cls._meta.auto_field if auto_field: self.create_autofield( auto_field=auto_field, dest_name=auto_field.attname, existing_field=not self.model_classdef.info.has_readable_member(auto_field.attname), ) def create_autofield( self, auto_field: Field[Any, Any], dest_name: str, existing_field: bool, ) -> None: if existing_field: auto_field_fullname = helpers.get_class_fullname(auto_field.__class__) auto_field_info = self.lookup_typeinfo_or_incomplete_defn_error(auto_field_fullname) set_type, get_type = get_field_descriptor_types( auto_field_info, is_set_nullable=True, is_get_nullable=False, ) self.add_new_var_to_model_class(dest_name, Instance(auto_field_info, [set_type, get_type])) class AddPrimaryKeyAlias(AddDefaultPrimaryKey): @override def run_with_model_cls(self, model_cls: type[Model]) -> None: # We also need to override existing `pk` definition from `stubs`: auto_field = model_cls._meta.pk if auto_field is not None: # type: ignore[comparison-overlap] self.create_autofield( auto_field=auto_field, dest_name="pk", existing_field=self.model_classdef.info.has_readable_member(auto_field.name), ) class AddRelatedModelsId(ModelClassInitializer): @override def run_with_model_cls(self, model_cls: type[Model]) -> None: for field in self.django_context.get_model_foreign_keys(model_cls): try: related_model_cls = self.django_context.get_field_related_model_cls(field) except UnregisteredModelError: error_context: Context = self.ctx.cls field_sym = self.ctx.cls.info.get(field.name) if field_sym is not None and field_sym.node is not None: error_context = field_sym.node self.api.fail( f"Cannot find model {field.related_model!r} referenced in field {field.name!r}", ctx=error_context, ) self.add_new_var_to_model_class(field.attname, AnyType(TypeOfAny.explicit)) continue if related_model_cls._meta.abstract: continue rel_target_field = self.django_context.get_related_target_field(related_model_cls, field) if not rel_target_field: continue try: field_info = self.lookup_class_typeinfo_or_incomplete_defn_error(rel_target_field.__class__) except helpers.IncompleteDefnException as exc: if not self.api.final_iteration: raise exc continue is_nullable = self.django_context.get_field_nullability(field, None) set_type, get_type = get_field_descriptor_types( field_info, is_set_nullable=is_nullable, is_get_nullable=is_nullable ) self.add_new_var_to_model_class(field.attname, Instance(field_info, [set_type, get_type])) class AddManagers(ModelClassInitializer): def lookup_manager(self, fullname: str, manager: Manager[Any]) -> TypeInfo | None: manager_info = self.lookup_typeinfo(fullname) if manager_info is None: manager_info = self.get_dynamic_manager(fullname, manager) return manager_info def is_manager_dynamically_generated(self, manager_info: TypeInfo | None) -> bool: if manager_info is None: return False return manager_info.metadata.get("django", {}).get("from_queryset_manager") is not None def reparametrize_dynamically_created_manager(self, manager_name: str, manager_info: TypeInfo | None) -> None: if not self.is_manager_dynamically_generated(manager_info): return assert manager_info is not None # Reparameterize dynamically created manager with model type manager_type = helpers.fill_manager(manager_info, Instance(self.model_classdef.info, [])) self.add_new_var_to_model_class(manager_name, manager_type, is_classvar=True) @override def run_with_model_cls(self, model_cls: type[Model]) -> None: manager_info: TypeInfo | None incomplete_manager_defs = set() for manager_name, manager in model_cls._meta.managers_map.items(): manager_node = self.model_classdef.info.get(manager_name) manager_fullname = helpers.get_class_fullname(manager.__class__) manager_info = self.lookup_manager(manager_fullname, manager) if manager_node and manager_node.type is not None: # Manager is already typed -> do nothing unless it's a dynamically generated manager self.reparametrize_dynamically_created_manager(manager_name, manager_info) continue if manager_info is None: # We couldn't find a manager type, see if we should create one manager_info = self.try_create_manager_from_from_queryset(manager_name) if manager_info is None: incomplete_manager_defs.add(manager_name) continue assert self.model_classdef.info.self_type is not None manager_type = helpers.fill_manager(manager_info, self.model_classdef.info.self_type) self.add_new_var_to_model_class(manager_name, manager_type, is_classvar=True) if incomplete_manager_defs: if not self.api.final_iteration: # Unless we're on the final round, see if another round could # figure out all manager types raise helpers.IncompleteDefnException() for manager_name in incomplete_manager_defs: # We act graceful and set the type as the bare minimum we know of # (Django's default) before finishing. And emit an error, to allow for # ignoring a more specialised manager not being resolved while still # setting _some_ type fallback_manager_info = self.get_or_create_manager_with_any_fallback() if fallback_manager_info is not None: assert self.model_classdef.info.self_type is not None manager_type = helpers.fill_manager(fallback_manager_info, self.model_classdef.info.self_type) self.add_new_var_to_model_class(manager_name, manager_type, is_classvar=True) # Find expression for e.g. `objects = SomeManager()` manager_expr = self.get_manager_expression(manager_name) manager_fullname = f"{self.model_classdef.fullname}.{manager_name}" self.api.fail( f'Could not resolve manager type for "{manager_fullname}"', manager_expr or self.ctx.cls, code=MANAGER_MISSING, ) def get_manager_expression(self, name: str) -> AssignmentStmt | None: # TODO: What happens if the manager is defined multiple times? for expr in self.ctx.cls.defs.body: if ( isinstance(expr, AssignmentStmt) and isinstance(expr.lvalues[0], NameExpr) and expr.lvalues[0].name == name ): return expr return None def get_dynamic_manager(self, fullname: str, manager: Manager[Any]) -> TypeInfo | None: """ Try to get a dynamically defined manager """ # Check if manager is a generated (dynamic class) manager base_manager_fullname = helpers.get_class_fullname(manager.__class__.__bases__[0]) generated_managers = self.get_generated_manager_mappings(base_manager_fullname) generated_manager_name: str | None = generated_managers.get(fullname, None) if generated_manager_name is None: return None return self.lookup_typeinfo(generated_manager_name) def try_create_manager_from_from_queryset(self, name: str) -> TypeInfo | None: """ Try to create a manager from a .from_queryset call: class MyModel(models.Model): objects = MyManager.from_queryset(MyQuerySet)() module level cases are resolved in `create_new_manager_class_from_from_queryset_method` """ assign_statement = self.get_manager_expression(name) if assign_statement is None: return None expr = assign_statement.rvalue if not isinstance(expr, CallExpr) or not isinstance(expr.callee, CallExpr): return None return create_manager_info_from_from_queryset_call(self.api, expr.callee) class AddDefaultManagerAttribute(ModelClassInitializer): @override def run_with_model_cls(self, model_cls: type[Model]) -> None: if "_default_manager" in self.model_classdef.info.names: return None default_manager_cls = model_cls._meta.default_manager.__class__ default_manager_fullname = helpers.get_class_fullname(default_manager_cls) try: default_manager_info = self.lookup_typeinfo_or_incomplete_defn_error(default_manager_fullname) except helpers.IncompleteDefnException as exc: # Check if default manager could be a generated manager base_manager_fullname = helpers.get_class_fullname(default_manager_cls.__bases__[0]) generated_manager_info = self.get_generated_manager_info(default_manager_fullname, base_manager_fullname) if generated_manager_info is None: # Manager doesn't appear to be generated. Unless we're on the final round, # see if another round could help figuring out the default manager type if not self.api.final_iteration: raise exc return None default_manager_info = generated_manager_info default_manager = helpers.fill_manager(default_manager_info, Instance(self.model_classdef.info, [])) self.add_new_var_to_model_class("_default_manager", default_manager, is_classvar=True) class AddReverseLookups(ModelClassInitializer): @cached_property def reverse_one_to_one_descriptor(self) -> TypeInfo: return self.lookup_typeinfo_or_incomplete_defn_error(fullnames.REVERSE_ONE_TO_ONE_DESCRIPTOR) @cached_property def reverse_many_to_one_descriptor(self) -> TypeInfo: return self.lookup_typeinfo_or_incomplete_defn_error(fullnames.REVERSE_MANY_TO_ONE_DESCRIPTOR) @cached_property def many_to_many_descriptor(self) -> TypeInfo: return self.lookup_typeinfo_or_incomplete_defn_error(fullnames.MANY_TO_MANY_DESCRIPTOR) def process_relation(self, relation: ForeignObjectRel) -> None: attname = relation.get_accessor_name() if attname is None: # No reverse accessor. return to_model_cls = self.django_context.get_field_related_model_cls(relation) to_model_info = self.lookup_class_typeinfo_or_incomplete_defn_error(to_model_cls) reverse_lookup_declared = attname in self.model_classdef.info.names if isinstance(relation, OneToOneRel): if not reverse_lookup_declared: self.add_new_var_to_model_class( attname, Instance( self.reverse_one_to_one_descriptor, [Instance(self.model_classdef.info, []), Instance(to_model_info, [])], ), ) return if isinstance(relation, ManyToManyRel): if not reverse_lookup_declared: # TODO: 'relation' should be based on `TypeInfo` instead of Django runtime. assert relation.through is not None if isinstance(relation.through, str): # A lazy reference Django never resolved, i.e. the through model doesn't exist. return # type:ignore[unreachable] # this can only happen for broken django setup through_fullname = helpers.get_class_fullname(relation.through) through_model_info = self.lookup_typeinfo_or_incomplete_defn_error(through_fullname) self.add_new_var_to_model_class( attname, Instance( self.many_to_many_descriptor, [Instance(to_model_info, []), Instance(through_model_info, [])] ), is_classvar=True, ) return if not reverse_lookup_declared: # ManyToOneRel self.add_new_var_to_model_class( attname, Instance(self.reverse_many_to_one_descriptor, [Instance(to_model_info, [])]), is_classvar=True ) related_manager_info = self.lookup_typeinfo_or_incomplete_defn_error(fullnames.RELATED_MANAGER_CLASS) # TODO: Support other reverse managers than `_default_manager` default_manager = to_model_info.names.get("_default_manager") if default_manager is None: if not self.api.final_iteration: raise helpers.IncompleteDefnException() # When we get no default manager we can't customize the reverse manager any # further and will just fall back to the manager declared on the descriptor. # If a django model has a Manager class that cannot be resolved statically # (if it is generated in a way where we cannot import it, like # `objects = my_manager_factory()`) # # See https://github.com/typeddjango/django-stubs/pull/993 # for more information on when this error can occur. self.ctx.api.fail( ( f"Couldn't resolve related manager {attname!r} for relation " f"'{to_model_info.fullname}.{relation.field.name}'." ), self.ctx.cls, code=MANAGER_MISSING, ) return default_manager_type = get_proper_type(default_manager.type) if ( # '_default_manager' attribute is a node type we can't process not isinstance(default_manager_type, Instance) # Already has a related manager subclassed from the default manager or helpers.get_reverse_manager_info(self.api, model_info=to_model_info, derived_from="_default_manager") is not None # When the default manager isn't custom there's no need to create a new type # as `RelatedManager` has `models.Manager` as base or default_manager_type.type.fullname == fullnames.MANAGER_CLASS_FULLNAME ): return # Create a reverse manager subclassed from the default manager of the related # model and 'RelatedManager' related_manager = Instance(related_manager_info, [Instance(to_model_info, [])]) # The reverse manager is based on the related model's manager, so it makes most sense to add the new # related manager in that module new_related_manager_info = helpers.add_new_class_for_module( module=self.api.modules[to_model_info.module_name], name=f"{to_model_info.name}_RelatedManager", bases=[related_manager, default_manager_type], ) # Stash the new reverse manager type fullname on the related model, so we don't duplicate # or have to create it again for other reverse relations helpers.set_reverse_manager_info( to_model_info, derived_from="_default_manager", fullname=new_related_manager_info.fullname, ) @override def run_with_model_cls(self, model_cls: type[Model]) -> None: # add related managers etc. processing_incomplete = False for relation in self.django_context.get_model_relations(model_cls): try: self.process_relation(relation) except helpers.IncompleteDefnException: processing_incomplete = True if processing_incomplete and not self.api.final_iteration: raise helpers.IncompleteDefnException class AddExtraFieldMethods(ModelClassInitializer): @override def run_with_model_cls(self, model_cls: type[Model]) -> None: # get_FOO_display for choices for field in self.django_context.get_model_fields(model_cls): if field.choices: info = self.lookup_typeinfo_or_incomplete_defn_error("builtins.str") return_type = Instance(info, []) common.add_method(self.ctx, name=f"get_{field.attname}_display", args=[], return_type=return_type) # get_next_by, get_previous_by for Date, DateTime for field in self.django_context.get_model_fields(model_cls): if isinstance(field, DateField | DateTimeField) and not field.null: return_type = Instance(self.model_classdef.info, []) common.add_method( self.ctx, name=f"get_next_by_{field.attname}", args=[ Argument( Var("kwargs", AnyType(TypeOfAny.implementation_artifact)), AnyType(TypeOfAny.implementation_artifact), initializer=None, kind=ARG_STAR2, ) ], return_type=return_type, ) common.add_method( self.ctx, name=f"get_previous_by_{field.attname}", args=[ Argument( Var("kwargs", AnyType(TypeOfAny.implementation_artifact)), AnyType(TypeOfAny.implementation_artifact), initializer=None, kind=ARG_STAR2, ) ], return_type=return_type, ) class ProcessManyToManyFields(ModelClassInitializer): """ Processes 'ManyToManyField()' fields and; - Generates any implicit through tables that Django also generates. It won't do anything if the model is abstract or for fields where an explicit 'through' argument has been passed. - Creates related managers for both ends of the many to many relationship TODO: Move the 'related_name' contribution from 'AddReverseLookups' to here. As it makes sense to add it when processing ManyToManyField """ def statements(self) -> Iterable[Statement]: """ Returns class body statements from the current model and any of its bases that is an abstract model. Statements from any concrete parent class or parents of that concrete class will be skipped. """ processed_models = set() # Produce all statements from current class model_bases = deque([self.model_classdef]) # Do a breadth first search over the current model and its bases, to find all # abstract parent models that have not been "interrupted" by any concrete model. while model_bases: model = model_bases.popleft() yield from model.defs.body if isinstance(model.info, FakeInfo): # While loading from cache ClassDef infos are faked and 'FakeInfo' doesn't have # all attributes of a 'TypeInfo' set. See #2184 continue for base in model.info.bases: # Only produce any additional statements from abstract model bases, as they # simulate regular python inheritance. Avoid concrete models, and any of their # parents, as they're handled differently by Django. if helpers.is_abstract_model(base.type) and base.type.fullname not in processed_models: model_bases.append(base.type.defn) processed_models.add(base.type.fullname) @override def run(self) -> None: if self.is_model_abstract: # TODO: Create abstract through models? return for statement in self.statements(): # Check if this part of the class body is an assignment from a 'ManyToManyField' call # = ManyToManyField(...) if ( isinstance(statement, AssignmentStmt) and len(statement.lvalues) == 1 and isinstance(statement.lvalues[0], NameExpr) and isinstance(statement.rvalue, CallExpr) and len(statement.rvalue.args) > 0 # Need at least the 'to' argument and isinstance(statement.rvalue.callee, RefExpr) and isinstance(statement.rvalue.callee.node, TypeInfo) and statement.rvalue.callee.node.has_base(fullnames.MANYTOMANY_FIELD_FULLNAME) ): m2m_field_name = statement.lvalues[0].name m2m_field_symbol = self.model_classdef.info.get(m2m_field_name) # The symbol referred to by the assignment expression is expected to be a variable if m2m_field_symbol is None or not isinstance(m2m_field_symbol.node, Var): continue # Resolve argument information of the 'ManyToManyField(...)' call args = self.resolve_many_to_many_arguments(statement.rvalue, context=statement) # Ignore calls without required 'to' argument, mypy will complain if args is None: continue # Get the names of the implicit through model that will be generated through_model_name = f"{self.model_classdef.name}_{m2m_field_name}" through_model = self.create_through_table_class( field_name=m2m_field_name, model_name=through_model_name, model_fullname=f"{self.model_classdef.info.module_name}.{through_model_name}", m2m_args=args, ) if through_model is not None and args.through is None: # Explicit through models are regular models, they get their managers from the usual initializers. self.add_through_table_managers(through_model) container = self.model_classdef.info.get_containing_type_info(m2m_field_name) if ( through_model is not None and container is not None and container.fullname != self.model_classdef.info.fullname and helpers.is_abstract_model(container) ): # ManyToManyField is inherited from an abstract parent class, so in # order to get the to and the through model argument right we # override the ManyToManyField attribute on the current class helpers.add_new_sym_for_info( self.model_classdef.info, name=m2m_field_name, sym_type=Instance(self.m2m_field, [args.to.model, Instance(through_model, [])]), ) # Create a 'ManyRelatedManager' class for the processed model self.create_many_related_manager(Instance(self.model_classdef.info, [])) if isinstance(args.to.model, Instance): # Create a 'ManyRelatedManager' class for the related model self.create_many_related_manager(args.to.model) @cached_property def default_pk_instance(self) -> Instance: default_pk_field = self.lookup_typeinfo(self.django_context.settings.DEFAULT_AUTO_FIELD) if default_pk_field is None: raise helpers.IncompleteDefnException() return Instance( default_pk_field, list(get_field_descriptor_types(default_pk_field, is_set_nullable=True, is_get_nullable=False)), ) @cached_property def model_pk_instance(self) -> Instance: return self.get_pk_instance(self.model_classdef.info) @cached_property def model_base(self) -> TypeInfo: info = self.lookup_typeinfo(fullnames.MODEL_CLASS_FULLNAME) if info is None: raise helpers.IncompleteDefnException() return info @cached_property def fk_field(self) -> TypeInfo: info = self.lookup_typeinfo(fullnames.FOREIGN_KEY_FULLNAME) if info is None: raise helpers.IncompleteDefnException() return info @cached_property def m2m_field(self) -> TypeInfo: info = self.lookup_typeinfo(fullnames.MANYTOMANY_FIELD_FULLNAME) if info is None: raise helpers.IncompleteDefnException() return info @cached_property def manager_info(self) -> TypeInfo: info = self.lookup_typeinfo(fullnames.MANAGER_CLASS_FULLNAME) if info is None: raise helpers.IncompleteDefnException() return info @cached_property def fk_field_types(self) -> FieldDescriptorTypes: return get_field_descriptor_types(self.fk_field, is_set_nullable=False, is_get_nullable=False) @cached_property def many_related_manager(self) -> TypeInfo: return self.lookup_typeinfo_or_incomplete_defn_error(fullnames.MANY_RELATED_MANAGER) def get_pk_instance(self, model: TypeInfo, /) -> Instance: """ Get a primary key instance of provided model's type info. If primary key can't be resolved, return a default declaration. """ contains_from_pk_info = model.get_containing_type_info("pk") if contains_from_pk_info is not None: pk = contains_from_pk_info.names["pk"].node if isinstance(pk, Var): pk_type = get_proper_type(pk.type) if isinstance(pk_type, Instance): return pk_type return self.default_pk_instance def create_through_table_class( self, field_name: str, model_name: str, model_fullname: str, m2m_args: M2MArguments ) -> TypeInfo | None: if not isinstance(m2m_args.to.model, Instance): return None if m2m_args.through is not None: # Call has explicit 'through=', no need to create any implicit through table return m2m_args.through.model.type if isinstance(m2m_args.through.model, Instance) else None # If through model is already declared there's nothing more we should do through_model = self.lookup_typeinfo(model_fullname) if through_model is not None: return through_model # Declare a new, empty, implicitly generated through model class named: '_' through_model = self.add_new_class_for_current_module(model_name, bases=[Instance(self.model_base, [])]) # We attempt to be a bit clever here and store the generated through model's fullname in # the metadata of the class containing the 'ManyToManyField' call expression, where its # identifier is the field name of the 'ManyToManyField'. This would allow the containing # model to always find the implicit through model, so that it doesn't get lost. model_metadata = helpers.get_django_metadata(self.model_classdef.info) model_metadata.setdefault("m2m_throughs", {}) model_metadata["m2m_throughs"][field_name] = through_model.fullname # Add a 'pk' symbol to the model class helpers.add_new_sym_for_info(through_model, name="pk", sym_type=self.default_pk_instance.copy_modified()) # Add an 'id' symbol to the model class helpers.add_new_sym_for_info(through_model, name="id", sym_type=self.default_pk_instance.copy_modified()) # Add the foreign key to the model containing the 'ManyToManyField' call: # or from_ from_name = f"from_{self.model_classdef.name.lower()}" if m2m_args.to.self else self.model_classdef.name.lower() helpers.add_new_sym_for_info( through_model, name=from_name, sym_type=Instance( self.fk_field, [ helpers.convert_any_to_type(self.fk_field_types.set, Instance(self.model_classdef.info, [])), helpers.convert_any_to_type(self.fk_field_types.get, Instance(self.model_classdef.info, [])), ], ), ) # Add the foreign key's '_id' field: _id or from__id helpers.add_new_sym_for_info( through_model, name=f"{from_name}_id", sym_type=self.model_pk_instance.copy_modified() ) # Add the foreign key to the model on the opposite side of the relation # i.e. the model given as 'to' argument to the 'ManyToManyField' call: # or to_ to_name = ( f"to_{m2m_args.to.model.type.name.lower()}" if m2m_args.to.self else m2m_args.to.model.type.name.lower() ) helpers.add_new_sym_for_info( through_model, name=to_name, sym_type=Instance( self.fk_field, [ helpers.convert_any_to_type(self.fk_field_types.set, m2m_args.to.model), helpers.convert_any_to_type(self.fk_field_types.get, m2m_args.to.model), ], ), ) # Add the foreign key's '_id' field: _id or to__id other_pk = self.get_pk_instance(m2m_args.to.model.type) helpers.add_new_sym_for_info(through_model, name=f"{to_name}_id", sym_type=other_pk.copy_modified()) return through_model def add_through_table_managers(self, through_model: TypeInfo) -> None: """The `self.manager_info` lookup might trigger a deferral pass so this has to be idempotent""" for name in ("objects", "_default_manager"): if through_model.names.get(name) is None: helpers.add_new_sym_for_info( through_model, name=name, sym_type=Instance(self.manager_info, [Instance(through_model, [])]), is_classvar=True, ) def resolve_many_to_many_arguments(self, call: CallExpr, /, context: Context) -> M2MArguments | None: """ Inspect a 'ManyToManyField(...)' call to collect argument data on any 'to' and 'through' arguments. """ to_arg = helpers.get_class_init_argument_by_name(call, "to") if to_arg is None: # 'to' is a required argument of 'ManyToManyField()', we can't do anything if it's not provided return None # Resolve the type of the 'to' argument expression to_model = helpers.get_model_from_expression( to_arg, self_model=self.model_classdef.info, api=self.api, django_context=self.django_context ) if to_model is None: return None to = M2MTo( arg=to_arg, model=to_model, self=to_model.type == self.model_classdef.info, ) # Resolve the type of the 'through' argument expression through_arg = helpers.get_class_init_argument_by_name(call, "through") through = None if through_arg is not None: through_model = helpers.get_model_from_expression( through_arg, self_model=self.model_classdef.info, api=self.api, django_context=self.django_context ) if through_model is not None: through = M2MThrough(arg=through_arg, model=through_model) return M2MArguments(to=to, through=through) def create_many_related_manager(self, model: Instance) -> None: """ Creates a generic manager that subclasses both 'ManyRelatedManager' and the default manager of the given model. These are normally used on both models involved in a ManyToManyField. The manager classes are generic over a '_Through' model, meaning that they can be reused for multiple many to many relations. """ if helpers.get_many_to_many_manager_info(self.api, to=model.type, derived_from="_default_manager") is not None: return default_manager_node = model.type.names.get("_default_manager") if default_manager_node is None: raise helpers.IncompleteDefnException() default_manager_type = get_proper_type(default_manager_node.type) if not isinstance(default_manager_type, Instance): return # Create a reusable generic subclass that is generic over a 'through' model, # explicitly declared it'd could have looked something like below # # class X(models.Model): ... # _Through = TypeVar("_Through", bound=models.Model) # class X_ManyRelatedManager(ManyRelatedManager[X, _Through], type(X._default_manager), Generic[_Through]): ... through_type_var = self.many_related_manager.defn.type_vars[1] assert isinstance(through_type_var, TypeVarType) if has_placeholder(through_type_var): # 'ManyRelatedManager' hasn't been fully analysed yet, so '_Through' still # carries a 'PlaceholderType' bound. Copying it into the class we're about to # create would store an unserializable type on a synthetic class that is never # re-analysed, so defer instead and pick it up on a later iteration. raise helpers.IncompleteDefnException() generic_to_many_related_manager = Instance(self.many_related_manager, [model, through_type_var.copy_modified()]) related_manager_info = helpers.add_new_class_for_module( module=self.api.modules[model.type.module_name], name=f"{model.type.name}_ManyRelatedManager", bases=[generic_to_many_related_manager, default_manager_type], ) # Reuse the '_Through' `TypeVar` from `ManyRelatedManager` in our subclass related_manager_info.defn.type_vars = [through_type_var.copy_modified()] related_manager_info.add_type_vars() # Track the existence of our manager subclass, by tying it to the model it # operates on helpers.set_many_to_many_manager_info( to=model.type, derived_from="_default_manager", manager_info=related_manager_info ) class MetaclassAdjustments(ModelClassInitializer): @classmethod def adjust_model_class(cls, ctx: ClassDefContext, plugin_config: DjangoPluginConfig) -> None: """ For the sake of type checkers other than mypy, some attributes that are dynamically added by Django's model metaclass has been annotated on `django.db.models.base.Model`. We remove those attributes and will handle them through the plugin. Configurable with `strict_model_abstract_attrs = false` to skip removing any objects from models. Basically, this code:: from django.db import models def get_model_count(model_type: type[models.Model]) -> int: return model_type.objects.count() - Will raise an error `"type[models.Model]" has no attribute "objects" [attr-defined]` when `strict_model_abstract_attrs = true` (default) - Return without any type errors when `strict_model_abstract_attrs = false` But, beware that the code above can fail in runtime, as mypy correctly shows. Example: `get_model_count(models.Model)` Turn this setting off at your own risk. """ # Mypy does not properly support narrowing in `__getattr__` based on `Literal["objects"]` # so the current `ModelBase.__getattr__` swallows every unknown attributes errors. # `objects` is already inserted by the plugin, so the fallback is not necessary for mypy. We can drop it # TODO: remove once https://github.com/python/mypy/issues/8203 is resolved metaclass = ctx.cls.info.metaclass_type if metaclass is not None and "__getattr__" in metaclass.type.names: del metaclass.type.names["__getattr__"] if ctx.cls.fullname != fullnames.MODEL_CLASS_FULLNAME: return if not plugin_config.strict_model_abstract_attrs: # `__getattr__` was the only source of `Model.objects`, redeclare it explicitly for this setting. manager = helpers.lookup_fully_qualified_typeinfo( helpers.get_semanal_api(ctx), fullnames.MANAGER_CLASS_FULLNAME ) if manager is not None: helpers.add_new_sym_for_info( ctx.cls.info, name="objects", sym_type=Instance(manager, [Instance(ctx.cls.info, [])]), ) return for attr_name in ["DoesNotExist", "NotUpdated", "MultipleObjectsReturned"]: attr = ctx.cls.info.names.get(attr_name) if attr is not None and isinstance(attr.node, Var) and not attr.plugin_generated: del ctx.cls.info.names[attr_name] def get_exception_bases(self, name: str) -> list[Instance]: bases = [] for model_base in self.model_classdef.info.direct_base_classes(): exception_base_sym = model_base.names.get(name) if ( # Base class is a Model helpers.is_model_type(model_base) # But base class is not 'models.Model' and model_base.fullname != fullnames.MODEL_CLASS_FULLNAME # Base class also has a generated exception base e.g. 'DoesNotExist' and exception_base_sym is not None and exception_base_sym.plugin_generated and isinstance(exception_base_sym.node, TypeInfo) ): bases.append(Instance(exception_base_sym.node, [])) return bases def add_exception_classes(self) -> None: """ Adds exception classes `DoesNotExist`, `NotUpdated`, and `MultipleObjectsReturned` to a model type, aligned with how the model metaclass does it runtime. If the model is abstract, exceptions will be added as abstract attributes. """ for model_exc_name, base_exc_name in [ ("DoesNotExist", fullnames.OBJECT_DOES_NOT_EXIST), ("NotUpdated", fullnames.OBJECT_NOT_UPDATED), ("MultipleObjectsReturned", fullnames.MULTIPLE_OBJECTS_RETURNED), ]: if model_exc_name in self.model_classdef.info.names: continue base_exc_type = self.lookup_typeinfo_or_incomplete_defn_error(base_exc_name) base_exc_inst = Instance(base_exc_type, []) model_exc_type: Var | TypeInfo if self.is_model_abstract: model_exc_type = self.create_new_var(model_exc_name, TypeType(base_exc_inst)) model_exc_type.is_abstract_var = True else: model_exc_type = helpers.create_type_info( model_exc_name, self.model_classdef.info.fullname, self.get_exception_bases(model_exc_name) or [base_exc_inst], ) self.model_classdef.info.names[model_exc_type.name] = SymbolTableNode( MDEF, model_exc_type, plugin_generated=True ) @override def run(self) -> None: self.add_exception_classes() def process_model_class(ctx: ClassDefContext, django_context: DjangoContext) -> None: initializers = [ AddAnnotateUtilities, InjectAnyAsBaseForNestedMeta, AddDefaultPrimaryKey, AddPrimaryKeyAlias, AddRelatedModelsId, AddManagers, AddDefaultManagerAttribute, AddReverseLookups, AddExtraFieldMethods, ProcessManyToManyFields, MetaclassAdjustments, ] for initializer_cls in initializers: try: initializer_cls(ctx, django_context).run() except helpers.IncompleteDefnException: if not ctx.api.final_iteration: ctx.api.defer() def set_auth_user_model_boolean_fields(ctx: AttributeContext, django_context: DjangoContext) -> MypyType: boolinfo = helpers.lookup_class_typeinfo(helpers.get_typechecker_api(ctx), bool) assert boolinfo is not None return Instance(boolinfo, []) def handle_annotated_type(ctx: AnalyzeTypeContext, fullname: str) -> MypyType: """ Replaces the 'WithAnnotations' type with a type that can represent an annotated model. """ is_with_annotations = fullname == fullnames.WITH_ANNOTATIONS_FULLNAME args = ctx.type.args if not args: return AnyType(TypeOfAny.from_omitted_generics) if is_with_annotations else ctx.type type_arg = get_proper_type(ctx.api.analyze_type(args[0])) if not isinstance(type_arg, Instance) or not helpers.is_model_type(type_arg.type): if isinstance(type_arg, TypeVarType): # When the first arg is a TypeVar bounded by a Model (e.g. WithAnnotations[_Model, BarDict]), # use the upper bound to look up @AnnotatedWith. The method hook # (merge_annotations_from_custom_method) will later replace it with the actual concrete model. upper = get_proper_type(type_arg.upper_bound) if isinstance(upper, Instance) and helpers.is_model_type(upper.type): type_arg = upper else: return type_arg else: return type_arg fields_dict = None if len(args) > 1: second_arg_type = get_proper_type(ctx.api.analyze_type(args[1])) if isinstance(second_arg_type, TypedDictType) and is_with_annotations: fields_dict = second_arg_type elif isinstance(second_arg_type, Instance) and second_arg_type.type.fullname == ANNOTATIONS_FULLNAME: annotations_type_arg = get_proper_type(second_arg_type.args[0]) if isinstance(annotations_type_arg, TypedDictType): fields_dict = annotations_type_arg elif not isinstance(annotations_type_arg, AnyType): ctx.api.fail("Only TypedDicts are supported as type arguments to Annotations", ctx.context) elif annotations_type_arg.type_of_any == TypeOfAny.from_omitted_generics: ctx.api.fail("Missing required TypedDict parameter for generic type Annotations", ctx.context) if fields_dict is None: return type_arg assert isinstance(ctx.api, TypeAnalyser) assert isinstance(ctx.api.api, SemanticAnalyzer) return get_annotated_type(ctx.api.api, type_arg, fields_dict=fields_dict) def get_annotated_type( api: SemanticAnalyzer | TypeChecker, model_type: Instance, fields_dict: TypedDictType ) -> ProperType: """ Get a model type that can be used to represent an annotated model """ extra_attrs = helpers.merge_extra_attrs(model_type.extra_attrs, new_attrs=fields_dict.items) annotated_model: TypeInfo | None if helpers.is_annotated_model(model_type.type): annotated_model = model_type.type if model_type.args: annotations = get_proper_type(model_type.args[0]) if isinstance(annotations, TypedDictType): fields_dict = helpers.merge_typeddict(api, annotations, fields_dict) else: annotated_model = helpers.lookup_fully_qualified_typeinfo(api, model_type.type.fullname + "@AnnotatedWith") if annotated_model is None and isinstance(api, SemanticAnalyzer): # Create @AnnotatedWith lazily when it doesn't exist yet. This happens when # WithAnnotations is used with a TypeVar whose upper bound is a model that # hasn't been processed by AddAnnotateUtilities (e.g. the base Model class). annotations_info = helpers.lookup_fully_qualified_typeinfo(api, ANNOTATIONS_FULLNAME) if annotations_info is not None: annotated_model = helpers.get_or_create_annotated_type(api, model_type.type, annotations_info) if annotated_model is None: return model_type return Instance(annotated_model, [fields_dict], extra_attrs=extra_attrs) typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/orm_lookups.py000066400000000000000000000111751526064357400304200ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from mypy.nodes import ARG_NAMED, DictExpr, StrExpr from mypy.types import AnyType, Instance, ProperType, TypeOfAny, UnionType, get_proper_type from mypy.types import Type as MypyType from mypy_django_plugin.exceptions import UnregisteredModelError from mypy_django_plugin.lib import fullnames, helpers if TYPE_CHECKING: from mypy.plugin import MethodContext from mypy_django_plugin.django.context import DjangoContext def typecheck_queryset_filter(ctx: MethodContext, django_context: DjangoContext) -> MypyType: django_model = helpers.get_model_info_from_qs_ctx(ctx, django_context) if django_model is None: return ctx.default_return_type # We only typecheck the `**kwargs` formal parameter. Python's grammar guarantees # `**kwargs` is the last formal parameter when present, which holds for every # method this hook is registered for (`filter`, `get_or_create`, `update_or_create`, ...). lookup_kwargs = ctx.arg_names[-1] provided_lookup_types = ctx.arg_types[-1] for lookup_kwarg, provided_type in zip(lookup_kwargs, provided_lookup_types, strict=False): if lookup_kwarg is None: continue provided_type = resolve_combinables(get_proper_type(provided_type), django_context) lookup_type: MypyType try: lookup_type = django_context.resolve_lookup_expected_type( ctx, django_model.cls, lookup_kwarg, django_model.typ ) except UnregisteredModelError: lookup_type = AnyType(TypeOfAny.from_error) # Managers as provided_type is not supported yet if isinstance(provided_type, Instance) and helpers.has_any_of_bases( provided_type.type, (fullnames.MANAGER_CLASS_FULLNAME, fullnames.QUERYSET_CLASS_FULLNAME) ): return ctx.default_return_type helpers.check_types_compatible( ctx, expected_type=lookup_type, actual_type=provided_type, error_message=f"Incompatible type for lookup {lookup_kwarg!r}:", ) _typecheck_defaults_kwarg(ctx, django_model, django_context) return ctx.default_return_type def _typecheck_defaults_kwarg( ctx: MethodContext, django_model: helpers.DjangoModel, django_context: DjangoContext ) -> None: """ Validate `defaults=` and `create_defaults=` dict literals passed to `get_or_create` / `update_or_create` against the model's field setter types. Only literal `DictExpr` arguments with string-literal keys are checked; any other shape is silently skipped to avoid false positives. """ defaults_positions = [ idx for idx, name in enumerate(ctx.callee_arg_names) if name in ("defaults", "create_defaults") ] if not defaults_positions: return api = helpers.get_typechecker_api(ctx) expected_types = django_context.get_expected_types(api, django_model.cls, method="create") model_name = django_model.cls.__name__ for idx in defaults_positions: if not ctx.args[idx]: continue if ctx.arg_kinds[idx][0] != ARG_NAMED: continue dict_expr = ctx.args[idx][0] if not isinstance(dict_expr, DictExpr): continue for key_expr, value_expr in dict_expr.items: if not isinstance(key_expr, StrExpr): continue key_name = key_expr.value if key_name not in expected_types: ctx.api.fail( f'Unexpected attribute "{key_name}" for model "{model_name}"', key_expr, ) continue actual_type = api.get_expression_type(value_expr) helpers.check_types_compatible( ctx, expected_type=expected_types[key_name], actual_type=actual_type, error_message=f'Incompatible type for "{key_name}" of "{model_name}"', ) def resolve_combinables(provided_type: ProperType, django_context: DjangoContext) -> ProperType: if isinstance(provided_type, UnionType): return UnionType.make_union( [resolve_combinables(get_proper_type(item), django_context) for item in provided_type.items] ) if isinstance(provided_type, Instance) and provided_type.type.has_base(fullnames.COMBINABLE_EXPRESSION_FULLNAME): if provided_type.type.fullname != fullnames.F_EXPRESSION_FULLNAME: # Combinables aside from F expressions are unsupported return AnyType(TypeOfAny.explicit) return django_context.resolve_f_expression_type(provided_type) return provided_type typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/querysets.py000066400000000000000000001533531526064357400301200ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, Literal from django.core.exceptions import FieldDoesNotExist, FieldError from django.db.models.constants import LOOKUP_SEP from django.db.models.fields.related import RelatedField from django.db.models.fields.related_descriptors import ( ForwardManyToOneDescriptor, ManyToManyDescriptor, ReverseManyToOneDescriptor, ReverseOneToOneDescriptor, ) from django.db.models.fields.reverse_related import ForeignObjectRel from django.db.models.sql.query import Query from mypy.errorcodes import NO_REDEF from mypy.nodes import ( ARG_NAMED, ARG_NAMED_OPT, ARG_POS, ARG_STAR, CallExpr, Decorator, Expression, ListExpr, SetExpr, StrExpr, TupleExpr, Var, ) from mypy.types import ( AnyType, CallableType, Instance, LiteralType, ProperType, TupleType, TypedDictType, TypeOfAny, TypeVarType, get_proper_type, ) from mypy.types import Type as MypyType from mypy_django_plugin.django.context import DjangoContext, LookupsAreUnsupported from mypy_django_plugin.lib import fullnames, helpers from mypy_django_plugin.lib.field_validation import ( check_field_concrete, check_field_unique, try_get_field, validate_non_pk_concrete_field, ) from mypy_django_plugin.transformers.models import get_annotated_type if TYPE_CHECKING: from collections.abc import Sequence from django.db.models.base import Model from mypy.checker import TypeChecker from mypy.plugin import FunctionContext, MethodContext from mypy_django_plugin.lib.helpers import DjangoModel def determine_proper_manager_type(ctx: FunctionContext) -> MypyType: """ Fill the manager TypeVar on instantiation using the enclosing class. For example: class MyModel(Model): objects = MyManager() Is interpreted as: class MyModel(Model): objects: MyManager[MyModel] = MyManager() """ default_return_type = get_proper_type(ctx.default_return_type) assert isinstance(default_return_type, Instance) outer_model_info = helpers.get_typechecker_api(ctx).scope.active_class() if ( outer_model_info is None or not helpers.is_model_type(outer_model_info) or outer_model_info.self_type is None or not default_return_type.type.is_generic() ): return default_return_type return default_return_type.copy_modified(args=[outer_model_info.self_type]) def get_field_type_from_lookup( ctx: MethodContext, django_context: DjangoContext, model_cls: type[Model], *, method: str, lookup: str, silent_on_error: bool = False, ) -> MypyType | None: try: lookup_field, model_cls = django_context.resolve_lookup_into_field(model_cls, lookup) except FieldError as exc: if not silent_on_error: ctx.api.fail(exc.args[0], ctx.context) return None except LookupsAreUnsupported: return AnyType(TypeOfAny.explicit) if lookup_field is None: return AnyType(TypeOfAny.implementation_artifact) if (isinstance(lookup_field, RelatedField) and lookup_field.column == lookup) or isinstance( lookup_field, ForeignObjectRel ): model_cls = django_context.get_field_related_model_cls(lookup_field) lookup_field = django_context.get_primary_key_field(model_cls) api = helpers.get_typechecker_api(ctx) model_info = helpers.lookup_class_typeinfo(api, model_cls) return django_context.get_field_get_type(api, model_info, lookup_field, method=method) def get_values_list_row_type( ctx: MethodContext, django_context: DjangoContext, model_cls: type[Model], *, annotation_types: dict[str, MypyType], flat: bool, named: bool, ) -> MypyType: field_lookups = resolve_field_lookups(ctx.args[0], django_context) if field_lookups is None: return AnyType(TypeOfAny.from_error) typechecker_api = helpers.get_typechecker_api(ctx) model_info = helpers.lookup_class_typeinfo(typechecker_api, model_cls) if len(field_lookups) == 0: if flat: primary_key_field = django_context.get_primary_key_field(model_cls) lookup_type = get_field_type_from_lookup( ctx, django_context, model_cls, lookup=primary_key_field.attname, method="values_list" ) assert lookup_type is not None return lookup_type if named: column_types: dict[str, MypyType] = {} for field in django_context.get_model_fields(model_cls): column_type = django_context.get_field_get_type( typechecker_api, model_info, field, method="values_list" ) column_types[field.attname] = column_type column_types.update(annotation_types) return helpers.make_oneoff_named_tuple(typechecker_api, "Row", column_types) # flat=False, named=False, all fields if annotation_types: return typechecker_api.named_generic_type("builtins.tuple", [AnyType(TypeOfAny.special_form)]) field_lookups = [] for field in django_context.get_model_fields(model_cls): field_lookups.append(field.attname) if len(field_lookups) > 1 and flat: typechecker_api.fail("'flat' is not valid when 'values_list' is called with more than one field", ctx.context) return AnyType(TypeOfAny.from_error) column_types = {} for field_lookup in field_lookups: if annotation_type := annotation_types.get(field_lookup): column_types[field_lookup] = annotation_type continue lookup_field_type = get_field_type_from_lookup( ctx, django_context, model_cls, lookup=field_lookup, method="values_list", silent_on_error=bool(annotation_types), ) if lookup_field_type is None: if annotation_types: lookup_field_type = AnyType(TypeOfAny.from_omitted_generics) else: return AnyType(TypeOfAny.from_error) column_types[field_lookup] = lookup_field_type if flat: assert len(column_types) == 1 row_type = next(iter(column_types.values())) elif named: row_type = helpers.make_oneoff_named_tuple(typechecker_api, "Row", column_types) else: # Since there may have been repeated field lookups, we cannot just use column_types.values here. # This is not the case in named above, because Django will error if duplicate fields are requested. resolved_column_types = [column_types[field_lookup] for field_lookup in field_lookups] row_type = helpers.make_tuple(typechecker_api, resolved_column_types) return row_type def extract_proper_type_queryset_values_list(ctx: MethodContext, django_context: DjangoContext) -> MypyType: django_model = helpers.get_model_info_from_qs_ctx(ctx, django_context) if django_model is None: return ctx.default_return_type default_return_type = get_proper_type(ctx.default_return_type) if not isinstance(default_return_type, Instance): return ctx.default_return_type flat = helpers.get_bool_call_argument_by_name(ctx, "flat", default=False) named = helpers.get_bool_call_argument_by_name(ctx, "named", default=False) if flat and named: ctx.api.fail("'flat' and 'named' can't be used together", ctx.context) return default_return_type.copy_modified(args=[django_model.typ, AnyType(TypeOfAny.from_error)]) annotation_types = _get_annotation_field_types(django_model.typ) if django_model.is_annotated else {} row_type = get_values_list_row_type( ctx, django_context, django_model.cls, annotation_types=annotation_types, flat=flat, named=named, ) ret = default_return_type.copy_modified(args=[django_model.typ, row_type]) if not named and (field_lookups := resolve_field_lookups(ctx.args[0], django_context)): # For non-named values_list, the row type does not encode column names. # Attach selected field names to the returned QuerySet instance so that # subsequent annotate() can make an informed decision about name conflicts. ret.extra_attrs = helpers.merge_extra_attrs(ret.extra_attrs, new_immutable=set(field_lookups)) return ret def _aggregate_default_alias(expr: Expression, expr_type: MypyType) -> str | None: """Mirror `Aggregate.default_alias`: ``__``. Django generates a default alias only for aggregates with a single source expression that has a `name`; complex expressions raise at runtime, so the plugin matches that and returns ``None`` for anything else. See https://docs.djangoproject.com/en/dev/topics/db/aggregation/#generating-aggregates-for-each-item-in-a-queryset """ if not ( isinstance(expr, CallExpr) and isinstance(proper := get_proper_type(expr_type), Instance) and proper.type.has_base(fullnames.AGGREGATE_CLASS_FULLNAME) ): return None source: Expression | None = None for arg, kind in zip(expr.args, expr.arg_kinds, strict=False): if kind != ARG_POS: continue if source is not None: return None source = arg # TODO: consider switching to `helpers.resolve_string_attribute_value` once # `gather_kwargs` threads `django_context` through — that would also handle # `Count(NAME_CONST)` and `Count(settings.X)`. if not isinstance(source, StrExpr): return None return f"{source.value}__{proper.type.name.lower()}" def gather_kwargs(ctx: MethodContext) -> dict[str, MypyType] | None: kwargs: dict[str, MypyType] = {} named = (ARG_NAMED, ARG_NAMED_OPT) for slot in zip(ctx.arg_kinds, ctx.arg_types, ctx.arg_names, ctx.args, strict=False): for kind, arg_type, name, arg in zip(*slot, strict=False): if kind in named: assert name is not None kwargs[name] = arg_type elif kind == ARG_POS: alias = _aggregate_default_alias(arg, arg_type) if alias is not None: kwargs[alias] = arg_type return kwargs def reparameterize_func_output_field(ctx: FunctionContext) -> MypyType: """Reparameterize Func[_OutputField] from the output_field argument. When a generic Func subclass like Substr is nested directly inside a call with **kwargs: Any (e.g., QuerySet.annotate()), mypy infers _OutputField=Any because the target type is unconstrained. This hook corrects the return type by extracting the actual output_field argument type. """ default = get_proper_type(ctx.default_return_type) if not isinstance(default, Instance) or not default.args: return ctx.default_return_type # Only act when the generic arg is Any (i.e., mypy didn't infer it) if not isinstance(get_proper_type(default.args[0]), AnyType): return ctx.default_return_type # Use the output_field argument type to fill the generic param output_field_type = helpers.get_call_argument_type_by_name(ctx, "output_field") if output_field_type is not None: field_type = get_proper_type(output_field_type) if isinstance(field_type, Instance): return default.copy_modified(args=[field_type]) return ctx.default_return_type def _resolve_output_field_type(expr_type: MypyType) -> MypyType | None: """Try to resolve the Python type for an expression's output_field. Handles multiple resolution strategies, in order of priority: 1. Generic type args on the expression (e.g. Substr(output_field=BinaryField()) → bytes) 2. ClassVar output_field declarations (e.g. Count.output_field: ClassVar[IntegerField] → int) 3. @property/@cached_property output_field definitions (e.g. ArrayAgg → list[Any]) Generic args take priority so that expressions like Substr(output_field=BinaryField()) can override the default ClassVar[CharField] when a specific output field type is provided. """ proper = get_proper_type(expr_type) if not isinstance(proper, Instance): return None # First, check generic type args for Field subclasses. # This supports the Generic[_OutputField] pattern (e.g., Subquery[IntegerField], Substr[BinaryField]). # Generic args take priority over ClassVar so that explicit type params override defaults. for arg in proper.args: arg_proper = get_proper_type(arg) if isinstance(arg_proper, Instance) and arg_proper.type.has_base(fullnames.FIELD_FULLNAME): type_args = helpers.get_field_type_args(arg_proper) if type_args is not None and not isinstance(type_args.get, AnyType): return type_args.get # Then check static output_field declarations (ClassVar or @property/@cached_property). output_field_sym = proper.type.get("output_field") if output_field_sym is None or output_field_sym.node is None: return None node = output_field_sym.node field_type: ProperType | None = None if isinstance(node, Var) and node.type is not None: field_type = get_proper_type(node.type) elif isinstance(node, Decorator) and node.var.is_property: func_type = node.func.type if isinstance(func_type, CallableType): field_type = get_proper_type(func_type.ret_type) if isinstance(field_type, Instance): result = helpers.get_private_descriptor_type(field_type.type, "_pyi_private_get_type", is_nullable=False) if not isinstance(get_proper_type(result), AnyType): return result return None def gather_expression_types(ctx: MethodContext) -> dict[str, MypyType]: kwargs = gather_kwargs(ctx) if not kwargs: return {} # Try to resolve the output_field type for each expression. For expressions # with a static ClassVar output_field (e.g. Count → IntegerField → int), # we can infer the concrete Python type. Otherwise, fall back to Any. # # NOTE: It's important that we use 'special_form' for 'Any' as otherwise we can # get stuck with mypy interpreting an overload ambiguity towards the # overloaded 'Field.__get__' method when its 'model' argument gets matched. This # is because the model argument gets matched with a model subclass that is # parametrized with a type that contains the 'Any' below and then mypy runs in # to a (false?) ambiguity, due to 'Any', and can't decide what overload/return # type to select # # Example: # class MyModel(models.Model): # field = models.CharField() # # # Our plugin auto generates the following subclass # class MyModel_WithAnnotations(MyModel, django_stubs_ext.Annotations[_Annotations]): # ... # # Assume # x = MyModel.objects.annotate(foo=F("id")).get() # reveal_type(x) # MyModel_WithAnnotations[TypedDict({"foo": Any})] # # Then, on an attribute access of 'field' like # reveal_type(x.field) # # Now 'CharField.__get__', which is overloaded, is passed 'x' as the 'model' # argument and mypy consider it ambiguous to decide which overload method to # select due to the 'Any' in 'TypedDict({"foo": Any})'. But if we specify the # 'Any' as 'TypeOfAny.special_form' mypy doesn't consider the model instance to # contain 'Any' and the ambiguity goes away. result: dict[str, MypyType] = {} for name, expr_type in kwargs.items(): resolved = _resolve_output_field_type(expr_type) if resolved is not None and not isinstance(get_proper_type(resolved), AnyType): result[name] = resolved else: result[name] = AnyType(TypeOfAny.special_form) return result def _extract_model_type_var_upper_bound(ctx: MethodContext) -> Instance | None: """When the queryset's model type arg is a TypeVar bounded by a Model, return the upper bound.""" if not isinstance(ctx.type, Instance): return None for base_type in [ctx.type, *ctx.type.type.bases]: if not len(base_type.args) or base_type.type.has_base(fullnames.MANY_RELATED_MANAGER): continue model = get_proper_type(base_type.args[0]) if isinstance(model, TypeVarType): upper = get_proper_type(model.upper_bound) if isinstance(upper, Instance) and helpers.is_model_type(upper.type): return upper return None def _resolve_annotate_row_type( api: TypeChecker, default_return_type: Instance, annotated_model: ProperType, expression_types: dict[str, MypyType], ) -> MypyType: if len(default_return_type.args) <= 1: return annotated_model original_row_type = get_proper_type(default_return_type.args[1]) if isinstance(original_row_type, TypedDictType): annotation_td = helpers.make_typeddict( api, {name: AnyType(TypeOfAny.from_omitted_generics) for name in expression_types} ) return helpers.merge_typeddict(api, original_row_type, annotation_td) if isinstance(original_row_type, TupleType): if original_row_type.partial_fallback.type.has_base("typing.NamedTuple"): # Rebuild the NamedTuple with existing fields + annotation fields. annotation_fields = {name: AnyType(TypeOfAny.from_omitted_generics) for name in expression_types} return helpers.extend_oneoff_named_tuple(api, "Row", original_row_type, annotation_fields) return api.named_generic_type("builtins.tuple", [AnyType(TypeOfAny.from_omitted_generics)]) if isinstance(original_row_type, Instance) and helpers.is_model_type(original_row_type.type): return annotated_model return original_row_type def extract_proper_type_queryset_annotate(ctx: MethodContext, django_context: DjangoContext) -> MypyType: django_model = helpers.get_model_info_from_qs_ctx(ctx, django_context) if django_model is None: # When the queryset's model is a TypeVar (e.g. inside a generic queryset method body), # use the TypeVar's upper bound to build a temporary annotated type. This allows # `self.annotate(...)` to return `QS[Model@AnnotatedWith[...]]` which is compatible # with return types declared as `QS[WithAnnotations[_Model, ...]]`. upper_bound = _extract_model_type_var_upper_bound(ctx) if upper_bound is not None: default_return_type = get_proper_type(ctx.default_return_type) if isinstance(default_return_type, Instance): api = helpers.get_typechecker_api(ctx) expression_types = gather_expression_types(ctx) if expression_types: fields_dict = helpers.make_typeddict(api, expression_types) upper_annotated = get_annotated_type(api, upper_bound, fields_dict=fields_dict) row_type = _resolve_annotate_row_type(api, default_return_type, upper_annotated, expression_types) return default_return_type.copy_modified(args=[upper_annotated, row_type]) return AnyType(TypeOfAny.from_omitted_generics) default_return_type = get_proper_type(ctx.default_return_type) if not isinstance(default_return_type, Instance): return ctx.default_return_type api = helpers.get_typechecker_api(ctx) expression_types = { attr_name: typ for attr_name, typ in gather_expression_types(ctx).items() if check_valid_attr_value(ctx, django_context, django_model, attr_name) } existing_row_extra_attrs: dict[str, MypyType] = {} if len(default_return_type.args) > 1: original_row_type = get_proper_type(default_return_type.args[1]) if isinstance(original_row_type, Instance) and original_row_type.extra_attrs: existing_row_extra_attrs = dict(original_row_type.extra_attrs.attrs) all_fields = {**existing_row_extra_attrs, **expression_types} annotated_type: ProperType = django_model.typ if all_fields: fields_dict = helpers.make_typeddict(api, all_fields) annotated_type = get_annotated_type(api, django_model.typ, fields_dict=fields_dict) row_type = _resolve_annotate_row_type(api, default_return_type, annotated_type, expression_types) return default_return_type.copy_modified(args=[annotated_type, row_type]) def merge_annotations_from_custom_method(ctx: MethodContext, django_context: DjangoContext) -> MypyType: """ Method hook for custom QuerySet/Manager methods that return annotated querysets. Ensures extra_attrs are set on annotated model Instances (so attribute access works) and merges annotations from the caller queryset with annotations from the return type. """ django_model = helpers.get_model_info_from_qs_ctx(ctx, django_context) if django_model is None: return ctx.default_return_type default_return_type = get_proper_type(ctx.default_return_type) if not ( isinstance(default_return_type, Instance) and (ret_model := helpers.extract_model_type_from_queryset(default_return_type)) and helpers.is_annotated_model(ret_model.type) and ret_model.args and isinstance(new_td := get_proper_type(ret_model.args[0]), TypedDictType) ): return ctx.default_return_type api = helpers.get_typechecker_api(ctx) annotated_type = get_annotated_type(api, django_model.typ, fields_dict=new_td) new_args: list[MypyType] = [annotated_type] if len(default_return_type.args) > 1: original_row = get_proper_type(default_return_type.args[1]) if isinstance(original_row, Instance) and helpers.is_model_type(original_row.type): new_args.append(annotated_type) else: new_args.append(default_return_type.args[1]) else: new_args.append(annotated_type) return default_return_type.copy_modified(args=new_args) def resolve_field_lookups(lookup_exprs: Sequence[Expression], django_context: DjangoContext) -> list[str] | None: field_lookups = [] for field_lookup_expr in lookup_exprs: field_lookup = helpers.resolve_string_attribute_value(field_lookup_expr, django_context) if field_lookup is None: return None field_lookups.append(field_lookup) return field_lookups def _get_annotation_field_types(model_type: Instance) -> dict[str, MypyType]: """Extract annotation field types from an annotated model's TypedDict type argument.""" if model_type.args: annotations = get_proper_type(model_type.args[0]) if isinstance(annotations, TypedDictType): return dict(annotations.items) return {} def extract_proper_type_queryset_values(ctx: MethodContext, django_context: DjangoContext) -> MypyType: """ Extract proper return type for QuerySet.values(*fields, **expressions) method calls. See https://docs.djangoproject.com/en/stable/ref/models/querysets/#values """ django_model = helpers.get_model_info_from_qs_ctx(ctx, django_context) if django_model is None: return ctx.default_return_type default_return_type = get_proper_type(ctx.default_return_type) if not isinstance(default_return_type, Instance): return ctx.default_return_type field_lookups = resolve_field_lookups(ctx.args[0], django_context) if field_lookups is None: return AnyType(TypeOfAny.from_error) annotation_types = _get_annotation_field_types(django_model.typ) if django_model.is_annotated else {} # Bare `.values()` case if len(field_lookups) == 0 and not ctx.args[1]: for field in django_context.get_model_fields(django_model.cls): field_lookups.append(field.attname) field_lookups.extend(annotation_types) column_types: dict[str, MypyType] = {} # Collect `*fields` types -- `.values("id", "name")` for field_lookup in field_lookups: # Check annotation fields first for annotated querysets if annotation_type := annotation_types.get(field_lookup): column_types[field_lookup] = annotation_type continue field_lookup_type = get_field_type_from_lookup( ctx, django_context, django_model.cls, lookup=field_lookup, method="values", silent_on_error=django_model.is_annotated, ) if field_lookup_type is None: if django_model.is_annotated: column_types[field_lookup] = AnyType(TypeOfAny.from_omitted_generics) else: return default_return_type.copy_modified(args=[django_model.typ, AnyType(TypeOfAny.from_error)]) else: column_types[field_lookup] = field_lookup_type # Collect `**expressions` types -- `.values(lower_name=Lower("name"), foo=F("name"))` column_types.update(gather_expression_types(ctx)) row_type = helpers.make_typeddict(ctx.api, column_types) return default_return_type.copy_modified(args=[django_model.typ, row_type]) def _infer_prefetch_queryset_type(queryset_expr: Expression, api: TypeChecker) -> Instance | None: """Infer the model Instance from `Prefetch(queryset=...)`""" try: qs_type = get_proper_type(api.expr_checker.accept(queryset_expr)) except Exception: return None if isinstance(qs_type, Instance): return qs_type return None def _resolve_prefetch_string_argument( type_arg: MypyType, expr: Expression | None, django_context: DjangoContext, arg_name: str, ) -> str | None: # First try to get value from specialized type arg arg_value = helpers.get_literal_str_type(type_arg) if arg_value is not None: return arg_value # Fallback: parse inline call expression if isinstance(expr, CallExpr): arg_expr = helpers.get_class_init_argument_by_name(expr, arg_name) if arg_expr: return helpers.resolve_string_attribute_value(arg_expr, django_context) return None def _resolve_prefetch_queryset_argument( type_arg: MypyType, expr: Expression | None, api: TypeChecker, ) -> Instance | None: # First try to get queryset type from specialized type arg queryset_type = get_proper_type(type_arg) if isinstance(queryset_type, Instance): elem_model = helpers.extract_model_type_from_queryset(queryset_type) # If we got a valid specific model type, return the queryset type if elem_model is not None and elem_model.type.fullname != fullnames.MODEL_CLASS_FULLNAME: return queryset_type # Fallback: parse inline call expression if isinstance(expr, CallExpr): queryset_expr = helpers.get_class_init_argument_by_name(expr, "queryset") if queryset_expr is not None: return _infer_prefetch_queryset_type(queryset_expr, api) return None def _specialize_string_arg_to_literal( ctx: FunctionContext, django_context: DjangoContext, arg_name: str, fallback_type: MypyType ) -> MypyType: """ Helper to specialize a string argument to a Literal[str] type. This allows the plugin to extract the actual string value for further processing and validation in later analysis phases. """ if arg_expr := helpers.get_call_argument_by_name(ctx, arg_name): if arg_value := helpers.resolve_string_attribute_value(arg_expr, django_context): api = helpers.get_typechecker_api(ctx) return LiteralType(value=arg_value, fallback=api.named_generic_type("builtins.str", [])) return fallback_type def specialize_prefetch_type(ctx: FunctionContext, django_context: DjangoContext) -> MypyType: """Function hook for `Prefetch(...)` to specialize its `lookup` and `to_attr` generic parameters.""" default = get_proper_type(ctx.default_return_type) if not isinstance(default, Instance): return ctx.default_return_type lookup_type = _specialize_string_arg_to_literal(ctx, django_context, "lookup", default.args[0]) to_attr_type = _specialize_string_arg_to_literal(ctx, django_context, "to_attr", default.args[2]) return default.copy_modified(args=[lookup_type, default.args[1], to_attr_type]) def gather_flat_args(ctx: MethodContext) -> list[tuple[Expression | None, ProperType]]: """ Flatten all arguments into a uniform list of (expr, typ) pairs. This helper iterates over positional and named arguments and expands any starred arguments when their type is a TupleType with statically known items. """ lookups: list[tuple[Expression | None, ProperType]] = [] arg_start_idx = 0 for expr, typ, kind in zip(ctx.args[0], ctx.arg_types[0], ctx.arg_kinds[0], strict=False): ptyp = get_proper_type(typ) if kind == ARG_STAR: # Expand starred tuple items if statically known if isinstance(ptyp, TupleType): lookups.append((None, get_proper_type(ptyp.items[arg_start_idx]))) # If not a TupleType (e.g. list/Iterable), we cannot expand statically arg_start_idx += 1 continue lookups.append((expr, ptyp)) return lookups def _get_selected_fields_from_queryset_type(qs_type: Instance) -> set[str] | None: """ Derive selected field names from a QuerySet type. Sources: - values(): encoded in the row TypedDict keys - values_list(named=True): row is a NamedTuple; extract field names from fallback TypeInfo - values_list(named=False): stored in qs_type.extra_attrs.immutable """ if len(qs_type.args) > 1: row_type = get_proper_type(qs_type.args[1]) if isinstance(row_type, Instance) and helpers.is_model_type(row_type.type): return None if isinstance(row_type, TypedDictType): return set(row_type.items.keys()) if isinstance(row_type, TupleType): if row_type.partial_fallback.type.has_base("typing.NamedTuple"): return {name for name, sym in row_type.partial_fallback.type.names.items() if sym.plugin_generated} return set() return set() # Fallback to explicit metadata attached to the QuerySet Instance if qs_type.extra_attrs and qs_type.extra_attrs.immutable and isinstance(qs_type.extra_attrs.immutable, set): return qs_type.extra_attrs.immutable return None def _get_annotated_fields_from_queryset_type(qs_type: Instance) -> set[str]: """ Derive annotated field names from a QuerySet type. Sources: - args[0].extra_attrs: from .annotate() calls - args[1].extra_attrs: from WithAnnotations[Model, TypedDict] """ fields: set[str] = set() if len(qs_type.args) >= 1: model_type = get_proper_type(qs_type.args[0]) if isinstance(model_type, Instance) and model_type.extra_attrs: fields.update(model_type.extra_attrs.attrs.keys()) if len(qs_type.args) >= 2: row_type = get_proper_type(qs_type.args[1]) if isinstance(row_type, Instance) and row_type.extra_attrs: fields.update(row_type.extra_attrs.attrs.keys()) return fields def check_valid_attr_value( ctx: MethodContext, django_context: DjangoContext, model: DjangoModel, attr_name: str, *, new_attr_names: set[str] | None = None, ) -> bool: """ Check if adding `attr_name` would conflict with existing symbols on `model`. Args: - model: The Django model being analyzed - attr_name: The name of the attribute to be added - new_attr_names: A mapping of field names to types currently being added to the model """ deselected_fields: set[str] | None = None annotated_fields: set[str] = set() if isinstance(ctx.type, Instance): selected_fields = _get_selected_fields_from_queryset_type(ctx.type) if selected_fields is not None: model_field_names = {f.name for f in django_context.get_model_fields(model.cls)} deselected_fields = model_field_names - selected_fields new_attr_names = new_attr_names or set() new_attr_names.update(selected_fields - model_field_names) annotated_fields = _get_annotated_fields_from_queryset_type(ctx.type) is_conflicting_attr_value = bool( # 1. Conflict with another symbol on the model (If not de-selected via a prior .values/.values_list call). # Ex: # User.objects.prefetch_related(Prefetch(..., to_attr="id")) (model.typ.type.get(attr_name) and (deselected_fields is None or attr_name not in deselected_fields)) # 2. Conflict with a previous annotation. # Ex: # User.objects.annotate(foo=...).prefetch_related(Prefetch(...,to_attr="foo")) # User.objects.prefetch_related(Prefetch(...,to_attr="foo")).prefetch_related(Prefetch(...,to_attr="foo")) or attr_name in annotated_fields # 3. Conflict with another symbol added in the current processing. # Ex: # User.objects.prefetch_related( # Prefetch("groups", Group.objects.filter(name="test"), to_attr="new_attr"), # Prefetch("groups", Group.objects.all(), to_attr="new_attr"), # E: Not OK! # ) or (new_attr_names is not None and attr_name in new_attr_names) ) if is_conflicting_attr_value: ctx.api.fail( f'Attribute "{attr_name}" already defined on "{model.typ}"', ctx.context, code=NO_REDEF, ) return not is_conflicting_attr_value def check_valid_prefetch_related_lookup( ctx: MethodContext, lookup: str, django_model: DjangoModel, django_context: DjangoContext, *, is_generic_prefetch: bool = False, ) -> bool: """Check if a lookup string resolve to something that can be prefetched""" current_model_cls = django_model.cls contenttypes_installed = django_context.apps_registry.is_installed("django.contrib.contenttypes") for through_attr in lookup.split(LOOKUP_SEP): rel_obj_descriptor = getattr(current_model_cls, through_attr, None) if rel_obj_descriptor is None: # If current_model_cls is "self", we cannot use `__name__` and want "self". model_name = getattr(current_model_cls, "__name__", current_model_cls) ctx.api.fail( ( f'Cannot find "{through_attr}" on "{model_name}" object, ' f'"{lookup}" is an invalid parameter to "prefetch_related()"' ), ctx.context, ) return False if contenttypes_installed and is_generic_prefetch: try: from django.contrib.contenttypes.fields import GenericForeignKeyDescriptor except ImportError: # Django < 6.1 from django.contrib.contenttypes.fields import ( # type: ignore[assignment] GenericForeignKey as GenericForeignKeyDescriptor, ) if not isinstance(rel_obj_descriptor, GenericForeignKeyDescriptor): # If current_model_cls is "self", we cannot use `__name__` and want "self". model_name = getattr(current_model_cls, "__name__", current_model_cls) ctx.api.fail( f'"{through_attr}" on "{model_name}" is not a GenericForeignKey, ' f"GenericPrefetch can only be used with GenericForeignKey fields", ctx.context, ) return True elif isinstance(rel_obj_descriptor, ForwardManyToOneDescriptor): current_model_cls = rel_obj_descriptor.field.remote_field.model elif isinstance(rel_obj_descriptor, ReverseOneToOneDescriptor): current_model_cls = rel_obj_descriptor.related.related_model elif isinstance(rel_obj_descriptor, ManyToManyDescriptor): current_model_cls = ( rel_obj_descriptor.rel.related_model if rel_obj_descriptor.reverse else rel_obj_descriptor.rel.model ) elif isinstance(rel_obj_descriptor, ReverseManyToOneDescriptor): if contenttypes_installed: from django.contrib.contenttypes.fields import ReverseGenericManyToOneDescriptor if isinstance(rel_obj_descriptor, ReverseGenericManyToOneDescriptor): current_model_cls = rel_obj_descriptor.rel.model continue current_model_cls = rel_obj_descriptor.rel.related_model else: if contenttypes_installed: try: from django.contrib.contenttypes.fields import GenericForeignKeyDescriptor except ImportError: # Django < 6.1 from django.contrib.contenttypes.fields import ( # type: ignore[assignment] GenericForeignKey as GenericForeignKeyDescriptor, ) if isinstance(rel_obj_descriptor, GenericForeignKeyDescriptor): # Generic foreign keys can point to any model, so we use Model as the base type return True ctx.api.fail( ( f'"{lookup}" does not resolve to an item that supports prefetching ' '- this is an invalid parameter to "prefetch_related()"' ), ctx.context, ) return False return True def check_conflicting_lookups( ctx: MethodContext, observed_attr: str, qs_types: dict[str, Instance | None], queryset_type: Instance | None, ) -> bool: is_conflicting_lookup = bool(observed_attr in qs_types and qs_types[observed_attr] != queryset_type) if is_conflicting_lookup: ctx.api.fail( f'Lookup "{observed_attr}" was already seen with a different queryset', ctx.context, code=NO_REDEF, ) return is_conflicting_lookup def extract_prefetch_related_annotations(ctx: MethodContext, django_context: DjangoContext) -> MypyType: """ Extract annotated attributes via `prefetch_related(Prefetch(..., to_attr=...))` See https://docs.djangoproject.com/en/stable/ref/models/querysets/#prefetch-objects """ api = helpers.get_typechecker_api(ctx) if not ( isinstance(ctx.type, Instance) and isinstance((default_return_type := get_proper_type(ctx.default_return_type)), Instance) and (qs_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is not None and ctx.args and ctx.arg_types and ctx.arg_types[0] # Only process the correct overload, i.e. # def prefetch_related(self, *lookups: str | Prefetch[_PrefetchedQuerySetT, _ToAttrT]) -> Self: ... and None not in ctx.callee_arg_names ): return ctx.default_return_type new_attrs: dict[str, MypyType] = {} # A mapping of field_name / types to add to the model qs_types: dict[str, Instance | None] = {} # A mapping of field_name / associated queryset type for expr, typ in gather_flat_args(ctx): if not (isinstance(typ, Instance) and typ.type.has_base(fullnames.PREFETCH_CLASS_FULLNAME)): # Handle plain string lookups (not Prefetch instances) lookup = helpers.get_literal_str_type(typ) queryset_type = None if lookup is not None: check_valid_prefetch_related_lookup(ctx, lookup, qs_model, django_context) check_conflicting_lookups(ctx, lookup, qs_types, queryset_type) qs_types[lookup] = queryset_type continue # 1) Extract lookup value from specialized type arg or call expression lookup = _resolve_prefetch_string_argument(typ.args[0], expr, django_context, "lookup") # 2) Extract to_attr value from specialized type arg or call expression to_attr = _resolve_prefetch_string_argument(typ.args[2], expr, django_context, "to_attr") if to_attr is None and lookup is None: continue # 3.a) Determine queryset type from specialized type arg or call expression queryset_type = _resolve_prefetch_queryset_argument(typ.args[1], expr, api) # 3.b) Extract model type from queryset type (or from the lookup value) elem_model: Instance | None = None if queryset_type is not None and isinstance(queryset_type, Instance): elem_model = helpers.extract_model_type_from_queryset(queryset_type) elif lookup: try: observed_model_cls = django_context.resolve_lookup_into_field(qs_model.cls, lookup)[1] if model_info := helpers.lookup_class_typeinfo(api, observed_model_cls): elem_model = Instance(model_info, []) except (FieldError, LookupsAreUnsupported): pass if to_attr and check_valid_attr_value( ctx, django_context, qs_model, to_attr, new_attr_names=set(new_attrs.keys()) ): # When traversing multiple relations (e.g. "groups__user_set"), the to_attr is set # on the last item of the chain (e.g. Group), not on the root model (e.g. User). # We can't annotate an intermediate model from here, so skip adding the annotation # to the root model to avoid incorrectly attributing to_attr to it. if lookup and LOOKUP_SEP in lookup: continue new_attrs[to_attr] = api.named_generic_type( "builtins.list", [elem_model if elem_model is not None else AnyType(TypeOfAny.special_form)], ) qs_types[to_attr] = queryset_type if not to_attr and lookup: check_valid_prefetch_related_lookup( ctx, lookup, qs_model, django_context, is_generic_prefetch=typ.type.has_base(fullnames.GENERIC_PREFETCH_CLASS_FULLNAME), ) check_conflicting_lookups(ctx, lookup, qs_types, queryset_type) qs_types[lookup] = queryset_type if not new_attrs: return ctx.default_return_type fields_dict = helpers.make_typeddict(api, new_attrs) annotated_model = get_annotated_type(api, qs_model.typ, fields_dict=fields_dict) # Keep row shape; if row is a model instance, update it to annotated # Todo: consolidate with `extract_proper_type_queryset_annotate` row handling above. if len(default_return_type.args) > 1: original_row = get_proper_type(default_return_type.args[1]) row_type: MypyType = original_row if isinstance(original_row, Instance) and helpers.is_model_type(original_row.type): row_type = annotated_model else: row_type = annotated_model return default_return_type.copy_modified(args=[annotated_model, row_type]) def _extract_field_names_from_collection( ctx: MethodContext, django_context: DjangoContext, arg_index: int ) -> list[str] | None: if not ( len(ctx.args) > arg_index and ctx.args[arg_index] and isinstance((collection_expr := ctx.args[arg_index][0]), (ListExpr, TupleExpr, SetExpr)) ): return None return [ field_name for field_arg in collection_expr.items if (field_name := helpers.resolve_string_attribute_value(field_arg, django_context)) is not None ] def _extract_field_names_from_varargs(ctx: MethodContext) -> list[str]: return [ lookup_value for lookup_type in (ctx.arg_types[0] if ctx.arg_types and ctx.arg_types[0] else []) if (lookup_value := helpers.get_literal_str_type(get_proper_type(lookup_type))) is not None ] def _get_select_related_field_choices(model_cls: type[Model]) -> set[str]: """ Get valid field choices for select_related lookups. Based on Django's SQLCompiler.get_related_selections._get_field_choices method. """ opts = model_cls._meta # Direct relation fields (forward relations) direct_choices = (f.name for f in opts.fields if f.is_relation) # Reverse relation fields (backward relations with unique=True) reverse_choices = (f.field.related_query_name() for f in opts.related_objects if f.field.unique) return {*direct_choices, *reverse_choices} def _validate_select_related_lookup( ctx: MethodContext, django_context: DjangoContext, model_cls: type[Model], lookup: str, ) -> bool: """Validate a single select_related lookup string.""" if not lookup.strip(): ctx.api.fail( f'Invalid field name "{lookup}" in select_related lookup', ctx.context, ) return False lookup_parts = lookup.split(LOOKUP_SEP) observed_model = model_cls for i, part in enumerate(lookup_parts): valid_choices = _get_select_related_field_choices(observed_model) if part not in valid_choices: ctx.api.fail( f'Invalid field name "{part}" in select_related lookup. ' f"Choices are: {', '.join(sorted(valid_choices)) or '(none)'}", ctx.context, ) return False if i < len(lookup_parts) - 1: # Not the last part try: field, observed_model = django_context.resolve_lookup_into_field(observed_model, part) if field is None: return False except (FieldError, LookupsAreUnsupported): # For good measure, but we should never reach this since we already validated the part name return False return True def validate_select_related(ctx: MethodContext, django_context: DjangoContext) -> MypyType: """ Validates that all lookup strings passed to select_related() resolve to actual model fields and relations. Extracted and adapted from `django.db.models.sql.compiler.SQLCompiler.get_related_selections` """ if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None: return ctx.default_return_type for lookup_value in _extract_field_names_from_varargs(ctx): _validate_select_related_lookup(ctx, django_context, django_model.cls, lookup_value) return ctx.default_return_type def validate_bulk_update( ctx: MethodContext, django_context: DjangoContext, method: Literal["bulk_update", "abulk_update"] ) -> MypyType: """ Type check the `fields` argument passed to `QuerySet.bulk_update(...)`. Extracted and adapted from `django.db.models.query.QuerySet.bulk_update` Mirrors tests from `django/tests/queries/test_bulk_update.py` """ if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None or ( field_names := _extract_field_names_from_collection(ctx, django_context, arg_index=1) ) is None: return ctx.default_return_type if not field_names: # Only error if the collection literal itself is empty (not when items are unresolvable). collection_expr = ctx.args[1][0] if isinstance(collection_expr, (ListExpr, TupleExpr, SetExpr)) and not collection_expr.items: ctx.api.fail(f'Field names must be given to "{method}()"', ctx.context) return ctx.default_return_type for field_name in field_names: validate_non_pk_concrete_field(ctx, django_model.cls, field_name, method) return ctx.default_return_type def _validate_bulk_create_unique_field( ctx: MethodContext, model_cls: type[Model], field_name: str, method: str ) -> bool: return (field := try_get_field(ctx, model_cls, field_name, resolve_pk=True)) is not None and check_field_concrete( ctx, field, field_name, method ) def validate_bulk_create( ctx: MethodContext, django_context: DjangoContext, method: Literal["bulk_create", "abulk_create"] ) -> MypyType: """ Type check the `update_fields` and `unique_fields` arguments passed to `QuerySet.bulk_create(...)`. Extracted and adapted from `django.db.models.query.QuerySet._check_bulk_create_options` """ if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None: return ctx.default_return_type update_field_names = _extract_field_names_from_collection(ctx, django_context, arg_index=4) if update_field_names is not None: for field_name in update_field_names: validate_non_pk_concrete_field(ctx, django_model.cls, field_name, method, attr_name="update_fields") unique_field_names = _extract_field_names_from_collection(ctx, django_context, arg_index=5) if unique_field_names is not None: for field_name in unique_field_names: _validate_bulk_create_unique_field(ctx, django_model.cls, field_name, method) return ctx.default_return_type def _validate_lookup(ctx: MethodContext, model_cls: type[Model], parts: list[str]) -> None: # Abstract models don't have a pk field, skip validation if model_cls._meta.abstract: return try: _, final_field, _, remainder = Query(model_cls).names_to_path(parts, model_cls._meta) except FieldError as exc: ctx.api.fail(exc.args[0], ctx.context) return if remainder: # Check if the trailing part is a valid transform (e.g. __year, __month) on the field. # Transforms are allowed, but lookups (e.g. __exact) are not. if final_field.get_transform(remainder[0]) is None: msg = f"Cannot resolve keyword '{remainder[0]}' into field or transform on '{final_field.name}'." ctx.api.fail(msg, ctx.context) def _validate_order_by_lookup(ctx: MethodContext, model_cls: type[Model], parts: list[str]) -> None: if len(parts) == 1 and parts[0] == "?": return _validate_lookup(ctx, model_cls, parts) def validate_order_by(ctx: MethodContext, django_context: DjangoContext) -> MypyType: if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None: return ctx.default_return_type selected_fields = _get_selected_fields_from_queryset_type(ctx.type) if isinstance(ctx.type, Instance) else None annotated_fields = _get_annotated_fields_from_queryset_type(ctx.type) if isinstance(ctx.type, Instance) else set() for lookup_value in _extract_field_names_from_varargs(ctx): parts = lookup_value.removeprefix("-").split(LOOKUP_SEP) if parts[0] in annotated_fields: # Skip validation for annotated fields continue if selected_fields is not None and parts[0] in selected_fields: # Skip validation for fields selected via values()/values_list() continue _validate_order_by_lookup(ctx, django_model.cls, parts) return ctx.default_return_type def _validate_defer_only_fields( ctx: MethodContext, model_cls: type[Model], field_names: list[str], *, is_defer: bool ) -> None: if not is_defer and model_cls._meta.abstract: # Abstract models do not have a primary key field, but Query.add_immediate_loading() # assumes that one exists when resolving the "pk" alias. field_names = [field_name for field_name in field_names if field_name != "pk"] query = Query(model_cls) query.add_deferred_loading(field_names) if is_defer else query.add_immediate_loading(field_names) try: query.get_select_mask() except (FieldDoesNotExist, FieldError) as exc: method = "defer" if is_defer else "only" ctx.api.fail(f'Invalid field in "{method}()": {exc.args[0]}', ctx.context) def validate_defer_only(ctx: MethodContext, django_context: DjangoContext, *, is_defer: bool) -> MypyType: if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None or not ( field_names := _extract_field_names_from_varargs(ctx) ): return ctx.default_return_type _validate_defer_only_fields(ctx, django_model.cls, field_names, is_defer=is_defer) return ctx.default_return_type def validate_distinct(ctx: MethodContext, django_context: DjangoContext) -> MypyType: if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None: return ctx.default_return_type selected_fields = _get_selected_fields_from_queryset_type(ctx.type) if isinstance(ctx.type, Instance) else None annotated_fields = _get_annotated_fields_from_queryset_type(ctx.type) if isinstance(ctx.type, Instance) else set() for lookup_value in _extract_field_names_from_varargs(ctx): parts = lookup_value.split(LOOKUP_SEP) if parts[0] in annotated_fields: # Skip validation for annotated fields continue if selected_fields is not None and parts[0] in selected_fields: # Skip validation for fields selected via values()/values_list() continue _validate_lookup(ctx, django_model.cls, parts) return ctx.default_return_type def gather_update_kwargs(ctx: MethodContext) -> dict[str, MypyType]: """Gather named arguments destined for the `**kwargs` collector.""" kwargs: dict[str, MypyType] = {} named = (ARG_NAMED, ARG_NAMED_OPT) slots = zip(ctx.callee_arg_names, ctx.arg_kinds, ctx.arg_types, ctx.arg_names, strict=False) for formal_name, kinds, types, names in slots: for kind, arg_type, name in zip(kinds, types, names, strict=False): if kind in named and name is not None and name != formal_name: kwargs[name] = arg_type return kwargs def validate_update(ctx: MethodContext, django_context: DjangoContext) -> MypyType: if (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None or not ( kwargs := gather_update_kwargs(ctx) ): return ctx.default_return_type for field_name in kwargs: field = try_get_field(ctx, django_model.cls, field_name) if field is not None: check_field_concrete(ctx, field, field_name, method="update") return ctx.default_return_type def validate_in_bulk(ctx: MethodContext, django_context: DjangoContext) -> MypyType: if ( (django_model := helpers.get_model_info_from_qs_ctx(ctx, django_context)) is None or (field_name_expr := helpers.get_call_argument_by_name(ctx, "field_name")) is None or (field_name := helpers.resolve_string_attribute_value(field_name_expr, django_context)) is None or field_name == "pk" or (field := try_get_field(ctx, django_model.cls, field_name)) is None ): return ctx.default_return_type check_field_unique(ctx, django_model.cls, field, field_name, method="in_bulk") return ctx.default_return_type typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/request.py000066400000000000000000000007601526064357400275350ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from mypy.types import Type as MypyType from mypy.types import UninhabitedType, get_proper_type if TYPE_CHECKING: from mypy.plugin import MethodContext def check_querydict_is_mutable(ctx: MethodContext) -> MypyType: ret_type = get_proper_type(ctx.default_return_type) if isinstance(ret_type, UninhabitedType): ctx.api.fail("This QueryDict is immutable.", ctx.context) return ctx.default_return_type typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/save.py000066400000000000000000000030021526064357400267730ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from mypy.nodes import ListExpr, SetExpr, TupleExpr from mypy.types import Instance from mypy.types import Type as MypyType from mypy_django_plugin.lib import helpers from mypy_django_plugin.lib.field_validation import validate_non_pk_concrete_field if TYPE_CHECKING: from mypy.plugin import MethodContext from mypy_django_plugin.django.context import DjangoContext def validate_save_update_fields(ctx: MethodContext, django_context: DjangoContext, method: str) -> MypyType: """ Type check the keyword-only `update_fields` argument passed to `Model.save(...)` / `Model.asave(...)`. """ if not isinstance(ctx.type, Instance) or not helpers.is_model_type(ctx.type.type): return ctx.default_return_type django_model = helpers.DjangoModel.from_model_type(ctx.type, django_context) if django_model is None: return ctx.default_return_type update_fields_expr = helpers.get_call_argument_by_name(ctx, "update_fields") if not isinstance(update_fields_expr, (ListExpr, TupleExpr, SetExpr)): # `None`, a `set()` call, or any non-literal collection cannot be checked statically. return ctx.default_return_type for field_arg in update_fields_expr.items: field_name = helpers.resolve_string_attribute_value(field_arg, django_context) if field_name is not None: validate_non_pk_concrete_field(ctx, django_model.cls, field_name, method) return ctx.default_return_type typeddjango-django-stubs-fa03b48/mypy_django_plugin/transformers/settings.py000066400000000000000000000037361526064357400277130ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from mypy.nodes import MemberExpr from mypy.types import AnyType, TypeOfAny from mypy.types import Type as MypyType from mypy_django_plugin.lib import helpers if TYPE_CHECKING: from mypy.plugin import AttributeContext from mypy_django_plugin.config import DjangoPluginConfig from mypy_django_plugin.django.context import DjangoContext def get_type_of_settings_attribute( ctx: AttributeContext, django_context: DjangoContext, plugin_config: DjangoPluginConfig ) -> MypyType: if not isinstance(ctx.context, MemberExpr): return ctx.default_attr_type setting_name = ctx.context.name typechecker_api = helpers.get_typechecker_api(ctx) # first look for the setting in the project settings file, then global settings settings_module = typechecker_api.modules.get(django_context.django_settings_module) global_settings_module = typechecker_api.modules.get("django.conf.global_settings") for module in [settings_module, global_settings_module]: if module is not None: sym = module.names.get(setting_name) if sym is not None: if sym.type is None: # When analysing a function, mypy will defer analysis to a later pass typechecker_api.handle_cannot_determine_type(setting_name, ctx.context) return ctx.default_attr_type return sym.type # Now, we want to check if this setting really exist in runtime. # If it does, we just return `Any`, not to raise any false-positives. # But, we cannot reconstruct the exact runtime type. # See https://github.com/typeddjango/django-stubs/pull/1163 if not plugin_config.strict_settings and hasattr(django_context.settings, setting_name): return AnyType(TypeOfAny.implementation_artifact) ctx.api.fail(f"'Settings' object has no attribute {setting_name!r}", ctx.context) return ctx.default_attr_type typeddjango-django-stubs-fa03b48/pyproject.toml000066400000000000000000000130621526064357400217630ustar00rootroot00000000000000[project] name = "django-stubs" version = "6.1.2" description = "Mypy stubs for Django" readme = "README.md" license = "MIT" license-files = ["LICENSE.md"] requires-python = ">=3.11" authors = [ { name = "Maksim Kurnikov", email = "maxim.kurnikov@gmail.com" }, ] maintainers = [ { name = "Marti Raudsepp", email = "marti@juffo.org" }, { name = "Nikita Sobolev", email = "mail@sobolevn.me" }, { name = "Petter Friberg", email = "petter_friberg@hotmail.com" }, { name = "Adam Johnson", email = "me@adamj.eu" }, ] classifiers = [ "Operating System :: OS Independent", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Typing :: Typed", "Framework :: Django", "Framework :: Django :: 5.2", "Framework :: Django :: 6.0", "Framework :: Django :: 6.1", ] dependencies = [ "django", "django-stubs-ext>=6.0.2", # Types: "types-pyyaml", "typing-extensions>=4.11.0", ] [project.optional-dependencies] compatible-mypy = ["mypy>=1.13,<2.5"] oracle = ["oracledb"] redis = ["redis", "types-redis"] [dependency-groups] tests = [ # Dev tools: "pytest==9.1.1", "pytest-mypy-plugins==4.0.3", "pytest-shard==0.1.2", "pytest-xdist==3.8.0", # Django deps: "django==5.2.17; python_version < '3.12'", "django==6.1.1; python_version >= '3.12'", "mysqlclient==2.3.0", "psycopg[binary]==3.3.6", "psycopg2-binary==2.9.13", "jinja2==3.1.6", "pyyaml==6.0.3", # typing: "django-stubs[compatible-mypy,oracle,redis]", ] pyright = [ "pyright==1.1.414", ] pyrefly = [ "pyrefly==1.3.2", "psycopg2-binary" ] ty = [ "ty==0.0.83", "psycopg2-binary" ] dev = [ {include-group = "tests"}, {include-group = "pyright"}, {include-group = "pyrefly"}, {include-group = "ty"}, ] [project.urls] Homepage = "https://github.com/typeddjango/django-stubs" Funding = "https://github.com/sponsors/typeddjango" "Release notes" = "https://github.com/typeddjango/django-stubs/releases" [tool.uv.sources] django-stubs = { workspace = true } django-stubs-ext = { workspace = true } [tool.uv.workspace] members = ["ext"] [build-system] requires = ["uv_build>=0.12.0,<0.13.0"] build-backend = "uv_build" [tool.uv.build-backend] module-name = ["django-stubs", "mypy_django_plugin"] module-root = "" [tool.pyright] include = ["tests/assert_type/"] typeCheckingMode = "strict" # Extra strict settings reportImplicitStringConcatenation = "error" reportUninitializedInstanceVariable = "error" reportUnnecessaryTypeIgnoreComment = "error" # Don't use '# type: ignore' to suppress with pyright enableTypeIgnoreComments = false # If a test case uses this anti-pattern, there's likely a reason and annoying to `type: ignore`. # Let Ruff flag it (B006) reportCallInDefaultInitializer = "none" # Too strict and not needed for type testing reportMissingSuperCall = "none" # Stubs are allowed to use private variables. We may want to test those. reportPrivateUsage = "none" # Stubs don't need the actual modules to be installed reportMissingModuleSource = "none" [tool.pyrefly] # Respect only `# pyrefly: ignore` (ignore `# type: ignore`) enabled-ignores = ["pyrefly"] [tool.pyrefly.errors] unused-ignore = true [tool.ty.terminal] error-on-warning = true [tool.ty.analysis] # Respect only `# ty: ignore` (ignore `# type: ignore`) respect-type-ignore-comments = false [tool.codespell] ignore-words-list = "aadd,acount,asend,indentity,nam" [tool.ruff] # Adds to default excludes: https://ruff.rs/docs/settings/#exclude line-length = 120 target-version = "py311" [tool.ruff.lint] # See Rules in Ruff documentation: https://beta.ruff.rs/docs/rules/ select = [ "B", # bugbear "E", # pycodestyle "F", # pyflakes "FURB", # refurb "INP", # flake8-tidy-imports "W", # pycodestyle "I", # isort "ISC001", # Implicitly concatenated string literals on one line "ISC002", # Implicitly concatenated string literals over multiple lines "UP", # pyupgrade "TID251", # Disallowed imports (flake8-tidy-imports.banned-api) "PYI", # flake8-pyi "RUF100", # Equivalent to flake8-noqa NQA103 "PGH004", # Equivalent to flake8-noqa NQA104 "PGH003", # Disallowed blanket `type: ignore` annotations. "RET504", # Unnecessary assignment to {name} before return statement "RET505", # Unnecessary {branch} after return statement "RET506", # Unnecessary {branch} after raise statement "RET507", # Unnecessary {branch} after continue statement "RET508", # Unnecessary {branch} after break statement "RUF", # Ruff specific rules "TC", # flake8-type-checking ] ignore = [ "PYI021", # We have a few meaningful docstrings for stubs only constructs/utilities. "PYI041", # This might not be obvious that `float | int` is mostly equivalent to `float` typing wise | int | str "PYI043", ] [tool.ruff.lint.per-file-ignores] "*.pyi" = [ "B", "E501", "E741", "E743", "F403", # Use wildcard import "F405", "F822", "F821", ] "tests/*.py" = ["INP001", "PGH003", "RUF012"] "ext/tests/*.py" = ["INP001"] "setup.py" = ["INP001"] "tests/assert_type/*.py" = ["B", "UP013"] [tool.ruff.lint.flake8-tidy-imports.banned-api] "_typeshed.Self".msg = "Use typing_extensions.Self (PEP 673) instead. If you type a metaclass, add a noqa" "typing.TypeVar".msg = "Only support the `default` parameter in Python 3.13 and above. Use `typing_extensions.TypeVar` instead." [tool.ruff.lint.isort] known-first-party = ["django_stubs_ext", "mypy_django_plugin"] required-imports = ["from __future__ import annotations"] split-on-trailing-comma = false typeddjango-django-stubs-fa03b48/pytest.ini000066400000000000000000000003611526064357400210760ustar00rootroot00000000000000[pytest] testpaths = ./tests ./ext/tests addopts = --tb=native -s -v --cache-clear --mypy-ini-file=mypy.ini --mypy-extension-hook=scripts.tests_extension_hook.django_plugin_hook --ignore=tests/assert_type typeddjango-django-stubs-fa03b48/scripts/000077500000000000000000000000001526064357400205345ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/scripts/__init__.py000066400000000000000000000000001526064357400226330ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/scripts/django_tests_settings.py000066400000000000000000000017151526064357400255160ustar00rootroot00000000000000# It is used in `mypy.ini` only. # The following installed apps are required for stubtest to run correctly. from __future__ import annotations import pathlib _REPO_ROOT = pathlib.Path(__file__).resolve().parent.parent _ASSERT_TYPE_APPS_ROOT = _REPO_ROOT / "tests" / "assert_type" def _discover_assert_type_apps() -> list[str]: """Discover Django apps under `tests/assert_type`. Each directory containing a `models.py` is registered as an app, with the directory name as the implicit `app_label`. """ return sorted( ".".join(models_py.parent.relative_to(_REPO_ROOT).parts) for models_py in _ASSERT_TYPE_APPS_ROOT.rglob("models.py") ) INSTALLED_APPS = [ "django.contrib.auth", "django.contrib.admin", "django.contrib.contenttypes", "django.contrib.flatpages", "django.contrib.redirects", "django.contrib.sessions", "django.contrib.sites", *_discover_assert_type_apps(), ] STATIC_URL = "static/" typeddjango-django-stubs-fa03b48/scripts/stubtest.sh000077500000000000000000000013301526064357400227450ustar00rootroot00000000000000#!/bin/sh # Run this script with `./scripts/stubtest.sh [additional_stubtest_args]` set -e export MYPYPATH='.' # Getting per version allowlist file: PYTHON_VERSION="$(python --version 2>&1 | sed 's/Python \([0-9]*\)\.\([0-9]*\)\..*/\1\2/')" PYTHON_VERSION_ALLOWLIST="scripts/stubtest/allowlist_python${PYTHON_VERSION}.txt" if [ -f "$PYTHON_VERSION_ALLOWLIST" ]; then VERSION_SPECIFIC_ALLOWLIST="--allowlist $PYTHON_VERSION_ALLOWLIST" else VERSION_SPECIFIC_ALLOWLIST= fi # Cleaning existing cache: rm -rf .mypy_cache stubtest django \ --mypy-config-file mypy.ini \ --allowlist scripts/stubtest/allowlist.txt \ --allowlist scripts/stubtest/allowlist_todo.txt \ $VERSION_SPECIFIC_ALLOWLIST \ "$@" typeddjango-django-stubs-fa03b48/scripts/stubtest/000077500000000000000000000000001526064357400224115ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/scripts/stubtest/allowlist.txt000066400000000000000000000334751526064357400252000ustar00rootroot00000000000000# This is a true allow list with things that we really don't care about. # `allowlist_todo.txt` is autogenerated by `stubtest --generate-allowlist` # and might contain actual problems and things that we *do want* to fix. # # Please, move things here when you are sure that they really should be ignored. # Comments about why things are ignored are mandatory. # We don't need locales: django.conf.locale.* # We don't need migrations: django.contrib.admin.migrations.* django.contrib.auth.migrations.* django.contrib.contenttypes.migrations.* django.contrib.flatpages.migrations.* django.contrib.redirects.migrations.* django.contrib.sessions.migrations.* django.contrib.sites.migrations.* # `python -m django` entry point: everything is behind `if __name__ == "__main__"`, # so there is nothing importable to stub. Same as the locale and migration modules above. django.__main__ # Note: At runtime, these are `LazyObject` or `ConnectionProxy` instances. # However, to avoid type degradation, we stub them using the underlying target type instead. # # Why? Both wrapper classes define `__getattr__(self, name: str) -> Any`. # Type-hinting as the wrapper would turn every attribute access into `Any`. django.contrib.admin.sites.site django.contrib.staticfiles.finders.DefaultStorageFinder.storage django.contrib.staticfiles.storage.staticfiles_storage django.core.cache.cache django.core.files.storage.default_storage django.db.connection django.tasks.default_task_backend # path/re_path are actually functools.partial objects at runtime, but stubs type them as functions django.urls.conf.path django.urls.conf.re_path # '_RelatedManager' entries are plugin generated and these subclasses only exist # _locally/dynamically_ runtime -- Created via # 'django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager' django.contrib.admin.models.LogEntry_RelatedManager django.contrib.auth.models.Permission_RelatedManager # '_ManyRelatedManager' entries are plugin generated and these subclasses only exist # _locally/dynamically_ runtime -- Created via # 'django.db.models.fields.related_descriptors.create_forward_many_to_many_manager' django.contrib.auth.models.Group_ManyRelatedManager django.contrib.auth.models.Permission_ManyRelatedManager django.contrib.auth.models.User_ManyRelatedManager django.contrib.flatpages.models.FlatPage_ManyRelatedManager django.contrib.sites.models.Site_ManyRelatedManager # BaseArchive abstract methods that take no argument, but typed with arguments to match the Archive and TarArchive Implementations django.utils.archive.BaseArchive.list django.utils.archive.BaseArchive.extract # Runtime default is the cached_property descriptor itself django.contrib.auth.password_validation.CommonPasswordValidator.__init__ # Promise is lazy, see notes in .pyi django.utils.functional.Promise.__init__ django.utils.functional.Promise.__add__ django.utils.functional.Promise.__deepcopy__ django.utils.functional.Promise.__radd__ django.utils.functional.Promise.__mod__ # DEFAULT_TRIM_VALUE is a SimpleLazyObject at runtime, which causes stubtest to crash # when trying to infer its type as a LiteralType (stubtest bug). django.contrib.gis.geos.prototypes.io.DEFAULT_TRIM_VALUE # `classonlymethod` is an alias for `@classmethod` which is disjoint: django.utils.decorators.classonlymethod # At runtime these return functools.partial via class_or_instance_method descriptor django.db.models.query_utils.RegisterLookupMixin.get_lookups django.db.models.query_utils.RegisterLookupMixin.register_lookup django.db.models.query_utils.RegisterLookupMixin._unregister_lookup # Lazy regex django.contrib.admin.utils.UNQUOTE_RE django.contrib.admindocs.utils.named_group_matcher django.contrib.admindocs.utils.non_capturing_group_matcher django.contrib.admindocs.utils.unnamed_group_matcher django.contrib.gis.db.models.lookups.RelateLookup.pattern_regex django.contrib.gis.geometry.hex_regex django.contrib.gis.geometry.json_regex django.contrib.gis.geometry.wkt_regex django.contrib.postgres.search.multiple_spaces_re django.contrib.postgres.search.spec_chars_re django.core.cache.backends.base.memcached_error_chars_re django.core.validators.EmailValidator.domain_regex django.core.validators.EmailValidator.literal_regex django.core.validators.EmailValidator.user_regex django.core.validators.slug_re django.core.validators.slug_unicode_re django.core.validators.URLValidator.regex django.core.management.commands.makemessages.plural_forms_re django.core.management.commands.runserver.naiveip_re django.db.backends.mysql.base.server_version_re django.db.backends.mysql.compiler.SQLCompiler.ordering_parts django.db.backends.sqlite3.base.FORMAT_QMARK_REGEX django.db.backends.sqlite3.introspection.field_size_re django.db.models.functions.comparison.Collate.collation_re django.db.models.sql.compiler.SQLCompiler.ordering_parts django.forms.fields.IntegerField.re_decimal django.forms.widgets.SelectDateWidget.date_re django.http.request.host_validation_re django.middleware.csrf.invalid_token_chars_re django.middleware.gzip.re_accepts_gzip django.template.base.filter_re django.template.base.kwarg_re django.test.client.CONTENT_TYPE_RE django.test.client.JSON_CONTENT_TYPE_RE django.test.html.ASCII_WHITESPACE django.utils.dateformat.re_escaped django.utils.dateformat.re_formatchars django.utils.dateparse.date_re django.utils.dateparse.datetime_re django.utils.dateparse.iso8601_duration_re django.utils.dateparse.postgres_interval_re django.utils.dateparse.standard_duration_re django.utils.dateparse.time_re django.utils.html.Urlizer.simple_url_2_re django.utils.html.Urlizer.simple_url_re django.utils.html.Urlizer.word_split_re django.utils.html.long_open_tag_without_closing_re django.utils.http.ASCTIME_DATE django.utils.http.ETAG_MATCH django.utils.http.RFC1123_DATE django.utils.http.RFC850_DATE django.utils.text.re_newlines django.utils.text.re_camel_case django.utils.text.smart_split_re django.utils.translation.trans_real.language_code_re django.utils.translation.trans_real.language_code_prefix_re django.utils.translation.trans_real.accept_language_re django.utils.translation.template.plural_re django.utils.translation.template.inline_re django.utils.translation.template.endblock_re django.utils.translation.template.dot_re django.utils.translation.template.context_re django.utils.translation.template.constant_re django.utils.translation.template.block_re django.utils.version.version_component_re django.views.debug.SafeExceptionReporterFilter.hidden_settings django.http.multipartparser.MultiPartParser.boundary_re # AlterTogetherOptionOperation.option_name is set as None, # but is required in the init, so we type it as str django.db.migrations.operations.models.AlterTogetherOptionOperation.option_name # These are set to None in the base class but *must* be overridden # because they are required in the init, so we type them without the None option. django.contrib.gis.db.backends.spatialite.base.DatabaseWrapper.ops django.db.backends.base.base.BaseDatabaseWrapper.SchemaEditorClass django.db.backends.base.base.BaseDatabaseWrapper.client_class django.db.backends.base.base.BaseDatabaseWrapper.creation_class django.db.backends.base.base.BaseDatabaseWrapper.features_class django.db.backends.base.base.BaseDatabaseWrapper.introspection_class django.db.backends.base.base.BaseDatabaseWrapper.ops django.db.backends.base.base.BaseDatabaseWrapper.ops_class django.db.backends.mysql.base.DatabaseWrapper.ops django.db.backends.postgresql.base.DatabaseWrapper.ops django.db.backends.sqlite3.base.DatabaseWrapper.ops # Attributes defaulting to None messing with mypy django.contrib.admin.options.InlineModelAdmin.model django.contrib.admin.options.InlineModelAdmin.template django.views.generic.detail.SingleObjectMixin.model django.views.generic.edit.BaseDeleteView.form_class # Dynamically added via django.core.management.color.make_style django.core.management.color.Style.ERROR django.core.management.color.Style.ERROR_OUTPUT django.core.management.color.Style.HTTP_BAD_REQUEST django.core.management.color.Style.HTTP_INFO django.core.management.color.Style.HTTP_NOT_FOUND django.core.management.color.Style.HTTP_NOT_MODIFIED django.core.management.color.Style.HTTP_REDIRECT django.core.management.color.Style.HTTP_SERVER_ERROR django.core.management.color.Style.HTTP_SUCCESS django.core.management.color.Style.MIGRATE_HEADING django.core.management.color.Style.MIGRATE_LABEL django.core.management.color.Style.NOTICE django.core.management.color.Style.SQL_COLTYPE django.core.management.color.Style.SQL_FIELD django.core.management.color.Style.SQL_KEYWORD django.core.management.color.Style.SQL_TABLE django.core.management.color.Style.SUCCESS django.core.management.color.Style.WARNING # Custom __str__ that we don't want to overcomplicate: django.forms.utils.RenderableMixin.__str__ django.forms.utils.RenderableMixin.__html__ # Dynamically added in ManyToManyField.contribute_to_class() django.db.models.fields.related.ManyToManyField.m2m_db_table # Dynamically added in ManyToManyField.contribute_to_related_class() django.db.models.fields.related.ManyToManyField.m2m_column_name django.db.models.fields.related.ManyToManyField.m2m_field_name django.db.models.fields.related.ManyToManyField.m2m_reverse_field_name django.db.models.fields.related.ManyToManyField.m2m_reverse_name django.db.models.fields.related.ManyToManyField.m2m_reverse_target_field_name django.db.models.fields.related.ManyToManyField.m2m_target_field_name # Defined inside a signature (using the walrus operator) django.core.management.utils.sentinel # Plugin generated model instances for '.annotate' support django.contrib.admin.models.LogEntry@AnnotatedWith django.contrib.auth.base_user.AbstractBaseUser@AnnotatedWith django.contrib.auth.models.AbstractUser@AnnotatedWith django.contrib.auth.models.Group@AnnotatedWith django.contrib.auth.models.Permission@AnnotatedWith django.contrib.auth.models.PermissionsMixin@AnnotatedWith django.contrib.auth.models.User@AnnotatedWith django.contrib.contenttypes.models.ContentType@AnnotatedWith django.contrib.flatpages.models.FlatPage@AnnotatedWith django.contrib.gis.db.backends.oracle.models.OracleGeometryColumns@AnnotatedWith django.contrib.gis.db.backends.oracle.models.OracleSpatialRefSys@AnnotatedWith django.contrib.gis.db.backends.postgis.models.PostGISGeometryColumns@AnnotatedWith django.contrib.gis.db.backends.postgis.models.PostGISSpatialRefSys@AnnotatedWith django.contrib.gis.db.backends.spatialite.models.SpatialiteGeometryColumns@AnnotatedWith django.contrib.gis.db.backends.spatialite.models.SpatialiteSpatialRefSys@AnnotatedWith django.contrib.redirects.models.Redirect@AnnotatedWith django.contrib.sessions.base_session.AbstractBaseSession@AnnotatedWith django.contrib.sessions.models.Session@AnnotatedWith django.contrib.sites.models.Site@AnnotatedWith django.db.migrations.recorder.Migration@AnnotatedWith # These are `UserModel = get_user_model()` lines, the plugin updates them to correct types django.contrib.auth.backends.UserModel django.contrib.auth.forms.UserModel django.contrib.auth.views.UserModel # These are dynamically added when using `save(commit=False)` # See https://docs.djangoproject.com/en/stable/topics/forms/modelforms/#the-save-method django.forms.models.BaseModelForm.save_m2m django.forms.models.BaseModelFormSet.save_m2m # Dynamically generated in https://github.com/django/django/blob/0ee06c04e0256094270db3ffe8b5dafa6a8457a3/django/core/mail/backends/locmem.py#L24 django.core.mail.outbox # Variable is supposed to be a set but is initialised to an empty dict django.contrib.gis.db.backends.base.features.BaseSpatialFeatures.unsupported_geojson_options # We declare more strict types for this in stubs to avoid RuntimeErrors. # Django uses a `*args` parameter but crash if it contains more than 1 element. django.http.request.QueryDict.pop # The `task` decorator supports both `@task` and `@task(...)` forms. Stubs use # overloads to type each case separately, so `function` doesn't accept `None`. django.tasks.base.task # Django incorrectly uses a signature of `(cls, **kwargs)` when it should be `(cls, *args, **kwargs)`. django.test.selenium.SeleniumTestCase.__init_subclass__ # mypy does not understand __getitem__ unpacking python/mypy#2220 django.urls.resolvers.ResolverMatch.__iter__ # The parameters form_class / choices_form_class are positional at runtime, but # usage and docs always pass them as keyword args; additionally, all subclasses # require them to be keyword-only, so require all usage to be keyword-only. django.db.models.fields.Field.formfield # `form` is a TypeVar with a PEP 696 default of `ModelForm[_M]`, so omitting it still ties the # formset to the model. stubtest never resolves TypeVar defaults, so it can't tell that the # runtime `ModelForm` default satisfies `type[_ModelFormT]`. django.contrib.contenttypes.forms.generic_inlineformset_factory django.forms.models.inlineformset_factory django.forms.models.modelformset_factory # Stub-only, replicates the runtime `ManagerDescriptor` behavior of raising when # a manager is accessed on a model instance rather than on the model class django.db.models.manager.BaseManager.__get__ django.db.models.manager.EmptyManager.__get__ # Field.__get__/__set__ are stub-only for the mypy plugin, they don't exist at runtime django.contrib.contenttypes.fields.GenericForeignKey.__get__ django.db.models.fields.Field.__get__ django.db.models.fields.Field.__set__ django.db.models.fields.files.FileField.__get__ django.db.models.fields.files.ImageField.__get__ django.db.models.fields.related.ForeignObject.__get__ django.db.models.fields.related.ManyToManyField.__get__ django.db.models.fields.related.OneToOneField.__get__ # These are dynamically added at runtime with loose types django.utils.functional.LazyObject.__bool__ django.utils.functional.LazyObject.__bytes__ django.utils.functional.LazyObject.__dir__ django.utils.functional.LazyObject.__hash__ django.utils.functional.LazyObject.__iter__ django.utils.functional.LazyObject.__len__ django.utils.functional.LazyObject.__str__ typeddjango-django-stubs-fa03b48/scripts/stubtest/allowlist_python314.txt000066400000000000000000000003001526064357400270060ustar00rootroot00000000000000# Version specific allowlist for Python3.14 only. # We simplify the Enum subclasses creation logic: django.db.models.enums.IntegerChoices.__init__ django.db.models.enums.TextChoices.__init__ typeddjango-django-stubs-fa03b48/scripts/stubtest/allowlist_todo.txt000066400000000000000000000113521526064357400262130ustar00rootroot00000000000000# Autogenerated by `stubtest` # Unsorted: there are real problems and things we can really ignore. django.contrib.admin.models.LogEntry.action_flag django.contrib.admin.models.LogEntry.action_time django.contrib.admin.models.LogEntry.change_message django.contrib.admin.models.LogEntry.content_type django.contrib.admin.models.LogEntry.content_type_id django.contrib.admin.models.LogEntry.get_action_flag_display django.contrib.admin.models.LogEntry.get_next_by_action_time django.contrib.admin.models.LogEntry.get_previous_by_action_time django.contrib.admin.models.LogEntry.id django.contrib.admin.models.LogEntry.object_id django.contrib.admin.models.LogEntry.object_repr django.contrib.admin.models.LogEntry.user django.contrib.admin.models.LogEntry.user_id django.contrib.auth.admin.UserAdmin.fieldsets django.contrib.auth.base_user.AbstractBaseUser.last_login django.contrib.auth.base_user.AbstractBaseUser.password django.contrib.auth.models.AbstractUser.date_joined django.contrib.auth.models.AbstractUser.email django.contrib.auth.models.AbstractUser.first_name django.contrib.auth.models.AbstractUser.get_next_by_date_joined django.contrib.auth.models.AbstractUser.get_previous_by_date_joined django.contrib.auth.models.AbstractUser.groups django.contrib.auth.models.AbstractUser.is_active django.contrib.auth.models.AbstractUser.is_staff django.contrib.auth.models.AbstractUser.is_superuser django.contrib.auth.models.AbstractUser.last_login django.contrib.auth.models.AbstractUser.last_name django.contrib.auth.models.AbstractUser.objects django.contrib.auth.models.AbstractUser.password django.contrib.auth.models.AbstractUser.user_permissions django.contrib.auth.models.AbstractUser.username django.contrib.auth.models.Group.id django.contrib.auth.models.Group.name django.contrib.auth.models.Group.permissions django.contrib.auth.models.Permission.codename django.contrib.auth.models.Permission.content_type django.contrib.auth.models.Permission.content_type_id django.contrib.auth.models.Permission.id django.contrib.auth.models.Permission.name django.contrib.auth.models.PermissionsMixin.groups django.contrib.auth.models.PermissionsMixin.is_superuser django.contrib.auth.models.PermissionsMixin.user_permissions django.contrib.auth.models.User.date_joined django.contrib.auth.models.User.email django.contrib.auth.models.User.first_name django.contrib.auth.models.User.get_next_by_date_joined django.contrib.auth.models.User.get_previous_by_date_joined django.contrib.auth.models.User.groups django.contrib.auth.models.User.id django.contrib.auth.models.User.is_active django.contrib.auth.models.User.is_staff django.contrib.auth.models.User.is_superuser django.contrib.auth.models.User.last_login django.contrib.auth.models.User.last_name django.contrib.auth.models.User.password django.contrib.auth.models.User.user_permissions django.contrib.auth.models.User.username django.contrib.contenttypes.models.ContentType.app_label django.contrib.contenttypes.models.ContentType.id django.contrib.contenttypes.models.ContentType.model django.contrib.flatpages.models.FlatPage.content django.contrib.flatpages.models.FlatPage.enable_comments django.contrib.flatpages.models.FlatPage.id django.contrib.flatpages.models.FlatPage.registration_required django.contrib.flatpages.models.FlatPage.sites django.contrib.flatpages.models.FlatPage.template_name django.contrib.flatpages.models.FlatPage.title django.contrib.flatpages.models.FlatPage.url django.contrib.redirects.models.Redirect.id django.contrib.redirects.models.Redirect.new_path django.contrib.redirects.models.Redirect.old_path django.contrib.redirects.models.Redirect.site django.contrib.redirects.models.Redirect.site_id django.contrib.sessions.base_session.AbstractBaseSession.expire_date django.contrib.sessions.base_session.AbstractBaseSession.get_next_by_expire_date django.contrib.sessions.base_session.AbstractBaseSession.get_previous_by_expire_date django.contrib.sessions.base_session.AbstractBaseSession.objects django.contrib.sessions.base_session.AbstractBaseSession.session_data django.contrib.sessions.base_session.AbstractBaseSession.session_key django.contrib.sessions.models.Session.expire_date django.contrib.sessions.models.Session.get_next_by_expire_date django.contrib.sessions.models.Session.get_previous_by_expire_date django.contrib.sessions.models.Session.session_data django.contrib.sessions.models.Session.session_key django.contrib.sites.models.Site.domain django.contrib.sites.models.Site.id django.contrib.sites.models.Site.name django.db.migrations.recorder.MigrationRecorder.Migration.get_next_by_applied django.db.migrations.recorder.MigrationRecorder.Migration.get_previous_by_applied django.db.migrations.recorder.MigrationRecorder.Migration.id django.db.models.fields.CharField.description django.db.models.fields.Field.description typeddjango-django-stubs-fa03b48/scripts/tests_extension_hook.py000066400000000000000000000054771526064357400254010ustar00rootroot00000000000000from __future__ import annotations import hashlib from typing import TYPE_CHECKING from pytest_mypy_plugins.collect import File if TYPE_CHECKING: from pytest_mypy_plugins.item import YamlTestItem def django_plugin_hook(test_item: YamlTestItem) -> None: custom_settings = test_item.parsed_test_data.get("custom_settings", "") installed_apps = test_item.parsed_test_data.get("installed_apps", None) monkeypatch = test_item.parsed_test_data.get("monkeypatch", False) # When the result of `Plugin.report_config_data` changes, the mypy cache is invalidated. # This slows down the test suite because test can be executed in any order, regularly invalidating shared cache. # To mitigate this, use different cache dirs based on the settings. config_hash = hashlib.md5(f"{installed_apps}{custom_settings}".encode(), usedforsecurity=False).hexdigest()[:10] test_item.incremental_cache_dir += config_hash if installed_apps and custom_settings: raise ValueError('"installed_apps" and "custom_settings" are not compatible, please use one or the other') if installed_apps: # custom_settings is empty, add INSTALLED_APPS installed_apps_as_str = "(" + ",".join([repr(app) for app in installed_apps]) + ",)" custom_settings += "INSTALLED_APPS = " + installed_apps_as_str if "SECRET_KEY" not in custom_settings: custom_settings = 'SECRET_KEY = "1"\n' + custom_settings if monkeypatch: custom_settings = "import django_stubs_ext\ndjango_stubs_ext.monkeypatch()\n" + custom_settings django_settings_section = "\n[mypy.plugins.django-stubs]\ndjango_settings_module = mysettings" if not test_item.additional_mypy_config: test_item.additional_mypy_config = django_settings_section else: if "[mypy.plugins.django-stubs]" not in test_item.additional_mypy_config: test_item.additional_mypy_config += django_settings_section # yml tests use bare generics on purpose, to test real world cases. disable_any_generics = "disallow_any_generics = false\n" if "[mypy]\n" in test_item.additional_mypy_config: test_item.additional_mypy_config = test_item.additional_mypy_config.replace( "[mypy]\n", "[mypy]\n" + disable_any_generics, 1 ) else: test_item.additional_mypy_config = "[mypy]\n" + disable_any_generics + test_item.additional_mypy_config mysettings_file = File(path="mysettings.py", content=custom_settings) test_item.files.append(mysettings_file) if hasattr(test_item.config, "workerinput"): # Append worker ID to cache directory to prevent race conditions during parallel mypy testing # Avoids potential file corruption when multiple processes access/write cached files simultaneously test_item.incremental_cache_dir += test_item.config.workerinput["workerid"] typeddjango-django-stubs-fa03b48/tests/000077500000000000000000000000001526064357400202075ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/__init__.py000066400000000000000000000000001526064357400223060ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/000077500000000000000000000000001526064357400225515ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/__init__.py000066400000000000000000000000001526064357400246500ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/apps/000077500000000000000000000000001526064357400235145ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/apps/__init__.py000066400000000000000000000000001526064357400256130ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/apps/test_config.py000066400000000000000000000025521526064357400263760ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.apps.config import AppConfig from django.utils.functional import cached_property from typing_extensions import override class FooConfig(AppConfig): name = "foo" default_auto_field = "django.db.models.BigAutoField" class BarConfig(AppConfig): name = "foo" @property @override def default_auto_field(self) -> str: # type: ignore[override] # pyrefly: ignore[bad-override] return "django.db.models.BigAutoField" class BazConfig(AppConfig): name = "foo" @cached_property @override def default_auto_field(self) -> str: # type: ignore[override] # pyrefly: ignore[bad-override] return "django.db.models.BigAutoField" class FooBarConfig(AppConfig): name = "foo" default_auto_field = cached_property(lambda self: "django.db.models.BigAutoField") # Pyright correctly picks up our fake '_Getter' descriptor on class level. But we # silence the pyright error since mypy doesn't follow along and the fake descriptor # is a stubs detail made to round other problems. assert_type(FooConfig.default_auto_field, str) # pyright: ignore[reportAssertTypeFailure] assert_type(BarConfig("bar", None).default_auto_field, str) assert_type(BazConfig("baz", None).default_auto_field, str) assert_type(FooBarConfig("baz", None).default_auto_field, str) typeddjango-django-stubs-fa03b48/tests/assert_type/apps/test_registry/000077500000000000000000000000001526064357400264235ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/apps/test_registry/__init__.py000066400000000000000000000000001526064357400305220ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/apps/test_registry/models.py000066400000000000000000000047201526064357400302630ustar00rootroot00000000000000from __future__ import annotations from typing import Any, assert_type from django.apps import apps from django.apps.registry import apps as registry_apps from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.migrations.state import ProjectState class First(models.Model): pass class Second(models.Model): pass def get_model_resolves_literal_references() -> None: # Mypy plugin is needed to narrow `type[Any]` to type[MyModel] # TODO: other type checker should also understand that assert_type(apps.get_model("test_registry.First"), type[First]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] assert_type(apps.get_model("test_registry.first"), type[First]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] assert_type(apps.get_model("test_registry", "First"), type[First]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] assert_type(apps.get_model(app_label="test_registry", model_name="first"), type[First]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] assert_type(apps.get_model(model_name="Second", app_label="test_registry"), type[Second]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] assert_type(registry_apps.get_model("contenttypes.ContentType"), type[ContentType]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] def get_model_of_unknown_or_dynamic_reference_is_permissive() -> None: # Unknown models can't be resolved: the mypy plugin reports an error # TODO: other type checker should also raise issues here assert_type(apps.get_model("test_registry.Missing"), type[Any]) # type: ignore[misc] assert_type(apps.get_model("TEST_REGISTRY.First"), type[Any]) # type: ignore[misc] app_label = "test_registry" model = apps.get_model(app_label, "First") assert_type(model, type[Any]) model.objects.whatever() def get_model_of_historical_state_is_not_narrowed() -> None: # `StateApps` returns historical models rebuilt from migration state, so skip narrowing. state_apps = ProjectState().apps assert_type(state_apps.get_model("test_registry.First"), type[Any]) typeddjango-django-stubs-fa03b48/tests/assert_type/conf/000077500000000000000000000000001526064357400234765ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/conf/settings.py000066400000000000000000000102241526064357400257070ustar00rootroot00000000000000from __future__ import annotations from pathlib import Path from typing import TYPE_CHECKING if TYPE_CHECKING: from django_stubs_ext.settings import TemplatesSetting BASE_DIR = Path(__file__).resolve().parent # Example taken from various doc pages # https://docs.djangoproject.com/en/stable/ref/settings/#templates TEMPLATES: list[TemplatesSetting] = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "APP_DIRS": True, }, ] # https://docs.djangoproject.com/en/stable/ref/templates/api/#the-dirs-option TEMPLATES_2: list[TemplatesSetting] = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [ "/home/html/templates/lawrence.com", "/home/html/templates/default", ], }, ] # https://docs.djangoproject.com/en/stable/ref/templates/api/#template-loaders TEMPLATES_3: list[TemplatesSetting] = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [BASE_DIR / "templates"], } ] TEMPLATES_4: list[TemplatesSetting] = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "OPTIONS": { "loaders": [ ( "django.template.loaders.filesystem.Loader", [BASE_DIR / "templates"], ), ], }, } ] # https://docs.djangoproject.com/en/stable/ref/templates/api/#django.template.loaders.cached.Loader TEMPLATES_5: list[TemplatesSetting] = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [BASE_DIR / "templates"], "OPTIONS": { "loaders": [ ( "django.template.loaders.cached.Loader", [ "django.template.loaders.filesystem.Loader", "django.template.loaders.app_directories.Loader", "path.to.custom.Loader", ], ), ], }, } ] # https://docs.djangoproject.com/en/stable/ref/templates/api/#django.template.loaders.cached.Loader TEMPLATES_6: list[TemplatesSetting] = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "OPTIONS": { "loaders": [ ( "django.template.loaders.locmem.Loader", { "index.html": "content here", }, ), ], }, } ] # https://docs.djangoproject.com/en/stable/topics/templates/#configuration TEMPLATES_7: list[TemplatesSetting] = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [], "APP_DIRS": True, "OPTIONS": { # ... some options here ... }, }, ] # https://docs.djangoproject.com/en/stable/topics/templates/#django.template.backends.base.Template.render TEMPLATES_8: list[TemplatesSetting] = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [ "/home/html/example.com", "/home/html/default", ], }, { "BACKEND": "django.template.backends.jinja2.Jinja2", "DIRS": [ "/home/html/jinja2", ], }, ] # Custom jinja backend TEMPLATES_9: list[TemplatesSetting] = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [BASE_DIR / "templates" / "django"], "APP_DIRS": True, }, { "BACKEND": "django.template.backends.jinja2.Jinja2", "DIRS": [BASE_DIR / "templates" / "jinja"], "OPTIONS": { "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ], "environment": "example.jinja.environment", "extensions": [ "jinja2.ext.do", "jinja2.ext.i18n", "jinja2.ext.loopcontrols", ], }, }, ] typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/000077500000000000000000000000001526064357400242115ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/__init__.py000066400000000000000000000000001526064357400263100ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/admin/000077500000000000000000000000001526064357400253015ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/admin/__init__.py000066400000000000000000000000001526064357400274000ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/admin/test_decorators.py000066400000000000000000000131271526064357400310630ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from django.contrib import admin from django.db import models if TYPE_CHECKING: from django.db.models import QuerySet from django.http import FileResponse, HttpRequest, HttpResponse class DisplayModel(models.Model): @admin.display def display_bare(self) -> str: raise NotImplementedError @admin.display(ordering="field", description="Something", empty_value="...") def display_fancy(self) -> bool: raise NotImplementedError @property @admin.display def display_property(self) -> str: raise NotImplementedError @admin.display def freestanding_display_bare(obj: DisplayModel) -> str: raise NotImplementedError @admin.display(boolean=True) def freestanding_display_fancy(obj: DisplayModel) -> bool: raise NotImplementedError @admin.register(DisplayModel, DisplayModel, site=None) class DisplayModelAdmin(admin.ModelAdmin[DisplayModel]): list_display = [ "display_property", "display_fancy", "display_bare", "admin_display_bare", "admin_display_fancy", freestanding_display_bare, freestanding_display_fancy, ] @admin.display def admin_display_bare(self, obj: DisplayModel) -> str: raise NotImplementedError @admin.display(boolean=True, ordering="field", description="Something") def admin_display_fancy(self, obj: DisplayModel) -> bool: raise NotImplementedError # 'boolean' and 'empty_value' are mutually exclusive arguments admin.display(lambda: 1, boolean=True, empty_value="str") # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] admin.display(lambda: 1, boolean=False, empty_value="str") # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] admin.display(boolean=True, empty_value="str") # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] admin.display(boolean=False, empty_value="str") # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] # Valid combinations (function form) admin.display(lambda: 1, boolean=True, empty_value=None) admin.display(lambda: 1, boolean=False, empty_value=None) admin.display(lambda: 1, boolean=True) admin.display(lambda: 1, boolean=False) admin.display(lambda: 1, boolean=None, empty_value="str") admin.display(lambda: 1, boolean=None, empty_value=None) admin.display(lambda: 1, empty_value="str") admin.display(lambda: 1, empty_value=None) admin.display(lambda: 1) # Valid combinations (decorator form) admin.display(boolean=True, empty_value=None) admin.display(boolean=False, empty_value=None) admin.display(boolean=True) admin.display(boolean=False) admin.display(boolean=None, empty_value="str") admin.display(boolean=None, empty_value=None) admin.display(empty_value="str") admin.display(empty_value=None) admin.display() class ActionModel(models.Model): ... @admin.action def freestanding_action_bare( modeladmin: ActionModelAdmin, request: HttpRequest, queryset: QuerySet[ActionModel] ) -> None: raise NotImplementedError @admin.action(description="Some text here", permissions=["test"]) def freestanding_action_fancy( modeladmin: ActionModelAdmin, request: HttpRequest, queryset: QuerySet[ActionModel] ) -> None: raise NotImplementedError @admin.action def freestanding_action_http_response( modeladmin: ActionModelAdmin, request: HttpRequest, queryset: QuerySet[ActionModel] ) -> HttpResponse: raise NotImplementedError @admin.action def freestanding_action_file_response( modeladmin: ActionModelAdmin, request: HttpRequest, queryset: QuerySet[ActionModel] ) -> FileResponse: raise NotImplementedError @admin.register(ActionModel) class ActionModelAdmin(admin.ModelAdmin[ActionModel]): actions = [ # pyrefly: ignore[bad-assignment] freestanding_action_bare, freestanding_action_fancy, "method_action_bare", "method_action_fancy", freestanding_action_http_response, freestanding_action_file_response, ] @admin.action def method_action_bare(self, request: HttpRequest, queryset: QuerySet[ActionModel]) -> None: raise NotImplementedError @admin.action(description="Some text here", permissions=["test"]) def method_action_fancy(self, request: HttpRequest, queryset: QuerySet[ActionModel]) -> None: raise NotImplementedError @admin.action(description="Some text here", permissions=["test"]) def method_action_http_response(self, request: HttpRequest, queryset: QuerySet[ActionModel]) -> HttpResponse: raise NotImplementedError @admin.action(description="Some text here", permissions=["test"]) def method_action_file_response(self, request: HttpRequest, queryset: QuerySet[ActionModel]) -> FileResponse: raise NotImplementedError # This is actually wrong: @admin.register(ActionModel) should use ActionModel as the type parameter, # not DisplayModel. However, we don't have a way to represent this error in the type system yet. @admin.register(ActionModel) class WrongModelAdmin(admin.ModelAdmin[DisplayModel]): pass @admin.register(ActionModel) # ty: ignore[invalid-argument-type] # pyright: ignore[reportArgumentType, reportUntypedClassDecorator] class UnrelatedClass: # type: ignore[type-var] pass typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/admin/test_filters.py000066400000000000000000000047611526064357400303720ustar00rootroot00000000000000from __future__ import annotations from collections.abc import Iterator, Mapping from typing import TYPE_CHECKING, assert_type from django.contrib.admin.filters import FieldListFilter, ListFilter, SimpleListFilter, _ListFilterChoices from typing_extensions import override if TYPE_CHECKING: from django.contrib.admin.views.main import ChangeList class MyFieldListFilter(FieldListFilter): def populate(self) -> None: # Arbitrary method to showcase that subclasses can store arbitrary values # (e.g. list[list[str]] for __in keys) without `type: ignore`, # since `ListFilter.used_parameters` is `dict[str, object]`. self.used_parameters["state__in"] = [["active", "pending"]] def test_used_parameters( simple_filter: SimpleListFilter, field_filter: FieldListFilter, custom_filter: MyFieldListFilter, ) -> None: # SimpleListFilter narrows used_parameters to dict[str, str] assert_type(simple_filter.used_parameters, dict[str, str]) # FieldListFilter inherits dict[str, object] from ListFilter assert_type(field_filter.used_parameters, dict[str, object]) # Custom subclasses inherit dict[str, object] too assert_type(custom_filter.used_parameters, dict[str, object]) # Custom ListFilter subclass with a completely different choices() schema. # The loosened base return type (Mapping[str, object]) allows this. # This can be useful for user who customized the builtin admin template (`admin/filter.html`) with something # expecting a different type class MyChoicesListFilter(ListFilter): @override def choices(self, changelist: ChangeList) -> Iterator[Mapping[str, object]]: yield {"label": "All items", "icon": "star", "count": 42, "active": True} def test_choices( changelist: ChangeList, base_filter: ListFilter, simple_filter: SimpleListFilter, field_filter: FieldListFilter, my_choices_list_filter: MyChoicesListFilter, ) -> None: # Base ListFilter.choices() returns the loosened type: Iterator[Mapping[str, object]] assert_type(base_filter.choices(changelist), Iterator[Mapping[str, object]]) # SimpleListFilter and FieldListFilter narrow the return type via @override assert_type(simple_filter.choices(changelist), Iterator[_ListFilterChoices]) assert_type(field_filter.choices(changelist), Iterator[_ListFilterChoices]) # Custom subclass with a completely different schema works without type errors assert_type(my_choices_list_filter.choices(changelist), Iterator[Mapping[str, object]]) typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/admin/test_options.py000066400000000000000000000175351526064357400304200ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, Any from django.contrib import admin, messages from django.contrib.admin.sites import AdminSite from django.core.paginator import Paginator from django.db import models from django.forms import ModelForm, Textarea from django.http.request import HttpRequest from django.utils.translation import gettext_lazy as _ from typing_extensions import override if TYPE_CHECKING: from django.db.models.query import QuerySet from django.http.response import HttpResponse # "Happy path" test for model admin, trying to cover as many valid # configurations as possible. class FullAdminModel(models.Model): pass def full_admin_action( modeladmin: FullModelAdmin, request: HttpRequest, queryset: QuerySet[FullAdminModel, FullAdminModel] ) -> None: pass class FullAdminModelForm(ModelForm[FullAdminModel]): pass class FullModelAdmin(admin.ModelAdmin[FullAdminModel]): # BaseModelAdmin autocomplete_fields = ("strs",) raw_id_fields = ["strs"] fields = ( "a field", ["a", "list of", "fields"], ) exclude = ("a", "b") fieldsets = [ (None, {"fields": ["a", "b"]}), ("group", {"fields": ("c",), "classes": ("a",), "description": "foo"}), (_("lazy"), {"fields": ["bar"]}), ] form = FullAdminModelForm filter_vertical = ("fields",) filter_horizontal = ("plenty", "of", "fields") radio_fields = { "some_field": admin.VERTICAL, "another_field": admin.HORIZONTAL, } prepopulated_fields = {"slug": ("title",)} formfield_overrides = {models.TextField: {"widget": Textarea}} readonly_fields = ("date_modified",) ordering = ("-pk", "date_modified") sortable_by = ["pk"] view_on_site = True show_full_result_count = False # ModelAdmin list_display = ("pk",) list_display_links = ("str",) list_filter = ("str", admin.SimpleListFilter, ("str", admin.FieldListFilter)) list_select_related = True list_per_page = 1 list_max_show_all = 2 list_editable = ("a", "b") search_fields = ("c", "d") date_hierarchy = "f" save_as = False save_as_continue = True save_on_top = False paginator = Paginator presserve_filters = False inlines = (admin.TabularInline, admin.StackedInline) add_form_template = "template" change_form_template = "template" change_list_template = "template" delete_confirmation_template = "template" delete_selected_confirmation_template = "template" object_history_template = "template" popup_response_template = "template" actions = (full_admin_action, "a_method_action") # pyrefly: ignore[bad-assignment] actions_on_top = True actions_on_bottom = False actions_selection_counter = True admin_site = AdminSite() # test generic ModelAdmin # https://github.com/typeddjango/django-stubs/pull/504 # this will fail if `model` has a type other than the generic specified in the class declaration model = FullAdminModel def a_method_action(self, request: HttpRequest, queryset: QuerySet[FullAdminModel]) -> None: pass def a_method_action_with_message_user(self, request: HttpRequest, queryset: QuerySet[FullAdminModel]) -> None: self.message_user(request, _("Error message"), messages.ERROR) class AnotherModel(models.Model): pass admin.site.register(FullAdminModel, FullModelAdmin) admin.site.register(AnotherModel, FullModelAdmin) # type: ignore[misc] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] # pyright:ignore[reportArgumentType] # This admin is here to make sure we're not running into a mypy issue which is # worked around using a somewhat complicated _ListOrTuple union type. Once the # issue is solved upstream this test should pass even with the workaround # replaced by a simpler Sequence type. # https://github.com/python/mypy/issues/8921 class FieldsetWorkaroundAdmin(admin.ModelAdmin[Any]): fieldsets = ( ( None, { "fields": ("name",), }, ), ) class ViewOnSiteCallableAdmin(admin.ModelAdmin[Any]): @override def view_on_site(self, obj: ViewOnSiteCallableAdmin) -> str: # pyright: ignore[reportIncompatibleVariableOverride] # pyrefly: ignore[bad-override-mutable-attribute] return "http://example.org" class MissingFieldsetFieldsAdmin(admin.ModelAdmin[Any]): fieldsets = [ (None, {}), # type: ignore[typeddict-item] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-typed-dict-key] ] class InvalidRadioFieldsValueAdmin(admin.ModelAdmin[Any]): radio_fields = {"some_field": 0} # type: ignore[dict-item] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment] class InvalidRadioFieldsKeyAdmin(admin.ModelAdmin[Any]): radio_fields = {1: admin.VERTICAL} # type: ignore[dict-item] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment] class InvalidFormfieldOverridesAdmin(admin.ModelAdmin[Any]): formfield_overrides = { "not a field": { # type: ignore[dict-item] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment] "widget": Textarea, } } class InvalidActionSignatureModel(models.Model): ... def invalid_action(modeladmin: None) -> None: pass class InvalidActionSignatureAdmin(admin.ModelAdmin[InvalidActionSignatureModel]): actions = [invalid_action] # type: ignore[list-item] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment] class InvalidGenericModel(models.Model): pass class InvalidGenericModelAdmin(admin.ModelAdmin[InvalidGenericModel]): model = int # type: ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment] class InlineParentModel(models.Model): pass class InlineChildModel(models.Model): parent = models.ForeignKey(InlineParentModel, on_delete=models.CASCADE) # pyright: ignore[reportUnknownVariableType] class ParentObjInline(admin.StackedInline[InlineChildModel, InlineParentModel]): model = InlineChildModel @override def get_readonly_fields( self, request: HttpRequest, obj: InlineParentModel | None = None ) -> list[str] | tuple[str, ...]: return super().get_readonly_fields(request, obj) # Passing wrong types to inline methods that expect parent objects inline_req = HttpRequest() inline_instance = ParentObjInline(InlineParentModel, admin.AdminSite()) inline_instance.get_fields(inline_req, 1) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] inline_instance.get_inlines(inline_req, 1) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] inline_instance.get_readonly_fields(inline_req, 1) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] class ValidActionModel(models.Model): ... @admin.action(description="Trigger an action from a global action function.") def valid_action_function( modeladmin: admin.ModelAdmin[ValidActionModel], request: HttpRequest, queryset: QuerySet[ValidActionModel], ) -> None: raise NotImplementedError @admin.register(ValidActionModel) class ActionAdmin(admin.ModelAdmin[ValidActionModel]): @admin.action(description="Trigger an action from a model admin action method.") def valid_action_method( self, request: HttpRequest, queryset: QuerySet[ValidActionModel], ) -> HttpResponse: raise NotImplementedError # Normally a method would be passed by name as a string, but defining `actions` after the # method makes it possible to ensure that it is typed correctly. actions = [valid_action_function, valid_action_method] typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/admin/test_utils.py000066400000000000000000000115711526064357400300570ustar00rootroot00000000000000from __future__ import annotations import datetime from typing import assert_type from django import http from django.contrib import admin from django.contrib.admin.options import _DisplayT from django.contrib.admin.utils import ( build_q_object_from_lookup_parameters, flatten, flatten_fieldsets, prepare_lookup_value, ) from django.db import models from django.db.models import F, Q from django.db.models.functions import Upper @admin.display(description="Name") def upper_case_name(obj: Person) -> str: return f"{obj.first_name} {obj.last_name}".upper() # pyright: ignore[reportUnknownMemberType] class Person(models.Model): first_name = models.CharField(max_length=None) # pyright: ignore[reportUnknownVariableType] last_name = models.CharField(max_length=None) # pyright: ignore[reportUnknownVariableType] birthday = models.DateField() # pyright: ignore[reportUnknownVariableType] class PersonListAdmin(admin.ModelAdmin[Person]): fields = [["first_name", "last_name"], "birthday"] list_display = [upper_case_name, "birthday"] class PersonTupleAdmin(admin.ModelAdmin[Person]): fields = (("first_name", "last_name"), "birthday") list_display = (upper_case_name, "birthday") class PersonFieldsetListAdmin(admin.ModelAdmin[Person]): fieldsets = [ ( "Personal Details", { "description": "Personal details of a person.", "fields": [["first_name", "last_name"], "birthday"], }, ) ] class PersonFieldsetTupleAdmin(admin.ModelAdmin[Person]): fieldsets = ( ( "Personal Details", { "description": "Personal details of a person.", "fields": (("first_name", "last_name"), "birthday"), }, ), ) request = http.HttpRequest() admin_site = admin.AdminSite() person_list_admin = PersonListAdmin(Person, admin_site) person_tuple_admin = PersonTupleAdmin(Person, admin_site) person_fieldset_list_admin = PersonFieldsetListAdmin(Person, admin_site) person_fieldset_tuple_admin = PersonFieldsetTupleAdmin(Person, admin_site) # For some reason, pyright cannot see that these are not `None` so we need to ignore these for mypy. assert person_list_admin.fields is not None # type: ignore[comparison-overlap] assert person_tuple_admin.fields is not None # type: ignore[comparison-overlap] assert person_fieldset_list_admin.fieldsets is not None # type: ignore[comparison-overlap] assert person_fieldset_tuple_admin.fieldsets is not None # type: ignore[comparison-overlap] assert_type(flatten(person_list_admin.fields), list[str]) # ty: ignore[no-matching-overload,type-assertion-failure] assert_type(flatten(person_list_admin.get_fields(request)), list[str]) assert_type(flatten(person_tuple_admin.fields), list[str]) assert_type(flatten(person_tuple_admin.get_fields(request)), list[str]) assert_type(flatten(person_list_admin.list_display), list[_DisplayT[Person]]) # ty: ignore[no-matching-overload,type-assertion-failure] assert_type(flatten(person_list_admin.get_list_display(request)), list[_DisplayT[Person]]) # ty: ignore[type-assertion-failure] assert_type(flatten(person_tuple_admin.list_display), list[_DisplayT[Person]]) assert_type(flatten(person_tuple_admin.get_list_display(request)), list[_DisplayT[Person]]) # ty: ignore[type-assertion-failure] assert_type(flatten_fieldsets(person_fieldset_list_admin.fieldsets), list[str]) # ty: ignore[invalid-argument-type] assert_type(flatten_fieldsets(person_fieldset_list_admin.get_fieldsets(request)), list[str]) assert_type(flatten_fieldsets(person_fieldset_tuple_admin.fieldsets), list[str]) # ty: ignore[invalid-argument-type] assert_type(flatten_fieldsets(person_fieldset_tuple_admin.get_fieldsets(request)), list[str]) class PersonOrderingAdmin(admin.ModelAdmin[Person]): ordering = [Upper("first_name")] class PersonMixedOrderingAdmin(admin.ModelAdmin[Person]): ordering = ["-last_name", Upper("first_name")] class PersonFExpressionAdmin(admin.ModelAdmin[Person]): ordering = [F("birthday").desc(nulls_last=True)] # prepare_lookup_value: list[str] input recurses on each element, # returning list[str] (pass-through) or list[bool] (__isnull keys) assert_type(prepare_lookup_value("field", ["a", "b"]), list[str] | list[bool]) # str input: split (__in) -> list[str], bool (__isnull), or str (pass-through) assert_type(prepare_lookup_value("field", "value"), str | bool | list[str]) # Non-str, non-list values pass through unchanged (e.g. datetime from date_hierarchy # in ChangeList.get_filters) assert_type(prepare_lookup_value("field", datetime.datetime.now()), datetime.datetime) # Values are not limited to list[str] — any iterable of objects is accepted assert_type( build_q_object_from_lookup_parameters( { "a": ["str"], "b": [datetime.datetime(2023, 1, 1)], "c": [True], } ), Q, ) typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/auth/000077500000000000000000000000001526064357400251525ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/auth/test_base_user.py000066400000000000000000000004171526064357400305350ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.contrib.auth.models import User def get_backend() -> str: return "django.contrib.auth.backends.ModelBackend" user = User() user.backend = get_backend() assert_type(user.backend, str) typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/auth/test_decorators.py000066400000000000000000000011631526064357400307310ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from django.contrib.auth.decorators import user_passes_test from django.urls import reverse, reverse_lazy if TYPE_CHECKING: from django.http import HttpRequest, HttpResponse reversed_url = reverse("url") lazy_url = reverse_lazy("namespace:url") @user_passes_test(lambda user: user.is_active, login_url=reversed_url) def my_view1(request: HttpRequest) -> HttpResponse: raise NotImplementedError @user_passes_test(lambda user: user.is_active, login_url=lazy_url) def my_view2(request: HttpRequest) -> HttpResponse: raise NotImplementedError typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/auth/test_hashers.py000066400000000000000000000012141526064357400302160ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.contrib.auth.hashers import check_password def setter(password: str | None) -> None: ... def perfect_setter(password: str) -> None: ... def bad_setter(password: int) -> None: ... assert_type(check_password("password", "encoded"), bool) assert_type(check_password("password", "encoded", setter), bool) assert_type(check_password("password", "encoded", perfect_setter), bool) check_password("password", "encoded", bad_setter) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/auth/test_models.py000066400000000000000000000004341526064357400300470ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.contrib.auth.models import AbstractBaseUser, UserManager class MyUser(AbstractBaseUser): pass class Manager(UserManager[MyUser]): pass assert_type(Manager().create_user("username"), MyUser) typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/postgres/000077500000000000000000000000001526064357400260575ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/postgres/__init__.py000066400000000000000000000000001526064357400301560ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/postgres/test_aggregates.py000066400000000000000000000032021526064357400315760ustar00rootroot00000000000000from __future__ import annotations from typing import cast from django.contrib.postgres.aggregates import ArrayAgg from django.db.models import BooleanField, Exists, ExpressionWrapper, F, Model, Q, QuerySet from django.db.models.lookups import GreaterThan queryset = cast("QuerySet[Model]", object()) # ArrayAgg: order_by accepts single str/Combinable or sequence of either ArrayAgg("title", order_by="title") ArrayAgg("title", order_by="-title") ArrayAgg("title", order_by=F("title")) ArrayAgg("title", order_by=F("title").desc()) ArrayAgg("title", order_by=["-title", F("title")]) ArrayAgg("title", order_by=("-title", F("title").desc())) # Aggregate kwargs forwarded through OrderableAggMixin ArrayAgg("title", distinct=True, filter=Q(active=True), order_by="-title", default=[]) ArrayAgg("title", filter=Exists(queryset)) ArrayAgg("title", filter=GreaterThan(F("id"), 0)) ArrayAgg("title", filter=ExpressionWrapper(Exists(queryset), output_field=BooleanField())) ArrayAgg("title", order_by=123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] ArrayAgg("title", order_by=[123]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] ArrayAgg("title", filter=F("a")) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] ArrayAgg("title", filter="active") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/postgres/test_indexes.py000066400000000000000000000041441526064357400311320ustar00rootroot00000000000000from __future__ import annotations from django.contrib.postgres.indexes import BrinIndex, BTreeIndex, GinIndex, GistIndex, HashIndex, OpClass, SpGistIndex from django.db import models from django.db.models import Index from django.db.models.functions import Lower # BrinIndex BrinIndex(fields=["foo"]) BrinIndex(models.F("bar"), name="test") BrinIndex("foo", models.F("bar"), Lower("baz"), name="test") BrinIndex("foo", name="test", opclasses=["bar"]) BrinIndex("foo", name="test", condition=models.Q(foo=1)) BrinIndex("foo", name="test", include=["bar"]) # BTreeIndex BTreeIndex(fields=["foo"]) BTreeIndex(models.F("bar"), name="test") BTreeIndex("foo", models.F("bar"), Lower("baz"), name="test") BTreeIndex("foo", name="test", opclasses=["bar"]) BTreeIndex("foo", name="test", condition=models.Q(foo=1)) BTreeIndex("foo", name="test", include=["bar"]) # GinIndex GinIndex(fields=["foo"]) GinIndex(models.F("bar"), name="test") GinIndex("foo", models.F("bar"), Lower("baz"), name="test") GinIndex("foo", name="test", opclasses=["bar"]) GinIndex("foo", name="test", condition=models.Q(foo=1)) GinIndex("foo", name="test", include=["bar"]) # GistIndex GistIndex(fields=["foo"]) GistIndex(models.F("bar"), name="test") GistIndex("foo", models.F("bar"), Lower("baz"), name="test") GistIndex("foo", name="test", opclasses=["bar"]) GistIndex("foo", name="test", condition=models.Q(foo=1)) GistIndex("foo", name="test", include=["bar"]) # HashIndex HashIndex(fields=["foo"]) HashIndex(models.F("bar"), name="test") HashIndex("foo", models.F("bar"), Lower("baz"), name="test") HashIndex("foo", name="test", opclasses=["bar"]) HashIndex("foo", name="test", condition=models.Q(foo=1)) HashIndex("foo", name="test", include=["bar"]) # SpGistIndex SpGistIndex(fields=["foo"]) SpGistIndex(models.F("bar"), name="test") SpGistIndex("foo", models.F("bar"), Lower("baz"), name="test") SpGistIndex("foo", name="test", opclasses=["bar"]) SpGistIndex("foo", name="test", condition=models.Q(foo=1)) SpGistIndex("foo", name="test", include=["bar"]) # OpClass Index( OpClass(Lower("username"), name="varchar_pattern_ops"), name="lower_username_idx", ) typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/staticfiles/000077500000000000000000000000001526064357400265235ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/staticfiles/__init__.py000066400000000000000000000000001526064357400306220ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/staticfiles/test_finders.py000066400000000000000000000025761526064357400316000ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.contrib.staticfiles import finders from django.contrib.staticfiles.finders import AppDirectoriesFinder, BaseFinder, DefaultStorageFinder, FileSystemFinder # find (single) assert_type(finders.find("filepath"), str | None) for finder in finders.get_finders(): assert_type(finder, BaseFinder) assert_type(finder.find("filepath"), str | None) assert_type(FileSystemFinder().find("filepath"), str | None) assert_type(AppDirectoriesFinder().find("filepath"), str | None) assert_type(DefaultStorageFinder().find("filepath"), str | None) # find (all) assert_type(finders.find("filepath", find_all=True), list[str]) for finder in finders.get_finders(): assert_type(finder.find("filepath", find_all=True), list[str]) # ty: ignore[type-assertion-failure] assert_type(FileSystemFinder().find("filepath", find_all=True), list[str]) # ty: ignore[type-assertion-failure] assert_type(AppDirectoriesFinder().find("filepath", find_all=True), list[str]) # ty: ignore[type-assertion-failure] assert_type(DefaultStorageFinder().find("filepath", find_all=True), list[str]) # ty: ignore[type-assertion-failure] # FileSystemFinder-specific assert_type(FileSystemFinder().find_location(".", "filepath"), str | None) # AppDirectoriesFinder-specific assert_type(AppDirectoriesFinder().find_in_app("app", "filepath"), str | None) typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/staticfiles/test_storage.py000066400000000000000000000011611526064357400315770ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from django.contrib.staticfiles.storage import HashedFilesMixin from typing_extensions import override if TYPE_CHECKING: from django.core.files.base import File # Ensure subclassing narrowing the content arg in contravariant position is allowed class ZulipStorage(HashedFilesMixin): @override def hashed_name(self, name: str, content: File[bytes] | None = None, filename: str | None = None) -> str: return name @override def file_hash(self, name: str, content: File[bytes] | None = None) -> str | None: return None typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/test_contenttypes/000077500000000000000000000000001526064357400300075ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/test_contenttypes/__init__.py000066400000000000000000000000001526064357400321060ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/test_contenttypes/models.py000066400000000000000000000024721526064357400316510ustar00rootroot00000000000000from __future__ import annotations import sys from typing import Any, assert_type from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.db import models # `GenericForeignKeyDescriptor` is only available in Django 6.1+ but we test against Django 5.2.x # on Python < 3.12, so only run these tests for newer Python versions to avoid lots of issues with # different type checkers complaining when attempting to fall back to `GenericForeignKey` # when `ImportError` is raised. if sys.version_info >= (3, 12): from django.contrib.contenttypes.fields import GenericForeignKeyDescriptor class TaggedItem(models.Model): tag = models.SlugField() # pyright: ignore[reportUnknownVariableType] content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) # pyright: ignore[reportUnknownVariableType] object_id = models.PositiveBigIntegerField() # pyright: ignore[reportUnknownVariableType] content_object = GenericForeignKey("content_type", "object_id") def test_generic_foreign_key_descriptor() -> None: assert_type(TaggedItem().content_object, Any | None) # pyrefly: ignore[assert-type] assert_type(TaggedItem.content_object, GenericForeignKeyDescriptor) # pyrefly: ignore[assert-type] typeddjango-django-stubs-fa03b48/tests/assert_type/contrib/test_models.py000066400000000000000000000057571526064357400271230ustar00rootroot00000000000000from __future__ import annotations from datetime import datetime from typing import assert_type from django.contrib.admin.models import LogEntry from django.contrib.auth.models import Group, Permission, User from django.contrib.contenttypes.models import ContentType from django.contrib.flatpages.models import FlatPage from django.contrib.redirects.models import Redirect from django.contrib.sessions.models import Session from django.contrib.sites.models import Site def log_entry_fields_are_inferred() -> None: entry = LogEntry() assert_type(entry.action_time, datetime) assert_type(entry.user, User) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] assert_type(entry.content_type, ContentType | None) # pyrefly: ignore[assert-type] assert_type(entry.object_id, str | None) # pyrefly: ignore[assert-type] assert_type(entry.object_repr, str) assert_type(entry.action_flag, int) assert_type(entry.change_message, str) def flatpage_fields_are_inferred() -> None: page = FlatPage() assert_type(page.url, str) assert_type(page.title, str) assert_type(page.content, str) assert_type(page.enable_comments, bool) assert_type(page.template_name, str) assert_type(page.registration_required, bool) assert_type(page.sites.get(), Site) def redirect_fields_are_inferred() -> None: redirect = Redirect() assert_type(redirect.site, Site) # pyrefly: ignore[assert-type] assert_type(redirect.old_path, str) assert_type(redirect.new_path, str) def site_fields_are_inferred() -> None: site = Site() assert_type(site.domain, str) assert_type(site.name, str) def content_type_fields_are_inferred() -> None: content_type = ContentType() assert_type(content_type.app_label, str) assert_type(content_type.model, str) def session_fields_are_inferred() -> None: session = Session() assert_type(session.session_key, str) assert_type(session.session_data, str) assert_type(session.expire_date, datetime) def permission_fields_are_inferred() -> None: permission = Permission() assert_type(permission.name, str) assert_type(permission.content_type, ContentType) # pyrefly: ignore[assert-type] assert_type(permission.codename, str) def group_fields_are_inferred() -> None: group = Group() assert_type(group.name, str) assert_type(group.permissions.get(), Permission) def user_fields_are_inferred() -> None: user = User() assert_type(user.password, str) assert_type(user.last_login, datetime | None) # pyrefly: ignore[assert-type] assert_type(user.username, str) assert_type(user.first_name, str) assert_type(user.last_name, str) assert_type(user.email, str) assert_type(user.is_staff, bool) assert_type(user.is_active, bool) assert_type(user.is_superuser, bool) assert_type(user.date_joined, datetime) assert_type(user.groups.get(), Group) assert_type(user.user_permissions.get(), Permission) typeddjango-django-stubs-fa03b48/tests/assert_type/core/000077500000000000000000000000001526064357400235015ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/core/__init__.py000066400000000000000000000000001526064357400256000ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/core/files/000077500000000000000000000000001526064357400246035ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/core/files/__init__.py000066400000000000000000000000001526064357400267020ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/core/files/test_storage.py000066400000000000000000000010501526064357400276540ustar00rootroot00000000000000from __future__ import annotations from django.core.files.base import File from django.core.files.storage import Storage from django.core.validators import FileExtensionValidator from typing_extensions import override # Ensure subclassing narrowing the return type is allowed class MyStorage(Storage): @override def open(self, name: str, mode: str = "rb") -> File[bytes]: return File(open(name, mode)) class MyValidator(FileExtensionValidator): @override def __call__(self, value: File[bytes]) -> None: return None typeddjango-django-stubs-fa03b48/tests/assert_type/core/handlers/000077500000000000000000000000001526064357400253015ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/core/handlers/__init__.py000066400000000000000000000000001526064357400274000ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/core/handlers/test_wsgi.py000066400000000000000000000003011526064357400276550ustar00rootroot00000000000000from __future__ import annotations from wsgiref.simple_server import make_server from django.core.handlers.wsgi import WSGIHandler make_server( "0.0.0.0", 8080, WSGIHandler(), ) typeddjango-django-stubs-fa03b48/tests/assert_type/core/mail/000077500000000000000000000000001526064357400244235ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/core/mail/__init__.py000066400000000000000000000000001526064357400265220ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/core/mail/test_message.py000066400000000000000000000012341526064357400274600ustar00rootroot00000000000000from __future__ import annotations from email.message import EmailMessage as StdlibEmailMessage from email.mime.image import MIMEImage from email.mime.text import MIMEText from typing import Any, assert_type from django.core.mail.message import EmailMessage message = EmailMessage() assert_type(message, EmailMessage) assert_type(message.message(), StdlibEmailMessage) message.attach("myfilename", "mycontent", "text/plain") mime_text = MIMEText("mytext") assert_type(mime_text, MIMEText) message.attach(mime_text) mime_image = MIMEImage(b"mydata", "png") assert_type(mime_image, MIMEImage) message.attach(mime_image) assert_type(message.attachments, list[Any]) typeddjango-django-stubs-fa03b48/tests/assert_type/core/test_checks.py000066400000000000000000000021521526064357400263520ustar00rootroot00000000000000from __future__ import annotations from collections.abc import Sequence from typing import TYPE_CHECKING, assert_type from django.core.checks import CheckMessage, Warning, register if TYPE_CHECKING: from django.apps.config import AppConfig @register("foo", deploy=True) def check_foo( app_configs: Sequence[AppConfig] | None, databases: Sequence[str] | None, **kwargs: object, ) -> list[CheckMessage]: if databases and "databass" in databases: return [Warning("Naughty list")] return [] assert_type(check_foo.tags, Sequence[str]) @register def check_bar(*, app_configs: Sequence[AppConfig] | None, **kwargs: object) -> list[CheckMessage]: raise NotImplementedError assert_type(check_bar.tags, Sequence[str]) @register def check_baz(**kwargs: object) -> list[CheckMessage]: raise NotImplementedError assert_type(check_baz.tags, Sequence[str]) @register() # type: ignore[type-var] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-specialization] # ty: ignore[invalid-argument-type] def wrong_args(bla: int) -> list[CheckMessage]: raise NotImplementedError typeddjango-django-stubs-fa03b48/tests/assert_type/core/test_exceptions.py000066400000000000000000000010171526064357400272720ustar00rootroot00000000000000from __future__ import annotations from django.core.exceptions import ValidationError ValidationError( { "list": ["list error 1", "list error 2"], "plain_str": "message", "plain_error": ValidationError("message"), "list_error": [ ValidationError("list error 1", code="test"), ValidationError("list error 2", code="test"), ], } ) ValidationError( [ "message 1", ValidationError("message 2"), ["nested 1", "nested 2"], ] ) typeddjango-django-stubs-fa03b48/tests/assert_type/db/000077500000000000000000000000001526064357400231365ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/__init__.py000066400000000000000000000000001526064357400252350ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/migrations/000077500000000000000000000000001526064357400253125ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/migrations/__init__.py000066400000000000000000000000001526064357400274110ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/migrations/test_classvar.py000066400000000000000000000017351526064357400305470ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, ClassVar from django.db import migrations if TYPE_CHECKING: from django.db.migrations.operations.base import Operation class ExplicitMigration(migrations.Migration): operations: ClassVar[list[Operation]] = [] # pyright: ignore[reportIncompatibleVariableOverride] initial: ClassVar[bool] = True # pyright: ignore[reportIncompatibleVariableOverride] # Non-ClassVar annotations are incorrect class ExplicitIncorrectMigration(migrations.Migration): operations: list[Operation] = [] # type: ignore[misc] # pyright: ignore[reportIncompatibleVariableOverride] # pyrefly: ignore[bad-override] # ty: ignore[invalid-attribute-override] initial: bool = True # type: ignore[misc] # pyright: ignore[reportIncompatibleVariableOverride] # pyrefly: ignore[bad-override] # ty: ignore[invalid-attribute-override] class ImplicitMigration(migrations.Migration): operations = [] initial = True typeddjango-django-stubs-fa03b48/tests/assert_type/db/migrations/test_operations.py000066400000000000000000000037061526064357400311140ustar00rootroot00000000000000from __future__ import annotations from django.db.migrations import RunSQL RunSQL(sql="SOME SQL") RunSQL(sql=("SOME SQLS", "SOME SQLS"), reverse_sql=("SOME SQLS", "SOME SQLS")) RunSQL(sql=["SOME SQLS", "SOME SQLS"], reverse_sql=["SOME SQLS", "SOME SQLS"]) RunSQL( sql=["SOME SQLS", ("SOME SQLS %s", ("SQL PARAM AS A TUPLE",))], reverse_sql=["SOME SQLS", ("SOME SQLS %s", ("SQL PARAM AS A TUPLE",))], ) RunSQL( sql=["SOME SQLS", ("SOME SQLS NO PARAM", None)], reverse_sql=["SOME SQLS", ("SOME SQLS NO PARAM", None)], ) RunSQL( sql=["SOME SQLS", ("SOME SQLS %(VAL)s", {"VAL": "FOO"})], reverse_sql=["SOME SQLS", ("SOME SQLS %(VAL)s", {"VAL": "FOO"})], ) RunSQL( sql=["SOME SQLS", ("SOME SQLS %s, %s", ["PARAM", "ANOTHER PARAM"])], reverse_sql=["SOME SQLS", ("SOME SQLS %s, %s", ["PARAM", "ANOTHER PARAM"])], ) RunSQL("INSERT INTO musician (name) VALUES ('Reinhardt');") RunSQL([("INSERT INTO musician (name) VALUES ('Reinhardt');", None)]) RunSQL([("INSERT INTO musician (name) VALUES (%s);", ["Reinhardt"])]) query = "UPDATE posts SET category = %s WHERE category = ANY(%s);" RunSQL([(query, ["new category", ["retired category", "another retired category"]])]) RunSQL(sql=["SOME SQLS", ("SOME SQLS %s, %s", [object(), "ANOTHER PARAM"])]) # Error cases RunSQL(sql=("SOME SQL", {})) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] RunSQL(sql=("SOME SQL", 1)) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] RunSQL(sql=("SOME SQL", None)) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] RunSQL(sql=("SOME SQLS %(VAL)s", {1: "FOO"})) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/000077500000000000000000000000001526064357400244215ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/__init__.py000066400000000000000000000000001526064357400265200ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/_enums.py000066400000000000000000000020051526064357400262560ustar00rootroot00000000000000from __future__ import annotations from typing import Literal, assert_type from django.db.models import TextChoices class Direction(TextChoices): NORTH = "N", "North" EAST = "E", "East" SOUTH = "S", "South" WEST = "W", "West" # Note: Suppress errors from pyright and ty as the mypy plugin narrows the type of labels if non-lazy. assert_type(Direction.names, list[str]) assert_type(Direction.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Direction.values, list[str]) assert_type(Direction.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Direction.NORTH, Literal[Direction.NORTH]) assert_type(Direction.NORTH.name, Literal["NORTH"]) assert_type(Direction.NORTH.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Direction.NORTH.value, str) assert_type(Direction.NORTH.do_not_call_in_templates, Literal[True]) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/fields/000077500000000000000000000000001526064357400256675ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/fields/__init__.py000066400000000000000000000000001526064357400277660ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/fields/test_files.py000066400000000000000000000006531526064357400304060ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.db import models from django.db.models.fields.files import FieldFile, ImageFieldFile class MyModel(models.Model): file = models.FileField() image = models.ImageField() instance = MyModel() assert_type(instance.file, FieldFile) # pyrefly: ignore[assert-type] assert_type(instance.image, ImageFieldFile) # pyrefly: ignore[assert-type] typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/fields/test_related.py000066400000000000000000000012461526064357400307230ustar00rootroot00000000000000from __future__ import annotations from django.db import models class Author(models.Model): pass class Book(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE, swappable=False) # pyright: ignore[reportUnknownVariableType] class Profile(models.Model): user = models.OneToOneField(Author, on_delete=models.CASCADE, swappable=False) # pyright: ignore[reportUnknownVariableType] class Review(models.Model): book = models.ForeignKey(Book, on_delete=models.DB_CASCADE) # pyright: ignore[reportUnknownVariableType] author = models.OneToOneField(Author, on_delete=models.DB_SET_NULL) # pyright: ignore[reportUnknownVariableType] typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/fields/test_related_descriptors.py000066400000000000000000000027461526064357400333520ustar00rootroot00000000000000from __future__ import annotations from typing import ClassVar, assert_type from django.db import models from django.db.models.fields.related_descriptors import RelatedManager, ReverseManyToOneDescriptor from typing_extensions import TypeVar _To = TypeVar("_To", bound=models.Model) class Other(models.Model): explicit_descriptor: ClassVar[ReverseManyToOneDescriptor[MyModel]] class MyModel(models.Model): rel = models.ForeignKey[Other, Other](Other, on_delete=models.CASCADE, related_name="explicit_descriptor") assert_type(Other().explicit_descriptor, RelatedManager[MyModel]) class CustomDescriptor(ReverseManyToOneDescriptor[MyModel]): def custom_method(self) -> int: raise NotImplementedError class WithCustomDescriptor(models.Model): custom_descriptor: ClassVar[CustomDescriptor] # Class-level access returns `Self`, preserving descriptor subclasses and their members assert_type(WithCustomDescriptor.custom_descriptor, CustomDescriptor) assert_type(WithCustomDescriptor.custom_descriptor.custom_method(), int) class PassThroughDescriptor(ReverseManyToOneDescriptor[_To]): ... class WithPassThroughDescriptor(models.Model): passthrough_descriptor: ClassVar[PassThroughDescriptor[MyModel]] # Class-level access returns `Self`, preserving a generic subclass and its parameterization assert_type(WithPassThroughDescriptor.passthrough_descriptor, PassThroughDescriptor[MyModel]) assert_type(MyModel._default_manager.__class__, type[models.Manager[MyModel]]) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/functions/000077500000000000000000000000001526064357400264315ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/functions/__init__.py000066400000000000000000000000001526064357400305300ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/functions/test_window.py000066400000000000000000000005661526064357400313600ustar00rootroot00000000000000from __future__ import annotations from django.db.models import F, Value from django.db.models.functions import Lag, Lead, NthValue Lag("field") Lag(F("field")) Lead("field") Lead(F("field")) NthValue("field", nth=2) NthValue(F("field"), nth=2) Lag("field", default=42) Lag("field", default="string") Lag("field", default=Value("value")) Lag("field", default=F("other")) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_aggregates.py000066400000000000000000000056151526064357400301520ustar00rootroot00000000000000from __future__ import annotations from typing import cast from django.db.models import ( BooleanField, Count, Exists, ExpressionWrapper, F, Model, Q, QuerySet, StdDev, StringAgg, Variance, ) from django.db.models.aggregates import Aggregate from django.db.models.lookups import GreaterThan Aggregate("title", order_by="title") Aggregate("title", order_by="-title") Aggregate("title", order_by=F("title")) Aggregate("title", order_by=F("title").desc()) Aggregate("title", order_by=["-title", F("title")]) Aggregate("title", order_by=("-title", F("title").desc())) Aggregate("title", order_by=None) queryset = cast("QuerySet[Model]", object()) # Count: filter is positional-or-keyword (unique to Count) Count("id", distinct=True) Count("id", filter=Q(active=True)) Count("id", filter=Exists(queryset)) Count("id", filter=GreaterThan(F("id"), 0)) Count("id", filter=ExpressionWrapper(Exists(queryset), output_field=BooleanField())) Count("id", Q(active=True)) # filter as positional Count(123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] Count("id", filter="active") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] Count("id", filter=F("a")) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] # StdDev: second positional is `sample: bool`, not filter; filter/default are keyword-only StdDev("score", filter=Q(active=True), default=0) StdDev([]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] StdDev("score", Q(active=True)) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] # Variance: same shape as StdDev Variance("score", filter=Q(active=True), default=0) Variance({}) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] # StringAgg: full Aggregate kwarg surface (distinct, filter, default, order_by) StringAgg("title", delimiter=",", order_by="title") StringAgg("title", delimiter=",", order_by=F("title")) StringAgg("title", delimiter=",", order_by=["-title", F("title")]) StringAgg("title", delimiter=",", distinct=True, filter=Q(active=True), order_by="-title", default="") StringAgg("title", delimiter=",", filter=F("a")) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] StringAgg("title", delimiter=",", order_by=123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_base.py000066400000000000000000000021441526064357400267450ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, assert_type from django.db import models from typing_extensions import override if TYPE_CHECKING: from collections.abc import Iterable from django.db.models.query import QuerySet class MyModel(models.Model): class Meta: app_label = "myapp" class OtherModel(models.Model): class Meta: app_label = "myapp" # Override with QuerySet[Model] — valid class OverrideWithModel(models.Model): @override def refresh_from_db( self, using: str | None = None, fields: Iterable[str] | None = None, from_queryset: QuerySet[models.Model] | None = None, ) -> None: ... class Meta: app_label = "myapp" def test_correct_queryset(m: MyModel, qs: QuerySet[MyModel]) -> None: m.refresh_from_db(from_queryset=qs) assert_type(m.refresh_from_db(), None) def test_wrong_queryset(m: MyModel, qs: QuerySet[OtherModel]) -> None: m.refresh_from_db(from_queryset=qs) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_constraints.py000066400000000000000000000012131526064357400303760ustar00rootroot00000000000000from __future__ import annotations from django.db.models import CheckConstraint, Q, UniqueConstraint from django.db.models.functions import Lower UniqueConstraint(Lower("name").desc(), "category", name="unique_lower_name_category") UniqueConstraint(fields=["name"], name="unique_name") # There's no overload case for passing both expression and 'fields' UniqueConstraint( # type: ignore[call-overload] Lower("name"), fields=["name"], # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] name="unique_mess", ) CheckConstraint(name="positive_price", condition=Q(price__gt=0)) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_enums.py000066400000000000000000000406141526064357400271660ustar00rootroot00000000000000from __future__ import annotations import enum from typing import Any, Literal, assert_type from django.db.models import Choices, IntegerChoices, Model, TextChoices from django.utils.functional import _StrOrPromise, _StrPromise from django.utils.translation import gettext_lazy as _ from typing_extensions import TypeVar, override # Choices in a separate model to test that the plugin resolves types correctly. from tests.assert_type.db.models import _enums as imported T_Choices = TypeVar("T_Choices", bound=IntegerChoices) def get_choices_using_property(choices: type[T_Choices]) -> list[tuple[int, str]]: return choices.choices # pyright: ignore[reportReturnType] # ty: ignore[invalid-return-type] def get_labels_using_property(choices: type[T_Choices]) -> list[str]: return choices.labels # pyright: ignore[reportReturnType] # ty: ignore[invalid-return-type] def get_values_using_property(choices: type[T_Choices]) -> list[int]: return choices.values def get_labels_using_comprehension(choices: type[T_Choices]) -> list[str]: return [choice.label for choice in choices] # pyright: ignore[reportReturnType] # ty: ignore[invalid-return-type] def get_values_using_comprehension(choices: type[T_Choices]) -> list[int]: return [choice.value for choice in choices] class Suit(IntegerChoices): DIAMOND = 1, _("Diamond") SPADE = 2, _("Spade") HEART = 3, _("Heart") CLUB = 4, _("Club") class YearInSchool(TextChoices): FRESHMAN = "FR", _("Freshman") SOPHOMORE = "SO", _("Sophomore") JUNIOR = "JR", _("Junior") SENIOR = "SR", _("Senior") GRADUATE = "GR", _("Graduate") class Vehicle(IntegerChoices): CAR = 1, "Carriage" TRUCK = 2 JET_SKI = 3 __empty__ = _("(Unknown)") class Gender(TextChoices): MALE = "M" FEMALE = "F" NOT_SPECIFIED = "X" __empty__ = "(Undeclared)" class Medal(TextChoices): GOLD = enum.auto() SILVER = enum.auto() BRONZE = enum.auto() class Separator(bytes, Choices): FS = b"\x1c", "File Separator" GS = b"\x1d", "Group Separator" RS = b"\x1e", "Record Separator" US = b"\x1f", "Unit Separator" class Constants(float, Choices): PI = 3.141592653589793, "π" TAU = 6.283185307179586, "τ" __empty__ = "NULL" class BaseEmptyChoices(Choices): __empty__ = "Python's None" class VoidChoices(BaseEmptyChoices): ABYSS = enum.auto() CHASM = enum.auto() # Choice type that has been aliased to test that the plugin resolves types correctly. CompassPoint = imported.Direction # Choice type that has been aliased by type to test that the plugin resolves types correctly. Award: type[TextChoices] = Medal # Checks unions of enum literals to test that the plugin resolves types correctly. def get_suit_with_color(suit: Suit) -> str: if suit == Suit.DIAMOND or suit == Suit.HEART: return f"{suit.label} is red." return f"{suit.label} is black." # Checks a single enum literal to test that the plugin resolves types correctly. def is_suit_a_diamond(suit: Suit) -> str: if suit == Suit.DIAMOND: return f"{suit.label}: Yes!" return f"{suit.label}: No!" # Choice type that overrides a property and uses `super()` to test the plugin resolve types correctly. class ShoutyTextChoices(TextChoices): @property @override def label(self) -> str: return super().label.upper() class DeckModel(Model): # Alias with the same name. Suit = Suit # Alias with a different name. House = Suit class Joker(TextChoices): BLACK = "B" RED = "R" # Assertions for an integer choices type that uses a lazy translatable string for all labels. assert_type(Suit.names, list[str]) assert_type(Suit.labels, list[_StrPromise]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Suit.values, list[int]) assert_type(Suit.choices, list[tuple[int, _StrPromise]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Suit.CLUB, Literal[Suit.CLUB]) assert_type(Suit.CLUB.name, Literal["CLUB"]) assert_type(Suit.CLUB.label, _StrPromise) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Suit.CLUB.value, int) assert_type(Suit.CLUB.do_not_call_in_templates, Literal[True]) # Assertions for a text choices type that uses a lazy translatable string for all labels. assert_type(YearInSchool.names, list[str]) assert_type(YearInSchool.labels, list[_StrPromise]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(YearInSchool.values, list[str]) assert_type(YearInSchool.choices, list[tuple[str, _StrPromise]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(YearInSchool.SENIOR, Literal[YearInSchool.SENIOR]) assert_type(YearInSchool.SENIOR.name, Literal["SENIOR"]) assert_type(YearInSchool.SENIOR.label, _StrPromise) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(YearInSchool.SENIOR.value, str) assert_type(YearInSchool.SENIOR.do_not_call_in_templates, Literal[True]) # Assertions for an integer choices type that defines `__empty__`, generates most labels, etc. # Note: Suppress errors from pyright as the mypy plugin handles making types optional. assert_type(Vehicle.names, list[str]) assert_type(Vehicle.labels, list[_StrOrPromise]) assert_type(Vehicle.values, list[int | None]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Vehicle.choices, list[tuple[int | None, _StrOrPromise]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Vehicle.CAR, Literal[Vehicle.CAR]) assert_type(Vehicle.CAR.name, Literal["CAR"]) assert_type(Vehicle.CAR.label, _StrOrPromise) assert_type(Vehicle.CAR.value, int) assert_type(Vehicle.CAR.do_not_call_in_templates, Literal[True]) assert_type(Vehicle.__empty__, _StrPromise) # pyright: ignore[reportAssertTypeFailure] # Assertions for an text choices type that defines `__empty__` and uses plain strings for all labels. # Note: Suppress errors from pyright as the mypy plugin handles making types optional. # Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy. assert_type(Gender.names, list[str]) assert_type(Gender.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Gender.values, list[str | None]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Gender.choices, list[tuple[str | None, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Gender.MALE, Literal[Gender.MALE]) assert_type(Gender.MALE.name, Literal["MALE"]) assert_type(Gender.MALE.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Gender.MALE.value, str) assert_type(Gender.MALE.do_not_call_in_templates, Literal[True]) assert_type(Gender.__empty__, str) # pyright: ignore[reportAssertTypeFailure] # Assertions for a text choices type that uses `enum.auto()`. # Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy. assert_type(Medal.names, list[str]) assert_type(Medal.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Medal.values, list[str]) assert_type(Medal.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Medal.GOLD, Literal[Medal.GOLD]) assert_type(Medal.GOLD.name, Literal["GOLD"]) assert_type(Medal.GOLD.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Medal.GOLD.value, str) assert_type(Medal.GOLD.do_not_call_in_templates, Literal[True]) # Assertions for a choices type that uses a custom base type. # Note: Suppress errors from pyright as the mypy plugin handles propagating custom base types. # Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy. assert_type(Separator.names, list[str]) assert_type(Separator.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Separator.values, list[bytes]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Separator.choices, list[tuple[bytes, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Separator.FS, Literal[Separator.FS]) assert_type(Separator.FS.name, Literal["FS"]) assert_type(Separator.FS.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Separator.FS.value, bytes) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Separator.FS.do_not_call_in_templates, Literal[True]) # Assertions for a choices type uses a custom base type and defines `__empty__`. # Note: Suppress errors from pyright as the mypy plugin handles making types optional. # Note: Suppress errors from pyright as the mypy plugin handles propagating custom base types. # Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy. assert_type(Constants.names, list[str]) assert_type(Constants.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Constants.values, list[float | None]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Constants.choices, list[tuple[float | None, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Constants.PI, Literal[Constants.PI]) assert_type(Constants.PI.name, Literal["PI"]) assert_type(Constants.PI.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Constants.PI.value, float) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Constants.PI.do_not_call_in_templates, Literal[True]) assert_type(Constants.__empty__, str) # pyright: ignore[reportAssertTypeFailure] # Assertions for a choices type where `__empty__` is defined on a base class. # Note: Suppress errors from pyright as the mypy plugin handles making types optional. # Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy. assert_type(VoidChoices.names, list[str]) assert_type(VoidChoices.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(VoidChoices.values, list[int | None]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(VoidChoices.values, list[Any | None]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] assert_type(VoidChoices.choices, list[tuple[int | None, str]]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(VoidChoices.choices, list[tuple[Any | None, str]]) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] assert_type(VoidChoices.ABYSS, Literal[VoidChoices.ABYSS]) assert_type(VoidChoices.ABYSS.name, Literal["ABYSS"]) assert_type(VoidChoices.ABYSS.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(VoidChoices.ABYSS.value, int) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(VoidChoices.ABYSS.value, Any) # pyrefly: ignore[assert-type] assert_type(VoidChoices.ABYSS.do_not_call_in_templates, Literal[True]) assert_type(VoidChoices.__empty__, str) # pyright: ignore[reportAssertTypeFailure] # Assertions for a choices type imported from another module to test the plugin resolves correctly. # Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy. assert_type(imported.Direction.names, list[str]) assert_type(imported.Direction.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(imported.Direction.values, list[str]) assert_type(imported.Direction.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(imported.Direction.NORTH, Literal[imported.Direction.NORTH]) assert_type(imported.Direction.NORTH.name, Literal["NORTH"]) assert_type(imported.Direction.NORTH.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(imported.Direction.NORTH.value, str) assert_type(imported.Direction.NORTH.do_not_call_in_templates, Literal[True]) # Assertions for a choices type aliased from another to test the plugin resolves correctly. # Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy. assert_type(CompassPoint.names, list[str]) assert_type(CompassPoint.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(CompassPoint.values, list[str]) assert_type(CompassPoint.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(CompassPoint.NORTH, Literal[imported.Direction.NORTH]) assert_type(CompassPoint.NORTH.name, Literal["NORTH"]) assert_type(CompassPoint.NORTH.label, str) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(CompassPoint.NORTH.value, str) assert_type(CompassPoint.NORTH.do_not_call_in_templates, Literal[True]) # Assertions for a choices type aliased by type to test the plugin resolves correctly. # Note: Suppress errors from pyright as the mypy plugin narrows the type of labels if non-lazy. assert_type(Award.names, list[str]) assert_type(Award.labels, list[str]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(Award.values, list[str]) assert_type(Award.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] # Assertions for mixing multiple choices types with consistent base types - only `IntegerChoices`. x0 = (Suit, Vehicle) assert_type([member.label for choices in x0 for member in choices], list[_StrOrPromise]) assert_type([member.value for choices in x0 for member in choices], list[int]) # Assertions for mixing multiple choices types with consistent base types - only `TextChoices`. x1 = (Medal, Gender) assert_type([member.label for choices in x1 for member in choices], list[str]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type( # pyrefly: ignore[assert-type] [member.label for choices in x1 for member in choices], list[_StrOrPromise] ) assert_type([member.value for choices in x1 for member in choices], list[str]) # Assertions for mixing multiple choices types with different base types - `IntegerChoices` and `TextChoices`. x2 = (Medal, Suit) assert_type([member.label for choices in x2 for member in choices], list[_StrOrPromise]) assert_type([member.value for choices in x2 for member in choices], list[int | str]) # Assertions for mixing multiple choices types with consistent base types - custom types. x3 = (Constants, Separator) assert_type([member.label for choices in x3 for member in choices], list[str]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type( # pyrefly: ignore[assert-type] [member.label for choices in x3 for member in choices], list[_StrOrPromise] ) assert_type([member.value for choices in x3 for member in choices], list[bytes | float]) # type: ignore[assert-type] # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type( # pyrefly: ignore[assert-type] [member.value for choices in x3 for member in choices], list[Any] ) # Assertions for choices objects defined and aliased in a model. assert_type(DeckModel.Suit.choices, list[tuple[int, _StrPromise]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(DeckModel.House.choices, list[tuple[int, _StrPromise]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] assert_type(DeckModel.Joker.choices, list[tuple[str, str]]) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_expressions.py000066400000000000000000000026071526064357400304210ustar00rootroot00000000000000from __future__ import annotations import datetime from decimal import Decimal from typing import assert_type from django.db.models import F from django.db.models.expressions import CombinedExpression now = datetime.datetime.now() delta = datetime.timedelta(seconds=10) assert_type(F("x") + now, CombinedExpression) assert_type(now + F("x"), CombinedExpression) assert_type(F("x") + delta, CombinedExpression) assert_type(delta + F("x"), CombinedExpression) assert_type(F("x") + 1, CombinedExpression) assert_type(1 + F("x"), CombinedExpression) assert_type(F("x") + 1.5, CombinedExpression) assert_type(F("x") + Decimal(1), CombinedExpression) assert_type(F("x") + F("y"), CombinedExpression) assert_type(F("x") + "_suffix", CombinedExpression) assert_type("prefix_" + F("x"), CombinedExpression) assert_type(F("x") + None, CombinedExpression) assert_type(None + F("x"), CombinedExpression) assert_type(F("x") - now, CombinedExpression) assert_type(now - F("x"), CombinedExpression) assert_type(F("x") - delta, CombinedExpression) assert_type(delta - F("x"), CombinedExpression) assert_type(F("x") - 1, CombinedExpression) assert_type(1 - F("x"), CombinedExpression) assert_type(F("x") - 1.5, CombinedExpression) assert_type(F("x") - Decimal(1), CombinedExpression) assert_type(F("x") - F("y"), CombinedExpression) assert_type(F("x") - None, CombinedExpression) assert_type(None - F("x"), CombinedExpression) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_indexes.py000066400000000000000000000006311526064357400274710ustar00rootroot00000000000000from __future__ import annotations from django.db import models from django.db.models.functions import Lower models.Index(fields=["foo"]) models.Index(models.F("bar"), name="test") models.Index("foo", models.F("bar"), Lower("baz"), name="test") models.Index("foo", name="test", opclasses=["bar"]) models.Index("foo", name="test", condition=models.Q(foo=1)) models.Index("foo", name="test", include=["bar"]) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_lookups.py000066400000000000000000000022111526064357400275220ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, Any, assert_type from django.db.models import Lookup if TYPE_CHECKING: from django.db.backends.base.base import BaseDatabaseWrapper from django.db.models.fields.json import CaseInsensitiveMixin from django.db.models.sql.compiler import SQLCompiler # Lookup can be used without explicit type argument (defaults to Any). # Regression test for https://github.com/typeddjango/django-stubs/issues/2649. def test_lookup_optional_type_arg(lookup: Lookup, typed_lookup: Lookup[int]) -> None: assert_type(lookup, Lookup) assert_type(typed_lookup, Lookup[int]) class MyLookup(Lookup): ... class MyTypedLookup(Lookup[Any]): ... def test_subclass_without_type_arg(lookup: MyLookup, typed: MyTypedLookup) -> None: # MyLookup(Lookup) is equivalent to MyLookup(Lookup[Any]) assert_type(lookup, MyLookup) assert_type(typed, MyTypedLookup) def test_case_insensitive_mixin( mixin: CaseInsensitiveMixin, compiler: SQLCompiler, connection: BaseDatabaseWrapper ) -> None: assert_type(mixin.process_lhs(compiler, connection), tuple[str, tuple[str | int, ...]]) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_manager_access/000077500000000000000000000000001526064357400304135ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_manager_access/__init__.py000066400000000000000000000000001526064357400325120ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_manager_access/models.py000066400000000000000000000071401526064357400322520ustar00rootroot00000000000000"""Managers are only accessible on the model class, never on an instance.""" from __future__ import annotations from typing import assert_type from django.contrib.auth.models import AnonymousUser, Group from django.db import models from django.db.models.manager import EmptyManager from django_stubs_ext.db.models.manager import RelatedManager class CategoryManager(models.Manager["Category"]): pass class Category(models.Model): objects = CategoryManager() secondary = CategoryManager() class Post(models.Model): """No declared manager, `objects` only resolves through `ModelBase.__getattr__`.""" class Article(models.Model): # Reverse accessors are bound to instances, so they must be annotated with `RelatedManager`, not a bare `Manager`. mistyped_category_set: models.Manager[Category] # pyright: ignore[reportUninitializedInstanceVariable] category_set: RelatedManager[Category] # pyright: ignore[reportUninitializedInstanceVariable] def declared_manager_access_on_instance_is_banned() -> None: Category().objects # type: ignore[arg-type] # pyright: ignore[reportAttributeAccessIssue, reportUnknownMemberType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-attribute-access] Category().secondary # type: ignore[arg-type] # pyright: ignore[reportAttributeAccessIssue, reportUnknownMemberType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-attribute-access] def default_manager_access_on_instance_is_banned() -> None: # `ModelBase.__getattr__` lives on the metaclass, so instances can't reach it. mypy sees the # per-model attribute the plugin declares instead, and rejects it through `BaseManager.__get__` Post().objects # type: ignore[arg-type] # pyright: ignore[reportAttributeAccessIssue, reportUnknownMemberType] # pyrefly: ignore[missing-attribute] # ty: ignore[unresolved-attribute] def manager_access_on_class_is_allowed() -> None: # A declared manager keeps its own type, exactly like any other class attribute assert_type(Category.objects, CategoryManager) assert_type(Category.secondary, CategoryManager) assert_type(Post.objects, models.Manager[Post]) def unknown_attribute_is_still_an_error() -> None: # `Literal["objects"]` must not turn `__getattr__` into a catch-all Category.not_defined # type: ignore[attr-defined] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-attribute-access] Category().not_defined # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue, reportUnknownMemberType] # pyrefly: ignore[missing-attribute] # ty: ignore[unresolved-attribute] def related_manager_access_on_instance_is_allowed() -> None: assert_type(Article().category_set, RelatedManager[Category]) def bare_manager_annotation_on_instance_is_banned() -> None: # A reverse accessor annotated as `Manager` is unreachable from the instance that owns it Article().mistyped_category_set # type: ignore[arg-type] # pyright: ignore[reportAttributeAccessIssue, reportUnknownMemberType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-attribute-access] def empty_manager_access_through_property_is_allowed() -> None: # `EmptyManager` reaches instances through `AnonymousUser.groups`, a plain property assert_type(AnonymousUser().groups, EmptyManager[Group]) def meta_manager_access_on_instance_is_allowed() -> None: # `Options` hands out managers from an instance the same way assert_type(Category()._meta.base_manager, models.Manager[Category]) assert_type(Category()._meta.default_manager, models.Manager[Category] | None) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_manager_overrides/000077500000000000000000000000001526064357400311545ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_manager_overrides/__init__.py000066400000000000000000000000001526064357400332530ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_manager_overrides/models.py000066400000000000000000000052601526064357400330140ustar00rootroot00000000000000"""Overriding `Manager.create()` with a narrowed return type. Regression test for https://github.com/typeddjango/django-stubs/issues/578. """ from __future__ import annotations from typing import Any, assert_type from django.db import models from typing_extensions import override # --------------------------------------------------------------------------- # Unparametrized manager: the plugin re-parametrizes it with the model it's on # --------------------------------------------------------------------------- class ArticleManager(models.Manager): # pyright: ignore[reportMissingTypeArgument] # Without a type parameter, the inherited `create()` returns the unsolved `_T`, so narrowing it is an error. # Only mypy checks the override against `_T`, the other type checkers treat it as unknown. @override def create(self, **kwargs: Any) -> Article: # type: ignore[override] return super().create(**kwargs) # type: ignore[return-value] # pyright: ignore[reportUnknownVariableType] class Article(models.Model): objects = ArticleManager() def override_manager_create_no_type_param() -> None: assert_type(Article.objects.create(), Article) # --------------------------------------------------------------------------- # Manager parametrized with the model it's assigned to # --------------------------------------------------------------------------- class BookManager(models.Manager["Book"]): @override def create(self, **kwargs: Any) -> Book: return super().create(**kwargs) class Book(models.Model): objects = BookManager() def override_manager_create_with_type_param() -> None: assert_type(Book.objects.create(), Book) # --------------------------------------------------------------------------- # Manager parametrized with another model than the one it's assigned to # --------------------------------------------------------------------------- class ReviewManager(models.Manager["Author"]): # The type parameter, not the model the manager ends up on, drives what the inherited `create()` returns. @override def create(self, **kwargs: Any) -> Review: # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # pyrefly: ignore[bad-override] # ty: ignore[invalid-method-override] return super().create(**kwargs) # type: ignore[return-value] # pyright: ignore[reportReturnType] # pyrefly: ignore[bad-return] # ty: ignore[invalid-return-type] class Review(models.Model): objects = ReviewManager() # pyright: ignore[reportGeneralTypeIssues] class Author(models.Model): pass def override_manager_create_with_incoherent_type_param() -> None: assert_type(Review.objects.create(), Review) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_managers.py000066400000000000000000000020251526064357400276260ustar00rootroot00000000000000"""Regression test for https://github.com/typeddjango/django-stubs/issues/2911. A TypeVar with a forward-referenced bound used in a QuerySet subclass caused 'Must not defer during final iteration' crash in mypy. """ from __future__ import annotations from typing import assert_type from django.db import models from django.db.models.query import QuerySet from typing_extensions import TypeVar T = TypeVar("T", bound="MyModel") class MyModelQuerySet(QuerySet[T]): pass class MyModel(models.Model): class Meta: app_label = "myapp" class CustomManager(models.Manager["OtherModel"]): def manager_method(self) -> str: return "" class OtherQuerySet(models.QuerySet["OtherModel"]): ... class OtherModel(models.Model): class Meta: app_label = "myapp" # `from_queryset` returns `type[Self]`, preserving manager subclasses and their members assert_type(CustomManager.from_queryset(OtherQuerySet), type[CustomManager]) assert_type(CustomManager.from_queryset(OtherQuerySet)().manager_method(), str) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_model_base.py000066400000000000000000000023151526064357400301250ustar00rootroot00000000000000"""The `ModelBase` metaclass properties, reached whenever a model class is only known as `type[_T]`.""" from __future__ import annotations from typing import Generic, assert_type from django.db import models from typing_extensions import TypeVar _T = TypeVar("_T", bound=models.Model) class MyModel(models.Model): class Meta: app_label = "myapp" class Base(Generic[_T]): def __init__(self, model_cls: type[_T]) -> None: self.model_cls = model_cls def test_unbound(self) -> None: # pyright reports `Manager[Model*]`: a conditional type still tied to `_T`, but not identical to it assert_type(self.model_cls._default_manager, models.Manager[_T]) # pyright: ignore[reportAssertTypeFailure] assert_type(self.model_cls._base_manager, models.Manager[_T]) # pyright: ignore[reportAssertTypeFailure] class Child(Base[MyModel]): def test_bound(self) -> None: assert_type(self.model_cls._default_manager, models.Manager[MyModel]) assert_type(self.model_cls._base_manager, models.Manager[MyModel]) assert_type(Base(MyModel).model_cls._default_manager, models.Manager[MyModel]) assert_type(Base(MyModel).model_cls._base_manager, models.Manager[MyModel]) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_ordering.py000066400000000000000000000051611526064357400276460ustar00rootroot00000000000000from __future__ import annotations from django.contrib.auth.models import User from django.db.models import F, OrderBy from django.db.models.sql.query import Query qs = User.objects.all() qs.order_by("username") qs.order_by(F("username")) qs.order_by("-date_joined", F("last_login").desc()) # Test OrderBy expressions (success cases) qs.order_by(OrderBy(F("username"))) qs.order_by(OrderBy(F("date_joined"), descending=True)) qs.order_by("username", OrderBy(F("last_login"), descending=True)) qs.extra(order_by=["username"]) qs.extra(order_by=[F("username")]) qs.extra(order_by=["username", F("date_joined").desc()]) qs.extra(order_by=[OrderBy(F("username"))]) qs.extra(order_by=["username", OrderBy(F("date_joined"), descending=True)]) query = Query(User) query.add_ordering("username") query.add_ordering(F("date_joined")) query.add_ordering("-last_login", F("username").desc()) query.add_ordering(OrderBy(F("username"))) query.add_ordering("username", OrderBy(F("date_joined"), descending=True)) query.add_extra( select=None, select_params=None, where=None, params=None, tables=None, order_by=["username", F("date_joined").desc(), OrderBy(F("last_login"))], ) # failure cases qs.order_by(123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] qs.order_by(["username"]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] qs.order_by({"username": "asc"}) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] qs.extra(order_by=[123]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] qs.extra(order_by=["username", 456]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] query.add_ordering(123) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] query.add_ordering(["username"]) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] query.add_extra( select=None, select_params=None, where=None, params=None, tables=None, order_by=[123, "username"], # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] ) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_query.py000066400000000000000000000041071526064357400272010ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, assert_type from django.db.models.query import QuerySet, RawQuerySet, aprefetch_related_objects, prefetch_related_objects if TYPE_CHECKING: from collections.abc import Sequence from django.contrib.auth.models import AnonymousUser from django.db.models import Model models_list: list[Model] = [] prefetch_related_objects(models_list, "pk") models_tuple: tuple[Model, ...] = () prefetch_related_objects(models_tuple, "pk") models_sequence: Sequence[Model] = [] prefetch_related_objects(models_sequence, "pk") # failure cases models_set: set[Model] = set() prefetch_related_objects(models_set, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] models_frozenset: frozenset[Model] = frozenset() prefetch_related_objects(models_frozenset, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] async def test_async() -> None: await aprefetch_related_objects(models_list, "pk") await aprefetch_related_objects(models_tuple, "pk") await aprefetch_related_objects(models_sequence, "pk") # failure cases await aprefetch_related_objects(models_set, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] await aprefetch_related_objects(models_frozenset, "pk") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] def test_in_operator( qs: QuerySet[Model], raw_qs: RawQuerySet[Model], obj: Model, user_or_anon: Model | AnonymousUser, obj_or_none: Model | None, ) -> None: assert_type(obj in qs, bool) assert_type(obj in raw_qs, bool) assert_type(user_or_anon in qs, bool) assert_type(obj_or_none in qs, bool) assert_type(None in qs, bool) assert_type("test" in qs, bool) assert_type(42 in qs, bool) typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_queryset_row_type/000077500000000000000000000000001526064357400312715ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_queryset_row_type/__init__.py000066400000000000000000000000001526064357400333700ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/db/models/test_queryset_row_type/models.py000066400000000000000000000041251526064357400331300ustar00rootroot00000000000000from __future__ import annotations import datetime from collections.abc import Iterator from typing import Any, assert_type from django.db import models from django.db.models.query import QuerySet, RawQuerySet from django.utils import timezone class Blog(models.Model): created_at = models.DateTimeField() # pyright: ignore[reportUnknownVariableType] def queryset_methods_keep_the_row_type(qs: QuerySet[Blog], manager: models.Manager[Blog]) -> None: assert_type(qs.get(id=1), Blog) assert_type(iter(qs), Iterator[Blog]) assert_type(qs.iterator(), Iterator[Blog]) assert_type(qs.first(), Blog | None) assert_type(qs.earliest(), Blog) assert_type(qs[0], Blog) assert_type(qs[:9], QuerySet[Blog, Blog]) assert_type(qs.create(), Blog) assert_type(qs.get_or_create(), tuple[Blog, bool]) assert_type(qs.exists(), bool) assert_type(qs.none(), QuerySet[Blog, Blog]) assert_type(qs.update_or_create(), tuple[Blog, bool]) assert_type(qs.explain(), str) assert_type(qs.raw(qs.explain()), RawQuerySet[Blog]) assert_type(qs.distinct(), QuerySet[Blog, Blog]) assert_type(qs.distinct("created_at"), QuerySet[Blog, Blog]) assert_type(qs & qs, QuerySet[Blog, Blog]) # .dates / .datetimes swap the row type assert_type(manager.dates("created_at", "day"), QuerySet[Blog, datetime.date]) assert_type(manager.datetimes("created_at", "day"), QuerySet[Blog, datetime.datetime]) # defer / only assert_type(qs.defer("created_at"), QuerySet[Blog, Blog]) assert_type(qs.defer(None), QuerySet[Blog, Blog]) assert_type(qs.only("created_at"), QuerySet[Blog, Blog]) qs.only(None) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] # bulk methods assert_type(qs.count(), int) assert_type(qs.update(created_at=timezone.now()), int) assert_type(qs.in_bulk(), dict[Any, Blog]) assert_type(qs.bulk_update(list(qs), fields=["created_at"]), int) assert_type(qs.bulk_create([]), list[Blog]) assert_type(qs.delete(), tuple[int, dict[str, int]]) typeddjango-django-stubs-fa03b48/tests/assert_type/db/test_connection.py000066400000000000000000000013351526064357400267100ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.db import connection, connections from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.utils import CursorWrapper with connection.cursor() as cursor: assert_type(cursor, CursorWrapper) cursor.execute("SELECT %s", [123]) # psycopg2 composable SQL from psycopg2.sql import SQL, Identifier # type: ignore[import-untyped] with connection.cursor() as cursor: cursor.execute(SQL("INSERT INTO {} VALUES (%s)").format(Identifier("my_table")), [123]) assert_type(connections["test"], BaseDatabaseWrapper) for conn in connections.all(): with conn.cursor() as cursor: assert_type(cursor, CursorWrapper) typeddjango-django-stubs-fa03b48/tests/assert_type/db/test_transaction.py000066400000000000000000000033641526064357400271020ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.db.transaction import atomic, non_atomic_requests from django.http import HttpRequest, HttpResponse # atomic as context manager with atomic(): pass with atomic(using="mydb"): pass with atomic(using="mydb", savepoint=False): pass with atomic(using="mydb", savepoint=False, durable=True): pass # atomic as bare decorator preserves function type @atomic def func(x: int) -> list[object]: return [] assert_type(func(1), list[object]) # atomic with args preserves function type @atomic(using="bla", savepoint=False) def func2(x: int) -> list[object]: return [] assert_type(func2(1), list[object]) # non_atomic_requests bare preserves function type @non_atomic_requests def view_func(request: HttpRequest) -> HttpResponse: raise NotImplementedError assert_type(view_func(HttpRequest()), HttpResponse) # non_atomic_requests with extra args @non_atomic_requests def view_func2(request: HttpRequest, arg: str) -> HttpResponse: raise NotImplementedError assert_type(view_func2(HttpRequest(), "test"), HttpResponse) # atomic as decorator on class methods class ClassWithAtomicMethod: @atomic def atomic_method1(self, abc: int) -> str: return "" @atomic(savepoint=True) def atomic_method2(self) -> None: pass @atomic(using="db", savepoint=True) def atomic_method3(self, myparam: str) -> int: return 0 assert_type(ClassWithAtomicMethod().atomic_method1(1), str) assert_type(ClassWithAtomicMethod().atomic_method3("x"), int) ClassWithAtomicMethod().atomic_method1("abc") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] typeddjango-django-stubs-fa03b48/tests/assert_type/forms/000077500000000000000000000000001526064357400236775ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/forms/modelformsets/000077500000000000000000000000001526064357400265625ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/forms/modelformsets/__init__.py000066400000000000000000000000001526064357400306610ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/forms/modelformsets/models.py000066400000000000000000000032421526064357400304200ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, assert_type from django.db import models from django.forms.models import BaseInlineFormSet, BaseModelFormSet, ModelForm if TYPE_CHECKING: from django.contrib.contenttypes.forms import BaseGenericInlineFormSet from django.forms.models import ModelChoiceField, ModelChoiceIterator class Author(models.Model): pass class Book(models.Model): pass def test_form_parameter_defaults_to_model_form() -> None: """`_ModelFormT` defaults to `ModelForm[_M]`, so the form parameter can be omitted.""" class AuthorForm(ModelForm[Author]): ... implicit: BaseModelFormSet[Author] = BaseModelFormSet() explicit: BaseModelFormSet[Author, AuthorForm] = BaseModelFormSet() # `ty` doesn't substitute `_M` in the default yet, it infers `list[ModelForm[Unknown]]`. assert_type(implicit.saved_forms, "list[ModelForm[Author]]") assert_type(explicit.saved_forms, "list[AuthorForm]") def test_inline_form_parameter_defaults_to_model_form( inline: BaseInlineFormSet[Book, Author], generic_inline: BaseGenericInlineFormSet[Book], ) -> None: assert_type(inline.saved_forms, "list[ModelForm[Book]]") assert_type(inline.save(), "list[Book]") assert_type(generic_inline.saved_forms, "list[ModelForm[Book]]") def test_model_choice_iterator(field: ModelChoiceField[Author], iterator: ModelChoiceIterator[Author]) -> None: """`ModelChoiceIterator` is generic over the model of its field.""" assert_type(field.iterator, "type[ModelChoiceIterator[Author]]") assert_type(iterator.field, "ModelChoiceField[Author]") assert_type(iterator.queryset, "models.QuerySet[Author]") typeddjango-django-stubs-fa03b48/tests/assert_type/forms/test_add_error.py000066400000000000000000000054721526064357400272610ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.core.exceptions import ValidationError from django.forms import BaseForm from django.utils.functional import lazystr form = BaseForm() assert_type(form.add_error(None, "error"), None) assert_type(form.add_error("field", "error"), None) assert_type(form.add_error(None, lazystr("error")), None) assert_type(form.add_error("field", lazystr("error")), None) assert_type(form.add_error(None, ValidationError("error")), None) assert_type(form.add_error("field", ValidationError("error")), None) assert_type(form.add_error(None, ["error"]), None) assert_type(form.add_error("field", ["error"]), None) assert_type(form.add_error(None, [lazystr("error")]), None) assert_type(form.add_error("field", [lazystr("error")]), None) assert_type(form.add_error(None, [ValidationError("error")]), None) assert_type(form.add_error("field", [ValidationError("error")]), None) assert_type(form.add_error(None, {"field": "error"}), None) assert_type(form.add_error(None, {"field": lazystr("error")}), None) assert_type(form.add_error(None, {"field": ValidationError("error")}), None) assert_type(form.add_error(None, {"field": ["error"]}), None) assert_type(form.add_error(None, {"field": [lazystr("error")]}), None) assert_type(form.add_error(None, {"field": [ValidationError("error")]}), None) assert_type(form.add_error(None, ValidationError(["error"])), None) assert_type(form.add_error("field", ValidationError(["error"])), None) assert_type(form.add_error(None, ValidationError({"field": "error"})), None) form.add_error("field", {"field": "error"}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] form.add_error("field", {"field": lazystr("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] form.add_error("field", {"field": ValidationError("error")}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] form.add_error("field", {"field": ["error"]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] form.add_error("field", {"field": [lazystr("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] form.add_error("field", {"field": [ValidationError("error")]}) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] typeddjango-django-stubs-fa03b48/tests/assert_type/forms/test_fields.py000066400000000000000000000040651526064357400265630ustar00rootroot00000000000000from __future__ import annotations import json from collections.abc import Collection from re import Match, Pattern from typing import Any, assert_type from django import forms from django.forms import DateField, JSONField from django.forms.fields import DateTimeFormatsIterator # 1. Test for BaseTemporalField (via DateField) def test_temporal_field_input_formats() -> None: field = DateField(input_formats=["%Y-%m-%d"]) # Verify that 'Collection' is correctly implemented assert_type(field.input_formats, Collection[str] | DateTimeFormatsIterator | None) # 2. "Real World" Example: Using it in a Django Form class MyForm(forms.Form): start_date = DateField(input_formats=["%Y-%m-%d"]) def test_form_field_type_access() -> None: form = MyForm() # Fetch the field explicitly from base_fields field = form.base_fields["start_date"] # Apply type narrowing to resolve Mypy errors if isinstance(field, DateField): assert_type(field.input_formats, Collection[str] | DateTimeFormatsIterator | None) # 3. "Real World" Example: Subclassing class CustomDateField(DateField): def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(input_formats=["%d/%m/%Y"], *args, **kwargs) def test_subclass_field_type() -> None: custom_field = CustomDateField() assert_type(custom_field.input_formats, Collection[str] | DateTimeFormatsIterator | None) # 4. Test for JSONField Encoder/Decoder class MyEncoder(json.JSONEncoder): pass class MyDecoder(json.JSONDecoder): pass def test_json_field_serialization_types() -> None: field = JSONField(encoder=MyEncoder, decoder=MyDecoder) assert_type(field.encoder, type[json.JSONEncoder] | None) assert_type(field.decoder, type[json.JSONDecoder] | None) def test_lazy_regex_pattern_methods_are_typed() -> None: field = forms.IntegerField() assert_type(field.re_decimal, Pattern[str]) assert_type(field.re_decimal.match("1.0"), Match[str] | None) assert_type(field.re_decimal.sub("", "1.000"), str) assert_type(field.re_decimal.pattern, str) typeddjango-django-stubs-fa03b48/tests/assert_type/forms/test_fields_choices.py000066400000000000000000000052751526064357400302640ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from django import forms from django.db import models from typing_extensions import TypeVar if TYPE_CHECKING: from collections.abc import Callable, Mapping, Sequence _T = TypeVar("_T") def to_named_seq(func: Callable[[], _T]) -> Callable[[], Sequence[tuple[str, _T]]]: def inner() -> Sequence[tuple[str, _T]]: return [("title", func())] return inner def to_named_mapping(func: Callable[[], _T]) -> Callable[[], Mapping[str, _T]]: def inner() -> Mapping[str, _T]: return {"title": func()} return inner def str_tuple() -> Sequence[tuple[str, str]]: return (("foo", "bar"), ("fuzz", "bazz")) def str_mapping() -> Mapping[str, str]: return {"foo": "bar", "fuzz": "bazz"} def int_tuple() -> Sequence[tuple[int, str]]: return ((1, "bar"), (2, "bazz")) def int_mapping() -> Mapping[int, str]: return {3: "bar", 4: "bazz"} class ExternalIntegerChoices(models.IntegerChoices): FIRST = 1 def choices_type() -> type[models.Choices]: return ExternalIntegerChoices # Invalid choices class BadForm(forms.Form): my_choice = forms.ChoiceField(choices="test") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] # Valid choices class TestForm(forms.Form): class TextChoices(models.TextChoices): FIRST = "foo", "bar" SECOND = "foo2", "bar" class IntegerChoices(models.IntegerChoices): FIRST = 1, "bar" SECOND = 2, "bar" char1 = forms.ChoiceField(choices=TextChoices) # ty: ignore[invalid-argument-type] char2 = forms.ChoiceField(choices=str_tuple) char3 = forms.ChoiceField(choices=str_mapping) char4 = forms.ChoiceField(choices=str_tuple()) char5 = forms.ChoiceField(choices=str_mapping()) char6 = forms.ChoiceField(choices=to_named_seq(str_tuple)) char7 = forms.ChoiceField(choices=to_named_mapping(str_mapping)) char8 = forms.ChoiceField(choices=to_named_seq(str_tuple)()) char9 = forms.ChoiceField(choices=to_named_mapping(str_mapping)()) int1 = forms.ChoiceField(choices=IntegerChoices) # ty: ignore[invalid-argument-type] int2 = forms.ChoiceField(choices=int_tuple) int3 = forms.ChoiceField(choices=int_mapping) int4 = forms.ChoiceField(choices=int_tuple()) int5 = forms.ChoiceField(choices=int_mapping()) int6 = forms.ChoiceField(choices=to_named_seq(int_tuple)) int7 = forms.ChoiceField(choices=to_named_seq(int_mapping)) int8 = forms.ChoiceField(choices=to_named_seq(int_tuple)()) int9 = forms.ChoiceField(choices=to_named_seq(int_mapping)()) int10 = forms.ChoiceField(choices=choices_type) typeddjango-django-stubs-fa03b48/tests/assert_type/forms/test_forms.py000066400000000000000000000021421526064357400264350ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, Any, assert_type from django.contrib.messages.views import SuccessMessageMixin from django.views.generic.edit import FormMixin if TYPE_CHECKING: from django.forms import Form def test_in_operator(form: Form, field: str) -> None: # Valid: str field name assert_type(field in form, bool) # Invalid: non-str types should error _ = 123 in form # type: ignore[operator] # pyright: ignore[reportOperatorIssue] # pyrefly: ignore[unsupported-operation] # ty: ignore[unsupported-operator] _ = None in form # type: ignore[operator] # pyright: ignore[reportOperatorIssue] # pyrefly: ignore[unsupported-operation] # ty: ignore[unsupported-operator] _ = b"field" in form # type: ignore[operator] # pyright: ignore[reportOperatorIssue] # pyrefly: ignore[unsupported-operation] # ty: ignore[unsupported-operator] # SuccessMessageMixin is compatible with FormMixin class FormFirstView(FormMixin[Any], SuccessMessageMixin[Any]): pass class SuccessMessageFirstView(SuccessMessageMixin[Any], FormMixin[Any]): pass typeddjango-django-stubs-fa03b48/tests/assert_type/forms/test_formsets.py000066400000000000000000000004501526064357400271510ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, assert_type if TYPE_CHECKING: from django.forms import Form from django.forms.formsets import BaseFormSet def test_in_operator(formset: BaseFormSet[Form], form: Form) -> None: assert_type(form in formset, bool) typeddjango-django-stubs-fa03b48/tests/assert_type/forms/test_widgets.py000066400000000000000000000007021526064357400267550ustar00rootroot00000000000000from __future__ import annotations from typing import Any, assert_type from django import forms from typing_extensions import override # User-defined widgets may return any value usable in a template from `format_value` class IntWidget(forms.Widget): @override def format_value(self, value: Any) -> int: return int(value) def test_format_value_override(widget: IntWidget) -> None: assert_type(widget.format_value("1"), int) typeddjango-django-stubs-fa03b48/tests/assert_type/http/000077500000000000000000000000001526064357400235305ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/http/test_redirect.py000066400000000000000000000006061526064357400267440ustar00rootroot00000000000000from __future__ import annotations from django.conf import settings from django.http import HttpResponseRedirect from django.urls import reverse, reverse_lazy reversed_url = reverse("url") lazy_url = reverse_lazy("namespace:url") HttpResponseRedirect(reversed_url) HttpResponseRedirect(lazy_url) HttpResponseRedirect(settings.LOGIN_URL) HttpResponseRedirect(settings.LOGIN_REDIRECT_URL) typeddjango-django-stubs-fa03b48/tests/assert_type/http/test_request.py000066400000000000000000000031211526064357400266260ustar00rootroot00000000000000from __future__ import annotations from collections.abc import Iterable, Iterator from typing import assert_type from django.http import QueryDict from django.http.request import _ImmutableQueryDict from django_stubs_ext import MutableHttpRequest q = QueryDict("", False) # Test constructor overloads -- Mutable assert_type(QueryDict("querystring", True), QueryDict) assert_type(QueryDict("querystring", mutable=True), QueryDict) # Test constructor overloads -- Immutable assert_type(QueryDict(), _ImmutableQueryDict) assert_type(QueryDict("querystring"), _ImmutableQueryDict) assert_type(QueryDict("querystring", False), _ImmutableQueryDict) assert_type(QueryDict("querystring", mutable=False), _ImmutableQueryDict) # Test ImmutableQueryDict q = QueryDict() assert_type(q["a"], str) assert_type(q.get("a"), str | None) assert_type(q.items(), Iterator[tuple[str, str | list[object]]]) assert_type(q.getlist("a"), list[str]) # ty: ignore[type-assertion-failure] assert_type(q.lists(), Iterable[tuple[str, list[str]]]) # Test MutableQueryDict mut_q = QueryDict(mutable=True) mut_q["a"] = "3" mut_q["a"] = ["1", "2"] # type: ignore[assignment] # pyright: ignore[reportArgumentType] # pyrefly: ignore[unsupported-operation] # ty: ignore[invalid-assignment] assert_type(mut_q.pop("a"), list[str]) assert_type(mut_q.pop("a", 12), list[str] | int) # ty: ignore[type-assertion-failure] assert_type(mut_q.popitem(), tuple[str, list[str]]) # Test MutableHttpRequest helper request = MutableHttpRequest() assert_type(request, MutableHttpRequest) request.GET["foo"] = "bar" request.POST.setdefault("foo", "bar") typeddjango-django-stubs-fa03b48/tests/assert_type/http/test_response.py000066400000000000000000000015761526064357400270100ustar00rootroot00000000000000from __future__ import annotations from collections.abc import AsyncIterable, AsyncIterator, Iterator from typing import assert_type from django.http.response import HttpResponse, StreamingHttpResponse # HttpResponse # ============ response = HttpResponse() # We can assign any objects, but get bytes back: response.content = "abc" assert_type(response.content, bytes) assert_type(response.text, str) # StreamingHttpResponse # ===================== streaming_response = StreamingHttpResponse() # We can assign any `Iterable`s ... streaming_response.streaming_content = [1, 2] streaming_response.streaming_content = iter(["a", "b"]) def async_iterable() -> AsyncIterable[int]: raise NotImplementedError streaming_response.streaming_content = async_iterable() # ... but get `Iterator` back: assert_type(streaming_response.streaming_content, Iterator[bytes] | AsyncIterator[bytes]) typeddjango-django-stubs-fa03b48/tests/assert_type/middleware/000077500000000000000000000000001526064357400246665ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/middleware/__init__.py000066400000000000000000000000001526064357400267650ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/middleware/test_middleware.py000066400000000000000000000063361526064357400304240ustar00rootroot00000000000000from __future__ import annotations from collections.abc import Awaitable from typing import TYPE_CHECKING, assert_type from django.contrib.auth.middleware import AuthenticationMiddleware, RemoteUserMiddleware from django.contrib.redirects.middleware import RedirectFallbackMiddleware from django.contrib.sessions.middleware import SessionMiddleware from django.http.response import ( FileResponse, HttpResponse, HttpResponseBase, HttpResponseGone, HttpResponsePermanentRedirect, HttpResponseRedirect, HttpResponseRedirectBase, ) from django.middleware.cache import CacheMiddleware from django.middleware.common import CommonMiddleware from django.middleware.locale import LocaleMiddleware from typing_extensions import override if TYPE_CHECKING: from django.http.request import HttpRequest class CustomCommonMiddleware(CommonMiddleware): response_redirect_class = HttpResponsePermanentRedirect class BrokenCustomCommonMiddleware(CommonMiddleware): response_redirect_class = FileResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment] class CustomLocaleMiddleware(LocaleMiddleware): response_redirect_class = HttpResponseRedirect class BrokenCustomLocaleMiddleware(CommonMiddleware): response_redirect_class = FileResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment] class CustomRedirectFallbackMiddleware(RedirectFallbackMiddleware): response_redirect_class = HttpResponseRedirect response_gone_class = HttpResponseGone class CustomRedirectFallbackMiddleware2(RedirectFallbackMiddleware): response_redirect_class = HttpResponseRedirectBase response_gone_class = HttpResponse class BrokenCustomRedirectFallbackMiddleware(RedirectFallbackMiddleware): response_redirect_class = HttpResponse # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment] response_gone_class = 12 # type:ignore[assignment] # pyright: ignore[reportAssignmentType] # pyrefly: ignore[bad-assignment] class ResponseGoneFallbackMiddleware(RedirectFallbackMiddleware): @override def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: return self.response_gone_class() def test_middleware_composition(request: HttpRequest) -> None: def sync_get_response(request: HttpRequest, /) -> HttpResponse: return HttpResponse() async def async_get_response(request: HttpRequest, /) -> HttpResponse: return HttpResponse() # Plain sync and async views are accepted. AuthenticationMiddleware(sync_get_response) AuthenticationMiddleware(async_get_response) # A middleware instance is accepted (regression test for #3537). composed = SessionMiddleware(AuthenticationMiddleware(sync_get_response)) assert_type(composed(request), HttpResponseBase | Awaitable[HttpResponseBase]) remote = RemoteUserMiddleware(SessionMiddleware(sync_get_response)) assert_type(remote(request), HttpResponseBase | Awaitable[HttpResponseBase]) cache = CacheMiddleware(AuthenticationMiddleware(sync_get_response)) assert_type(cache(request), HttpResponseBase | Awaitable[HttpResponseBase]) typeddjango-django-stubs-fa03b48/tests/assert_type/tasks/000077500000000000000000000000001526064357400236765ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/tasks/__init__.py000066400000000000000000000000001526064357400257750ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/tasks/test_tasks.py000066400000000000000000000021211526064357400264300ustar00rootroot00000000000000from __future__ import annotations from typing import Any, assert_type from django.tasks import task from django.tasks.base import Task, TaskContext, TaskResult @task def test_task(x: int) -> int: return x + 1 assert_type(test_task.call(1), int) @task(priority=5) def test_task_with_priority(x: int) -> int: return x + 1 assert_type(test_task_with_priority.call(1), int) @task(takes_context=True) def test_task_with_context(context: TaskContext[Any, Any], x: int, /) -> int: return x + 1 assert_type(test_task_with_context, Task[[int], int]) assert_type(test_task_with_context.enqueue(1), TaskResult[[int], int]) assert_type(test_task_with_context.call(1), int) @task(takes_context=True, priority=5) def test_task_with_context_and_priority(context: TaskContext[Any, Any], x: int, /) -> int: return x + 1 assert_type(test_task_with_context_and_priority, Task[[int], int]) assert_type(test_task_with_context_and_priority.enqueue(1), TaskResult[[int], int]) assert_type(test_task_with_context.get_backend().enqueue(test_task_with_context, [1], {}), TaskResult[[int], int]) typeddjango-django-stubs-fa03b48/tests/assert_type/template/000077500000000000000000000000001526064357400243645ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/template/__init__.py000066400000000000000000000000001526064357400264630ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/template/backends/000077500000000000000000000000001526064357400261365ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/template/backends/__init__.py000066400000000000000000000000001526064357400302350ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/template/backends/test_utils.py000066400000000000000000000007131526064357400307100ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.http import HttpRequest from django.template.backends.utils import csrf_input_lazy, csrf_token_lazy from django.utils.functional import _StrPromise from django.utils.safestring import SafeString request = HttpRequest() input_result = csrf_input_lazy(request) assert_type(input_result, SafeString) token_result = csrf_token_lazy(request) assert_type(token_result, _StrPromise) typeddjango-django-stubs-fa03b48/tests/assert_type/template/test_library.py000066400000000000000000000075621526064357400274530ustar00rootroot00000000000000from __future__ import annotations import datetime from typing import Any, assert_type from django import template from django.template.base import Parser, Token, TokenType from django.template.defaulttags import CycleNode register = template.Library() # register.filter (bare) @register.filter def lower(value: str) -> str: return value.lower() assert_type(lower("test"), str) # register.filter (named) @register.filter(name="tolower") def lower2(value: str) -> str: return value.lower() assert_type(lower2("test"), str) # register.filter with all flags @register.filter(name="plain", is_safe=True, needs_autoescape=False, expects_localtime=False) def plain_filter(value: str) -> str: return value assert_type(plain_filter("x"), str) # Negative: non-bool values for flag kwargs are rejected register.filter("bad_is_safe", is_safe="yes") # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] register.filter("bad_needs_autoescape", needs_autoescape="no") # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] register.filter("bad_expects_localtime", expects_localtime=None) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] # Negative: unknown kwargs are rejected register.filter("unknown_flag", safe=True) # type: ignore[call-overload] # pyright: ignore[reportCallIssue] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] # register.simple_tag (bare) @register.simple_tag def current_time(format_string: str) -> str: return datetime.datetime.now().strftime(format_string) assert_type(current_time("%H"), str) # register.simple_tag with takes_context @register.simple_tag(takes_context=True) def current_time_ctx(context: dict[str, Any], format_string: str) -> str: return "test" assert_type(current_time_ctx({}, "%H"), str) # register.simple_tag (named) @register.simple_tag(name="minustwo") def some_function(value: int) -> int: return value - 2 assert_type(some_function(5), int) # register.simple_tag via call def f(s: str) -> str: return s * 2 assert_type(register.simple_tag(f, name="double")("x"), str) # register.simple_block_tag assert_type(register.simple_block_tag(f, name="double")("x"), str) @register.simple_block_tag def block_tag_bare(format_string: str) -> str: return datetime.datetime.now().strftime(format_string) assert_type(block_tag_bare("%H"), str) @register.simple_block_tag(name="minustwo") def block_tag_named(value: int) -> int: return value - 2 assert_type(block_tag_named(5), int) # register.tag (bare) @register.tag def cycle(parser: Parser, token: Token) -> CycleNode: return CycleNode([]) assert_type(cycle(Parser([]), Token(token_type=TokenType.TEXT, contents="")), CycleNode) # register.tag (named) @register.tag(name="cycle") def cycle_impl(parser: Parser, token: Token) -> CycleNode: return CycleNode([]) assert_type(cycle_impl(Parser([]), Token(token_type=TokenType.TEXT, contents="")), CycleNode) # register.inclusion_tag @register.inclusion_tag("results.html") def format_results(results: list[str]) -> str: return ", ".join(results) assert_type(format_results(["a", "b"]), str) # register.inclusion_tag with takes_context @register.inclusion_tag("results.html", takes_context=True) def format_results_ctx(context: dict[str, Any], results: list[str]) -> str: return ", ".join(results) assert_type(format_results_ctx({}, ["a", "b"]), str) # register.inclusion_tag via call def format_results_func(results: list[str]) -> str: return ", ".join(results) assert_type(register.inclusion_tag("results.html", format_results_func)(["a"]), str) typeddjango-django-stubs-fa03b48/tests/assert_type/test/000077500000000000000000000000001526064357400235305ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/test/__init__.py000066400000000000000000000000001526064357400256270ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/test/client.py000066400000000000000000000012561526064357400253640ustar00rootroot00000000000000from __future__ import annotations from django.test import Client from django.urls import reverse, reverse_lazy url_reverse = reverse("some:namespace") url_lazy = reverse_lazy("some:namespace") url_str = "/abc/def" client = Client() client.get(url_reverse) client.get(url_lazy) client.get(url_str) client.post(url_reverse) client.post(url_lazy) client.post(url_str) client.patch(url_reverse) client.patch(url_lazy) client.patch(url_str) client.put(url_reverse) client.put(url_lazy) client.put(url_str) client.delete(url_reverse) client.delete(url_lazy) client.delete(url_str) client.generic("GET", url_reverse) client.generic("POST", url_lazy) client.generic("DELETE", url_str) typeddjango-django-stubs-fa03b48/tests/assert_type/test/test_client.py000066400000000000000000000031651526064357400264240ustar00rootroot00000000000000from __future__ import annotations from typing import Any, assert_type from django.core.handlers.asgi import ASGIRequest from django.core.handlers.wsgi import WSGIRequest from django.template.base import Template from django.test.client import AsyncClient, AsyncRequestFactory, Client, RequestFactory from django.test.utils import ContextList # Client response attributes client = Client() response = client.get("foo") assert_type(response.wsgi_request, WSGIRequest) assert_type(response.request, dict[str, Any]) assert_type(response.templates, list[Template]) assert_type(response.client, Client) assert_type(response.context, ContextList | dict[str, Any]) assert_type(response.context_data, dict[str, Any] | None) assert_type(response.content, bytes) assert_type(response.redirect_chain, list[tuple[str, int]]) assert_type(response.text, str) response.json() # Async client response attributes async def test_async_client() -> None: async_client = AsyncClient() response = await async_client.get("foo") assert_type(response.asgi_request, ASGIRequest) assert_type(response.request, dict[str, Any]) assert_type(response.templates, list[Template]) assert_type(response.client, AsyncClient) assert_type(response.context, ContextList | dict[str, Any]) assert_type(response.context_data, dict[str, Any] | None) assert_type(response.content, bytes) assert_type(response.redirect_chain, list[tuple[str, int]]) response.json() # Request factories factory = RequestFactory() assert_type(factory.get("foo"), WSGIRequest) async_factory = AsyncRequestFactory() assert_type(async_factory.get("foo"), ASGIRequest) typeddjango-django-stubs-fa03b48/tests/assert_type/test/test_testcase.py000066400000000000000000000026561526064357400267650ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.core.handlers.wsgi import WSGIRequest from django.test.client import Client from django.test.testcases import TestCase, _AssertTemplateNotUsedContext, _AssertTemplateUsedContext class ExampleTestCase(TestCase): def test_method(self) -> None: assert_type(self.client, Client) resp = self.client.post("/url", {"doit": "srs"}, "application/json", False, True, extra="value") assert_type(resp.status_code, int) resp.json() assert_type(resp.wsgi_request, WSGIRequest) def test_assert_template_used(self) -> None: response = self.client.get("/url") assert_type(self.assertTemplateUsed(response, "template.html"), None) with self.assertTemplateUsed("template.html") as ctx: assert_type(ctx, _AssertTemplateUsedContext) with self.assertTemplateUsed(template_name="template.html") as ctx: assert_type(ctx, _AssertTemplateUsedContext) def test_assert_template_not_used(self) -> None: response = self.client.get("/url") assert_type(self.assertTemplateNotUsed(response, "template.html"), None) with self.assertTemplateNotUsed("template.html") as ctx: assert_type(ctx, _AssertTemplateNotUsedContext) with self.assertTemplateNotUsed(template_name="template.html") as ctx: assert_type(ctx, _AssertTemplateNotUsedContext) typeddjango-django-stubs-fa03b48/tests/assert_type/test/test_utils.py000066400000000000000000000010231526064357400262750ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, assert_type from django.test import override_settings if TYPE_CHECKING: from django.test.utils import CaptureQueriesContext def test_in_operator(ctx: CaptureQueriesContext, query: dict[str, str]) -> None: assert_type(query in ctx, bool) def test_iteration(ctx: CaptureQueriesContext) -> None: for query in ctx: assert_type(query, dict[str, str]) @override_settings(FOO="bar") def test() -> None: pass assert_type(test(), None) typeddjango-django-stubs-fa03b48/tests/assert_type/test_shortcuts.py000066400000000000000000000016301526064357400262200ustar00rootroot00000000000000from __future__ import annotations from typing import Any, assert_type from django.http.request import HttpRequest from django.http.response import HttpResponse, HttpResponsePermanentRedirect, HttpResponseRedirect from django.shortcuts import redirect, render from typing_extensions import TypedDict # render function arguments TestContext = TypedDict("TestContext", {"user": Any}) test_context: TestContext = {"user": "test"} assert_type(render(HttpRequest(), "", test_context), HttpResponse) # redirect return annotation assert_type(redirect(to="", permanent=True), HttpResponsePermanentRedirect) assert_type(redirect(to="", permanent=False), HttpResponseRedirect) assert_type(redirect(to=""), HttpResponseRedirect) var: bool = True assert_type(redirect(to="", permanent=var), HttpResponseRedirect | HttpResponsePermanentRedirect) # pyright: ignore[reportAssertTypeFailure] # ty: ignore[type-assertion-failure] typeddjango-django-stubs-fa03b48/tests/assert_type/urls/000077500000000000000000000000001526064357400235365ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/urls/__init__.py000066400000000000000000000000001526064357400256350ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/urls/test_conf.py000066400000000000000000000052771526064357400261070ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, assert_type from django.conf.urls.i18n import urlpatterns as i18n_urlpatterns from django.conf.urls.static import static from django.contrib import admin from django.contrib.auth.views import LoginView from django.contrib.flatpages import urls as flatpages_urls from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.urls import URLPattern, URLResolver, _AnyURL, include, path, re_path from django.utils.translation import gettext_lazy as _ if TYPE_CHECKING: from django.http import HttpResponse # Test 'path' accepts mix of pattern and resolver object include1: tuple[list[_AnyURL], None, None] = ([], None, None) assert_type(path("test/", include1), URLResolver) # Test 'path' accepts pattern resolver union subset include2: tuple[list[URLPattern], None, None] = ([], None, None) assert_type(path("test/", include2), URLResolver) # Test 'path' assert_type(path("admin/", admin.site.urls), URLResolver) assert_type(path(_("admin/"), admin.site.urls, name="admin"), URLResolver) assert_type(path("login/", LoginView.as_view(), name="login1"), URLPattern) assert_type(path(_("login/"), LoginView.as_view(), name="login2"), URLPattern) def v1() -> HttpResponse: raise NotImplementedError async def v2() -> HttpResponse: raise NotImplementedError assert_type(path("v1/", v1), URLPattern) assert_type(path("v2/", v2), URLPattern) assert_type(re_path("^v1/", v1), URLPattern) assert_type(re_path("^v2/", v2), URLPattern) # Test 'include' patterns1: list[_AnyURL] = [] assert_type(re_path(_("^foo/"), include(patterns1)), URLResolver) assert_type(re_path("^foo/", include(patterns1, namespace="foo")), URLResolver) assert_type(re_path("^foo/", include((patterns1, "foo"), namespace="foo")), URLResolver) assert_type(re_path("^foo/", include(patterns1, "foo")), URLResolver) assert_type(path("flat/", include(flatpages_urls)), URLResolver) assert_type(path("flat/", include((flatpages_urls, "static"))), URLResolver) assert_type(path("i18n/", include(i18n_urlpatterns)), URLResolver) assert_type(path("i18n/", include((i18n_urlpatterns, "i18n"))), URLResolver) assert_type(path("admindocs/", include("django.contrib.admindocs.urls")), URLResolver) assert_type(path("admindocs/", include(("django.contrib.admindocs.urls", "i18n"))), URLResolver) assert_type(path("", include(staticfiles_urlpatterns(prefix="static/"))), URLResolver) # Test 'static' assert_type(static("/media/"), list[URLPattern]) assert_type(static("/media/", document_root="/tmp/media"), list[URLPattern]) def custom_serve(request: object, path: str) -> HttpResponse: raise NotImplementedError assert_type(static("/media/", view=custom_serve), list[URLPattern]) typeddjango-django-stubs-fa03b48/tests/assert_type/urls/test_converters.py000066400000000000000000000015611526064357400273440ustar00rootroot00000000000000from __future__ import annotations from django.urls import register_converter from django.urls.converters import IntConverter # Builtin converter register_converter(IntConverter, "bigint") # Custom converter class BigIntConverter: regex = r"[0-9]+" def to_python(self, value: str) -> int: return int(value) def to_url(self, value: int) -> str: return str(value) register_converter(BigIntConverter, "bigint") # Incorrect types: to_python must accept str, to_url must return str class BadConverter: regex = r"[0-9]+" def to_python(self, value: int) -> str: return str(value) def to_url(self, value: str) -> int: return int(value) register_converter(BadConverter, "bigint") # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] typeddjango-django-stubs-fa03b48/tests/assert_type/urls/test_resolvers.py000066400000000000000000000006221526064357400271730ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING if TYPE_CHECKING: from django.urls.resolvers import ResolverMatch def f(x: ResolverMatch) -> None: _func, _args, _kwargs = x # does not error # would be nice but we can't really get this without tuple specialization # as `__getitem__` is implemented as `return (..., ...)[...]` # assert_type(_func, Callable) typeddjango-django-stubs-fa03b48/tests/assert_type/utils/000077500000000000000000000000001526064357400237115ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/utils/__init__.py000066400000000000000000000000001526064357400260100ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_connection.py000066400000000000000000000004171526064357400274630ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, assert_type if TYPE_CHECKING: from django.db.utils import ConnectionHandler def test_in_operator(connections: ConnectionHandler, alias: str) -> None: assert_type(alias in connections, bool) typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_datastructures.py000066400000000000000000000034321526064357400304010ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.utils.datastructures import MultiValueDict # Constructors var1: MultiValueDict[str, str] = MultiValueDict() d2: dict[str, list[str | int]] = {"foo": ["Foo"], "bar": [2, 3]} var2 = MultiValueDict(d2) d3: tuple[tuple[str, list[str | int]], ...] = (("foo", ["Foo"]), ("bar", [2, 3])) var3: MultiValueDict[str, str | int] = MultiValueDict(d3) assert_type(var1, MultiValueDict[str, str]) assert_type(var2, MultiValueDict[str, str | int]) assert_type(var3, MultiValueDict[str, str | int]) # __getitem__, get, getlist d = MultiValueDict({"foo": ["Foo"]}) d.setlist("bar", []) assert_type(d["foo"], str | list[object]) assert_type(d["bar"], str | list[object]) assert_type(d.get("bar"), str | None) assert_type(d.get("bar", 1), str | int) # ty: ignore[type-assertion-failure] assert_type(d.getlist("bar"), list[str]) # ty: ignore[type-assertion-failure] assert_type(d.getlist("bar", [1]), list[str] | list[int]) assert_type(d.getlist("baz", True), list[str] | bool) # ty: ignore[type-assertion-failure] # setters assert_type(d.setlistdefault("baz"), list[str]) d.setlistdefault("baz", [1]) # type: ignore[list-item] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] assert_type(d.setlistdefault("baz", []), list[str]) d.appendlist("baz", "Baz") d.appendlist("baz", 1) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] # iterators assert_type(list(d.items()), list[tuple[str, str | list[object]]]) assert_type(list(d.keys()), list[str]) assert_type(list(d.values()), list[str | list[object]]) assert_type(d.dict(), dict[str, str | list[object]]) # ty: ignore[type-assertion-failure] typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_decorators.py000066400000000000000000000027571526064357400275020ustar00rootroot00000000000000from __future__ import annotations from collections.abc import Callable from typing import TYPE_CHECKING, Any, assert_type from django.contrib.auth.decorators import login_required from django.http.response import HttpResponseBase from django.middleware.cache import CacheMiddleware from django.utils.decorators import ( classonlymethod, decorator_from_middleware, decorator_from_middleware_with_args, method_decorator, ) from django.views.generic.base import View from typing_extensions import override if TYPE_CHECKING: from django.http.request import HttpRequest decorator = decorator_from_middleware(CacheMiddleware) assert_type( decorator, Callable[[Callable[..., HttpResponseBase]], Callable[..., HttpResponseBase]], ) factory = decorator_from_middleware_with_args(CacheMiddleware) assert_type( factory, Callable[..., Callable[[Callable[..., HttpResponseBase]], Callable[..., HttpResponseBase]]], ) # classonlymethod class Bananaman: @classonlymethod def count_bananas(cls) -> int: return 12 assert_type(Bananaman.count_bananas(), int) # method_decorator on class @method_decorator(login_required, name="dispatch") class DecoratedView(View): ... assert_type(DecoratedView(), DecoratedView) # method_decorator on function class TestView(View): @method_decorator(login_required) @override def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: return super().dispatch(request, *args, **kwargs) typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_deprecation.py000066400000000000000000000007311526064357400276200ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING from django.utils.deprecation import MiddlewareMixin from typing_extensions import override if TYPE_CHECKING: from collections.abc import Awaitable from django.http import HttpRequest, HttpResponseBase class MyMiddleware(MiddlewareMixin): @override def __call__(self, request: HttpRequest) -> HttpResponseBase | Awaitable[HttpResponseBase]: return self.get_response(request) typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_encoding.py000066400000000000000000000040411526064357400271070ustar00rootroot00000000000000from __future__ import annotations import datetime as dt from typing import Any, assert_type from django.utils.encoding import force_bytes, force_str, smart_bytes, smart_str not_literal_int: int = 123 def test_any_input() -> None: x: Any = None assert_type(force_bytes(x), bytes) assert_type(force_str(x), str) assert_type(smart_bytes(x), bytes) assert_type(smart_str(x), str) class S(str): pass def test_force_bytes() -> None: assert_type(force_bytes(123), bytes) assert_type(force_bytes(not_literal_int, strings_only=True), int) def test_force_str() -> None: assert_type(force_str(123), str) assert_type(force_str(not_literal_int, strings_only=True), int) assert_type(force_str(dt.time(9, 50), strings_only=True), dt.time) assert_type(force_str(dt.date(2026, 5, 31), strings_only=True), dt.date) assert_type(force_str(dt.datetime.now(dt.UTC), strings_only=True), dt.datetime) assert_type(force_str("foo"), str) assert_type(force_str("foo", strings_only=True), str) # ty: ignore[type-assertion-failure] assert_type(force_str(S("foo"), strings_only=True), S) def test_smart_bytes() -> None: assert_type(smart_bytes(123), bytes) assert_type(smart_bytes(not_literal_int, strings_only=True), int) assert_type(smart_bytes(dt.time(9, 50), strings_only=True), dt.time) assert_type(smart_bytes(dt.date(2026, 5, 31), strings_only=True), dt.date) assert_type(smart_bytes(dt.datetime.now(dt.UTC), strings_only=True), dt.datetime) def test_smart_str() -> None: assert_type(smart_str(123), str) assert_type(smart_str(not_literal_int, strings_only=True), int) assert_type(smart_str(dt.time(9, 50), strings_only=True), dt.time) assert_type(smart_str(dt.date(2026, 5, 31), strings_only=True), dt.date) assert_type(smart_str(dt.datetime.now(dt.UTC), strings_only=True), dt.datetime) assert_type(smart_str("foo"), str) assert_type(smart_str("foo", strings_only=True), str) # ty: ignore[type-assertion-failure] assert_type(smart_str(S("foo"), strings_only=True), S) typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_functional.py000066400000000000000000000060401526064357400274640ustar00rootroot00000000000000from __future__ import annotations import copy from typing import TYPE_CHECKING, Any, ClassVar, assert_type from django.contrib.auth.models import User from django.utils.functional import Promise, SimpleLazyObject, cached_property, classproperty, lazystr from typing_extensions import override if TYPE_CHECKING: from django_stubs_ext import StrOrPromise # cached_property: class vs instance attributes class Foo: @cached_property def attr(self) -> list[str]: raise NotImplementedError @cached_property # type: ignore[misc] # pyright: ignore[reportArgumentType] # ty: ignore[invalid-argument-type] def attr2(self, arg2: str) -> list[str]: raise NotImplementedError f = Foo() assert_type(f.attr, list[str]) f.attr.func # type: ignore[attr-defined] # pyright: ignore[reportAttributeAccessIssue,reportUnknownMemberType] # pyrefly: ignore[missing-attribute] # ty: ignore[unresolved-attribute] # May be overridden by @property class Bar(Foo): @property @override def attr(self) -> list[str]: # pyright: ignore[reportIncompatibleVariableOverride] raise NotImplementedError # May be overridden by ClassVar class Quux(Foo): attr: ClassVar[list[str]] = [] # pyright: ignore[reportIncompatibleVariableOverride] # pyrefly: ignore[bad-override] # ClassVar may not be overridden by cached_property class Baz(Quux): @cached_property @override def attr(self) -> list[str]: # type: ignore[override] # pyright: ignore[reportIncompatibleVariableOverride] # pyrefly: ignore[bad-override] # ty: ignore[invalid-attribute-override] raise NotImplementedError # str promise proxy s = lazystr("asd") assert_type(s.format("asd"), str) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] assert_type(s.capitalize(), str) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] assert_type(s + "bar", str) assert_type("foo" + s, str) assert_type(s % "asd", str) s.nonsense # type: ignore[attr-defined] def test_str_or_promise(f2: StrOrPromise) -> None: assert_type(f2.format("asd"), str) # pyright: ignore[reportAssertTypeFailure] # pyrefly: ignore[assert-type] # ty: ignore[type-assertion-failure] assert_type(f2 + "asd", str) assert_type("asd" + f2, str) def foo(content: str) -> None: raise NotImplementedError def bar(content: Promise) -> None: raise NotImplementedError foo(s) # type: ignore[arg-type] # pyright: ignore[reportArgumentType] # pyrefly: ignore[bad-argument-type] # ty: ignore[invalid-argument-type] bar(s) lazy_user: SimpleLazyObject[User] = SimpleLazyObject(User) assert_type(lazy_user, SimpleLazyObject[User]) assert_type(copy.copy(lazy_user), SimpleLazyObject[User]) assert_type(copy.deepcopy(lazy_user), SimpleLazyObject[User]) class Bam: @classproperty def attr(cls: Any) -> str: raise NotImplementedError assert_type(Bam.attr, str) class Sub(Bam): def method(self) -> None: assert_type(self.attr, str) typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_safestring.py000066400000000000000000000012261526064357400274700ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.utils.safestring import SafeString, mark_safe from django.utils.translation import gettext_lazy s = "hello" assert_type(mark_safe(s), SafeString) assert_type(mark_safe(s) + mark_safe(s), SafeString) assert_type(s + mark_safe(s), str) s += mark_safe(s) assert_type(s, str) ms = mark_safe(s) ms += mark_safe(s) assert_type(ms, SafeString) # mark_safe accepts lazy strings lazy_s = gettext_lazy("hello") assert_type(mark_safe(lazy_s), SafeString) # mark_safe as decorator preserves function type @mark_safe def func(s: str) -> str: return s assert_type(func("test"), str) typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_text.py000066400000000000000000000011151526064357400263040ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.utils.functional import _StrPromise from django.utils.text import format_lazy from django.utils.translation import gettext_lazy result = format_lazy("{}", "test") assert_type(result, _StrPromise) result_lazy_fmt = format_lazy(gettext_lazy("Hello {}"), "world") assert_type(result_lazy_fmt, _StrPromise) result_multi = format_lazy("{} {} {}", "a", "b", "c") assert_type(result_multi, _StrPromise) result_kwargs = format_lazy("{name}: {value}", name="key", value=42) assert_type(result_kwargs, _StrPromise) typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_timezone.py000066400000000000000000000013771526064357400271640ustar00rootroot00000000000000from __future__ import annotations from datetime import date, datetime, time from typing import Literal, assert_type from django.utils.timezone import is_aware, is_naive # is_naive is_naive(date(2020, 1, 1)) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] assert_type(is_naive(datetime(2020, 1, 1)), bool) assert_type(is_naive(time()), Literal[True]) # is_aware is_aware(date(2020, 1, 1)) # type: ignore[call-overload] # pyright: ignore[reportCallIssue,reportArgumentType] # pyrefly: ignore[no-matching-overload] # ty: ignore[no-matching-overload] assert_type(is_aware(datetime(2020, 1, 1)), bool) assert_type(is_aware(time()), Literal[False]) typeddjango-django-stubs-fa03b48/tests/assert_type/utils/test_translation.py000066400000000000000000000015001526064357400276540ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.utils.functional import _StrPromise from django.utils.translation import ngettext, ngettext_lazy, npgettext, npgettext_lazy # ngettext / npgettext accept float assert_type(ngettext("apple", "apples", 1.0), str) assert_type(npgettext("fruit", "apple", "apples", 1.0), str) # lazy variants also accept str and None (deferred number resolution) assert_type(ngettext_lazy("apple", "apples", 1), _StrPromise) assert_type(ngettext_lazy("apple", "apples", "count"), _StrPromise) assert_type(ngettext_lazy("apple", "apples"), _StrPromise) assert_type(npgettext_lazy("fruit", "apple", "apples", 1), _StrPromise) assert_type(npgettext_lazy("fruit", "apple", "apples", "count"), _StrPromise) assert_type(npgettext_lazy("fruit", "apple", "apples"), _StrPromise) typeddjango-django-stubs-fa03b48/tests/assert_type/views/000077500000000000000000000000001526064357400237065ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/views/__init__.py000066400000000000000000000000001526064357400260050ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/assert_type/views/test_base.py000066400000000000000000000052001526064357400262260ustar00rootroot00000000000000from __future__ import annotations from typing import Any, assert_type from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin, UserPassesTestMixin from django.http import HttpRequest, HttpResponse, HttpResponseBase, JsonResponse from django.shortcuts import redirect from django.template.response import TemplateResponse from django.test import RequestFactory from django.views.generic import TemplateView from typing_extensions import override request = RequestFactory().get("/") class BareTemplateView(TemplateView): template_name = "template.html" class NarrowedTemplateView(TemplateView[TemplateResponse]): template_name = "template.html" def bare_is_permissive(view: BareTemplateView) -> None: assert_type(BareTemplateView.as_view()(request), HttpResponse) assert_type(view.get(request), HttpResponse) assert_type(view.render_to_response({}), HttpResponse) def parametrising_narrows_the_response(view: NarrowedTemplateView) -> None: response = NarrowedTemplateView.as_view()(request) assert_type(response, TemplateResponse) assert_type(response.rendered_content, str) assert_type(view.get(request), TemplateResponse) assert_type(view.render_to_response({}), TemplateResponse) def dispatch_is_never_narrowed(view: NarrowedTemplateView) -> None: assert_type(view.dispatch(request), HttpResponseBase) assert_type(view.http_method_not_allowed(request), HttpResponse) assert_type(view.options(request), HttpResponseBase) class LoginRequired(LoginRequiredMixin, TemplateView): template_name = "template.html" class PermissionRequired(PermissionRequiredMixin, NarrowedTemplateView): template_name = "template.html" permission_required = "app.some_permission" class UserPassesTest(UserPassesTestMixin, TemplateView): template_name = "template.html" @override def test_func(self) -> bool: return True class RedirectingGet(TemplateView): template_name = "template.html" @override def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: if request.user.is_anonymous: return redirect("/login/") return super().get(request, *args, **kwargs) class UnionGet(TemplateView): template_name = "template.html" @override def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse | JsonResponse: return JsonResponse({}) class WideningDispatch(TemplateView): template_name = "template.html" @override def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase: return super().dispatch(request, *args, **kwargs) typeddjango-django-stubs-fa03b48/tests/assert_type/views/test_decorators.py000066400000000000000000000014611526064357400274660ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django.http import HttpRequest, HttpResponse from django.views.decorators.csp import csp_override, csp_report_only_override @csp_override( { "default-src": ["'self'"], "script-src": ["'self'", "'unsafe-inline'"], "report-uri": "/path/to/reports-endpoint/", } ) def my_view(request: HttpRequest) -> HttpResponse: raise NotImplementedError @csp_report_only_override( { "default-src": ["'self'"], "script-src": ["'self'", "'unsafe-inline'"], "report-uri": "/path/to/reports-endpoint/", } ) def my_view2(request: HttpRequest) -> HttpResponse: raise NotImplementedError assert_type(my_view(HttpRequest()), HttpResponse) assert_type(my_view2(HttpRequest()), HttpResponse) typeddjango-django-stubs-fa03b48/tests/assert_type/views/test_function_based_views.py000066400000000000000000000112711526064357400315210ustar00rootroot00000000000000from __future__ import annotations from collections.abc import AsyncIterator, Iterator from typing import TYPE_CHECKING, assert_type from django.http.response import HttpResponse, StreamingHttpResponse from django.utils.translation import gettext_lazy as _ if TYPE_CHECKING: from django.http.request import HttpRequest # HttpResponse with various content types def empty_response(request: HttpRequest) -> HttpResponse: return HttpResponse() def str_response(request: HttpRequest) -> HttpResponse: return HttpResponse("It works!") def bytes_response(request: HttpRequest) -> HttpResponse: return HttpResponse(b"It works!") def object_response(request: HttpRequest) -> HttpResponse: return HttpResponse(_("It works!")) # HttpResponse.content is always bytes response = HttpResponse() assert_type(response.content, bytes) response.content = "It works!" assert_type(response.content, bytes) response.content = b"It works!" assert_type(response.content, bytes) response.content = _("It works!") assert_type(response.content, bytes) assert_type(response.text, str) # StreamingHttpResponse with various content types def empty_streaming(request: HttpRequest) -> StreamingHttpResponse: return StreamingHttpResponse() def str_streaming(request: HttpRequest) -> StreamingHttpResponse: return StreamingHttpResponse(["It works!"]) def bytes_streaming(request: HttpRequest) -> StreamingHttpResponse: return StreamingHttpResponse([b"It works!"]) def object_streaming(request: HttpRequest) -> StreamingHttpResponse: return StreamingHttpResponse([_("It works!")]) def mixed_streaming(request: HttpRequest) -> StreamingHttpResponse: return StreamingHttpResponse([_("Yes"), "/", _("No")]) # StreamingHttpResponse.streaming_content after various assignments streaming_response = StreamingHttpResponse() assert_type(streaming_response.streaming_content, Iterator[bytes] | AsyncIterator[bytes]) streaming_response.streaming_content = ["It works!"] assert_type(streaming_response.streaming_content, Iterator[bytes] | AsyncIterator[bytes]) streaming_response.streaming_content = [b"It works!"] assert_type(streaming_response.streaming_content, Iterator[bytes] | AsyncIterator[bytes]) streaming_response.streaming_content = [_("It works!")] assert_type(streaming_response.streaming_content, Iterator[bytes] | AsyncIterator[bytes]) streaming_response.streaming_content = [_("Yes"), "/", _("No")] assert_type(streaming_response.streaming_content, Iterator[bytes] | AsyncIterator[bytes]) # Async streaming constructors def async_str_response(request: HttpRequest) -> StreamingHttpResponse: async def str_iterator() -> AsyncIterator[str]: yield "It works!" return StreamingHttpResponse(str_iterator()) def async_bytes_response(request: HttpRequest) -> StreamingHttpResponse: async def bytes_iterator() -> AsyncIterator[bytes]: yield b"It works!" return StreamingHttpResponse(bytes_iterator()) def async_object_response(request: HttpRequest) -> StreamingHttpResponse: async def object_iterator() -> AsyncIterator[object]: yield _("It works!") return StreamingHttpResponse(object_iterator()) def async_mixed_response(request: HttpRequest) -> StreamingHttpResponse: async def mixed_iterator() -> AsyncIterator[object]: yield _("Yes") yield "/" yield _("No") return StreamingHttpResponse(mixed_iterator()) # Async streaming_content assignment def async_streaming_content_str() -> None: response = StreamingHttpResponse() async def str_iterator() -> AsyncIterator[str]: yield "It works!" response.streaming_content = str_iterator() assert_type(response.streaming_content, Iterator[bytes] | AsyncIterator[bytes]) def async_streaming_content_bytes() -> None: response = StreamingHttpResponse() async def bytes_iterator() -> AsyncIterator[bytes]: yield b"It works!" response.streaming_content = bytes_iterator() assert_type(response.streaming_content, Iterator[bytes] | AsyncIterator[bytes]) # type: ignore[assert-type] # mypy narrows to AsyncIterator[bytes] def async_streaming_content_object() -> None: response = StreamingHttpResponse() async def object_iterator() -> AsyncIterator[object]: yield _("It works!") response.streaming_content = object_iterator() assert_type(response.streaming_content, Iterator[bytes] | AsyncIterator[bytes]) def async_streaming_content_mixed() -> None: response = StreamingHttpResponse() async def mixed_iterator() -> AsyncIterator[object]: yield _("Yes") yield "/" yield _("No") response.streaming_content = mixed_iterator() assert_type(response.streaming_content, Iterator[bytes] | AsyncIterator[bytes]) typeddjango-django-stubs-fa03b48/tests/assert_type/views/test_generic.py000066400000000000000000000046231526064357400267400ustar00rootroot00000000000000from __future__ import annotations from typing import assert_type from django import forms from django.db import models from django.db.models import F from django.db.models.functions import Upper from django.views.generic.detail import SingleObjectMixin from django.views.generic.edit import CreateView, DeleteView, UpdateView from django.views.generic.list import ListView class MyModel(models.Model): ... class MyDetailView(SingleObjectMixin[MyModel]): ... detail_view = MyDetailView() assert_type(detail_view.model, type[MyModel]) assert_type(detail_view.queryset, models.QuerySet[MyModel, MyModel] | None) assert_type(detail_view.get_context_object_name(MyModel()), str) assert_type(detail_view.get_context_object_name(1), str | None) class MyListView(ListView[MyModel]): ... list_view = MyListView() assert_type(list_view.model, type[MyModel] | None) assert_type(list_view.queryset, models.QuerySet[MyModel, MyModel] | None) assert_type(list_view.get_context_object_name(models.QuerySet[MyModel]()), str) assert_type(list_view.get_context_object_name(MyModel()), str | None) assert_type(list_view.get_context_object_name(1), str | None) class ConfirmForm(forms.Form): ... class MyDeleteView(DeleteView[MyModel, ConfirmForm]): ... delete_view = MyDeleteView() assert_type(delete_view.get_form_class(), type[ConfirmForm]) assert_type(delete_view.get_form(), ConfirmForm) # When no form type parameter is given, the form types default to what Django provides at runtime. class SimpleCreateView(CreateView[MyModel]): model = MyModel fields = "__all__" simple_create_view = SimpleCreateView() assert_type(simple_create_view.get_form_class(), type[forms.ModelForm[MyModel]]) assert_type(simple_create_view.get_form(), forms.ModelForm[MyModel]) class SimpleUpdateView(UpdateView[MyModel]): model = MyModel fields = "__all__" simple_update_view = SimpleUpdateView() assert_type(simple_update_view.get_form_class(), type[forms.ModelForm[MyModel]]) assert_type(simple_update_view.get_form(), forms.ModelForm[MyModel]) class SimpleDeleteView(DeleteView[MyModel]): model = MyModel simple_delete_view = SimpleDeleteView() assert_type(simple_delete_view.get_form_class(), type[forms.Form]) assert_type(simple_delete_view.get_form(), forms.Form) class MyOrderedListView(ListView[MyModel]): ordering = [Upper("id")] class MyMixedOrderingListView(ListView[MyModel]): ordering = ["-id", F("id").asc()] typeddjango-django-stubs-fa03b48/tests/test_error_handling.py000066400000000000000000000230621526064357400246200ustar00rootroot00000000000000from __future__ import annotations import os import tempfile import uuid from contextlib import contextmanager from typing import TYPE_CHECKING, Any from unittest import mock import pytest from mypy_django_plugin.config import DjangoPluginConfig if TYPE_CHECKING: from collections.abc import Generator TEMPLATE = """ (config) ... [mypy.plugins.django-stubs] django_settings_module = str (default: `os.getenv("DJANGO_SETTINGS_MODULE")`) strict_settings = bool (default: true) strict_model_abstract_attrs = bool (default: true) ... (django-stubs) mypy: error: {} """ TEMPLATE_TOML = """ (config) ... [tool.django-stubs] django_settings_module = str (default: `os.getenv("DJANGO_SETTINGS_MODULE")`) strict_settings = bool (default: true) strict_model_abstract_attrs = bool (default: true) ... (django-stubs) mypy: error: {} """ @contextmanager def write_to_file(file_contents: str, suffix: str | None = None) -> Generator[str, None, None]: with tempfile.NamedTemporaryFile(mode="w+", suffix=suffix) as config_file: config_file.write(file_contents) config_file.seek(0) yield config_file.name @pytest.mark.parametrize( ("config_file_contents", "message_part"), [ pytest.param( ["[not-really-django-stubs]"], "no section [mypy.plugins.django-stubs] found", id="missing-section", ), pytest.param( ["[mypy.plugins.django-stubs]", "\tnot_django_not_settings_module = badbadmodule"], ( "missing required 'django_settings_module' config.\n" "Either specify this config or set your `DJANGO_SETTINGS_MODULE` env var" ), id="missing-settings-module", ), pytest.param( ["[mypy.plugins.django-stubs]"], ( "missing required 'django_settings_module' config.\n" "Either specify this config or set your `DJANGO_SETTINGS_MODULE` env var" ), id="no-settings-given", ), pytest.param( ["[mypy.plugins.django-stubs]", "django_settings_module = some.module", "strict_settings = bad"], "invalid 'strict_settings': the setting must be a boolean", id="invalid-strict_settings", ), pytest.param( [ "[mypy.plugins.django-stubs]", "django_settings_module = some.module", "strict_model_abstract_attrs = bad", ], "invalid 'strict_model_abstract_attrs': the setting must be a boolean", id="invalid-strict_model_abstract_attrs", ), ], ) def test_misconfiguration_handling(capsys: Any, config_file_contents: list[str], message_part: str) -> None: """Invalid configuration raises `SystemExit` with a precise error message.""" contents = "\n".join(config_file_contents).expandtabs(4) with write_to_file(contents) as filename: with pytest.raises(SystemExit, match="2"): DjangoPluginConfig(filename) error_message = "usage: " + TEMPLATE.format(message_part) assert error_message == capsys.readouterr().err @pytest.mark.parametrize( "filename", [ pytest.param(uuid.uuid4().hex, id="not matching an existing file"), pytest.param("", id="as empty string"), pytest.param(None, id="as none"), ], ) def test_handles_filename(capsys: Any, filename: str) -> None: with pytest.raises(SystemExit, match="2"): DjangoPluginConfig(filename) error_message = "usage: " + TEMPLATE.format("mypy config file is not specified or found") assert error_message == capsys.readouterr().err @pytest.mark.parametrize( ("config_file_contents", "message_part"), [ pytest.param( """ [tool.django-stubs] django_settings_module = 123 """, "invalid 'django_settings_module': the setting must be a string", id="django_settings_module not string", ), pytest.param( """ [tool.not-really-django-stubs] django_settings_module = "my.module" """, "no section [tool.django-stubs] found", id="missing django-stubs section", ), pytest.param( """ [tool.django-stubs] not_django_not_settings_module = "badbadmodule" """, ( "missing required 'django_settings_module' config.\n" "Either specify this config or set your `DJANGO_SETTINGS_MODULE` env var" ), id="missing django_settings_module", ), pytest.param( "tool.django-stubs]", "could not load configuration file", id="invalid toml", ), pytest.param( """ [tool.django-stubs] django_settings_module = "some.module" strict_settings = "a" """, "invalid 'strict_settings': the setting must be a boolean", id="invalid strict_settings type", ), pytest.param( """ [tool.django-stubs] django_settings_module = "some.module" strict_model_abstract_attrs = "a" """, "invalid 'strict_model_abstract_attrs': the setting must be a boolean", id="invalid strict_model_abstract_attrs type", ), ], ) def test_toml_misconfiguration_handling(capsys: Any, config_file_contents: str, message_part: str) -> None: with write_to_file(config_file_contents, suffix=".toml") as filename: with pytest.raises(SystemExit, match="2"): DjangoPluginConfig(filename) error_message = "usage: " + TEMPLATE_TOML.format(message_part) assert error_message == capsys.readouterr().err @pytest.mark.parametrize("boolean_value", ["true", "false"]) def test_correct_toml_configuration(boolean_value: str) -> None: config_file_contents = f""" [tool.django-stubs] some_other_setting = "setting" django_settings_module = "my.module" strict_settings = {boolean_value} """ with write_to_file(config_file_contents, suffix=".toml") as filename: config = DjangoPluginConfig(filename) assert config.django_settings_module == "my.module" assert config.strict_settings is (boolean_value == "true") @pytest.mark.parametrize("boolean_value", ["true", "True", "false", "False"]) def test_correct_configuration(boolean_value: str) -> None: """Django settings module gets extracted given valid configuration.""" config_file_contents = "\n".join( [ "[mypy.plugins.django-stubs]", "some_other_setting = setting", "django_settings_module = my.module", f"strict_settings = {boolean_value}", ] ) with write_to_file(config_file_contents) as filename: config = DjangoPluginConfig(filename) assert config.django_settings_module == "my.module" assert config.strict_settings is (boolean_value.lower() == "true") @pytest.mark.parametrize("boolean_value", ["true", "false"]) def test_correct_toml_configuration_with_django_setting_from_env(boolean_value: str) -> None: config_file_contents = f""" [tool.django-stubs] some_other_setting = "setting" strict_settings = {boolean_value} """ django_settings_env_value = "my.module" with write_to_file(config_file_contents, suffix=".toml") as filename: with mock.patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": django_settings_env_value}): config = DjangoPluginConfig(filename) assert config.django_settings_module == django_settings_env_value assert config.strict_settings is (boolean_value == "true") @pytest.mark.parametrize("boolean_value", ["true", "True", "false", "False"]) def test_correct_configuration_with_django_setting_from_env(boolean_value: str) -> None: """Django settings module gets extracted given valid configuration.""" config_file_contents = "\n".join( [ "[mypy.plugins.django-stubs]", "some_other_setting = setting", f"strict_settings = {boolean_value}", ] ) django_settings_env_value = "my.module" with write_to_file(config_file_contents) as filename: with mock.patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": django_settings_env_value}): config = DjangoPluginConfig(filename) assert config.django_settings_module == django_settings_env_value assert config.strict_settings is (boolean_value.lower() == "true") def test_toml_missing_section_with_env_var() -> None: """Missing [tool.django-stubs] section works when DJANGO_SETTINGS_MODULE is set.""" config_file_contents = """ [tool.mypy] plugins = ["mypy_django_plugin.main"] """ with write_to_file(config_file_contents, suffix=".toml") as filename: with mock.patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": "my.module"}): config = DjangoPluginConfig(filename) assert config.django_settings_module == "my.module" assert config.strict_settings is True def test_ini_missing_section_with_env_var() -> None: """Missing [mypy.plugins.django-stubs] section works when DJANGO_SETTINGS_MODULE is set.""" config_file_contents = "\n".join( [ "[mypy]", "plugins = mypy_django_plugin.main", ] ) with write_to_file(config_file_contents) as filename: with mock.patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": "my.module"}): config = DjangoPluginConfig(filename) assert config.django_settings_module == "my.module" assert config.strict_settings is True typeddjango-django-stubs-fa03b48/tests/test_generic_consistency.py000066400000000000000000000077431526064357400256700ustar00rootroot00000000000000from __future__ import annotations import ast import glob import importlib import os from pathlib import Path from typing import Any, final from unittest import mock import django from typing_extensions import override # The root directory of the django-stubs package STUBS_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "django-stubs")) @final class GenericInheritanceVisitor(ast.NodeVisitor): """AST visitor collecting type variables and classes with parameterized bases in the stubs.""" def __init__(self) -> None: self.module = "" # Type variables are collected from `X = TypeVar(...)` assignments. `AnyStr` is declared # in `typing` itself, not in the stubs, so it must be seeded manually. self.type_vars: set[str] = {"AnyStr"} # (module, class_name) -> {names parameterizing its bases}. # A class is generic if one of those names is a type variable self.candidate_classes: dict[tuple[str, str], set[str]] = {} @override def visit_Assign(self, node: ast.Assign) -> None: func = node.value.func if isinstance(node.value, ast.Call) else None if isinstance(func, ast.Name) and func.id in {"TypeVar", "ParamSpec", "TypeVarTuple"}: self.type_vars.update(target.id for target in node.targets if isinstance(target, ast.Name)) @override def visit_ClassDef(self, node: ast.ClassDef) -> None: for base in node.bases: if isinstance(base, ast.Subscript): self.candidate_classes.setdefault((self.module, node.name), set()).update( name.id for name in ast.walk(base.slice) if isinstance(name, ast.Name) ) self.generic_visit(node) def test_generic_classes_are_subscriptable_at_runtime() -> None: """ Ensure `ext/django_stubs_ext/patch.py` stays up-to-date with the stubs. Every class that is generic in the stubs must be subscriptable at runtime once `monkeypatch()` is called. """ with mock.patch.dict(os.environ, {"DJANGO_SETTINGS_MODULE": "scripts.django_tests_settings"}): django.setup() _monkeypatch() visitor = GenericInheritanceVisitor() for file_path in glob.glob("**/*.pyi", root_dir=STUBS_ROOT, recursive=True): visitor.module = "django." + file_path.replace(".pyi", "").replace("/", ".").removesuffix(".__init__") visitor.visit(ast.parse(Path(STUBS_ROOT, file_path).read_text())) errors = [] for (module_name, cls_name), base_args in visitor.candidate_classes.items(): if not base_args & visitor.type_vars: # Bases are only parameterized by concrete types (e.g. `Iterable[bytes]`) continue try: django_module = importlib.import_module(module_name) except ModuleNotFoundError: continue if (cls := getattr(django_module, cls_name, None)) is None: # `type_check_only`, or doesn't exist in the Django version being tested continue try: cls[Any] except TypeError: errors.append(f"{module_name}.{cls_name} is not patched in `ext/django_stubs_ext/patch.py`") assert not errors, "\n".join(errors) def _monkeypatch() -> None: """ Symbols in `django.contrib.auth.forms` are very hard to patch automatically because we end up importing the User model and it crashes if `django.setup()` was not called beforehand. It can also very easily introduce circular imports so we require the user to monkeypatch it manually. See README.md for more details """ import django_stubs_ext if django.VERSION >= (5, 1): from django.contrib.auth.forms import SetPasswordMixin, SetUnusablePasswordMixin extra_classes: list[type] = [SetPasswordMixin, SetUnusablePasswordMixin] else: from django.contrib.auth.forms import AdminPasswordChangeForm, SetPasswordForm extra_classes = [SetPasswordForm, AdminPasswordChangeForm] django_stubs_ext.monkeypatch(extra_classes=extra_classes) typeddjango-django-stubs-fa03b48/tests/typecheck/000077500000000000000000000000001526064357400221665ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/conf/000077500000000000000000000000001526064357400231135ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/conf/test_settings.yml000066400000000000000000000046211526064357400265400ustar00rootroot00000000000000- case: test_setting_circular_import main: | from myapp import lib mypy_config: | [mypy.plugins.django-stubs] django_settings_module = myapp.settings files: - path: myapp/__init__.py - path: myapp/settings.py content: | from myapp.lib import function_returning_int, const_with_circular_import, const_unresolvable_circular IMMEDIATE_VALUE = 123 CIRCULAR_WITH_HINT: int = function_returning_int() CIRCULAR_WITHOUT_HINT_FUNCTION = function_returning_int() CIRCULAR_WITHOUT_HINT_CONST = const_with_circular_import UNRESOLVABLE_CIRCULAR = const_unresolvable_circular - path: myapp/lib.py content: | from typing import TYPE_CHECKING from typing_extensions import reveal_type import django.conf settings = django.conf.settings def test() -> None: reveal_type(settings.IMMEDIATE_VALUE) # N: Revealed type is "int" reveal_type(settings.CIRCULAR_WITH_HINT) # N: Revealed type is "int" reveal_type(settings.CIRCULAR_WITHOUT_HINT_FUNCTION) # N: Revealed type is "int" reveal_type(settings.CIRCULAR_WITHOUT_HINT_CONST) # N: Revealed type is "int" reveal_type(settings.UNRESOLVABLE_CIRCULAR) # N: Revealed type is "Any" def function_returning_int() -> int: return 42 if TYPE_CHECKING: const_with_circular_import = settings.IMMEDIATE_VALUE const_unresolvable_circular = settings.UNRESOLVABLE_CIRCULAR # E: Cannot determine type of "UNRESOLVABLE_CIRCULAR" [has-type] else: const_with_circular_import = 0 const_unresolvable_circular = ... - case: test_setting_login_urls main: | from typing_extensions import reveal_type from django.conf import settings reveal_type(settings.LOGIN_URL) # N: Revealed type is "str | django.utils.functional._StrPromise" reveal_type(settings.LOGIN_REDIRECT_URL) # N: Revealed type is "str | django.utils.functional._StrPromise" reveal_type(settings.LOGOUT_REDIRECT_URL) # N: Revealed type is "str | django.utils.functional._StrPromise | None" typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/000077500000000000000000000000001526064357400236265ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/auth/000077500000000000000000000000001526064357400245675ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/auth/test_auth.yml000066400000000000000000000150551526064357400273200ustar00rootroot00000000000000- case: test_objects_using_auth_user_model_picks_up_configured_type main: | from typing_extensions import reveal_type from django.contrib.auth import authenticate, aauthenticate, get_user, get_user_model, login from django.contrib.auth.backends import ModelBackend from django.contrib.auth.decorators import user_passes_test from django.contrib.auth.models import AnonymousUser from django.http import HttpRequest, HttpResponse from myapp.models import MyUser reveal_type(authenticate()) # N: Revealed type is "myapp.models.MyUser | None" async def f() -> None: reveal_type(await aauthenticate()) # N: Revealed type is "myapp.models.MyUser | None" reveal_type(get_user_model()) # N: Revealed type is "type[myapp.models.MyUser]" reveal_type(login) # N: Revealed type is "def (request: django.http.request.HttpRequest, user: myapp.models.MyUser | None, backend: type[django.contrib.auth.backends.BaseBackend] | str | None =)" reveal_type(get_user) # N: Revealed type is "def (request: django.http.request.HttpRequest | django.test.client.Client) -> myapp.models.MyUser | django.contrib.auth.models.AnonymousUser" reveal_type(ModelBackend().authenticate(None)) # N: Revealed type is "myapp.models.MyUser | None" def check_user(user: MyUser | AnonymousUser) -> bool: return True @user_passes_test(check_user) def view(request: HttpRequest) -> HttpResponse: raise NotImplementedError custom_settings: | INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth", "myapp") AUTH_USER_MODEL = "myapp.MyUser" files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): ... - case: test_objects_using_auth_user_model_uses_builtin_auth_user_per_default main: | from typing_extensions import reveal_type from django.contrib.auth import authenticate, aauthenticate, get_user, get_user_model, login from django.contrib.auth.backends import ModelBackend from django.contrib.auth.decorators import user_passes_test from django.contrib.auth.models import AnonymousUser, User from django.http import HttpRequest, HttpResponse reveal_type(authenticate()) # N: Revealed type is "django.contrib.auth.models.User | None" async def f() -> None: reveal_type(await aauthenticate()) # N: Revealed type is "django.contrib.auth.models.User | None" reveal_type(get_user_model()) # N: Revealed type is "type[django.contrib.auth.models.User]" reveal_type(login) # N: Revealed type is "def (request: django.http.request.HttpRequest, user: django.contrib.auth.models.User | None, backend: type[django.contrib.auth.backends.BaseBackend] | str | None =)" reveal_type(get_user) # N: Revealed type is "def (request: django.http.request.HttpRequest | django.test.client.Client) -> django.contrib.auth.models.User | django.contrib.auth.models.AnonymousUser" reveal_type(ModelBackend().authenticate(None)) # N: Revealed type is "django.contrib.auth.models.User | None" def check_user(user: User | AnonymousUser) -> bool: return True @user_passes_test(check_user) def view(request: HttpRequest) -> HttpResponse: raise NotImplementedError custom_settings: | INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth", "myapp") files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): ... - case: test_objects_for_auth_user_model_returns_stub_types_when_contrib_auth_is_not_installed main: | from typing_extensions import reveal_type from django.contrib.auth import authenticate, aauthenticate, get_user, get_user_model, login from django.contrib.auth.backends import ModelBackend from django.contrib.auth.base_user import AbstractBaseUser from django.contrib.auth.decorators import user_passes_test from django.contrib.auth.models import AnonymousUser from django.http import HttpRequest, HttpResponse reveal_type(authenticate()) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser | None" async def f() -> None: reveal_type(await aauthenticate()) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser | None" reveal_type(get_user_model()) # N: Revealed type is "type[django.contrib.auth.base_user.AbstractBaseUser]" reveal_type(login) # N: Revealed type is "def (request: django.http.request.HttpRequest, user: django.contrib.auth.base_user.AbstractBaseUser | None, backend: type[django.contrib.auth.backends.BaseBackend] | str | None =)" reveal_type(get_user) # N: Revealed type is "def (request: django.http.request.HttpRequest | django.test.client.Client) -> django.contrib.auth.base_user.AbstractBaseUser | django.contrib.auth.models.AnonymousUser" reveal_type(ModelBackend().authenticate(None)) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser | None" def check_user(user: AbstractBaseUser | AnonymousUser) -> bool: return True @user_passes_test(check_user) def view(request: HttpRequest) -> HttpResponse: raise NotImplementedError custom_settings: | INSTALLED_APPS = ("django.contrib.contenttypes", "myapp") files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): ... - case: test_abstract_user_meta_inheritance main: | from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): class Meta(AbstractUser.Meta): pass custom_settings: | INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth") - case: test_auth_form_meta_inheritance main: | from django.contrib.auth.forms import BaseUserCreationForm, UserChangeForm class CustomUserCreationForm(BaseUserCreationForm): class Meta(BaseUserCreationForm.Meta): pass class CustomUserChangeForm(UserChangeForm): class Meta(UserChangeForm.Meta): pass custom_settings: | INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth") typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/auth/test_decorators.yml000066400000000000000000000153411526064357400305220ustar00rootroot00000000000000- case: login_required main: | from typing import Any from typing_extensions import reveal_type from django.core.handlers.asgi import ASGIRequest from django.core.handlers.wsgi import WSGIRequest from django.contrib.auth.decorators import login_required from django.http import HttpRequest, HttpResponse # Bare: @login_required def view_func1(request: HttpRequest) -> HttpResponse: raise NotImplementedError reveal_type(view_func1) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse" @login_required async def view_func2(request: HttpRequest) -> HttpResponse: raise NotImplementedError reveal_type(view_func2) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]" # Fancy: @login_required(redirect_field_name='a', login_url='b') def view_func3(request: WSGIRequest, arg: str) -> HttpResponse: raise NotImplementedError reveal_type(view_func3) # N: Revealed type is "def (request: django.core.handlers.wsgi.WSGIRequest, arg: str) -> django.http.response.HttpResponse" @login_required(redirect_field_name='a', login_url='b') async def view_func4(request: ASGIRequest, arg: str) -> HttpResponse: raise NotImplementedError reveal_type(view_func4) # N: Revealed type is "def (request: django.core.handlers.asgi.ASGIRequest, arg: str) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]" # This is non-conventional usage, but covered in Django tests, so we allow it. def view_func5(request: HttpRequest) -> HttpResponse: raise NotImplementedError wrapped_view = login_required(view_func5, redirect_field_name='a', login_url='b') reveal_type(wrapped_view) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse" # Wrong: @login_required() # E: Value of type variable "_VIEW" of function cannot be "Callable[[Any], str]" [type-var] def view_func6(request: Any) -> str: raise NotImplementedError custom_settings: | INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth", "myapp") AUTH_USER_MODEL = "myapp.MyUser" files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): ... - case: login_required_default_settings main: | from typing import Any from typing_extensions import reveal_type from django.core.handlers.asgi import ASGIRequest from django.core.handlers.wsgi import WSGIRequest from django.contrib.auth.decorators import login_required from django.http import HttpRequest, HttpResponse @login_required def view_func1(request: HttpRequest) -> HttpResponse: raise NotImplementedError reveal_type(view_func1) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse" @login_required async def view_func2(request: HttpRequest) -> HttpResponse: raise NotImplementedError reveal_type(view_func2) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]" @login_required() # E: Value of type variable "_VIEW" of function cannot be "Callable[[Any], str]" [type-var] def view_func3(request: Any) -> str: raise NotImplementedError - case: user_passes_test main: | from typing_extensions import reveal_type from django.contrib.auth.decorators import user_passes_test from django.http import HttpRequest, HttpResponse @user_passes_test(lambda u: u.is_authenticated and u.is_active) def view_func1(request: HttpRequest) -> HttpResponse: raise NotImplementedError reveal_type(view_func1) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse" @user_passes_test(lambda u: u.get_username().startswith('super')) async def view_func2(request: HttpRequest) -> HttpResponse: raise NotImplementedError reveal_type(view_func2) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]" # Wrong: @user_passes_test # E: Argument 1 to "user_passes_test" has incompatible type "Callable[[HttpRequest], HttpResponse]"; expected "Callable[[User | AnonymousUser], bool]" [arg-type] def view_func3(request: HttpRequest) -> HttpResponse: raise NotImplementedError @user_passes_test(lambda u: u.get_username().startswith('super')) # E: Value of type variable "_VIEW" of function cannot be "Callable[[str], str]" [type-var] def view_func4(request: str) -> str: raise NotImplementedError custom_settings: | INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth") - case: permission_required main: | from typing import Any from typing_extensions import reveal_type from django.contrib.auth.decorators import permission_required from django.http import HttpRequest, HttpResponse @permission_required('polls.can_vote') def view_func1(request: HttpRequest) -> HttpResponse: raise NotImplementedError reveal_type(view_func1) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> django.http.response.HttpResponse" @permission_required(['polls.can_vote', 'polls.can_close'], login_url='/abc') async def view_func2(request: HttpRequest) -> HttpResponse: raise NotImplementedError reveal_type(view_func2) # N: Revealed type is "def (request: django.http.request.HttpRequest) -> typing.Coroutine[Any, Any, django.http.response.HttpResponse]" # Wrong: @permission_required('polls.can_vote') # E: Value of type variable "_VIEW" of function cannot be "Callable[[Any], str]" [type-var] def view_func3(request: Any) -> str: raise NotImplementedError @permission_required # E: Argument 1 to "permission_required" has incompatible type "Callable[[HttpRequest], HttpResponse]"; expected "Iterable[str] | str" [arg-type] def view_func4(request: HttpRequest) -> HttpResponse: raise NotImplementedError custom_settings: | INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth") typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/auth/test_misc.yml000066400000000000000000000026421526064357400273100ustar00rootroot00000000000000- case: test_request_session main: | from django.contrib.auth import get_user from django.contrib.sessions.middleware import SessionMiddleware from django.http import HttpRequest, HttpResponse def get_response(request: HttpRequest, /) -> HttpResponse: return HttpResponse() request = HttpRequest() SessionMiddleware(get_response).process_request(request) get_user(request) - case: test_client_session main: | from django.contrib.auth import get_user from django.test import Client get_user(Client()) - case: test_user_fields main: | from django.contrib.auth.models import AnonymousUser, User anonymous: AnonymousUser anonymous_is_staff: bool = anonymous.is_staff anonymous_is_active: bool = anonymous.is_active anonymous_is_superuser: bool = anonymous.is_superuser anonymous_is_authenticated: bool = anonymous.is_authenticated user: User user_is_staff: bool = user.is_staff user_is_active: bool = user.is_active user_is_superuser: bool = user.is_superuser user_is_authenticated: bool = user.is_authenticated union: User | AnonymousUser union_is_staff: bool = union.is_staff union_is_active: bool = union.is_active union_is_superuser: bool = union.is_superuser union_is_authenticated: bool = union.is_authenticated typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/contenttypes/000077500000000000000000000000001526064357400263655ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/contenttypes/test_models.yml000066400000000000000000000011551526064357400314340ustar00rootroot00000000000000- case: test_contenttypes_models main: | from typing_extensions import reveal_type from django.contrib.contenttypes.models import ContentType c = ContentType.objects.create(app_label='abc', model='abc') reveal_type(c.id) # N: Revealed type is "int" reveal_type(c.app_label) # N: Revealed type is "str" reveal_type(c.model) # N: Revealed type is "str" ContentType.objects.create(app_label=[]) # E: Incompatible type for "app_label" of "ContentType" (got "list[Any]", expected "str | int | Combinable") [misc] custom_settings: | INSTALLED_APPS = ("django.contrib.contenttypes",) typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/gis/000077500000000000000000000000001526064357400244105ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/gis/test_fields.yml000066400000000000000000000041741526064357400274460ustar00rootroot00000000000000- case: fields_getter_and_setter main: | from typing_extensions import reveal_type from django.contrib.gis.geos import Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, GeometryCollection from myapp.models import MyModel model = MyModel() reveal_type(model.point) # N: Revealed type is "django.contrib.gis.geos.point.Point" model.point = Point() reveal_type(model.line_string) # N: Revealed type is "django.contrib.gis.geos.linestring.LineString" model.line_string = LineString() reveal_type(model.polygon) # N: Revealed type is "django.contrib.gis.geos.polygon.Polygon" model.polygon = Polygon() reveal_type(model.multi_point) # N: Revealed type is "django.contrib.gis.geos.collections.MultiPoint" model.multi_point = MultiPoint() reveal_type(model.multi_line_string) # N: Revealed type is "django.contrib.gis.geos.collections.MultiLineString" model.multi_line_string = MultiLineString() reveal_type(model.multi_polygon) # N: Revealed type is "django.contrib.gis.geos.collections.MultiPolygon" model.multi_polygon = MultiPolygon() reveal_type(model.geometry_collection) # N: Revealed type is "django.contrib.gis.geos.collections.GeometryCollection" model.geometry_collection = GeometryCollection() installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db.models import Model from django.contrib.gis.db.models.fields import PointField, LineStringField, PolygonField, MultiPointField, MultiLineStringField, MultiPolygonField, GeometryCollectionField class MyModel(Model): point = PointField() line_string = LineStringField() polygon = PolygonField() multi_point = MultiPointField() multi_line_string = MultiLineStringField() multi_polygon = MultiPolygonField() geometry_collection = GeometryCollectionField() typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/gis/test_functions.yml000066400000000000000000000020061526064357400302000ustar00rootroot00000000000000- case: distance_and_area_annotations_yield_measures main: | from typing_extensions import reveal_type from django.contrib.gis.db.models.functions import Area, Distance from django.contrib.gis.geos import Point from myapp.models import MyModel near = MyModel.objects.annotate(distance=Distance("point", Point(0, 0))) reveal_type(near.get().distance) # N: Revealed type is "django.contrib.gis.measure.Distance" sized = MyModel.objects.annotate(area=Area("polygon")) reveal_type(sized.get().area) # N: Revealed type is "django.contrib.gis.measure.Area" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.contrib.gis.db.models.fields import PointField, PolygonField from django.db.models import Model class MyModel(Model): point = PointField() polygon = PolygonField() typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/postgres/000077500000000000000000000000001526064357400254745ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/postgres/test_fields.yml000066400000000000000000000025071526064357400305300ustar00rootroot00000000000000- case: union_combinable_reduced_to_non_union main: | from myapp.models import MyModel array_val: list[int] = [1] MyModel(array=array_val) # E: Incompatible type for "array" of "MyModel" (got "list[int]", expected "Sequence[str] | Combinable") [misc] non_init = MyModel() non_init.array = array_val # E: Incompatible types in assignment (expression has type "list[int]", variable has type "Sequence[str] | Combinable") [assignment] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.postgres.fields import ArrayField class MyModel(models.Model): array = ArrayField(base_field=models.TextField()) - case: postgres_forms_simple_array_field main: | from myapp.forms import MyForm MyForm() installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/forms.py content: | from django import forms from django.contrib.postgres.forms import SimpleArrayField class MyForm(forms.Form): lots_of_dates = SimpleArrayField(forms.DateField(), required=False) typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/sitemaps/000077500000000000000000000000001526064357400254535ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/contrib/sitemaps/test_generic_sitemap.yml000066400000000000000000000067601526064357400324040ustar00rootroot00000000000000- case: test_items_custom_model main: | from django.contrib.sitemaps import GenericSitemap, Sitemap from django.contrib.sitemaps.views import sitemap from django.db.models import QuerySet from django.urls import path, reverse from typing_extensions import override from myapp.models import Offer class OfferSitemap(Sitemap[Offer]): priority = 1 changefreq = "always" @override def items(self) -> QuerySet[Offer]: return Offer.objects.all() @override def location(self, item: Offer) -> str: return reverse( "myapp:detail-offer", kwargs={ "provider_name": item.provider, "offer_name": item.trc, # E: "Offer" has no attribute "trc" [attr-defined] }, ) class WrongOfferSitemap(Sitemap[Offer]): @override def items(self) -> str: return "Yes" @override def location(self, item: str) -> int: return 1 info_dict = {"queryset": Offer.objects.all()} broken_info_dict = {"queryset": [1, 2]} urlpatterns = [ path( 'sitemap.xml', sitemap, {'sitemaps': {'offers': GenericSitemap[Offer](info_dict, priority=0.6)}}, name='django.contrib.sitemaps.views.sitemap' ), path( 'broken_sitemap.xml', sitemap, {'sitemaps': {'offers': GenericSitemap[Offer](broken_info_dict, priority=0.6)}}, name='django.contrib.sitemaps.views.broken_sitemap' ), ] out: | main:28: error: Return type "str" of "items" incompatible with return type "Iterable[Offer]" in supertype "django.contrib.sitemaps.Sitemap" [override] main:32: error: Return type "int" of "location" incompatible with return type "str" in supertype "django.contrib.sitemaps.Sitemap" [override] main:32: error: Argument 1 of "location" is incompatible with supertype "django.contrib.sitemaps.Sitemap"; supertype defines the argument type as "Offer" [override] main:32: note: This violates the Liskov substitution principle main:32: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#incompatible-overrides main:46: error: Argument 1 to "GenericSitemap" has incompatible type "dict[str, list[int]]"; expected "Mapping[str, datetime | QuerySet[Offer, Offer] | str]" [arg-type] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Offer(models.Model): provider = models.ForeignKey("self", on_delete=models.CASCADE) url_name = models.CharField() - case: test_items_string_sequence main: | from django.contrib.sitemaps import Sitemap from django.urls import reverse from typing_extensions import override class StaticViewSitemap(Sitemap[str]): priority = 1 changefreq = "always" @override def items(self) -> list[str]: return ["home", "about", "contact", "recommendations", "privacy-policy", "blog"] @override def location(self, item: str) -> str: return reverse(item) typeddjango-django-stubs-fa03b48/tests/typecheck/db/000077500000000000000000000000001526064357400225535ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/db/models/000077500000000000000000000000001526064357400240365ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/db/models/test_fields_choices.yml000066400000000000000000000147121526064357400305700ustar00rootroot00000000000000- case: db_models_charfield_invalid_choices main: | from django.db import models class MyModel(models.Model): char1 = models.CharField(max_length=200, choices='test') out: | main:4: error: Argument "choices" to "CharField" has incompatible type "str"; expected "Iterable[tuple[Any, Any] | tuple[str, Iterable[tuple[Any, Any]]]] | Mapping[Any, Any] | type[Choices] | Callable[[], Iterable[tuple[Any, Any] | tuple[str, Iterable[tuple[Any, Any]]]] | Mapping[Any, Any] | type[Choices]] | None" [arg-type] main:4: note: Following member(s) of "str" have conflicts: main:4: note: Expected: main:4: note: def __iter__(self) -> Iterator[tuple[Any, Any] | tuple[str, Iterable[tuple[Any, Any]]]] main:4: note: Got: main:4: note: def __iter__(self) -> Iterator[str] - case: db_models_integerfield_invalid_choices main: | from django.db import models class MyModel(models.Model): int1 = models.IntegerField(choices='test') out: | main:4: error: Argument "choices" to "IntegerField" has incompatible type "str"; expected "Iterable[tuple[Any, Any] | tuple[str, Iterable[tuple[Any, Any]]]] | Mapping[Any, Any] | type[Choices] | Callable[[], Iterable[tuple[Any, Any] | tuple[str, Iterable[tuple[Any, Any]]]] | Mapping[Any, Any] | type[Choices]] | None" [arg-type] main:4: note: Following member(s) of "str" have conflicts: main:4: note: Expected: main:4: note: def __iter__(self) -> Iterator[tuple[Any, Any] | tuple[str, Iterable[tuple[Any, Any]]]] main:4: note: Got: main:4: note: def __iter__(self) -> Iterator[str] - case: db_models_valid_choices main: | from collections.abc import Callable, Mapping, Sequence from django.db import models from typing_extensions import TypeVar, assert_type _T = TypeVar("_T") def to_named_seq(func: Callable[[], _T]) -> Callable[[], Sequence[tuple[str, _T]]]: def inner() -> Sequence[tuple[str, _T]]: return [("title", func())] return inner def to_named_mapping(func: Callable[[], _T]) -> Callable[[], Mapping[str, _T]]: def inner() -> Mapping[str, _T]: return {"title": func()} return inner def str_tuple() -> Sequence[tuple[str, str]]: return (("foo", "bar"), ("fuzz", "bazz")) def str_mapping() -> Mapping[str, str]: return {"foo": "bar", "fuzz": "bazz"} def int_tuple() -> Sequence[tuple[int, str]]: return ((1, "bar"), (2, "bazz")) def int_mapping() -> Mapping[int, str]: return {3: "bar", 4: "bazz"} class ExternalIntegerChoices(models.IntegerChoices): FIRST = 1 def choices_type() -> type[models.Choices]: return ExternalIntegerChoices class TestModel(models.Model): class TextChoices(models.TextChoices): FIRST = "foo", "bar" SECOND = "foo2", "bar" class IntegerChoices(models.IntegerChoices): FIRST = 1, "bar" SECOND = 2, "bar" char1 = models.CharField(max_length=5, choices=TextChoices, default="foo") char2 = models.CharField(max_length=5, choices=str_tuple, default="foo") char3 = models.CharField(max_length=5, choices=str_mapping, default="foo") char4 = models.CharField(max_length=5, choices=str_tuple(), default="foo") char5 = models.CharField(max_length=5, choices=str_mapping(), default="foo") char6 = models.CharField(max_length=5, choices=to_named_seq(str_tuple), default="foo") char7 = models.CharField(max_length=5, choices=to_named_mapping(str_mapping), default="foo") char8 = models.CharField(max_length=5, choices=to_named_seq(str_tuple)(), default="foo") char9 = models.CharField(max_length=5, choices=to_named_mapping(str_mapping)(), default="foo") int1 = models.IntegerField(choices=IntegerChoices, default=1) int2 = models.IntegerField(choices=int_tuple, default=1) int3 = models.IntegerField(choices=int_mapping, default=1) int4 = models.IntegerField(choices=int_tuple(), default=1) int5 = models.IntegerField(choices=int_mapping(), default=1) int6 = models.IntegerField(choices=to_named_seq(int_tuple), default=1) int7 = models.IntegerField(choices=to_named_seq(int_mapping), default=1) int8 = models.IntegerField(choices=to_named_seq(int_tuple)(), default=1) int9 = models.IntegerField(choices=to_named_seq(int_mapping)(), default=1) int10 = models.IntegerField(choices=choices_type) generated1 = models.GeneratedField( expression=models.Value("foo"), output_field=models.CharField(max_length=5), choices=TextChoices, db_persist=False, ) generated2 = models.GeneratedField( expression=models.Value("foo"), output_field=models.CharField(max_length=5), choices=str_tuple, db_persist=False, ) generated3 = models.GeneratedField( expression=models.Value("foo"), output_field=models.CharField(max_length=5), choices=str_mapping, db_persist=False, ) generated4 = models.GeneratedField( expression=models.Value("foo"), output_field=models.CharField(max_length=5), choices=str_tuple(), db_persist=False, ) generated5 = models.GeneratedField( expression=models.Value("foo"), output_field=models.CharField(max_length=5), choices=str_mapping(), db_persist=False, ) generated6 = models.GeneratedField( expression=models.Value("foo"), output_field=models.CharField(max_length=5), choices=to_named_seq(str_tuple), db_persist=False, ) generated7 = models.GeneratedField( expression=models.Value("foo"), output_field=models.CharField(max_length=5), choices=to_named_mapping(str_mapping), db_persist=False, ) generated8 = models.GeneratedField( expression=models.Value("foo"), output_field=models.CharField(max_length=5), choices=to_named_seq(str_tuple)(), db_persist=False, ) generated9 = models.GeneratedField( expression=models.Value("foo"), output_field=models.CharField(max_length=5), choices=to_named_mapping(str_mapping)(), db_persist=False, ) typeddjango-django-stubs-fa03b48/tests/typecheck/db/models/test_init.yml000066400000000000000000000023201526064357400265600ustar00rootroot00000000000000- case: field_to_many_and_to_one_attrs_bool_or_none_in_field_base_class main: | from django.db.models import Field field: Field my_bool: bool my_bool = field.one_to_many my_bool = field.one_to_one my_bool = field.many_to_many my_bool = field.many_to_one # Narrowing the types should give us bool assert field.one_to_many is not None my_bool = field.one_to_many assert field.one_to_one is not None my_bool = field.one_to_one assert field.many_to_many is not None my_bool = field.many_to_many assert field.many_to_one is not None my_bool = field.many_to_one out: | main:6: error: Incompatible types in assignment (expression has type "bool | None", variable has type "bool") [assignment] main:7: error: Incompatible types in assignment (expression has type "bool | None", variable has type "bool") [assignment] main:8: error: Incompatible types in assignment (expression has type "bool | None", variable has type "bool") [assignment] main:9: error: Incompatible types in assignment (expression has type "bool | None", variable has type "bool") [assignment] typeddjango-django-stubs-fa03b48/tests/typecheck/db/models/test_query.yml000066400000000000000000000060121526064357400267640ustar00rootroot00000000000000- case: django_db_models_query_module_has_ModelIterable main: | from django.db.models.query import ModelIterable from django.db.models import Model class IntModelIterable(ModelIterable[int]): pass class NoTypeParameterModelIterable(ModelIterable): pass class ModelModelIterable(ModelIterable[Model]): pass class MyModel(Model): pass class MyModelModelIterable(ModelIterable[MyModel]): pass out: | main:4: error: Type argument "int" of "ModelIterable" must be a subtype of "Model" [type-var] - case: django_db_models_query_module_has_ValuesListIterable main: | from django.db.models.query import ValuesListIterable class IntValuesListIterable(ValuesListIterable[tuple[int,int]]): pass class StringsValuesListIterable(ValuesListIterable[tuple[str,str,str]]): pass class MultiTypeValuesListIterable(ValuesListIterable[tuple[str,int,float]]): pass class NonTupleValuesListIterable(ValuesListIterable[int]): pass out: | main:10: error: Type argument "int" of "ValuesListIterable" must be a subtype of "tuple[Any, ...]" [type-var] - case: django_db_models_query_module_has_NamedValuesListIterable main: | from django.db.models.query import NamedValuesListIterable out: | - case: QuerySet_has__iterable_class_defined main: | from django.db.models.query import QuerySet, ValuesIterable, ModelIterable iterable_class = QuerySet._iterable_class QuerySet._iterable_class = ValuesIterable QuerySet._iterable_class = ModelIterable QuerySet._iterable_class = int out: | main:5: error: Incompatible types in assignment (expression has type "type[int]", variable has type "type[BaseIterable[Any]]") [assignment] - case: QuerySet_type_vars main: | from typing_extensions import reveal_type from django.db.models.query import QuerySet from django.contrib.auth.models import User from django_stubs_ext import ValuesQuerySet a: QuerySet[User] reveal_type(a) # N: Revealed type is "django.db.models.query.QuerySet[django.contrib.auth.models.User, django.contrib.auth.models.User]" reveal_type(a.get()) # N: Revealed type is "django.contrib.auth.models.User" b: QuerySet[User, int] reveal_type(b) # N: Revealed type is "django.db.models.query.QuerySet[django.contrib.auth.models.User, int]" reveal_type(b.get()) # N: Revealed type is "int" c: ValuesQuerySet[User, int] reveal_type(c) # N: Revealed type is "django.db.models.query.QuerySet[django.contrib.auth.models.User, int]" reveal_type(c.get()) # N: Revealed type is "int" d: QuerySet[int] # E: Type argument "int" of "QuerySet" must be a subtype of "Model" [type-var] e: ValuesQuerySet[int] # E: Type argument "int" of "QuerySet" must be a subtype of "Model" [type-var] typeddjango-django-stubs-fa03b48/tests/typecheck/fields/000077500000000000000000000000001526064357400234345ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/fields/test_base.yml000066400000000000000000000214241526064357400261330ustar00rootroot00000000000000- case: test_model_fields_classes_present_as_primitives main: | from typing_extensions import reveal_type from myapp.models import User user = User(small_int=1, name='user', slug='user', text='user') reveal_type(user.id) # N: Revealed type is "int" reveal_type(user.small_int) # N: Revealed type is "int" reveal_type(user.name) # N: Revealed type is "str" reveal_type(user.slug) # N: Revealed type is "str" reveal_type(user.text) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): id = models.AutoField(primary_key=True) small_int = models.SmallIntegerField() name = models.CharField(max_length=255) slug = models.SlugField(max_length=255) text = models.TextField() - case: test_model_field_classes_from_existing_locations main: | from typing_extensions import reveal_type from myapp.models import Booking booking = Booking() reveal_type(booking.id) # N: Revealed type is "int" reveal_type(booking.time_range) # N: Revealed type is "Any" reveal_type(booking.some_decimal) # N: Revealed type is "decimal.Decimal" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.postgres import fields as pg_fields from decimal import Decimal class Booking(models.Model): id = models.AutoField(primary_key=True) time_range = pg_fields.DateTimeRangeField(null=False) some_decimal = models.DecimalField(max_digits=10, decimal_places=5) - case: test_add_id_field_if_no_primary_key_defined disable_cache: true main: | from typing_extensions import reveal_type from myapp.models import User reveal_type(User().id) # N: Revealed type is "int" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass - case: test_do_not_add_id_if_field_with_primary_key_True_defined disable_cache: true main: | from typing_extensions import reveal_type from myapp.models import User reveal_type(User().my_pk) # N: Revealed type is "int" User().id # E: "User" has no attribute "id" [attr-defined] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): my_pk = models.IntegerField(primary_key=True) - case: blank_and_null_char_field_allows_none main: | from typing_extensions import reveal_type from myapp.models import MyModel MyModel(nulltext="") MyModel(nulltext=None) MyModel().nulltext=None reveal_type(MyModel().nulltext) # N: Revealed type is "str | None" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): nulltext=models.CharField(max_length=1, blank=True, null=True) - case: blank_and_not_null_charfield_does_not_allow_none main: | from typing_extensions import reveal_type from myapp.models import MyModel MyModel(notnulltext=None) # E: Incompatible type for "notnulltext" of "MyModel" (got "None", expected "str | int | Combinable") [misc] MyModel(notnulltext="") MyModel().notnulltext = None # E: Incompatible types in assignment (expression has type "None", variable has type "str | int | Combinable") [assignment] reveal_type(MyModel().notnulltext) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): notnulltext=models.CharField(max_length=1, blank=True, null=False) - case: if_field_called_on_class_return_field_itself main: | from typing_extensions import reveal_type from myapp.models import MyUser reveal_type(MyUser.name.field) # N: Revealed type is "django.db.models.fields.CharField[str | int | django.db.models.expressions.Combinable, str]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): name = models.CharField(max_length=100) - case: fields_on_non_model_classes_resolve_to_field_type main: | from typing_extensions import reveal_type from django.db import models class MyClass: myfield: models.IntegerField[int, int] reveal_type(MyClass.myfield) # N: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.IntegerField[int, int]]" reveal_type(MyClass.myfield.field) # N: Revealed type is "django.db.models.fields.IntegerField[int, int]" reveal_type(MyClass().myfield) # N: Revealed type is "django.db.models.fields.IntegerField[int, int]" - case: fields_inside_mixins_used_in_model_subclasses_resolved_as_primitives main: | from typing_extensions import reveal_type from myapp.models import MyModel, AuthMixin reveal_type(MyModel().username) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class AuthMixin(models.Model): class Meta: abstract = True username = models.CharField(max_length=100) class MyModel(AuthMixin, models.Model): pass - case: can_narrow_field_type main: | from typing import cast, NewType from typing_extensions import reveal_type from django.db import models Year = NewType("Year", int) class Book(models.Model): published = cast(models.Field[Year, Year], models.IntegerField()) book = Book() reveal_type(book.published) # N: Revealed type is "main.Year" book.published = 2006 # E: Incompatible types in assignment (expression has type "int", variable has type "Year") [assignment] book.published = Year(2006) reveal_type(book.published) # N: Revealed type is "main.Year" def accepts_int(arg: int) -> None: ... accepts_int(book.published) - case: test_binary_field_return_types main: | from typing_extensions import reveal_type from django.db import models class EncodedMessage(models.Model): message = models.BinaryField() obj = EncodedMessage(b'\x010') reveal_type(obj.message) # N: Revealed type is "bytes | memoryview[int]" - case: test_small_auto_field_class_presents_as_int main: | from typing_extensions import reveal_type from django.db import models class MyModel(models.Model): small = models.SmallAutoField(primary_key=True) obj = MyModel() reveal_type(obj.small) # N: Revealed type is "int" - case: test_ignores_renamed_field main: | # Ref: https://github.com/typeddjango/django-stubs/issues/1261 # Django modifies the model so it doesn't have 'modelname', but we don't follow # along. But the 'name=' argument to a field isn't a documented feature. from typing_extensions import reveal_type from myapp.models import RenamedField instance = RenamedField() reveal_type(instance.modelname) # N: Revealed type is "int" instance.fieldname # E: "RenamedField" has no attribute "fieldname" [attr-defined] instance.modelname = 1 instance.fieldname = 1 # E: "RenamedField" has no attribute "fieldname" [attr-defined] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class RenamedField(models.Model): modelname = models.IntegerField(name="fieldname", choices=((1, 'One'),)) typeddjango-django-stubs-fa03b48/tests/typecheck/fields/test_custom_fields.yml000066400000000000000000000126211526064357400300600ustar00rootroot00000000000000- case: test_custom_model_fields_with_generic_type main: | from typing_extensions import reveal_type from myapp.models import User, CustomFieldValue user = User() reveal_type(user.id) # N: Revealed type is "int" reveal_type(user.my_custom_field1) # N: Revealed type is "myapp.models.CustomFieldValue" reveal_type(user.my_custom_field2) # N: Revealed type is "myapp.models.CustomFieldValue" reveal_type(user.my_custom_field3) # N: Revealed type is "bool" reveal_type(user.my_custom_field4) # N: Revealed type is "myapp.models.CustomFieldValue" reveal_type(user.my_custom_field5) # N: Revealed type is "myapp.models.CustomFieldValue" reveal_type(user.my_custom_field6) # N: Revealed type is "myapp.models.CustomFieldValue" reveal_type(user.my_custom_field7) # N: Revealed type is "bool" reveal_type(user.my_custom_field8) # N: Revealed type is "myapp.models.CustomFieldValue" reveal_type(user.my_custom_field9) # N: Revealed type is "myapp.models.CustomFieldValue" reveal_type(user.my_custom_field10) # N: Revealed type is "bool" reveal_type(user.my_custom_field11) # N: Revealed type is "bool" reveal_type(user.my_custom_field12) # N: Revealed type is "myapp.models.CustomFieldValue | None" reveal_type(user.my_custom_field13) # N: Revealed type is "myapp.models.CustomFieldValue | None" reveal_type(user.my_custom_field14) # N: Revealed type is "bool | None" reveal_type(user.my_custom_field15) # N: Revealed type is "None" reveal_type(user.my_custom_field_any1) # N: Revealed type is "Any" reveal_type(user.my_custom_field_any2) # N: Revealed type is "Any" reveal_type(user.my_custom_field_any3) # N: Revealed type is "Any | None" reveal_type(user.my_custom_field_any4) # N: Revealed type is "Any" monkeypatch: true installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db.models import fields from typing import Any, Generic from typing_extensions import TypeVar _ST = TypeVar("_ST", contravariant=True) _GT = TypeVar("_GT", covariant=True) T = TypeVar("T") class CustomFieldValue: ... class GenericField(fields.Field[_ST, _GT]): ... class SingleTypeField(fields.Field[T, T]): ... class CustomValueField(fields.Field[CustomFieldValue | int, CustomFieldValue]): ... class AdditionalTypeVarField(fields.Field[_ST, _GT], Generic[_ST, _GT, T]): ... class CustomSmallIntegerField(fields.SmallIntegerField[_ST, _GT]): ... class FieldImplicitAny(fields.Field): ... class FieldExplicitAny(fields.Field[Any, Any]): ... class User(models.Model): id = models.AutoField(primary_key=True) my_custom_field1 = GenericField[CustomFieldValue | int, CustomFieldValue]() my_custom_field2 = CustomValueField() my_custom_field3 = SingleTypeField[bool]() my_custom_field4 = AdditionalTypeVarField[CustomFieldValue | int, CustomFieldValue, bool]() my_custom_field_any1 = FieldImplicitAny() my_custom_field_any2 = FieldExplicitAny() # test null=True on fields with non-optional generic types throw error my_custom_field5 = GenericField[CustomFieldValue | int, CustomFieldValue](null=True) # E: GenericField is nullable but its generic get type parameter is not optional [misc] my_custom_field6 = CustomValueField(null=True) # E: CustomValueField is nullable but its generic get type parameter is not optional [misc] my_custom_field7 = SingleTypeField[bool](null=True) # E: SingleTypeField is nullable but its generic get type parameter is not optional [misc] my_custom_field8 = AdditionalTypeVarField[CustomFieldValue | int, CustomFieldValue, bool](null=True) # E: AdditionalTypeVarField is nullable but its generic get type parameter is not optional [misc] my_custom_field9 = fields.Field[CustomFieldValue | int, CustomFieldValue](null=True) # E: Field is nullable but its generic get type parameter is not optional [misc] # test overriding fields that set _pyi_private_set_type or _pyi_private_get_type my_custom_field10 = fields.SmallIntegerField[bool, bool]() my_custom_field11 = CustomSmallIntegerField[bool, bool]() # test null=True on fields with non-optional generic types throw no errors my_custom_field12 = fields.Field[CustomFieldValue | int, CustomFieldValue | None](null=True) my_custom_field13 = GenericField[CustomFieldValue | int, CustomFieldValue | None](null=True) my_custom_field14 = SingleTypeField[bool | None](null=True) my_custom_field15 = fields.Field[None, None](null=True) # test null=True on Any does not raise my_custom_field_any3 = FieldImplicitAny(null=True) my_custom_field_any4 = FieldExplicitAny(null=True) typeddjango-django-stubs-fa03b48/tests/typecheck/fields/test_generic_foreign_key.yml000066400000000000000000000037331526064357400312210ustar00rootroot00000000000000- case: generic_foreign_key_could_point_to_any_model_and_is_always_optional main: | from typing_extensions import reveal_type from myapp.models import Tag, User myuser = User() Tag(content_object=None) Tag(content_object=myuser) Tag.objects.create(content_object=None) Tag.objects.create(content_object=myuser) reveal_type(Tag().content_object) # N: Revealed type is "Any | None" installed_apps: - myapp - django.contrib.contenttypes files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.contenttypes import fields class User(models.Model): pass class Tag(models.Model): content_object = fields.GenericForeignKey() - case: generic_foreign_key_subclass_could_point_to_any_model_and_is_always_optional main: | from typing_extensions import reveal_type from myapp.models import Tag, User myuser = User() Tag(content_object=None) Tag(content_object=myuser) Tag.objects.create(content_object=None) Tag.objects.create(content_object=myuser) reveal_type(Tag().content_object) # N: Revealed type is "Any | None" installed_apps: - myapp - django.contrib.contenttypes files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.contenttypes import fields class User(models.Model): pass class Tag(models.Model): content_object = fields.GenericForeignKey() # Simulate a GenericForeignKey subclass without type infos. Tag.content_object.__class__ = type('MyGenericForeignKey', (fields.GenericForeignKey,), {}) typeddjango-django-stubs-fa03b48/tests/typecheck/fields/test_nullable.yml000066400000000000000000000165351526064357400270260ustar00rootroot00000000000000- case: autofield_can_be_set_to_none main: | from myapp.models import MyModel, MyModelExplicitPK m = MyModel() m.id = 3 m.id = None m2 = MyModel(id=None) MyModel.objects.create(id=None) MyModel.objects.all().update(id=None) # Should give an error since there's a not-null constraint def foo(a: int) -> bool: return True m2 = MyModel() foo(m2.id) # At runtime, this would be an error, unless m.save() was called to populate the `id` field. # but the plugin cannot catch this. foo(m.id) exp = MyModelExplicitPK() exp.id = 3 exp.id = None installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): pass class MyModelExplicitPK(models.Model): id = models.AutoField(primary_key=True) - case: nullable_field_with_strict_optional_true main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel().text) # N: Revealed type is "str" reveal_type(MyModel().text_nullable) # N: Revealed type is "str | None" MyModel().text = None # E: Incompatible types in assignment (expression has type "None", variable has type "str | int | Combinable") [assignment] MyModel().text_nullable = None installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): text_nullable = models.CharField(max_length=100, null=True) text = models.CharField(max_length=100) - case: nullable_array_field main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel().lst) # N: Revealed type is "list[str] | None" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.postgres.fields import ArrayField class MyModel(models.Model): lst = ArrayField(base_field=models.CharField(max_length=100), null=True) - case: nullable_foreign_key main: | from typing_extensions import reveal_type from myapp.models import Publisher, Book reveal_type(Book().publisher) # N: Revealed type is "myapp.models.Publisher | None" Book().publisher = 11 # E: Incompatible types in assignment (expression has type "int", variable has type "Publisher | Combinable | None") [assignment] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Book(models.Model): publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE, null=True) - case: nullable_self_foreign_key main: | from typing_extensions import reveal_type from myapp.models import Inventory parent = Inventory() core = Inventory(parent_id=parent.id) reveal_type(core.parent_id) # N: Revealed type is "int | None" reveal_type(core.parent) # N: Revealed type is "myapp.models.Inventory | None" Inventory(parent=None) Inventory(parent_id=None) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Inventory(models.Model): parent = models.ForeignKey('self', on_delete=models.SET_NULL, null=True) - case: nullable_subclass_inherits_null_overload main: | from typing_extensions import reveal_type from myapp.models import Article reveal_type(Article().body) # N: Revealed type is "str" reveal_type(Article().body_nullable) # N: Revealed type is "str | None" reveal_type(Article().count) # N: Revealed type is "int" reveal_type(Article().count_nullable) # N: Revealed type is "int | None" monkeypatch: true installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import TypeVar from django.db import models _ST = TypeVar("_ST", contravariant=True) _GT = TypeVar("_GT", covariant=True) class HtmlField(models.TextField[_ST, _GT]): ... class IntWrap(models.IntegerField[_ST, _GT]): ... class Article(models.Model): body = HtmlField() body_nullable = HtmlField(null=True) count = IntWrap() count_nullable = IntWrap(null=True) - case: direct_field_null_true_does_not_trigger_nullability_check main: | from typing_extensions import reveal_type from django.db import models from django.db.models import OuterRef, Subquery from myapp.models import Article field = models.IntegerField(null=True) reveal_type(field) # N: Revealed type is "django.db.models.fields.IntegerField[float | int | str | django.db.models.expressions.Combinable | None, int | None]" Article.objects.annotate( other_id=Subquery( Article.objects.filter(id=OuterRef("id")).values_list("id", flat=True)[:1], output_field=models.IntegerField(null=True), ) ) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Article(models.Model): pass - case: field_null_true_expression_does_not_trigger_nullability_check main: | from typing_extensions import reveal_type from django.db import models def take_field(f: models.Field) -> None: return None take_field(models.IntegerField(null=True)) take_field(models.IntegerField(null=False)) - case: nullable_field_subclass_without_explicit_type_vars main: | from typing_extensions import reveal_type from myapp.models import Article reveal_type(Article().body) # N: Revealed type is "str" reveal_type(Article().body_nullable) # N: Revealed type is "str | None" reveal_type(Article().count_nullable) # N: Revealed type is "int | None" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class HTMLField(models.TextField): ... class IntWrap(models.IntegerField): ... class Article(models.Model): body = HTMLField() body_nullable = HTMLField(null=True) count_nullable = IntWrap(null=True) typeddjango-django-stubs-fa03b48/tests/typecheck/fields/test_postgres_fields.yml000066400000000000000000000025661526064357400304230ustar00rootroot00000000000000- case: array_field_descriptor_access main: | from typing_extensions import reveal_type from myapp.models import User user = User(array=[]) reveal_type(user.array) # N: Revealed type is "list[Any]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.postgres.fields import ArrayField class User(models.Model): array = ArrayField(base_field=models.Field()) - case: array_field_base_field_parsed_into_generic_typevar main: | from typing_extensions import reveal_type from myapp.models import User user = User() reveal_type(user.members) # N: Revealed type is "list[int]" reveal_type(user.members_as_text) # N: Revealed type is "list[str]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.postgres.fields import ArrayField class User(models.Model): members = ArrayField(base_field=models.IntegerField()) members_as_text = ArrayField(base_field=models.CharField(max_length=255)) typeddjango-django-stubs-fa03b48/tests/typecheck/fields/test_related.yml000066400000000000000000002423301526064357400266420ustar00rootroot00000000000000- case: test_foreign_key_field_with_related_name main: | from typing_extensions import reveal_type from myapp.models import Book, Publisher book = Book() reveal_type(book.publisher) # N: Revealed type is "myapp.models.Publisher" publisher = Publisher() reveal_type(publisher.books) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Book(models.Model): publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE, related_name='books') - case: foreign_key_field_creates_attribute_with_underscore_id main: | from typing_extensions import reveal_type from myapp.models import Book book = Book() reveal_type(book.publisher_id) # N: Revealed type is "int" reveal_type(book.owner_id) # N: Revealed type is "int" installed_apps: - django.contrib.auth - django.contrib.contenttypes - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Book(models.Model): publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE) owner = models.ForeignKey(db_column='model_id', to='auth.User', on_delete=models.CASCADE) - case: foreign_key_field_custom_to_field main: | from typing_extensions import reveal_type from myapp.models import Book, Publisher from uuid import UUID book = Book() book.publisher = Publisher() reveal_type(book.publisher_id) # N: Revealed type is "uuid.UUID" book.publisher_id = '821850bb-c105-426f-b340-3974419d00ca' book.publisher_id = UUID('821850bb-c105-426f-b340-3974419d00ca') book.publisher_id = [1] # E: Incompatible types in assignment (expression has type "list[int]", variable has type "str | UUID") [assignment] book.publisher_id = Publisher() # E: Incompatible types in assignment (expression has type "Publisher", variable has type "str | UUID") [assignment] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): id = models.BigAutoField(primary_key=True) uuid = models.UUIDField(unique=True) class Book(models.Model): publisher = models.ForeignKey(to=Publisher, to_field='uuid', on_delete=models.CASCADE) - case: foreign_key_field_different_order_of_params main: | from typing_extensions import reveal_type from myapp.models import Book, Publisher book = Book() reveal_type(book.publisher) # N: Revealed type is "myapp.models.Publisher" reveal_type(book.publisher2) # N: Revealed type is "myapp.models.Publisher" publisher = Publisher() reveal_type(publisher.books) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]" reveal_type(publisher.books2) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Book(models.Model): publisher = models.ForeignKey(on_delete=models.CASCADE, to=Publisher, related_name='books') publisher2 = models.ForeignKey(to=Publisher, related_name='books2', on_delete=models.CASCADE) - case: foreign_key_subclass main: | from typing_extensions import reveal_type from myapp.models import A reveal_type(A.objects.get().b) # N: Revealed type is "myapp.models.B" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import TypeVar from django.db import models _ST = TypeVar("_ST", contravariant=True) _GT = TypeVar("_GT", covariant=True) class MyForeignKey(models.ForeignKey[_ST, _GT]): ... class B(models.Model): ... class A(models.Model): b = models.ForeignKey(B, on_delete=models.CASCADE) - case: to_parameter_as_string_with_application_name__model_imported main: | from typing_extensions import reveal_type from myapp2.models import Book book = Book() reveal_type(book.publisher) # N: Revealed type is "myapp.models.Publisher" installed_apps: - myapp - myapp2 files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass - path: myapp2/__init__.py - path: myapp2/models.py content: | from django.db import models class Book(models.Model): publisher = models.ForeignKey(to='myapp.Publisher', on_delete=models.CASCADE) - case: one_to_one_field_no_related_name main: | from typing_extensions import reveal_type from myapp.models import User, Profile reveal_type(User().profile) # N: Revealed type is "myapp.models.Profile" reveal_type(Profile().user) # N: Revealed type is "myapp.models.User" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass class Profile(models.Model): user = models.OneToOneField(to=User, on_delete=models.CASCADE) - case: test_circular_dependency_in_imports_with_foreign_key main: | from myapp import models installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import reveal_type from django.db import models class App(models.Model): def method(self) -> None: reveal_type(self.views) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.View]" reveal_type(self.members) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Member]" reveal_type(self.sheets) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Sheet]" reveal_type(self.profile) # N: Revealed type is "myapp.models.Profile" class View(models.Model): app = models.ForeignKey(to=App, related_name='views', on_delete=models.CASCADE) class Member(models.Model): app = models.ForeignKey(related_name='members', on_delete=models.CASCADE, to=App) class Sheet(models.Model): app = models.ForeignKey(App, related_name='sheets', on_delete=models.CASCADE) class Profile(models.Model): app = models.OneToOneField(App, related_name='profile', on_delete=models.CASCADE) - case: test_circular_dependency_in_imports_with_string_based main: | from typing_extensions import reveal_type from myapp.models import View reveal_type(View().app.views) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.View]" View().app.unknown # E: "App" has no attribute "unknown" [attr-defined] installed_apps: - myapp - myapp2 files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from myapp2.models import App class View(models.Model): app = models.ForeignKey(to=App, related_name='views', on_delete=models.CASCADE) - path: myapp2/__init__.py - path: myapp2/models.py content: | from typing_extensions import reveal_type from django.db import models class App(models.Model): def method(self) -> None: reveal_type(self.views) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.View]" - case: models_related_managers_work_with_direct_model_inheritance_and_with_inheritance_from_other_model main: | from typing_extensions import reveal_type from myapp.models import App reveal_type(App().views) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.View]" reveal_type(App().views2) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.View2]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class App(models.Model): pass class View(models.Model): app = models.ForeignKey(to=App, on_delete=models.CASCADE, related_name='views') class View2(View): app2 = models.ForeignKey(to=App, on_delete=models.CASCADE, related_name='views2') - case: models_imported_inside_init_file_foreign_key main: | from typing_extensions import reveal_type from myapp2.models import View reveal_type(View().app.views) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp2.models.View]" installed_apps: - myapp - myapp2 files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from .app import App as App - path: myapp/models/app.py content: | from django.db import models class App(models.Model): pass - path: myapp2/__init__.py - path: myapp2/models.py content: | from django.db import models from myapp.models import App class View(models.Model): app = models.ForeignKey(to='myapp.App', related_name='views', on_delete=models.CASCADE) - case: models_imported_inside_init_file_one_to_one_field main: | from typing_extensions import reveal_type from myapp2.models import Profile reveal_type(Profile().user) # N: Revealed type is "myapp.models.user.User" reveal_type(Profile().user.profile) # N: Revealed type is "myapp2.models.Profile" reveal_type(Profile.user.field) # N: Revealed type is "django.db.models.fields.related.OneToOneField[myapp.models.user.User | django.db.models.expressions.Combinable, myapp.models.user.User]" installed_apps: - myapp - myapp2 files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from .user import User as User - path: myapp/models/user.py content: | from django.db import models class User(models.Model): pass - path: myapp2/__init__.py - path: myapp2/models.py content: | from django.db import models from myapp.models import User class Profile(models.Model): user = models.OneToOneField(to='myapp.User', related_name='profile', on_delete=models.CASCADE) - case: models_triple_circular_reference main: | from typing_extensions import reveal_type from myapp.models import App reveal_type(App().owner) # N: Revealed type is "myapp.models.user.User" reveal_type(App().owner.profile) # N: Revealed type is "myapp.models.profile.Profile" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from .user import User as User from .profile import Profile as Profile from .app import App as App - path: myapp/models/user.py content: | from django.db import models class User(models.Model): pass - path: myapp/models/profile.py content: | from django.db import models class Profile(models.Model): user = models.OneToOneField(to='myapp.User', related_name='profile', on_delete=models.CASCADE) - path: myapp/models/app.py content: | from django.db import models class App(models.Model): owner = models.ForeignKey(to='myapp.User', on_delete=models.CASCADE, related_name='apps') - case: many_to_many_field_converts_to_queryset_of_model_type main: | from typing_extensions import reveal_type from myapp.models import App, Member reveal_type(Member().apps) # N: Revealed type is "myapp.models.App_ManyRelatedManager[myapp.models.Member_apps]" reveal_type(Member().apps.get()) # N: Revealed type is "myapp.models.App" reveal_type(Member().apps.app_method()) # N: Revealed type is "str" Member().apps.add(App()) reveal_type(App().members) # N: Revealed type is "myapp.models.Member_ManyRelatedManager[myapp.models.Member_apps]" reveal_type(App().members.get()) # N: Revealed type is "myapp.models.Member" reveal_type(App().members.member_method()) # N: Revealed type is "int" App().members.add(Member()) reveal_type(Member.apps.field) # N: Revealed type is "django.db.models.fields.related.ManyToManyField[myapp.models.App, myapp.models.Member_apps]" reveal_type(App.members) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.Member, myapp.models.Member_apps]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class AppQuerySet(models.QuerySet["App"]): def app_method(self) -> str: return "abc" class App(models.Model): objects = AppQuerySet.as_manager() class MemberQuerySet(models.QuerySet["Member"]): def member_method(self) -> int: return 1 class Member(models.Model): apps = models.ManyToManyField(to=App, related_name='members') objects = MemberQuerySet.as_manager() - case: many_to_many_works_with_string_if_imported main: | from typing_extensions import reveal_type from myapp.models import Member reveal_type(Member().apps) # N: Revealed type is "myapp2.models.App_ManyRelatedManager[myapp.models.Member_apps]" installed_apps: - myapp - myapp2 files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Member(models.Model): apps = models.ManyToManyField(to='myapp2.App', related_name='members') - path: myapp2/__init__.py - path: myapp2/models.py content: | from django.db import models class App(models.Model): pass - case: foreign_key_with_self main: | from typing_extensions import reveal_type from myapp.models import User reveal_type(User().parent) # N: Revealed type is "myapp.models.User" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): parent = models.ForeignKey('self', on_delete=models.CASCADE) - case: many_to_many_with_self main: | from typing_extensions import reveal_type from myapp.models import User reveal_type(User().friends) # N: Revealed type is "myapp.models.User_ManyRelatedManager[myapp.models.User_friends]" reveal_type(User().friends.get()) # N: Revealed type is "myapp.models.User" reveal_type(User.friends.through.objects.get()) # N: Revealed type is "myapp.models.User_friends" reveal_type(User.friends.through._default_manager) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.User_friends]" reveal_type(User.friends.through().from_user) # N: Revealed type is "myapp.models.User" reveal_type(User.friends.through().from_user_id) # N: Revealed type is "int" reveal_type(User.friends.through().to_user) # N: Revealed type is "myapp.models.User" reveal_type(User.friends.through().to_user_id) # N: Revealed type is "int" reveal_type(User.friends.through) # N: Revealed type is "type[myapp.models.User_friends]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): friends = models.ManyToManyField('self') - case: implicit_through_model_gets_managers_despite_deferrals main: | from typing_extensions import reveal_type from django.contrib.auth.models import Group reveal_type(Group.permissions.through.objects) # N: Revealed type is "django.db.models.manager.Manager[django.contrib.auth.models.Group_permissions]" reveal_type(Group.permissions.through._default_manager) # N: Revealed type is "django.db.models.manager.Manager[django.contrib.auth.models.Group_permissions]" custom_settings: | INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth', 'myapp') # 'django.contrib.auth.models' is analyzed *before* 'myapp' (which imports it), so # this 'DEFAULT_AUTO_FIELD' lookup fails and triggers a deferral right after the # implicit through models of 'django.contrib.auth' were created. DEFAULT_AUTO_FIELD = 'myapp.models.MyAutoField' files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.auth.models import Group # noqa: F401 class MyAutoField(models.BigAutoField): ... - case: explicit_through_model_keeps_its_own_default_manager main: | from typing_extensions import reveal_type from myapp.models import Authorship, Book reveal_type(Authorship.objects) # N: Revealed type is "myapp.models.ManagerFromAuthorshipQuerySet[myapp.models.Authorship]" reveal_type(Authorship._default_manager) # N: Revealed type is "myapp.models.ManagerFromAuthorshipQuerySet[myapp.models.Authorship]" reveal_type(Book().authorships.active()) # N: Revealed type is "myapp.models.AuthorshipQuerySet[myapp.models.Authorship, myapp.models.Authorship]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import Self from django.db import models class Book(models.Model): authors = models.ManyToManyField('myapp.Author', through='myapp.Authorship') class Author(models.Model): ... class AuthorshipQuerySet(models.QuerySet['Authorship']): def active(self) -> Self: return self class Authorship(models.Model): book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='authorships') author = models.ForeignKey(Author, on_delete=models.CASCADE) objects = models.Manager.from_queryset(AuthorshipQuerySet)() - case: recursively_checking_for_base_model_in_to_parameter main: | installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class BaseModel(models.Model): pass class ParkingSpot(BaseModel): pass class Booking(BaseModel): parking_spot = models.ForeignKey(to=ParkingSpot, null=True, on_delete=models.SET_NULL) - case: if_no_related_name_is_passed_create_default_related_managers main: | from typing_extensions import reveal_type from myapp.models import Publisher reveal_type(Publisher().book_set) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Book(models.Model): publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE) - case: underscore_id_attribute_has_set_type_of_primary_key_if_explicit main: | import datetime from typing_extensions import reveal_type from myapp.models import Book, Book2 reveal_type(Book().publisher_id) # N: Revealed type is "str" Book(publisher_id=1) Book(publisher_id='hello') Book(publisher_id=datetime.datetime.now()) # E: Incompatible type for "publisher_id" of "Book" (got "datetime", expected "str | int | Combinable") [misc] Book.objects.create(publisher_id=1) Book.objects.create(publisher_id='hello') reveal_type(Book2().publisher_id) # N: Revealed type is "int" Book2(publisher_id=1) Book2(publisher_id=[]) # E: Incompatible type for "publisher_id" of "Book2" (got "list[Any]", expected "float | int | str | Combinable") [misc] Book2.objects.create(publisher_id=1) Book2.objects.create(publisher_id=[]) # E: Incompatible type for "publisher_id" of "Book2" (got "list[Any]", expected "float | int | str | Combinable") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models import datetime class Publisher(models.Model): mypk = models.CharField(max_length=100, primary_key=True) class Book(models.Model): publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE) class Publisher2(models.Model): mypk = models.IntegerField(primary_key=True) class Book2(models.Model): publisher = models.ForeignKey(to=Publisher2, on_delete=models.CASCADE) - case: if_model_is_defined_as_name_of_the_class_look_for_it_in_the_same_app main: | from typing_extensions import reveal_type from myapp.models import Book reveal_type(Book().publisher) # N: Revealed type is "myapp.models.publisher.Publisher" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from .publisher import Publisher as Publisher from .book import Book as Book - path: myapp/models/publisher.py content: | from django.db import models class Publisher(models.Model): pass - path: myapp/models/book.py content: | from django.db import models class Book(models.Model): publisher = models.ForeignKey(to='Publisher', on_delete=models.CASCADE) - case: fail_if_no_model_in_the_same_app_models_init_py main: | from myapp.models import Book installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from .book import Book as Book - path: myapp/models/publisher.py content: | from django.db import models class Publisher(models.Model): pass - path: myapp/models/book.py content: | from django.db import models class Book(models.Model): publisher = models.ForeignKey(to='Publisher', on_delete=models.CASCADE) # E: Cannot find model 'Publisher' referenced in field 'publisher' [misc] - case: test_foreign_key_field_without_backwards_relation main: | from typing_extensions import reveal_type from myapp.models import Book, Publisher book = Book() reveal_type(book.publisher) # N: Revealed type is "myapp.models.Publisher" publisher = Publisher() reveal_type(publisher.books) reveal_type(publisher.books2) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]" out: | main:7: error: "Publisher" has no attribute "books"; maybe "books2"? [attr-defined] main:7: note: Revealed type is "Any" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Book(models.Model): publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE, related_name='+') publisher2 = models.ForeignKey(to=Publisher, on_delete=models.CASCADE, related_name='books2') - case: to_parameter_could_be_resolved_if_passed_from_settings main: | from typing_extensions import reveal_type from myapp.models import Book book = Book() reveal_type(book.publisher) # N: Revealed type is "myapp.models.Publisher" custom_settings: | INSTALLED_APPS = ('django.contrib.contenttypes', 'myapp') BOOK_RELATED_MODEL = 'myapp.Publisher' files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.conf import settings from django.db import models class Publisher(models.Model): pass class Book(models.Model): publisher = models.ForeignKey(to=settings.BOOK_RELATED_MODEL, on_delete=models.CASCADE, related_name='books') - case: foreign_key_with_custom_app_name main: | from typing_extensions import reveal_type from myapp.models import MyMain reveal_type(MyMain().user) # N: Revealed type is "myapp2.models.MyUser" installed_apps: - myapp - myapp2.apps.MyApp2Config files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyMain(models.Model): user = models.ForeignKey('myapp2__user.MyUser', on_delete=models.CASCADE) - path: myapp2/__init__.py - path: myapp2/models.py content: | from django.db import models class MyUser(models.Model): pass - path: myapp2/apps.py content: | from django.apps.config import AppConfig class MyApp2Config(AppConfig): name = 'myapp2' label = 'myapp2__user' - case: related_field_to_extracted_from_function main: | from typing_extensions import reveal_type from myapp.models import Profile reveal_type(Profile().user) # N: Revealed type is "myapp.models.User" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass def get_user_model_name() -> str: return 'myapp.User' class Profile(models.Model): user = models.ForeignKey(to=get_user_model_name(), on_delete=models.CASCADE) - case: related_manager_name_defined_by_pattern main: | from typing_extensions import reveal_type from myapp.models import Publisher reveal_type(Publisher().books) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]" reveal_type(Publisher().articles) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Article]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Entry(models.Model): class Meta: abstract = True publisher = models.ForeignKey(to=Publisher, related_name='%(class)ss', on_delete=models.CASCADE) class Book(Entry): pass class Article(Entry): pass - case: test_related_fields_returned_as_descriptors_from_model_class main: | from typing_extensions import reveal_type from myapp.models import Author, Blog, Publisher, Profile reveal_type(Author.blogs) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.Blog, myapp.models.Author_blogs]" reveal_type(Author.blogs.through) # N: Revealed type is "type[myapp.models.Author_blogs]" reveal_type(Author().blogs) # N: Revealed type is "myapp.models.Blog_ManyRelatedManager[myapp.models.Author_blogs]" reveal_type(Blog.publisher) # N: Revealed type is "django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor[django.db.models.fields.related.ForeignKey[myapp.models.Publisher | django.db.models.expressions.Combinable, myapp.models.Publisher]]" reveal_type(Publisher.profile) # N: Revealed type is "django.db.models.fields.related_descriptors.ForwardOneToOneDescriptor[django.db.models.fields.related.OneToOneField[myapp.models.Profile | django.db.models.expressions.Combinable, myapp.models.Profile]]" reveal_type(Author.file) # N: Revealed type is "django.db.models.fields.files.FileDescriptor" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Profile(models.Model): pass class Publisher(models.Model): profile = models.OneToOneField(Profile, on_delete=models.CASCADE) class Blog(models.Model): publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE) class Author(models.Model): blogs = models.ManyToManyField(Blog) file = models.FileField() - case: test_foreign_key_from_superclass_inherits_correctly main: | from typing_extensions import reveal_type from myapp.models import MyUser, Book, Article, LibraryEntity reveal_type(Book().registered_by_user) # N: Revealed type is "myapp.models.MyUser" reveal_type(Article().registered_by_user) # N: Revealed type is "myapp.models.MyUser" user = MyUser() reveal_type(user.book_set) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Book]" reveal_type(user.article_set) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Article]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): pass class LibraryEntity(models.Model): class Meta: abstract = True registered_by_user = models.ForeignKey(MyUser, on_delete=models.CASCADE) class Book(LibraryEntity): pass class Article(LibraryEntity): pass - case: test_foreign_key_from_superclass_inherits_correctly_when_also_inheriting_manager main: | from typing_extensions import reveal_type from myapp.models import MyUser, Book, Article, LibraryEntity reveal_type(Book().registered_by_user) # N: Revealed type is "myapp.models.MyUser" reveal_type(Article().registered_by_user) # N: Revealed type is "myapp.models.MyUser" user = MyUser() reveal_type(user.book_set) # N: Revealed type is "myapp.models.Book_RelatedManager" reveal_type(user.article_set) # N: Revealed type is "myapp.models.Article_RelatedManager" reveal_type(user.book_set.add) # N: Revealed type is "def (*objs: myapp.models.Book | int, bulk: bool =)" reveal_type(user.article_set.add) # N: Revealed type is "def (*objs: myapp.models.Article | int, bulk: bool =)" reveal_type(user.book_set.filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.LibraryEntityQuerySet[myapp.models.Book, myapp.models.Book]" reveal_type(user.book_set.get()) # N: Revealed type is "myapp.models.Book" reveal_type(user.article_set.filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.LibraryEntityQuerySet[myapp.models.Article, myapp.models.Article]" reveal_type(user.article_set.get()) # N: Revealed type is "myapp.models.Article" reveal_type(user.book_set.queryset_method()) # N: Revealed type is "int" reveal_type(user.article_set.queryset_method()) # N: Revealed type is "int" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): pass class LibraryEntityQuerySet(models.QuerySet): def queryset_method(self) -> int: return 1 LibraryEntityManager = models.Manager.from_queryset(LibraryEntityQuerySet) class LibraryEntity(models.Model): class Meta: abstract = True objects = LibraryEntityManager() registered_by_user = models.ForeignKey(MyUser, on_delete=models.CASCADE) class Book(LibraryEntity): pass class Article(LibraryEntity): pass - case: foreign_key_relationship_for_models_with_custom_manager main: | from myapp.models import Transaction installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager class TransactionQuerySet(models.QuerySet): pass TransactionManager = Manager.from_queryset(TransactionQuerySet) class Transaction(models.Model): pk = 0 objects = TransactionManager() def test(self) -> None: self.transactionlog_set class TransactionLog(models.Model): transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE) Transaction().test() - case: foreign_key_relationship_for_models_with_custom_manager_unsolvable main: | from myapp.models import Transaction installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import reveal_type from django.db import models from django.db.models.manager import Manager class TransactionQuerySet(models.QuerySet): def custom(self) -> None: raise NotImplementedError def TransactionManager() -> Manager: return Manager.from_queryset(TransactionQuerySet)() class Transaction(models.Model): objects = TransactionManager() def test(self) -> None: reveal_type(self.transactionlog_set) # We use a fallback Any type: reveal_type(Transaction.objects) reveal_type(Transaction.objects.custom()) class TransactionLog(models.Model): transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE) out: | myapp/models:14: note: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.TransactionLog]" myapp/models:16: note: Revealed type is "myapp.models.ManagerFromTransactionQuerySet[myapp.models.Transaction]" myapp/models:17: note: Revealed type is "None" - case: resolve_primary_keys_for_foreign_keys_with_abstract_self_model main: | from typing_extensions import reveal_type from myapp.models import User reveal_type(User().parent) # N: Revealed type is "myapp.models.AbstractUser" reveal_type(User().parent_id) # N: Revealed type is "int" reveal_type(User().parent2) # N: Revealed type is "myapp.models.AbstractUser | None" reveal_type(User().parent2_id) # N: Revealed type is "int | None" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class AbstractUser(models.Model): parent = models.ForeignKey('self', on_delete=models.CASCADE) parent2 = models.ForeignKey('self', null=True, on_delete=models.CASCADE) class Meta: abstract = True class User(AbstractUser): pass - case: nullable_foreign_key_with_init_overridden main: | from typing_extensions import reveal_type from myapp.models import A reveal_type(A.objects.get().b) # N: Revealed type is "myapp.models.B | None" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import Any from typing_extensions import TypeVar from django.db import models _ST = TypeVar("_ST", contravariant=True) _GT = TypeVar("_GT", covariant=True) class FK(models.ForeignKey[_ST, _GT]): def __init__(self, *args: Any, **kwargs: Any) -> None: kwargs.setdefault('on_delete', models.CASCADE) super().__init__(*args, **kwargs) class B(models.Model): ... class A(models.Model): b = FK(B, null=True, on_delete=models.CASCADE) - case: related_manager_is_a_subclass_of_default_manager main: | from typing_extensions import reveal_type from myapp.models import User, Order, Product reveal_type(User().orders) # N: Revealed type is "myapp.models.Order_RelatedManager" reveal_type(User().orders.get()) # N: Revealed type is "myapp.models.Order" reveal_type(User().orders.manager_method()) # N: Revealed type is "int" reveal_type(Product.objects.queryset_method()) # N: Revealed type is "int" reveal_type(Order().products) # N: Revealed type is "myapp.models.Product_RelatedManager" reveal_type(Order().products.get()) # N: Revealed type is "myapp.models.Product" reveal_type(Order().products.queryset_method()) # N: Revealed type is "int" cond: bool if cond: manager = User().products else: manager = Order().products reveal_type(manager) # N: Revealed type is "myapp.models.Product_RelatedManager" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass class OrderManager(models.Manager): def manager_method(self) -> int: raise NotImplementedError class Order(models.Model): objects = OrderManager() user = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='orders') class ProductQueryset(models.QuerySet): def queryset_method(self) -> int: raise NotImplementedError ProductManager = models.Manager.from_queryset(ProductQueryset) class Product(models.Model): objects = ProductManager() order = models.ForeignKey(to=Order, on_delete=models.CASCADE, related_name='products') user = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='products') - case: related_manager_shared_between_multiple_relations main: | from typing_extensions import reveal_type from myapp.models.store import Store from myapp.models.user import User reveal_type(Store().purchases) # N: Revealed type is "myapp.models.purchase.Purchase_RelatedManager" reveal_type(Store().purchases.queryset_method()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet[myapp.models.purchase.Purchase, myapp.models.purchase.Purchase]" reveal_type(Store().purchases.filter()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet[myapp.models.purchase.Purchase, myapp.models.purchase.Purchase]" reveal_type(Store().purchases.get()) # N: Revealed type is "myapp.models.purchase.Purchase" reveal_type(Store().purchases.filter().queryset_method()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet[myapp.models.purchase.Purchase, myapp.models.purchase.Purchase]" reveal_type(User().purchases) # N: Revealed type is "myapp.models.purchase.Purchase_RelatedManager" reveal_type(User().purchases.queryset_method()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet[myapp.models.purchase.Purchase, myapp.models.purchase.Purchase]" reveal_type(User().purchases.filter()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet[myapp.models.purchase.Purchase, myapp.models.purchase.Purchase]" reveal_type(User().purchases.get()) # N: Revealed type is "myapp.models.purchase.Purchase" reveal_type(User().purchases.filter().queryset_method()) # N: Revealed type is "myapp.models.querysets.PurchaseQuerySet[myapp.models.purchase.Purchase, myapp.models.purchase.Purchase]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from .purchase import Purchase from .store import Store from .user import User - path: myapp/models/store.py content: | from django.db import models class Store(models.Model): ... - path: myapp/models/user.py content: | from django.db import models class User(models.Model): ... - path: myapp/models/querysets.py content: | from django.db.models import QuerySet from typing import TYPE_CHECKING if TYPE_CHECKING: from .purchase import Purchase class PurchaseQuerySet(QuerySet['Purchase']): def queryset_method(self) -> "PurchaseQuerySet": return self.all() - path: myapp/models/purchase.py content: | from django.db import models from django.db.models.manager import Manager from .querysets import PurchaseQuerySet from .store import Store from .user import User PurchaseManager = Manager.from_queryset(PurchaseQuerySet) class Purchase(models.Model): objects = PurchaseManager() store = models.ForeignKey(to=Store, on_delete=models.CASCADE, related_name='purchases') user = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='purchases') - case: explicitly_declared_related_manager_is_not_overridden main: | from typing_extensions import reveal_type from myapp.models import User reveal_type(User().purchases) # N: Revealed type is "int" User().purchases.filter() # E: "int" has no attribute "filter" [attr-defined] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager class User(models.Model): purchases: int class PurchaseQuerySet(models.QuerySet['Purchase']): def queryset_method(self) -> "PurchaseQuerySet": return self.all() PurchaseManager = Manager.from_queryset(PurchaseQuerySet) class Purchase(models.Model): objects = PurchaseManager() user = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='purchases') - case: related_manager_no_conflict_from_star_import main: | import myapp.models installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from myapp.models.a import * # make sure generated related manager from address to user doesn't have # the same name with related manager from profile to user from myapp.models.b import * - path: myapp/models/a.py content: | from django.db import models class Address(models.Model): pass - path: myapp/models/b.py content: | from django.db import models from .a import Address class Profile(models.Model): pass class UserQuerySet(models.QuerySet): pass UserManager = models.Manager.from_queryset(UserQuerySet) class User(models.Model): address = models.ForeignKey(Address, on_delete=models.CASCADE) profile = models.ForeignKey(Profile, on_delete=models.CASCADE) objects = UserManager() - case: many_to_many_field_can_be_used_in_alias main: | from collections.abc import Sequence from typing_extensions import TypeAlias, TypeVar from django.db import models T = TypeVar("T", bound=models.Model) ManyToManyFieldAlias: TypeAlias = models.ManyToManyField[T, T] - case: callable_reverse_manager main: | from typing_extensions import reveal_type from myapp.models import SalesMan sales_man = SalesMan() reveal_type(sales_man.client) # N: Revealed type is "myapp.models.CustomUser_ManyRelatedManager[myapp.models.SalesMan_client]" reveal_type(sales_man.client(manager="staffs")) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyRelatedManager[myapp.models.CustomUser, myapp.models.SalesMan_client]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class CustomUser(models.Model): staffs = models.Manager() class SalesMan(models.Model): client = models.ManyToManyField(CustomUser) - case: test_fails_if_app_label_is_unknown_in_relation_field main: | from installed.models import InstalledModel InstalledModel.objects.filter(non_installed__isnull=True) installed_apps: - installed files: - path: installed/__init__.py - path: installed/models.py content: | from django.db import models class InstalledModel(models.Model): non_installed = models.ForeignKey( # E: Cannot find model 'not_installed.NonInstalledModel' referenced in field 'non_installed' [misc] "not_installed.NonInstalledModel", on_delete=models.CASCADE ) - case: test_foreign_key_to_as_string main: | from myapp.models import Book, Publisher publisher = Publisher.objects.create(name="Example Publisher") book = Book.objects.create(name="Book", publisher=publisher) Book.objects.filter(publisher=publisher) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from django.db import models from django.db.models.query import QuerySet class Publisher(models.Model): name = models.CharField() class PrintedGood(models.Model): publisher = models.ForeignKey(to="myapp.Publisher", on_delete=models.CASCADE) class Meta: abstract = True class Book(PrintedGood): name = models.CharField() - case: test_foreign_key_to_as_string_filter_on_abstract main: | from myapp.models import Book, Publisher installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from django.db import models from django.db.models.query import QuerySet class Publisher(models.Model): name = models.CharField() class MyModel(models.Model): pass class PrintedGood(MyModel): publisher = models.ForeignKey(to="myapp.Publisher", on_delete=models.CASCADE) @property def siblings(self) -> QuerySet['PrintedGood']: return self.__class__.objects.filter(publisher=self.publisher) class Meta: abstract = True class Book(PrintedGood): name = models.CharField() - case: test_explicit_reverse_many_to_one_descriptor main: | from typing_extensions import reveal_type from myapp.models import Other reveal_type(Other.explicit_descriptor) # N: Revealed type is "django.db.models.fields.related_descriptors.ReverseManyToOneDescriptor[myapp.models.MyModel]" reveal_type(Other().explicit_descriptor) # N: Revealed type is "myapp.models.MyModel_RelatedManager" reveal_type(Other().explicit_descriptor.custom_method()) # N: Revealed type is "int" installed_apps: - myapp monkeypatch: true files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from typing import ClassVar from django.db import models from django.db.models.fields.related_descriptors import ReverseManyToOneDescriptor class Other(models.Model): explicit_descriptor: ClassVar[ReverseManyToOneDescriptor["MyModel"]] class CustomManager(models.Manager["MyModel"]): def custom_method(self) -> int: raise NotImplementedError class MyModel(models.Model): rel = models.ForeignKey( Other, on_delete=models.CASCADE, related_name="explicit_descriptor" ) objects = CustomManager() - case: test_reverse_one_to_one_descriptor main: | from typing_extensions import reveal_type from myapp.models import MyModel, Other reveal_type(MyModel.first.RelatedObjectDoesNotExist) reveal_type(Other.mymodel) reveal_type(Other.mymodel.get_queryset(instance=MyModel())) reveal_type(Other.mymodel.RelatedObjectDoesNotExist) reveal_type(Other.has_explicit_name.RelatedObjectDoesNotExist) try: other = Other.objects.get() reveal_type(other.mymodel) except Other.mymodel.RelatedObjectDoesNotExist: ... else: other.mymodel = MyModel() other.mymodel = Other() other.mymodel = None other.has_explicit_name = MyModel() other.has_explicit_name = Other() other.has_explicit_name = None out: | main:3: note: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]" main:4: note: Revealed type is "django.db.models.fields.related_descriptors.ReverseOneToOneDescriptor[myapp.models.Other, myapp.models.MyModel]" main:5: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel, myapp.models.MyModel]" main:6: note: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]" main:7: note: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]" main:10: note: Revealed type is "myapp.models.MyModel" main:15: error: Incompatible types in assignment (expression has type "Other", variable has type "MyModel | None") [assignment] main:18: error: Incompatible types in assignment (expression has type "Other", variable has type "MyModel | None") [assignment] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from django.db import models class Other(models.Model): ... class MyModel(models.Model): first = models.OneToOneField(Other, on_delete=models.CASCADE) second = models.OneToOneField( Other, on_delete=models.CASCADE, related_name="has_explicit_name" ) - case: test_many_to_many skip: __import__("django").VERSION < (6, 0) main: | from typing_extensions import reveal_type from myapp.models import MyModel, Other reveal_type(MyModel.auto_through.through.objects.get()) reveal_type(MyModel().auto_through.get()) reveal_type(Other().autos.get()) reveal_type(MyModel.custom_through.through.objects.get()) reveal_type(MyModel().custom_through.get()) reveal_type(MyModel.custom_through.through.objects.custom_qs_method()) reveal_type(Other().customs.get()) auto_through = MyModel.auto_through.through.objects.get() reveal_type(auto_through.id) reveal_type(auto_through.pk) reveal_type(auto_through.mymodel) reveal_type(auto_through.mymodel_id) reveal_type(auto_through.other) reveal_type(auto_through.other_id) reveal_type(MyModel.auto_through.through) reveal_type(MyModel.auto_through.through.mymodel) reveal_type(MyModel.auto_through.through._default_manager) reveal_type(MyModel.other_again.through) reveal_type(Other.autos) reveal_type(Other.autos.through) reveal_type(Other.autos.through.objects.get()) reveal_type(Other().autos.custom_qs_method()) reveal_type(Other().customs.custom_qs_method()) reveal_type(Other().autos.add) reveal_type(Other.autos.through.objects) reveal_type(Other.autos.through._default_manager) reveal_type(MyModel().auto_through) reveal_type(MyModel().auto_through.through) reveal_type(MyModel().auto_through.through.mymodel_id) reveal_type(MyModel().other_again) reveal_type(MyModel().other_again.through) reveal_type(MyModel().other_again.through.mymodel_id) reveal_type(MyModel().custom_through) reveal_type(MyModel().custom_through.through) reveal_type(MyModel().custom_through.through.my_model_id) out: | main:3: note: Revealed type is "myapp.models.MyModel_auto_through" main:4: note: Revealed type is "myapp.models.Other" main:5: note: Revealed type is "myapp.models.MyModel" main:7: note: Revealed type is "myapp.models.CustomThrough" main:8: note: Revealed type is "myapp.models.Other" main:9: note: Revealed type is "int" main:10: note: Revealed type is "myapp.models.MyModel" main:13: note: Revealed type is "int" main:14: note: Revealed type is "int" main:15: note: Revealed type is "myapp.models.MyModel" main:16: note: Revealed type is "int" main:17: note: Revealed type is "myapp.models.Other" main:18: note: Revealed type is "int" main:20: note: Revealed type is "type[myapp.models.MyModel_auto_through]" main:21: note: Revealed type is "django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor[django.db.models.fields.related.ForeignKey[myapp.models.MyModel | django.db.models.expressions.Combinable, myapp.models.MyModel]]" main:22: note: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel_auto_through]" main:24: note: Revealed type is "type[myapp.models.MyModel_other_again]" main:25: note: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.MyModel, myapp.models.MyModel_auto_through]" main:26: note: Revealed type is "type[myapp.models.MyModel_auto_through]" main:27: note: Revealed type is "myapp.models.MyModel_auto_through" main:29: note: Revealed type is "str" main:30: note: Revealed type is "str" main:31: note: Revealed type is "def (*objs: myapp.models.MyModel | int, through_defaults: typing.Mapping[str, Any] | None =)" main:33: note: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel_auto_through]" main:34: note: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel_auto_through]" main:36: note: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.MyModel_auto_through]" main:37: note: Revealed type is "type[myapp.models.MyModel_auto_through]" main:38: note: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.BigAutoField[float | int | str | django.db.models.expressions.Combinable | None, int]]" main:39: note: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.MyModel_other_again]" main:40: note: Revealed type is "type[myapp.models.MyModel_other_again]" main:41: note: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.BigAutoField[float | int | str | django.db.models.expressions.Combinable | None, int]]" main:42: note: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.CustomThrough]" main:43: note: Revealed type is "type[myapp.models.CustomThrough]" main:44: note: Revealed type is "django.db.models.fields._FieldDescriptor[django.db.models.fields.BigAutoField[float | int | str | django.db.models.expressions.Combinable, int]]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from django.db import models class Other(models.Model): ... class CustomThroughQuerySet(models.QuerySet["CustomThrough"]): def custom_qs_method(self) -> int: return 1 CustomThroughManager = models.Manager.from_queryset(CustomThroughQuerySet) class CustomThrough(models.Model): other = models.ForeignKey(Other, on_delete=models.CASCADE) my_model = models.ForeignKey("myapp.MyModel", on_delete=models.CASCADE) objects = CustomThroughManager() class MyModelQuerySet(models.QuerySet["MyModel"]): def custom_qs_method(self) -> str: return "abc" MyModelManager = models.Manager.from_queryset(MyModelQuerySet) class MyModel(models.Model): auto_through = models.ManyToManyField(Other, related_name="autos") # Have multiple M2Ms with implicit through other_again = models.ManyToManyField(Other, related_name="others_again") custom_through = models.ManyToManyField(Other, through=CustomThrough, related_name="customs") objects = MyModelManager() - case: test_many_to_many_with_lazy_references main: | from typing_extensions import reveal_type from first.models import First reveal_type(First().thirds.get()) reveal_type(First.thirds.through.objects.get()) reveal_type(First.thirds.through.objects.get().first) reveal_type(First.thirds.through.objects.get().third) from third.models import Third reveal_type(Third().fourths.get()) reveal_type(Third.fourths.through.objects.get()) out: | main:3: note: Revealed type is "third.models.Third" main:4: note: Revealed type is "second.models.Second" main:5: note: Revealed type is "first.models.First" main:6: note: Revealed type is "third.models.Third" main:9: note: Revealed type is "third.models.Fourth" main:10: note: Revealed type is "third.models.Third_fourths" installed_apps: - first - second - third files: - path: first/__init__.py - path: first/models/__init__.py content: | from django.db import models class First(models.Model): thirds = models.ManyToManyField("third.Third", through="second.Second") - path: second/__init__.py - path: second/models/__init__.py content: | from django.db import models class Second(models.Model): first = models.ForeignKey("first.First", on_delete=models.CASCADE) third = models.ForeignKey("third.Third", on_delete=models.CASCADE) - path: third/__init__.py - path: third/models/__init__.py content: | from django.db import models class Third(models.Model): fourths = models.ManyToManyField("third.Fourth", blank=True) class Fourth(models.Model): ... - case: test_many_to_many_with_unresolvable_through_model main: | from typing_extensions import reveal_type from myapp.models import First, Other reveal_type(Other().first_set) reveal_type(First().others) out: | main:3: error: "Other" has no attribute "first_set" [attr-defined] main:3: note: Revealed type is "Any" main:4: note: Revealed type is "django.db.models.fields.related_descriptors.ManyRelatedManager[myapp.models.Other, Never]" myapp/models:4: error: Could not match lazy reference with any model [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class First(models.Model): others = models.ManyToManyField("myapp.Other", through="myapp.Missing") class Other(models.Model): ... - case: test_many_to_many_lazy_references_with_implicit_app_label main: | from typing_extensions import reveal_type from myapp.models import Child reveal_type(Child.parents) reveal_type(Child().parents) out: | main:3: note: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[Any, Any]" main:4: note: Revealed type is "django.db.models.fields.related_descriptors.ManyRelatedManager[Any, Any]" myapp/models/child:5: error: Need type annotation for "parents" [var-annotated] myapp/models/child:6: error: Need type annotation for "other_parents" [var-annotated] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from .child import Child as Child from .parent import Parent as Parent - path: myapp/models/parent.py content: | from django.db import models class Parent(models.Model): ... - path: myapp/models/child.py content: | from django.db import models class Child(models.Model): # Reference without explicit app label parents = models.ManyToManyField("Parent") other_parents = models.ManyToManyField(to="Parent") - case: test_relations_with_bad_arguments main: | from typing_extensions import reveal_type from myapp.models import MyModel def f(arg: type[MyModel]) -> MyModel: instance = arg(field=1, unknown=2) reveal_type(instance.field) # N: Revealed type is "Any" reveal_type(instance.unknown) # N: Revealed type is "Any" reveal_type(instance.bad) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyRelatedManager[Any, Any]" return instance installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): field = models.ForeignKey("slef", on_delete=models.CASCADE) # E: Cannot find model 'slef' referenced in field 'field' [misc] unknown = models.OneToOneField("unknown", on_delete=models.CASCADE) # E: Cannot find model 'unknown' referenced in field 'unknown' [misc] bad = models.ManyToManyField("bad") # E: Need type annotation for "bad" [var-annotated] - case: test_reverse_of_inherited_many_to_many_fields main: | from typing_extensions import reveal_type from myapp.models import Other other = Other() reveal_type(other.abstract_of_concrete_parent) # N: Revealed type is "myapp.models.ConcreteParent_ManyRelatedManager[myapp.models.ConcreteParent_m2m_1]" reveal_type(other.concrete_parent) # N: Revealed type is "myapp.models.ConcreteParent_ManyRelatedManager[myapp.models.ConcreteParent_m2m_2]" reveal_type(other.abstract_of_abstract_parent) # N: Revealed type is "myapp.models.MyModel_ManyRelatedManager[myapp.models.MyModel_m2m_3]" reveal_type(other.abstract_parent) # N: Revealed type is "myapp.models.MyModel_ManyRelatedManager[myapp.models.MyModel_m2m_4]" reveal_type(other.mymodel) # N: Revealed type is "myapp.models.MyModel_ManyRelatedManager[myapp.models.MyModel_m2m_5]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Other(models.Model): ... class AbstractOfConcreteParent(models.Model): m2m_1 = models.ManyToManyField(Other, related_name="abstract_of_concrete_parent") class Meta: abstract = True class ConcreteParent(AbstractOfConcreteParent): m2m_2 = models.ManyToManyField(Other, related_name="concrete_parent") class AbstractOfAbstractParent(models.Model): m2m_3 = models.ManyToManyField(Other, related_name="abstract_of_abstract_parent") class Meta: abstract = True class AbstractParent(AbstractOfAbstractParent): m2m_4 = models.ManyToManyField(Other, related_name="abstract_parent") class Meta: abstract = True class MyModel(ConcreteParent, AbstractParent): m2m_5 = models.ManyToManyField(Other, related_name="mymodel") - case: test_m2m_related_managers_supports_renamed_imports main: | from typing_extensions import reveal_type from myapp.models import MyModel from other.models import Other reveal_type(MyModel.m2m_1.through.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel_m2m_1]" reveal_type(Other.auto_through.through.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel_m2m_1]" reveal_type(MyModel.m2m_2.through.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.Through]" reveal_type(Other.custom_through.through.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.Through]" installed_apps: - other - myapp files: - path: other/__init__.py - path: other/models.py content: | from django.db import models class Other(models.Model): ... - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from other import models as other_models class Through(models.Model): mymodel = models.ForeignKey("myapp.MyModel", on_delete=models.CASCADE) other = models.ForeignKey(other_models.Other, on_delete=models.CASCADE) class MyModel(models.Model): m2m_1 = models.ManyToManyField(other_models.Other, related_name="auto_through") m2m_2 = models.ManyToManyField(other_models.Other, related_name="custom_through", through=Through) - case: test_m2m_from_abstract_model main: | from typing_extensions import reveal_type from myapp.models import First, Second reveal_type(First().others) # N: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.First_others]" reveal_type(First().others.get()) # N: Revealed type is "myapp.models.Other" reveal_type(First.others) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.Other, myapp.models.First_others]" reveal_type(First.others.through) # N: Revealed type is "type[myapp.models.First_others]" reveal_type(First.others.through.objects.get()) # N: Revealed type is "myapp.models.First_others" reveal_type(Second().others) # N: Revealed type is "myapp.models.Other_ManyRelatedManager[myapp.models.Second_others]" reveal_type(Second().others.get()) # N: Revealed type is "myapp.models.Other" reveal_type(Second.others) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.Other, myapp.models.Second_others]" reveal_type(Second.others.through) # N: Revealed type is "type[myapp.models.Second_others]" reveal_type(Second.others.through.objects.get()) # N: Revealed type is "myapp.models.Second_others" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Other(models.Model): ... class Parent(models.Model): others = models.ManyToManyField(Other) class Meta: abstract = True class First(Parent): ... class Second(Parent): ... - case: test_m2m_self_on_abstract_model main: | from typing_extensions import reveal_type from myapp.models import First, Second reveal_type(First().others) # N: Revealed type is "myapp.models.First_ManyRelatedManager[myapp.models.First_others]" reveal_type(First().others.get()) # N: Revealed type is "myapp.models.First" reveal_type(First.others) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.First, myapp.models.First_others]" reveal_type(First.others.through) # N: Revealed type is "type[myapp.models.First_others]" reveal_type(First.others.through.objects.get()) # N: Revealed type is "myapp.models.First_others" reveal_type(Second().others) # N: Revealed type is "myapp.models.Second_ManyRelatedManager[myapp.models.Second_others]" reveal_type(Second().others.get()) # N: Revealed type is "myapp.models.Second" reveal_type(Second.others) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[myapp.models.Second, myapp.models.Second_others]" reveal_type(Second.others.through) # N: Revealed type is "type[myapp.models.Second_others]" reveal_type(Second.others.through.objects.get()) # N: Revealed type is "myapp.models.Second_others" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Parent(models.Model): others = models.ManyToManyField("self") class Meta: abstract = True class First(Parent): ... class Second(Parent): ... - case: test_m2m_models_manager_filter_kwargs_checked main: | from myapp.models import MyModel, Other MyModel.objects.filter(xyz__isnull=False) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, others [misc] MyModel.objects.get(xyz__isnull=False) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, others [misc] MyModel.objects.exclude(xyz__isnull=False) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, others [misc] other = Other() other.mymodel_set.filter(xyz__isnull=True) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, others [misc] other.mymodel_set.get(xyz__isnull=True) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, others [misc] other.mymodel_set.exclude(xyz__isnull=True) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, others [misc] MyModel.others.through.objects.filter(xyz__isnull=False) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, mymodel, mymodel_id, other, other_id [misc] MyModel.others.through.objects.get(xyz__isnull=False) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, mymodel, mymodel_id, other, other_id [misc] MyModel.others.through.objects.exclude(xyz__isnull=False) # E: Cannot resolve keyword 'xyz' into field. Choices are: id, mymodel, mymodel_id, other, other_id [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Other(models.Model): ... class MyModel(models.Model): others = models.ManyToManyField(Other) - case: test_reverse_m2m_relation_checks_other_model main: | from typing_extensions import reveal_type from myapp.models import Author # With builtin manager/queryset Author().book_set.filter(featured=True) Author().book_set.filter(xyz=True) # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc] reveal_type(Author().book_set.values_list("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, tuple[bool]]" Author().book_set.values_list("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc] reveal_type(Author().book_set.values("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, TypedDict({'featured': bool})]" Author().book_set.values("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc] reveal_type(Author().book_set.filter(featured=True).values_list("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, tuple[bool]]" Author().book_set.filter(featured=True).values_list("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc] reveal_type(Author().book_set.filter(featured=True).values("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, TypedDict({'featured': bool})]" Author().book_set.filter(featured=True).values("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc] # With a custom manager/queryset Author().other_set.filter(featured=True) Author().other_set.filter(xyz=True) # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc] reveal_type(Author().other_set.values_list("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Other, tuple[bool]]" Author().other_set.values_list("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc] reveal_type(Author().other_set.values("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Other, TypedDict({'featured': bool})]" Author().other_set.values("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc] reveal_type(Author().other_set.filter(featured=True).values_list("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Other, tuple[bool]]" Author().other_set.filter(featured=True).values_list("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc] reveal_type(Author().other_set.filter(featured=True).values("featured")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Other, TypedDict({'featured': bool})]" Author().other_set.filter(featured=True).values("xyz") # E: Cannot resolve keyword 'xyz' into field. Choices are: authors, featured, id [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import Self from django.db import models class Author(models.Model): ... class Book(models.Model): featured = models.BooleanField(default=False) authors = models.ManyToManyField(Author) class OtherQuerySet(models.QuerySet["Other"]): def custom(self) -> Self: raise NotImplementedError OtherManager = models.Manager.from_queryset(OtherQuerySet) class Other(models.Model): featured = models.BooleanField() authors = models.ManyToManyField(Author) objects = OtherManager() - case: test_many_to_many_field_null main: | from typing_extensions import reveal_type from django.db import models class Person(models.Model): friends = models.ManyToManyField("self", null=True, blank=True) p: Person reveal_type(p.friends) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyRelatedManager[main.Person, main.Person_friends]" typeddjango-django-stubs-fa03b48/tests/typecheck/managers/000077500000000000000000000000001526064357400237635ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/000077500000000000000000000000001526064357400260275ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_aggregate.yml000066400000000000000000000013221526064357400315350ustar00rootroot00000000000000- case: aggregate_filter_accepts_exists_expression main: | from django.db.models import Count, Exists, OuterRef from myapp.models import Blog, Entry Blog.objects.aggregate( entry_count=Count("id", filter=Exists(Entry.objects.filter(blog_id=OuterRef("id")))), ) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_annotate.yml000066400000000000000000001376021526064357400314330ustar00rootroot00000000000000- case: annotate_using_with_annotations main: | from typing_extensions import Annotated, reveal_type from myapp.models import User from django_stubs_ext import WithAnnotations, Annotations from django.db.models.expressions import Value annotated_user = User.objects.annotate(foo=Value("")).get() unannotated_user = User.objects.get(id=1) print(annotated_user.asdf) # E: "User@AnnotatedWith[TypedDict({'foo': Any})]" has no attribute "asdf" [attr-defined] print(unannotated_user.asdf) # E: "User" has no attribute "asdf" [attr-defined] def func(user: Annotated[User, Annotations]) -> None: # E: Missing required TypedDict parameter for generic type Annotations [misc] user.asdf # E: "User" has no attribute "asdf" [attr-defined] # Due to the error on 'func' it should fall back to expecting 'User' reveal_type(func) # N: Revealed type is "def (user: myapp.models.User)" func(unannotated_user) func(annotated_user) def func2(user: WithAnnotations[User]) -> None: user.asdf # E: "User" has no attribute "asdf" [attr-defined] # With only one argument to 'WithAnnotations' it should fall back to expecting 'User' reveal_type(func2) # N: Revealed type is "def (user: myapp.models.User)" func2(unannotated_user) func2(annotated_user) def func3(user: WithAnnotations) -> None: raise NotImplementedError # With no arguments to 'WithAnnotations' it should become 'Any' reveal_type(func3) # N: Revealed type is "def (user: Any)" func3(unannotated_user) func3(annotated_user) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) - case: annotate_using_with_annotations_typeddict main: | from typing import Any from typing_extensions import Annotated, TypedDict, reveal_type from myapp.models import User from django_stubs_ext import WithAnnotations, Annotations from django.db.models.expressions import Value class MyDict(TypedDict): foo: str def func(user: Annotated[User, Annotations[MyDict]]) -> str: print(user.asdf) # E: "User@AnnotatedWith[MyDict]" has no attribute "asdf" [attr-defined] return user.foo unannotated_user = User.objects.get(id=1) annotated_user = User.objects.annotate(foo=Value("")).get() other_annotated_user = User.objects.annotate(other=Value("")).get() func(unannotated_user) # E: Argument 1 to "func" has incompatible type "User"; expected "User@AnnotatedWith[MyDict]" [arg-type] x: WithAnnotations[User] # Declaring nothing annotated returns a user reveal_type(x) # N: Revealed type is "myapp.models.User" func(x) # E: Argument 1 to "func" has incompatible type "User"; expected "User@AnnotatedWith[MyDict]" [arg-type] func(annotated_user) func(other_annotated_user) # E: Argument 1 to "func" has incompatible type "User@AnnotatedWith[TypedDict({'other': Any})]"; expected "User@AnnotatedWith[MyDict]" [arg-type] def func2(user: WithAnnotations[User, MyDict]) -> str: print(user.asdf) # E: "User@AnnotatedWith[MyDict]" has no attribute "asdf" [attr-defined] return user.foo func2(unannotated_user) # E: Argument 1 to "func2" has incompatible type "User"; expected "User@AnnotatedWith[MyDict]" [arg-type] func2(annotated_user) func2(other_annotated_user) # E: Argument 1 to "func2" has incompatible type "User@AnnotatedWith[TypedDict({'other': Any})]"; expected "User@AnnotatedWith[MyDict]" [arg-type] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) - case: annotate_using_with_annotations_typeddict_subtypes main: | from typing_extensions import Annotated, TypedDict from myapp.models import User from django_stubs_ext import WithAnnotations, Annotations class BroadDict(TypedDict): foo: str bar: str class NarrowDict(TypedDict): foo: str class OtherDict(TypedDict): other: str def func(user: WithAnnotations[User, NarrowDict]) -> str: return user.foo x: WithAnnotations[User, NarrowDict] func(x) y: WithAnnotations[User, BroadDict] func(y) z: WithAnnotations[User, OtherDict] func(z) # E: Argument 1 to "func" has incompatible type "User@AnnotatedWith[OtherDict]"; expected "User@AnnotatedWith[NarrowDict]" [arg-type] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) - case: annotate_basic main: | from typing_extensions import reveal_type from myapp.models import User from django.db.models.expressions import F qs = User.objects.annotate(foo=F('id')) reveal_type(qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.User@AnnotatedWith[TypedDict({'foo': Any})], myapp.models.User@AnnotatedWith[TypedDict({'foo': Any})]]" annotated = qs.get() reveal_type(annotated) # N: Revealed type is "myapp.models.User@AnnotatedWith[TypedDict({'foo': Any})]" reveal_type(annotated.foo) # N: Revealed type is "Any" print(annotated.bar) # E: "User@AnnotatedWith[TypedDict({'foo': Any})]" has no attribute "bar" [attr-defined] reveal_type(annotated.username) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) - case: annotate_positional_aggregate_uses_default_alias main: | from typing_extensions import reveal_type from myapp.models import User from django.db.models import Count # Positional Aggregate gets Django's default_alias: __. user = User.objects.annotate(Count('id')).get() reveal_type(user.id__count) # N: Revealed type is "int" # Multiple positional aggregates produce multiple default aliases. multi = User.objects.annotate(Count('id'), Count('username')).get() reveal_type(multi.id__count) # N: Revealed type is "int" reveal_type(multi.username__count) # N: Revealed type is "int" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) - case: annotate_model_usage_across_methods main: | from myapp.models import User, Animal from django.db.models import Count qs = User.objects.annotate(Count('id')) annotated_user = qs.get() def animals_only(param: Animal) -> None: raise NotImplementedError animals_only(annotated_user) # E: Argument 1 to "animals_only" has incompatible type "User@AnnotatedWith[TypedDict({'id__count': int})]"; expected "Animal" [arg-type] def users_allowed(param: User) -> None: # But this function accepts only the original User type, so any attr access is not allowed within this function param.foo # E: "User" has no attribute "foo" [attr-defined] # Passing in the annotated User to a function taking a (unannotated) User is OK users_allowed(annotated_user) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) class Animal(models.Model): barks = models.BooleanField() - case: annotate_twice_works main: | from typing_extensions import reveal_type from myapp.models import User from django.db.models.expressions import F # Django annotations are additive qs = User.objects.annotate(foo=F('id')) qs = qs.annotate(bar=F('id')) annotated = qs.get() reveal_type(annotated) # N: Revealed type is "myapp.models.User@AnnotatedWith[TypedDict({'foo': Any, 'bar': Any})]" reveal_type(annotated.foo) # N: Revealed type is "Any" reveal_type(annotated.bar) # N: Revealed type is "Any" reveal_type(annotated.username) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) - case: annotate_using_queryset_across_methods main: | from myapp.models import User from django_stubs_ext import WithAnnotations from django.db.models import QuerySet from django.db.models.expressions import F from typing_extensions import TypedDict, reveal_type qs = User.objects.filter(id=1) class FooDict(TypedDict): foo: str def add_annotation(qs: QuerySet[User]) -> QuerySet[WithAnnotations[User, FooDict]]: return qs.annotate(foo=F('id')) def add_wrong_annotation(qs: QuerySet[User]) -> QuerySet[WithAnnotations[User, FooDict]]: return qs.annotate(bar=F('id')) # E: Incompatible return value type (got "QuerySet[User@AnnotatedWith[TypedDict({'bar': Any})], User@AnnotatedWith[TypedDict({'bar': Any})]]", expected "QuerySet[User@AnnotatedWith[FooDict], User@AnnotatedWith[FooDict]]") [return-value] qs = add_annotation(qs) reveal_type(qs.get().foo) # N: Revealed type is "str" qs.get().bar # E: "User@AnnotatedWith[FooDict]" has no attribute "bar" [attr-defined] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) - case: annotate_rejects_lookups_of_non_existent_field main: | from myapp.models import User from django.db.models.expressions import F User.objects.annotate(abc=F('id')).filter(abc=1).values_list() User.objects.annotate(abc=F('id')).filter(unknown_field=1).values_list() # E: Cannot resolve keyword 'unknown_field' into field. Choices are: id, abc [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass - case: annotate_values_or_values_list_before_or_after_annotate_broadens_type main: | from typing_extensions import reveal_type from myapp.models import Blog from django.db.models.expressions import F values_list_double_annotate = Blog.objects.annotate(foo=F('id')).annotate(bar=F('id')).values_list('foo', 'bar').get() reveal_type(values_list_double_annotate) # N: Revealed type is "tuple[Any, Any]" values_list_named = Blog.objects.annotate(foo=F('id'), bar=F('isad')).values_list('foo', 'text', named=True).get() # We have to assume we don't know any of the tuple member types. reveal_type(values_list_named) # N: Revealed type is "tuple[Any, str, fallback=main.Row]" values_list_named.unknown # E: "Row" has no attribute "unknown" [attr-defined] reveal_type(values_list_named.foo) # N: Revealed type is "Any" reveal_type(values_list_named.text) # N: Revealed type is "str" values_list_flat_known = Blog.objects.annotate(foo=F('id')).values_list('text', flat=True).get() # Even though it's annotated, we still know the lookup's type. reveal_type(values_list_flat_known) # N: Revealed type is "str" values_list_flat_unknown = Blog.objects.annotate(foo=F('id')).values_list('foo', flat=True).get() # We don't know the type of an unknown lookup reveal_type(values_list_flat_unknown) # N: Revealed type is "Any" values_list_no_params = Blog.objects.annotate(foo=F('id')).values_list().get() reveal_type(values_list_no_params) # N: Revealed type is "tuple[Any, ...]" values_list_flat_no_params = Blog.objects.annotate(foo=F('id')).values_list(flat=True).get() reveal_type(values_list_flat_no_params) # N: Revealed type is "int" values_list_named_no_params = Blog.objects.annotate(foo=F('id')).values_list(named=True).get() reveal_type(values_list_named_no_params.foo) # N: Revealed type is "Any" reveal_type(values_list_named_no_params.text) # N: Revealed type is "str" # .values/.values_list BEFORE .annotate # The following should happen to the TypeVars: # 1st typevar (Model): Blog => django_stubs_ext.WithAnnotations[Blog] # 2nd typevar (Row): The values() dict keys are preserved and extended with the # annotation aliases, mirroring Django's `.values(...).annotate(...)` behavior. qs1 = Blog.objects.values('text').annotate(foo=F('id')) reveal_type(qs1) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'foo': Any})], TypedDict({'text': str, 'foo': Any})]" qs2 = Blog.objects.values_list('text').annotate(foo=F('id')) reveal_type(qs2) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'foo': Any})], tuple[Any, ...]]" qs3 = Blog.objects.values_list('text', named=True).annotate(foo=F('id')) reveal_type(qs3) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'foo': Any})], tuple[str, Any, fallback=main.Row3]]" qs3_chained = Blog.objects.values_list('text', named=True).annotate(foo=F('id')).annotate(bar=F('num_posts')) qs3_chained_row = qs3_chained.get() reveal_type(qs3_chained_row.text) # N: Revealed type is "str" reveal_type(qs3_chained_row.foo) # N: Revealed type is "Any" reveal_type(qs3_chained_row.bar) # N: Revealed type is "Any" qs4 = Blog.objects.values_list('text', flat=True).annotate(foo=F('id')) reveal_type(qs4) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'foo': Any})], str]" before_values_no_params = Blog.objects.values().annotate(foo=F('id')).get() reveal_type(before_values_no_params) # N: Revealed type is "TypedDict({'id': int, 'num_posts': int, 'text': str, 'foo': Any})" before_values_list_no_params = Blog.objects.values_list().annotate(foo=F('id')).get() reveal_type(before_values_list_no_params) # N: Revealed type is "tuple[Any, ...]" before_values_list_flat_no_params = Blog.objects.values_list(flat=True).annotate(foo=F('id')).get() reveal_type(before_values_list_flat_no_params) # N: Revealed type is "int" before_values_list_named_no_params = Blog.objects.values_list(named=True).annotate(foo=F('id')).get() reveal_type(before_values_list_named_no_params.foo) # N: Revealed type is "Any" reveal_type(before_values_list_named_no_params.text) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Blog(models.Model): num_posts = models.IntegerField() text = models.CharField(max_length=100) - case: annotate_then_values_list_flat_slice_preserves_row_type main: | from typing import Iterable from typing_extensions import reveal_type from myapp.models import Blog from django.db.models import F qs = Blog.objects.annotate(a=F("id")).values_list("id", flat=True) reveal_type(qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'a': Any})], int]" reveal_type(qs[:]) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'a': Any})], int]" def get_blog_ids() -> Iterable[int]: return Blog.objects.annotate(a=F("id")).values_list("id", flat=True)[:] # Also preserve non-flat tuple row types and TypedDict row types from values(). reveal_type(Blog.objects.annotate(a=F("id")).values_list("id", "text")[:]) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'a': Any})], tuple[int, str]]" reveal_type(Blog.objects.annotate(a=F("id")).values("id")[:]) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'a': Any})], TypedDict({'id': int})]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Blog(models.Model): text = models.CharField(max_length=100) - case: test_annotate_with_filter main: | from django.db import models from myapp.models import Blog qs = Blog.objects.annotate(xyz=models.Count("entry")) qs.filter(xyz=1) qs.filter(annotate_wrong__gt=5) # The `__in` lookup expects an iterable of the field type. # Regression test for https://github.com/typeddjango/django-stubs/issue/xxxx qs.filter(xyz__in=[1, 2, 3]) qs.filter(xyz__in=(1, 2, 3)) qs.filter(xyz__in=range(4)) qs.filter(xyz__in=123) qs.filter(xyz__in=None) qs.filter(xyz__in="abc") qs.filter(xyz__in=(Blog(),)) qs.filter(xyz__in=[Blog()]) # Doesn't error because mypy sees the provided type as `list[Any]`. blogs: list[Blog] = [Blog()] qs.filter(xyz__in=blogs) # But this does error as `blogs` is explicitly `list[Blog]`. qs2 = qs.alias(alias_entries=models.Count("entry")) qs2.filter(alias_entries__gt=5) qs2.filter(alias_wrong__gt=5, annotate_wrong__gt=5) Blog.objects.annotate().filter(xyz=1) ( Blog.objects.filter(xyz=1) .annotate(xyz=models.Count("entry")) .filter(xyz=1) ) out: | main:6: error: Cannot resolve keyword 'annotate_wrong' into field. Choices are: entry, id, xyz [misc] main:13: error: Incompatible type for lookup 'xyz__in': (got "int", expected "Iterable[int]") [misc] main:14: error: Incompatible type for lookup 'xyz__in': (got "None", expected "Iterable[int]") [misc] main:15: error: Incompatible type for lookup 'xyz__in': (got "str", expected "Iterable[int]") [misc] main:15: note: Following member(s) of "str" have conflicts: main:15: note: Expected: main:15: note: def __iter__(self) -> Iterator[int] main:15: note: Got: main:15: note: def __iter__(self) -> Iterator[str] main:16: error: Incompatible type for lookup 'xyz__in': (got "tuple[Blog]", expected "Iterable[int]") [misc] main:19: error: Incompatible type for lookup 'xyz__in': (got "list[Blog]", expected "Iterable[int]") [misc] main:23: error: Cannot resolve keyword 'alias_wrong' into field. Choices are: entry, id, xyz, alias_entries [misc] main:23: error: Cannot resolve keyword 'annotate_wrong' into field. Choices are: entry, id, xyz, alias_entries [misc] main:25: error: Cannot resolve keyword 'xyz' into field. Choices are: entry, id [misc] main:27: error: Cannot resolve keyword 'xyz' into field. Choices are: entry, id [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Blog(models.Model): pass class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) - case: test_annotate_allows_any_lookups_in_filter main: | from typing_extensions import reveal_type from django.db import models from myapp.models import Blog qs = Blog.objects.annotate(distance=0) reveal_type(qs) reveal_type(qs.filter(distance=10)) reveal_type(qs.filter(distance__lt=10)) qs.filter(distance__lt__lt=10) qs.filter(distance__unknown_lookup=10) out: | main:6: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'distance': Any})], myapp.models.Blog@AnnotatedWith[TypedDict({'distance': Any})]]" main:7: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'distance': Any})], myapp.models.Blog@AnnotatedWith[TypedDict({'distance': Any})]]" main:8: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog@AnnotatedWith[TypedDict({'distance': Any})], myapp.models.Blog@AnnotatedWith[TypedDict({'distance': Any})]]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Blog(models.Model): pass - case: test_annotate_existing_field installed_apps: - django.contrib.auth - django.contrib.contenttypes main: | from typing import Any from typing_extensions import TypedDict from django.db import models from django.db.models import Prefetch, F, QuerySet from django.contrib.auth.models import User, Group from django_stubs_ext.annotations import WithAnnotations # Error on existing field / remapped field / previous annotation User.objects.annotate(username=F("username")) # E: Attribute "username" already defined on "django.contrib.auth.models.User" [no-redef] User.objects.values(foo=F("id")).annotate(foo=F("username")) # E: Attribute "foo" already defined on "django.contrib.auth.models.User" [no-redef] User.objects.annotate(computed=F('id')).annotate(computed=F('username')) # E: Attribute "computed" already defined on "django.contrib.auth.models.User@AnnotatedWith[TypedDict({'computed': Any})]" [no-redef] # Should be ok if filtered with `values` / `values_list` User.objects.values_list("id").annotate(username=F("username")) User.objects.values("id").annotate(username=F("username")) User.objects.values_list("id", named=True).annotate(username=F("username")) def get_with_values_list() -> QuerySet[User, tuple[int]]: return User.objects.values_list("id") get_with_values_list().annotate(username=F("username")) class OnlyIdDict(TypedDict): id: int def get_with_values() -> QuerySet[User, OnlyIdDict]: return User.objects.values("id") get_with_values().annotate(username=F("username")) # But still cause issue if overlapping with other symbols (methods, ...) User.objects.values_list("id").annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef] User.objects.values("id").annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef] # No false positive on approximative row types tuple_any_row: models.QuerySet[User, tuple[Any, ...]] tuple_any_row.annotate(username=F("username")) any_row: models.QuerySet[User, Any] any_row.annotate(username=F("username")) dict_row: models.QuerySet[User, dict] dict_row.annotate(username=F("username")) # Ensure collisions with methods are still errors in approximate contexts get_with_values_list().annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef] tuple_any_row.annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef] any_row.annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef] dict_row.annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef] # Named values_list # Test name collision with model methods in named values_list - should still error User.objects.values_list("id", named=True).annotate(get_full_name=F("username")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef] User.objects.values_list("username", named=True).annotate(get_full_name=F("first_name")) # E: Attribute "get_full_name" already defined on "django.contrib.auth.models.User" [no-redef] User.objects.values_list("id", named=True).annotate(is_anonymous=F("username")) # E: Attribute "is_anonymous" already defined on "django.contrib.auth.models.User" [no-redef] # Test name collision with model fields when field is NOT in values_list - should be OK User.objects.values_list("id", named=True).annotate(username=F("first_name")) User.objects.values_list("first_name", named=True).annotate(username=F("last_name")) # Test name collision with model fields when field IS in values_list - should error User.objects.values_list("username", named=True).annotate(username=F("first_name")) # E: Attribute "username" already defined on "django.contrib.auth.models.User" [no-redef] User.objects.values_list("id", "username", named=True).annotate(username=F("first_name")) # E: Attribute "username" already defined on "django.contrib.auth.models.User" [no-redef] # Regression test for https://github.com/typeddjango/django-stubs/issues/3098 # __isnull lookup on annotated fields should expect bool, not the annotation type - case: test_annotated_field_lookup_type_checking_ok main: | from uuid import UUID from typing_extensions import TypedDict from django.db.models import QuerySet from django_stubs_ext import WithAnnotations from myapp.models import MyModel class MyAnnotations(TypedDict): scan_id: UUID | None AnnotatedModel = WithAnnotations[MyModel, MyAnnotations] def filter_annotated(qs: QuerySet[AnnotatedModel]) -> QuerySet[AnnotatedModel]: # __isnull lookup should accept bool, not UUID return qs.filter(scan_id__isnull=True) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): name = models.CharField(max_length=100) # Test that lookups on annotated fields check argument types - case: test_annotated_field_lookup_type_checking_error main: | from typing_extensions import TypedDict from django.db.models import QuerySet from django_stubs_ext import WithAnnotations from myapp.models import MyModel class MyAnnotations(TypedDict): total: int AnnotatedModel = WithAnnotations[MyModel, MyAnnotations] def filter_annotated(qs: QuerySet[AnnotatedModel]) -> QuerySet[AnnotatedModel]: # Invalid: str argument for __gt lookup should error qs.filter(total__gt=10) return qs.filter(total__gt="not a number") # E: Incompatible type for lookup 'total__gt': (got "str", expected "int") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): name = models.CharField(max_length=100) - case: annotate_on_implicitly_generic_custom_queryset main: | from typing_extensions import reveal_type from myapp.models import MyModel from django.db.models import Count qs = MyModel.objects.all().annotate(num_items=Count("id")) obj = qs.get() reveal_type(obj.num_items) # N: Revealed type is "int" obj.nonexistent # E: "MyModel@AnnotatedWith[TypedDict({'num_items': int})]" has no attribute "nonexistent" [attr-defined] # Custom queryset methods remain available after annotate qs.custom_method() installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from typing_extensions import Self class MyQuerySet(models.QuerySet): def custom_method(self) -> Self: return self.filter(name="test") MyManager = models.Manager.from_queryset(MyQuerySet) class MyModel(models.Model): name = models.CharField(max_length=100) objects = MyManager() - case: annotate_resolves_output_field_type_from_classvar main: | from typing_extensions import reveal_type from myapp.models import User from django.db.models import Count, Exists, OuterRef from django.db.models.functions import Length, Now, Right, TruncDate, TruncTime # Count has output_field: ClassVar[IntegerField] → int user_count = User.objects.annotate(user_count=Count('id')).get().user_count reveal_type(user_count) # N: Revealed type is "int" # Exists has output_field: ClassVar[BooleanField] → bool has_users = User.objects.annotate(has_users=Exists(User.objects.filter(pk=OuterRef('pk')))).get().has_users reveal_type(has_users) # N: Revealed type is "bool" # Length has output_field: ClassVar[IntegerField] → int name_len = User.objects.annotate(name_len=Length('username')).get().name_len reveal_type(name_len) # N: Revealed type is "int" # Now has output_field: ClassVar[DateTimeField] → datetime current_time = User.objects.annotate(current_time=Now()).get().current_time reveal_type(current_time) # N: Revealed type is "datetime.datetime" # Right (inherits from Left) has output_field: ClassVar[CharField] → str suffix = User.objects.annotate(suffix=Right('username', 3)).get().suffix reveal_type(suffix) # N: Revealed type is "str" # TruncDate has output_field: ClassVar[DateField] → date created_date = User.objects.annotate(created_date=TruncDate('created_at')).get().created_date reveal_type(created_date) # N: Revealed type is "datetime.date" # TruncTime has output_field: ClassVar[TimeField] → time created_time = User.objects.annotate(created_time=TruncTime('created_at')).get().created_time reveal_type(created_time) # N: Revealed type is "datetime.time" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) created_at = models.DateTimeField() - case: annotate_resolves_output_field_from_property main: | from typing_extensions import reveal_type from myapp.models import User from django.contrib.postgres.aggregates import ArrayAgg from django.contrib.postgres.expressions import ArraySubquery # ArrayAgg has output_field as @property → ArrayField → list[Any] usernames = User.objects.annotate(usernames=ArrayAgg('username')).get().usernames reveal_type(usernames) # N: Revealed type is "list[Any]" # ArraySubquery has output_field as @cached_property → ArrayField → list[Any] sub_ids = User.objects.annotate(sub_ids=ArraySubquery(User.objects.values('id'))).get().sub_ids reveal_type(sub_ids) # N: Revealed type is "list[Any]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) - case: annotate_resolves_output_field_from_subquery_generic main: | from typing_extensions import reveal_type from myapp.models import User from django.db.models import Subquery, OuterRef, IntegerField, CharField, Exists # Subquery with explicit output_field=IntegerField() → int int_subquery = Subquery(User.objects.filter(pk=OuterRef('pk')).values('id')[:1], output_field=IntegerField()) val_int = User.objects.annotate(val=int_subquery).get().val reveal_type(val_int) # N: Revealed type is "int" # Subquery with explicit output_field=CharField() → str char_subquery = Subquery(User.objects.filter(pk=OuterRef('pk')).values('username')[:1], output_field=CharField()) val_str = User.objects.annotate(val=char_subquery).get().val reveal_type(val_str) # N: Revealed type is "str" # Subquery with nullable output_field → int | None nullable_sub = Subquery(User.objects.filter(pk=OuterRef('pk')).values('id')[:1], output_field=IntegerField(null=True)) val_nullable = User.objects.annotate(val=nullable_sub).get().val reveal_type(val_nullable) # N: Revealed type is "int | None" # Subquery without output_field → Any plain_subquery = Subquery(User.objects.filter(pk=OuterRef('pk')).values('id')[:1]) val_any = User.objects.annotate(val=plain_subquery).get().val reveal_type(val_any) # N: Revealed type is "Any" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) - case: annotate_resolves_output_field_from_func_generic main: | from typing_extensions import reveal_type from myapp.models import User from django.db.models import BinaryField from django.db.models.functions import Substr, Left, Right # Substr with explicit output_field=BinaryField() via variable sub = Substr("username", 1, 100, output_field=BinaryField()) val = User.objects.annotate(preview=sub).get().preview reveal_type(val) # N: Revealed type is "bytes | memoryview[int]" # Substr with explicit output_field=BinaryField() inlined val2 = User.objects.annotate(preview=Substr("username", 1, 100, output_field=BinaryField())).get().preview reveal_type(val2) # N: Revealed type is "bytes | memoryview[int]" # Left with explicit output_field=BinaryField() left_expr = Left("username", 5, output_field=BinaryField()) left_val = User.objects.annotate(prefix=left_expr).get().prefix reveal_type(left_val) # N: Revealed type is "bytes | memoryview[int]" # Right with explicit output_field=BinaryField() right_expr = Right("username", 5, output_field=BinaryField()) right_val = User.objects.annotate(suffix=right_expr).get().suffix reveal_type(right_val) # N: Revealed type is "bytes | memoryview[int]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) - case: test_values_and_values_list_on_with_annotations_queryset main: | from typing_extensions import TypedDict, reveal_type from django.db.models import QuerySet from django_stubs_ext import WithAnnotations from myapp.models import MyModel class MyAnnotations(TypedDict): extra_id: int | None AnnotatedModel = WithAnnotations[MyModel, MyAnnotations] def get_qs() -> QuerySet[AnnotatedModel]: raise NotImplementedError qs = get_qs() # .values() with annotation field should produce a TypedDict values_result = qs.values("extra_id").get() reveal_type(values_result) # N: Revealed type is "TypedDict({'extra_id': int | None})" # .values() with model field should still work model_field_values = qs.values("name").get() reveal_type(model_field_values) # N: Revealed type is "TypedDict({'name': str})" # .values() with both model and annotation fields mixed_values = qs.values("name", "extra_id").get() reveal_type(mixed_values) # N: Revealed type is "TypedDict({'name': str, 'extra_id': int | None})" # .values() with no params on annotated queryset includes model + annotation fields bare_values = qs.values().get() reveal_type(bare_values) # N: Revealed type is "TypedDict({'id': int, 'name': str, 'extra_id': int | None})" # .values_list() with annotation field should resolve its type vl_annotation = qs.values_list("extra_id").get() reveal_type(vl_annotation) # N: Revealed type is "tuple[int | None]" # .values_list() with model field should still work vl_model = qs.values_list("name").get() reveal_type(vl_model) # N: Revealed type is "tuple[str]" # .values_list() with both model and annotation fields vl_mixed = qs.values_list("name", "extra_id").get() reveal_type(vl_mixed) # N: Revealed type is "tuple[str, int | None]" # .values_list(flat=True) with annotation field vl_flat = qs.values_list("extra_id", flat=True).get() reveal_type(vl_flat) # N: Revealed type is "int | None" # .values_list(named=True) with annotation field vl_named = qs.values_list("name", "extra_id", named=True).get() reveal_type(vl_named.name) # N: Revealed type is "str" reveal_type(vl_named.extra_id) # N: Revealed type is "int | None" # .values_list(named=True) with no params merges model + annotation fields vl_named_bare = qs.values_list(named=True).get() reveal_type(vl_named_bare.name) # N: Revealed type is "str" reveal_type(vl_named_bare.extra_id) # N: Revealed type is "int | None" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): name = models.CharField(max_length=100) # Regression test from https://github.com/typeddjango/django-stubs/issues/1049 - case: custom_queryset_with_annotations_issue_1049 main: | from typing_extensions import reveal_type from myapp.models import Accommodation, SomeQuerySet from django.db.models import Value queryset = SomeQuerySet().annotate(hello=Value(True)).filter(is_on_shelf=True).annotate(hi=Value(False)) reveal_type(queryset) # N: Revealed type is "myapp.models.SomeQuerySet[myapp.models.Accommodation@AnnotatedWith[TypedDict({'hello': Any, 'hi': Any})], myapp.models.Accommodation@AnnotatedWith[TypedDict({'hello': Any, 'hi': Any})]]" reveal_type(queryset.first()) # N: Revealed type is "myapp.models.Accommodation@AnnotatedWith[TypedDict({'hello': Any, 'hi': Any})] | None" reveal_type(queryset.get(pk=1)) # N: Revealed type is "myapp.models.Accommodation@AnnotatedWith[TypedDict({'hello': Any, 'hi': Any})]" reveal_type(queryset[0]) # N: Revealed type is "myapp.models.Accommodation@AnnotatedWith[TypedDict({'hello': Any, 'hi': Any})]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Accommodation(models.Model): is_on_shelf = models.BooleanField() class SomeQuerySet(models.QuerySet["Accommodation"]): pass - case: annotate_does_not_leak_across_functions main: | from typing_extensions import reveal_type from myapp.models import consume reveal_type(consume()) # N: Revealed type is "myapp.models.Book | None" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import reveal_type from django.db import models from django.db.models import F class BookQuerySet(models.QuerySet["Book"]): pass class Book(models.Model): name = models.CharField(max_length=100) author = models.CharField(max_length=100) objects = models.Manager.from_queryset(BookQuerySet)() def leak() -> None: Book.objects.annotate(dupe_author=F("name")) def consume() -> "Book | None": book: Book | None = None if True: book = Book.objects.filter(name="foo").first() reveal_type(book) # N: Revealed type is "myapp.models.Book | None" if not book: book = Book(name="foo", author="bar") return book - case: custom_queryset_method_with_annotations main: | from typing_extensions import reveal_type from myapp.models import FooModel from django.db.models.expressions import F # Simple method qs = FooModel.objects.with_bar() reveal_type(qs) # N: Revealed type is "myapp.models.FooQuerySet[myapp.models.FooModel@AnnotatedWith[TypedDict(myapp.models.BarDict, {'bar': str})], myapp.models.FooModel@AnnotatedWith[TypedDict(myapp.models.BarDict, {'bar': str})]]" obj = qs.get() reveal_type(obj.bar) # N: Revealed type is "str" reveal_type(obj.name) # N: Revealed type is "str" obj.nonexistent # E: "FooModel@AnnotatedWith[BarDict]" has no attribute "nonexistent" [attr-defined] # Chained methods qs2 = FooModel.objects.with_bar().with_baz() reveal_type(qs2) # N: Revealed type is "myapp.models.FooQuerySet[myapp.models.FooModel@AnnotatedWith[TypedDict({'bar': str, 'baz': int})], myapp.models.FooModel@AnnotatedWith[TypedDict({'bar': str, 'baz': int})]]" obj2 = qs2[0] reveal_type(obj2.bar) # N: Revealed type is "str" reveal_type(obj2.baz) # N: Revealed type is "int" reveal_type(obj2.name) # N: Revealed type is "str" # Chained with regular methods filtered = FooModel.objects.with_bar().filter(name="x") maybe = filtered.first() reveal_type(maybe) # N: Revealed type is "myapp.models.FooModel@AnnotatedWith[TypedDict(myapp.models.BarDict, {'bar': str})] | None" if maybe: reveal_type(maybe.bar) # N: Revealed type is "str" reveal_type(maybe.name) # N: Revealed type is "str" # Built-in .annotate() then custom method mixed = FooModel.objects.annotate(extra=F("id")).with_bar() mixed_obj = mixed.get() reveal_type(mixed_obj.extra) # N: Revealed type is "Any" reveal_type(mixed_obj.bar) # N: Revealed type is "str" # Instance extraction propagate annotations correctly qs3 = FooModel.objects.with_bar() reveal_type(qs3.get().bar) # N: Revealed type is "str" reveal_type(qs3[0].bar) # N: Revealed type is "str" first = qs3.first() if first: reveal_type(first.bar) # N: Revealed type is "str" for item in qs3: reveal_type(item.bar) # N: Revealed type is "str" break # later annotation overrides collision = FooModel.objects.with_bar().with_bar_int() reveal_type(collision.get().bar) # N: Revealed type is "int" # Custom method without WithAnnotations: noop plain = FooModel.objects.active() reveal_type(plain) # N: Revealed type is "myapp.models.FooQuerySet[myapp.models.FooModel]" # Custom then .annotate() then custom: all three layers merge triple = FooModel.objects.with_bar().annotate(extra=F("id")).with_baz() triple_obj = triple.get() reveal_type(triple_obj.bar) # N: Revealed type is "str" reveal_type(triple_obj.extra) # N: Revealed type is "Any" reveal_type(triple_obj.baz) # N: Revealed type is "int" # Works on queryset too triple = FooModel.objects.all().with_bar().annotate(extra=F("id")).with_baz() triple_obj = triple.get() reveal_type(triple_obj.bar) # N: Revealed type is "str" reveal_type(triple_obj.extra) # N: Revealed type is "Any" reveal_type(triple_obj.baz) # N: Revealed type is "int" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import TypedDict, TypeVar, Self from django.db import models from django_stubs_ext import WithAnnotations class BarDict(TypedDict): bar: str class BazDict(TypedDict): baz: int class BarIntDict(TypedDict): bar: int _Model = TypeVar("_Model", bound=models.Model, covariant=True) class FooQuerySet(models.QuerySet[_Model]): def with_bar(self) -> "FooQuerySet[WithAnnotations[_Model, BarDict]]": return self.annotate(bar=models.Value("x")) def with_baz(self) -> "FooQuerySet[WithAnnotations[_Model, BazDict]]": return self.annotate(baz=models.Value(1)) def with_bar_int(self) -> "FooQuerySet[WithAnnotations[_Model, BarIntDict]]": return self.annotate(bar=models.Value(1)) def active(self) -> Self: return self.filter(active=True) FooManager = models.Manager.from_queryset(FooQuerySet) class FooModel(models.Model): name = models.CharField(max_length=100) objects = FooManager() # Regression test from https://github.com/typeddjango/django-stubs/issues/2681#issuecomment-3610917062 - case: custom_queryset_with_annotations_issue_2681_comment main: | from typing_extensions import reveal_type from myapp.models import FooModel reveal_type(FooModel.objects.with_bar()) # N: Revealed type is "myapp.models.FooQuerySet[myapp.models.FooModel@AnnotatedWith[TypedDict(myapp.models.BarDict, {'bar': str})], myapp.models.FooModel@AnnotatedWith[TypedDict(myapp.models.BarDict, {'bar': str})]]" reveal_type(FooModel.objects.with_bar().with_baz()) # N: Revealed type is "myapp.models.FooQuerySet[myapp.models.FooModel@AnnotatedWith[TypedDict({'bar': str, 'baz': str})], myapp.models.FooModel@AnnotatedWith[TypedDict({'bar': str, 'baz': str})]]" obj = FooModel.objects.with_bar().with_baz().get() reveal_type(obj.bar) # N: Revealed type is "str" reveal_type(obj.baz) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import TypedDict, TypeVar from django.db import models from django.db.models import Manager from django_stubs_ext import WithAnnotations class BarDict(TypedDict): bar: str class BazDict(TypedDict): baz: str _Model = TypeVar("_Model", bound=models.Model, covariant=True) class FooQuerySet(models.QuerySet[_Model]): def with_bar(self) -> "FooQuerySet[WithAnnotations[_Model, BarDict]]": return self.annotate(bar=models.Value("bar")) def with_baz(self) -> "FooQuerySet[WithAnnotations[_Model, BazDict]]": return self.annotate(baz=models.Value("baz")) FooManager = Manager.from_queryset(FooQuerySet) class FooModel(models.Model): objects = FooManager() - case: values_then_annotate_on_generic_queryset_typevar main: | from typing import Any from typing_extensions import reveal_type, TypeVar from django.db import models _Model = TypeVar("_Model", bound=models.Model) def latest_max(qs: models.QuerySet[_Model]) -> dict[str, Any] | None: annotated = qs.values("id").annotate(foo=models.Max("id")) reveal_type(annotated) # N: Revealed type is "django.db.models.query.QuerySet[django.db.models.base.Model, dict[str, Any]]" return annotated.first() typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_as_manager.yml000066400000000000000000000700021526064357400317050ustar00rootroot00000000000000- case: self_return_management main: | from typing_extensions import reveal_type from myapp.models import MyModel, MyModelWithoutSelf reveal_type(MyModel.objects.example_simple()) # N: Revealed type is "myapp.models.MyQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.example_list()) # N: Revealed type is "list[myapp.models.MyQuerySet[myapp.models.MyModel]]" reveal_type(MyModel.objects.example_simple().just_int()) # N: Revealed type is "int" reveal_type(MyModel.objects.example_dict()) # N: Revealed type is "dict[str, myapp.models.MyQuerySet[myapp.models.MyModel]]" reveal_type(MyModelWithoutSelf.objects.method()) # N: Revealed type is "myapp.models.QuerySetWithoutSelf[myapp.models.MyModelWithoutSelf, myapp.models.MyModelWithoutSelf]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from typing import ClassVar from typing_extensions import Self, TypeVar M = TypeVar("M", bound=models.Model, covariant=True) class BaseQuerySet(models.QuerySet[M]): def example_dict(self) -> dict[str, Self]: raise NotImplementedError class MyQuerySet(BaseQuerySet[M]): def example_simple(self) -> Self: raise NotImplementedError def example_list(self) -> list[Self]: raise NotImplementedError def just_int(self) -> int: raise NotImplementedError class MyModel(models.Model): objects = MyQuerySet.as_manager() class QuerySetWithoutSelf(models.QuerySet["MyModelWithoutSelf"]): def method(self) -> "QuerySetWithoutSelf": return self class MyModelWithoutSelf(models.Model): objects = QuerySetWithoutSelf.as_manager() - case: overridden_as_manager_still_generates_manager main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromMyQuerySet[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from typing import Any from typing_extensions import override class MyQuerySet(models.QuerySet): @classmethod @override def as_manager(cls) -> "models.Manager[Any]": return super().as_manager() class MyModel(models.Model): objects = MyQuerySet.as_manager() - case: overridden_as_manager_returning_custom_manager main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.CustomManagerFromMyQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.manager_method()) # N: Revealed type is "str" reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "int" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from typing_extensions import override class CustomManager(models.Manager): def manager_method(self) -> str: return "" class MyQuerySet(models.QuerySet["MyModel"]): def queryset_method(self) -> int: return 0 @classmethod @override def as_manager(cls) -> "CustomManager": return CustomManager.from_queryset(cls)() class MyModel(models.Model): objects = MyQuerySet.as_manager() - case: overridden_as_manager_in_other_module_with_module_private_typevar main: | from myapp.models import MyModel installed_apps: - django.contrib.contenttypes - myapp files: - path: lib/__init__.py - path: lib/query.py content: | from typing import TypeVar from django.db import models from typing_extensions import override _T = TypeVar("_T", bound=models.Model) class LibQuerySet(models.QuerySet[_T]): @classmethod @override def as_manager(cls) -> "models.Manager[_T]": return models.Manager.from_queryset(cls)() - path: myapp/__init__.py - path: myapp/models.py content: | from django.contrib.contenttypes.models import ContentType from django.db import models from lib.query import LibQuerySet class MyModel(models.Model): ctype = models.ForeignKey(ContentType, on_delete=models.CASCADE) class MyQuerySet(LibQuerySet): pass - case: declares_manager_type_like_django main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromMyQuerySet[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyQuerySet(models.QuerySet): ... class MyModel(models.Model): objects = MyQuerySet.as_manager() - case: includes_django_methods_returning_queryset main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects.none) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.all) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import TypeVar from django.db import models M = TypeVar("M", bound=models.Model, covariant=True) class MyQuerySet(models.QuerySet[M]): ... class MyModel(models.Model): objects = MyQuerySet.as_manager() - case: model_gets_generated_manager_as_default_manager main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "str" reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ModelQuerySet(models.QuerySet): def queryset_method(self) -> str: return 'hello' class MyModel(models.Model): objects = ModelQuerySet.as_manager() - case: resolves_name_collision_with_other_module_level_object main: | from typing_extensions import reveal_type from myapp.models import MyModel, ManagerFromModelQuerySet reveal_type(ManagerFromModelQuerySet) # N: Revealed type is "int" reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet1[myapp.models.MyModel]" reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet1[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models ManagerFromModelQuerySet = 1 class ModelQuerySet(models.QuerySet): ... class MyModel(models.Model): objects = ModelQuerySet.as_manager() - case: includes_custom_queryset_methods main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects.custom_queryset_method()) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.all().custom_queryset_method()) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.returns_int_sequence()) # N: Revealed type is "typing.Sequence[int]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from collections.abc import Sequence from django.db import models class ModelQuerySet(models.QuerySet["MyModel"]): def custom_queryset_method(self) -> "ModelQuerySet": return self.all() def returns_int_sequence(self) -> Sequence[int]: return [1] class MyModel(models.Model): objects = ModelQuerySet.as_manager() - case: includes_custom_queryset_methods_on_unions main: | from typing_extensions import reveal_type from myapp.models import MyModel1, MyModel2 kls: type[MyModel1 | MyModel2] = MyModel1 reveal_type(kls.objects.custom_queryset_method()) # N: Revealed type is "myapp.models.ModelQuerySet1[myapp.models.MyModel1, myapp.models.MyModel1] | myapp.models.ModelQuerySet2[myapp.models.MyModel2, myapp.models.MyModel2]" reveal_type(kls.objects.all().custom_queryset_method()) # N: Revealed type is "myapp.models.ModelQuerySet1[myapp.models.MyModel1, myapp.models.MyModel1] | myapp.models.ModelQuerySet2[myapp.models.MyModel2, myapp.models.MyModel2]" reveal_type(kls.objects.returns_thing()) # N: Revealed type is "int | str" reveal_type(kls.objects.get()) # N: Revealed type is "myapp.models.MyModel1 | myapp.models.MyModel2" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from collections.abc import Sequence from django.db import models class ModelQuerySet1(models.QuerySet["MyModel1"]): def custom_queryset_method(self) -> "ModelQuerySet1": return self.all() def returns_thing(self) -> int: return 1 class ModelQuerySet2(models.QuerySet["MyModel2"]): def custom_queryset_method(self) -> "ModelQuerySet2": return self.all() def returns_thing(self) -> str: return "asdf" class MyModel1(models.Model): objects = ModelQuerySet1.as_manager() class MyModel2(models.Model): objects = ModelQuerySet2.as_manager() - case: handles_call_outside_of_model_class_definition main: | from typing_extensions import reveal_type from myapp.models import MyModel, MyModelManager reveal_type(MyModelManager) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[Any]" reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.all()) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ModelQuerySet(models.QuerySet["MyModel"]): ... MyModelManager = ModelQuerySet.as_manager() class MyModel(models.Model): objects = MyModelManager - case: handles_name_collision_when_declared_outside_of_model_class_body main: | from typing_extensions import reveal_type from myapp.models import MyModel, ManagerFromModelQuerySet reveal_type(ManagerFromModelQuerySet) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet1[Any]" reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet1[myapp.models.MyModel]" reveal_type(MyModel.objects.all()) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ModelQuerySet(models.QuerySet["MyModel"]): ... ManagerFromModelQuerySet = ModelQuerySet.as_manager() class MyModel(models.Model): objects = ManagerFromModelQuerySet - case: handles_type_var_in_subclasses_of_subclasses_of_queryset main: | from typing_extensions import reveal_type from myapp.models import MyModel, MyOtherModel reveal_type(MyModel.objects.example_2()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.example()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.example_2()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.override()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.override2()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.dummy_override()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.example_mixin(MyModel())) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.example_other_mixin()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.example_union()) # N: Revealed type is "myapp.models.MyModel | list[myapp.models.MyModel]" reveal_type(MyOtherModel.objects.example()) # N: Revealed type is "myapp.models.MyOtherModel" reveal_type(MyOtherModel.objects.example_2()) # N: Revealed type is "myapp.models.MyOtherModel" reveal_type(MyOtherModel.objects.override()) # N: Revealed type is "myapp.models.MyOtherModel" reveal_type(MyOtherModel.objects.override2()) # N: Revealed type is "myapp.models.MyOtherModel" reveal_type(MyOtherModel.objects.dummy_override()) # N: Revealed type is "myapp.models.MyOtherModel" reveal_type(MyOtherModel.objects.example_mixin(MyOtherModel())) # N: Revealed type is "myapp.models.MyOtherModel" reveal_type(MyOtherModel.objects.example_other_mixin()) # N: Revealed type is "myapp.models.MyOtherModel" reveal_type(MyOtherModel.objects.test_self()) # N: Revealed type is "myapp.models._MyModelQuerySet2[myapp.models.MyOtherModel]" reveal_type(MyOtherModel.objects.test_sub_self()) # N: Revealed type is "myapp.models._MyModelQuerySet2[myapp.models.MyOtherModel]" reveal_type(MyOtherModel.objects.example_union()) # N: Revealed type is "myapp.models.MyOtherModel | list[myapp.models.MyOtherModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import Generic from django.db import models from typing_extensions import Self, TypeVar, override as typing_override T = TypeVar("T", bound=models.Model) T_2 = TypeVar("T_2", bound=models.Model) class SomeMixin: def example_mixin(self, a: T) -> T: raise NotImplementedError class OtherMixin(models.QuerySet[T]): def example_other_mixin(self) -> T: raise NotImplementedError def example_union(self) -> T | list[T]: raise NotImplementedError class _MyModelQuerySet(OtherMixin[T], models.QuerySet[T], Generic[T]): def example(self) -> T: raise NotImplementedError def override(self) -> T: raise NotImplementedError def override2(self) -> T: raise NotImplementedError def dummy_override(self) -> int: raise NotImplementedError def test_sub_self(self) -> Self: raise NotImplementedError class _MyModelQuerySet2(SomeMixin, _MyModelQuerySet[T_2]): def example_2(self) -> T_2: raise NotImplementedError @typing_override def override(self) -> T_2: raise NotImplementedError @typing_override def override2(self) -> T_2: raise NotImplementedError @typing_override def dummy_override(self) -> T_2: # type: ignore[override] raise NotImplementedError def test_self(self) -> Self: raise NotImplementedError class MyModelQuerySet(_MyModelQuerySet2["MyModel"]): @typing_override def override(self) -> "MyModel": raise NotImplementedError class MyModel(models.Model): objects = MyModelQuerySet.as_manager() class MyOtherModel(models.Model): objects = _MyModelQuerySet2.as_manager() - case: handles_type_vars main: | from typing_extensions import reveal_type from myapp.models import MyModel, BaseQuerySet reveal_type(MyModel.objects.example()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.example_list()) # N: Revealed type is "list[myapp.models.MyModel]" reveal_type(MyModel.objects.example_type()) # N: Revealed type is "type[myapp.models.MyModel]" reveal_type(MyModel.objects.example_tuple_simple()) # N: Revealed type is "tuple[myapp.models.MyModel]" reveal_type(MyModel.objects.example_tuple_list()) # N: Revealed type is "tuple[myapp.models.MyModel, ...]" reveal_type(MyModel.objects.example_tuple_double()) # N: Revealed type is "tuple[int, myapp.models.MyModel]" reveal_type(MyModel.objects.example_class()) # N: Revealed type is "myapp.models.Example[myapp.models.MyModel]" reveal_type(MyModel.objects.example_type_class()) # N: Revealed type is "type[myapp.models.Example[myapp.models.MyModel]]" reveal_type(MyModel.objects.example_collection()) # N: Revealed type is "typing.Collection[myapp.models.MyModel]" reveal_type(MyModel.objects.example_set()) # N: Revealed type is "set[myapp.models.MyModel]" reveal_type(MyModel.objects.example_dict()) # N: Revealed type is "dict[str, myapp.models.MyModel]" reveal_type(MyModel.objects.example_list_dict()) # N: Revealed type is "list[dict[str, myapp.models.MyModel]]" class TestQuerySet(BaseQuerySet[str]): ... # E: Type argument "str" of "BaseQuerySet" must be a subtype of "Model" [type-var] reveal_type(MyModel.objects.example_t(5)) # N: Revealed type is "int" MyModel.objects.example_arg(5, "5") # E: Argument 1 to "example_arg" of "BaseQuerySet" has incompatible type "int"; expected "MyModel" [arg-type] reveal_type(MyModel.objects.example_arg(MyModel(), "5")) # N: Revealed type is "myapp.models.MyModel" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from __future__ import annotations from collections.abc import Collection from typing import Generic from typing_extensions import TypeVar from django.db import models _CTE = TypeVar("_CTE", bound=models.Model) T = TypeVar("T") class Example(Generic[_CTE]): ... class BaseQuerySet(models.QuerySet[_CTE], Generic[_CTE]): def example(self) -> _CTE: raise NotImplementedError def example_list(self) -> list[_CTE]: raise NotImplementedError def example_type(self) -> type[_CTE]: raise NotImplementedError def example_tuple_simple(self) -> tuple[_CTE]: raise NotImplementedError def example_tuple_list(self) -> tuple[_CTE, ...]: raise NotImplementedError def example_tuple_double(self) -> tuple[int, _CTE]: raise NotImplementedError def example_class(self) -> Example[_CTE]: raise NotImplementedError def example_type_class(self) -> type[Example[_CTE]]: raise NotImplementedError def example_collection(self) -> Collection[_CTE]: raise NotImplementedError def example_set(self) -> set[_CTE]: raise NotImplementedError def example_dict(self) -> dict[str, _CTE]: raise NotImplementedError def example_list_dict(self) -> list[dict[str, _CTE]]: raise NotImplementedError def example_t(self, a: T) -> T: raise NotImplementedError def example_arg(self, a: _CTE, b: str) -> _CTE: raise NotImplementedError class MyModelQuerySet(BaseQuerySet["MyModel"]): ... class MyModel(models.Model): objects = MyModelQuerySet.as_manager() - case: reuses_generated_type_when_called_identically_for_multiple_managers main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects_1) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects_2) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects_1.all()) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects_2.all()) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ModelQuerySet(models.QuerySet["MyModel"]): ... class MyModel(models.Model): objects_1 = ModelQuerySet.as_manager() objects_2 = ModelQuerySet.as_manager() - case: generates_new_manager_class_when_name_colliding_with_explicit_manager main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet1[myapp.models.MyModel]" reveal_type(MyModel.objects.custom_method()) # N: Revealed type is "int" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ManagerFromModelQuerySet(models.Manager): ... class ModelQuerySet(models.QuerySet["MyModel"]): def custom_method(self) -> int: return 1 class MyModel(models.Model): objects = ModelQuerySet.as_manager() - case: handles_type_collision_with_from_queryset main: | from typing_extensions import reveal_type from myapp.models import MyModel, FromQuerySet reveal_type(FromQuerySet) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]" reveal_type(MyModel.from_queryset) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.as_manager) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ModelQuerySet(models.QuerySet["MyModel"]): ... FromQuerySet = models.Manager.from_queryset(ModelQuerySet) class MyModel(models.Model): from_queryset = FromQuerySet() as_manager = ModelQuerySet.as_manager() - case: nested_queryset_class_definition main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromMyQuerySet[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): class MyQuerySet(models.QuerySet): pass objects = MyQuerySet.as_manager() - case: queryset_as_manager_foreignkey_cycle main: | from typing_extensions import reveal_type from payments.models import Payout reveal_type(Payout.objects) # N: Revealed type is "payments.models.ManagerFromPayoutQuerySet[payments.models.Payout]" custom_settings: | INSTALLED_APPS = ("django.contrib.contenttypes", "django.contrib.auth", "payments", "accounts") AUTH_USER_MODEL = "accounts.Account" files: - path: payments/__init__.py - path: payments/models.py content: | from __future__ import annotations from typing_extensions import Self from django.contrib.auth import get_user_model from django.db import models UserModel = get_user_model() class Transaction(models.Model): user = models.ForeignKey( UserModel, on_delete=models.CASCADE, related_name="transactions" ) class PayoutQuerySet(models.QuerySet["Payout"]): def unapplied(self) -> Self: return self class Payout(models.Model): triggered_by = models.ForeignKey( Transaction, on_delete=models.CASCADE, related_name="payouts" ) objects = PayoutQuerySet.as_manager() - path: accounts/__init__.py - path: accounts/models.py content: | from django.contrib.auth.models import AbstractUser class Account(AbstractUser): pass typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_basic_methods.yml000066400000000000000000000512151526064357400324210ustar00rootroot00000000000000- case: queryset_missing_method main: | from typing_extensions import reveal_type from myapp.models import User reveal_type(User.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.User]" User.objects.not_existing_method() # E: "Manager[User]" has no attribute "not_existing_method" [attr-defined] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass - case: queryset_method_of_union main: | from typing_extensions import TypedDict, reveal_type from django.contrib.auth.models import User from django.db import models from myapp.models import MyModel1, MyModel2 kls: type[MyModel1 | MyModel2] = MyModel1 reveal_type(kls.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel1] | django.db.models.manager.Manager[myapp.models.MyModel2]" reveal_type(kls.objects.all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, myapp.models.MyModel1] | django.db.models.query.QuerySet[myapp.models.MyModel2, myapp.models.MyModel2]" reveal_type(kls.objects.get()) # N: Revealed type is "myapp.models.MyModel1 | myapp.models.MyModel2" # Regular QuerySet foos = MyModel1.objects.all() bars = MyModel2.objects.all() reveal_type(foos.union(bars)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, myapp.models.MyModel1]" reveal_type(foos.intersection(bars)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, myapp.models.MyModel1]" reveal_type(foos.difference(bars)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, myapp.models.MyModel1]" # `values_list()` QuerySet foos_list = MyModel1.objects.all().values_list("name") bars_list = MyModel2.objects.all().values_list("name") reveal_type(foos_list.union(bars_list)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, tuple[str]]" reveal_type(foos_list.intersection(bars_list)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, tuple[str]]" reveal_type(foos_list.difference(bars_list)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, tuple[str]]" def union_values_list() -> models.QuerySet[models.Model, tuple[str]]: union = foos_list.union(bars_list) return union # `values()` QuerySet -- One field, same name foos_dict = MyModel1.objects.all().values("name") bars_dict = MyModel2.objects.all().values("name") reveal_type(foos_dict.union(bars_dict)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str})]" reveal_type(foos_dict.intersection(bars_dict)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str})]" reveal_type(foos_dict.difference(bars_dict)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str})]" # `values()` QuerySet -- One field, different name, the first one takes precedence. # cf https://docs.djangoproject.com/en/stable/ref/models/querysets/#django.db.models.query.QuerySet.union foos_dict2 = MyModel1.objects.all().values("name") bars_dict2 = MyModel2.objects.all().values("id") reveal_type(foos_dict2.union(bars_dict2)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str})]" reveal_type(foos_dict2.intersection(bars_dict2)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str})]" reveal_type(foos_dict2.difference(bars_dict2)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str})]" # `values()` QuerySet -- Multiple field, same names foos_dict3 = MyModel1.objects.all().values("name", "id") bars_dict3 = MyModel2.objects.all().values("name", "id") reveal_type(foos_dict3.union(bars_dict3)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]" reveal_type(foos_dict3.intersection(bars_dict3)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]" reveal_type(foos_dict3.difference(bars_dict3)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]" # Mixing `values()` and `values_list()` is apparently ok and takes the type of the first queryset foos_dict4 = MyModel1.objects.all().values("name", "id") bars_list4 = MyModel2.objects.all().values_list("name", "id") reveal_type(foos_dict4.union(bars_list4)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]" reveal_type(foos_dict4.intersection(bars_list4)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]" reveal_type(foos_dict4.difference(bars_list4)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]" # TODO: Should be an error (mixed number of selected columns) -- runtime raises 'The used SELECT statements have a different number of columns' foos_dict5 = MyModel1.objects.all().values("name", "id") bars_dict5 = MyModel2.objects.all().values("name") reveal_type(foos_dict5.union(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]" reveal_type(foos_dict5.intersection(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]" reveal_type(foos_dict5.difference(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel1, TypedDict({'name': str, 'id': int})]" # TODO: Should be an error (mixed number of columns) -- runtime raises 'The used SELECT statements have a different number of columns' model2_qs = MyModel2.objects.all() user_qs = User.objects.all() reveal_type(model2_qs.union(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel2, myapp.models.MyModel2]" reveal_type(model2_qs.intersection(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel2, myapp.models.MyModel2]" reveal_type(model2_qs.difference(bars_dict5)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel2, myapp.models.MyModel2]" installed_apps: - django.contrib.auth - django.contrib.contenttypes - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel1(models.Model): name = models.TextField(blank=False, null=False) class MyModel2(models.Model): name = models.TextField(blank=False, null=False) - case: select_related_returns_queryset main: | from typing_extensions import reveal_type from myapp.models import Book reveal_type(Book.objects.select_related()) reveal_type(Book.objects.filter(pk=1).select_related()) Book.objects.select_related() Book.objects.all().select_related() Book.objects.select_related(None) Book.objects.all().select_related(None) Book.objects.select_related("author", "dd") # E: Invalid field name "dd" in select_related lookup. Choices are: author [misc] Book.objects.all().select_related("author", "dd") # E: Invalid field name "dd" in select_related lookup. Choices are: author [misc] Book.objects.select_related("None", None) Book.objects.all().select_related("None", None) Book.objects.select_related(1) Book.objects.all().select_related(1) Book.objects.select_related(True) Book.objects.all().select_related(True) out: | main:3: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, myapp.models.Book]" main:4: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, myapp.models.Book]" main:13: error: No overload variant of "select_related" of "Manager" matches argument types "str", "None" [call-overload] main:13: note: Possible overload variants: main:13: note: def select_related(self, None, /) -> QuerySet[Book, Book] main:13: note: def select_related(self, *fields: str) -> QuerySet[Book, Book] main:14: error: No overload variant of "select_related" of "QuerySet" matches argument types "str", "None" [call-overload] main:14: note: Possible overload variants: main:14: note: def select_related(self, None, /) -> QuerySet[Book, Book] main:14: note: def select_related(self, *fields: str) -> QuerySet[Book, Book] main:15: error: No overload variant of "select_related" of "Manager" matches argument type "int" [call-overload] main:15: note: Possible overload variants: main:15: note: def select_related(self, None, /) -> QuerySet[Book, Book] main:15: note: def select_related(self, *fields: str) -> QuerySet[Book, Book] main:16: error: No overload variant of "select_related" of "QuerySet" matches argument type "int" [call-overload] main:16: note: Possible overload variants: main:16: note: def select_related(self, None, /) -> QuerySet[Book, Book] main:16: note: def select_related(self, *fields: str) -> QuerySet[Book, Book] main:17: error: No overload variant of "select_related" of "Manager" matches argument type "bool" [call-overload] main:17: note: Possible overload variants: main:17: note: def select_related(self, None, /) -> QuerySet[Book, Book] main:17: note: def select_related(self, *fields: str) -> QuerySet[Book, Book] main:18: error: No overload variant of "select_related" of "QuerySet" matches argument type "bool" [call-overload] main:18: note: Possible overload variants: main:18: note: def select_related(self, None, /) -> QuerySet[Book, Book] main:18: note: def select_related(self, *fields: str) -> QuerySet[Book, Book] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Person(models.Model): pass class Book(models.Model): author = models.ForeignKey(Person, on_delete=models.CASCADE) - case: prefetch_related_returns_queryset main: | from typing_extensions import reveal_type from myapp.models import Book reveal_type(Book.objects.prefetch_related()) reveal_type(Book.objects.filter(pk=1).prefetch_related()) Book.objects.prefetch_related() Book.objects.all().prefetch_related() Book.objects.prefetch_related(None) Book.objects.all().prefetch_related(None) Book.objects.prefetch_related("author", "dd") # E: Cannot find "dd" on "Book" object, "dd" is an invalid parameter to "prefetch_related()" [misc] Book.objects.all().prefetch_related("author", "dd") # E: Cannot find "dd" on "Book" object, "dd" is an invalid parameter to "prefetch_related()" [misc] Book.objects.prefetch_related("None", None) Book.objects.all().prefetch_related("None", None) Book.objects.prefetch_related(1) Book.objects.all().prefetch_related(1) Book.objects.prefetch_related(True) Book.objects.all().prefetch_related(True) out: | main:3: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, myapp.models.Book]" main:4: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, myapp.models.Book]" main:13: error: No overload variant of "prefetch_related" of "Manager" matches argument types "str", "None" [call-overload] main:13: note: Possible overload variants: main:13: note: def prefetch_related(self, None, /) -> QuerySet[Book, Book] main:13: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[Book, Book] main:14: error: No overload variant of "prefetch_related" of "QuerySet" matches argument types "str", "None" [call-overload] main:14: note: Possible overload variants: main:14: note: def prefetch_related(self, None, /) -> QuerySet[Book, Book] main:14: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[Book, Book] main:15: error: No overload variant of "prefetch_related" of "Manager" matches argument type "int" [call-overload] main:15: note: Possible overload variants: main:15: note: def prefetch_related(self, None, /) -> QuerySet[Book, Book] main:15: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[Book, Book] main:16: error: No overload variant of "prefetch_related" of "QuerySet" matches argument type "int" [call-overload] main:16: note: Possible overload variants: main:16: note: def prefetch_related(self, None, /) -> QuerySet[Book, Book] main:16: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[Book, Book] main:17: error: No overload variant of "prefetch_related" of "Manager" matches argument type "bool" [call-overload] main:17: note: Possible overload variants: main:17: note: def prefetch_related(self, None, /) -> QuerySet[Book, Book] main:17: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[Book, Book] main:18: error: No overload variant of "prefetch_related" of "QuerySet" matches argument type "bool" [call-overload] main:18: note: Possible overload variants: main:18: note: def prefetch_related(self, None, /) -> QuerySet[Book, Book] main:18: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> QuerySet[Book, Book] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Person(models.Model): pass class Book(models.Model): author = models.ForeignKey(Person, on_delete=models.CASCADE) - case: prefetch_related_returns_raw_queryset main: | from myapp.models import Book raw_qs = Book.objects.raw("SELECT 1") raw_qs_from_manager = Book.objects.raw("SELECT 1") raw_qs_from_manager.prefetch_related() raw_qs.prefetch_related() raw_qs_from_manager.prefetch_related(None) raw_qs.prefetch_related(None) raw_qs_from_manager.prefetch_related("author", "dd") # Should be Error on invalid lookup 'dd' ! raw_qs.prefetch_related("author", "dd") # Should be Error on invalid lookup 'dd' ! raw_qs_from_manager.prefetch_related("None", None) raw_qs.prefetch_related("None", None) raw_qs_from_manager.prefetch_related(1) raw_qs.prefetch_related(1) raw_qs_from_manager.prefetch_related(True) raw_qs.prefetch_related(True) out: | main:12: error: No overload variant of "prefetch_related" of "RawQuerySet" matches argument types "str", "None" [call-overload] main:12: note: Possible overload variants: main:12: note: def prefetch_related(self, None, /) -> RawQuerySet[Book] main:12: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> RawQuerySet[Book] main:13: error: No overload variant of "prefetch_related" of "RawQuerySet" matches argument types "str", "None" [call-overload] main:13: note: Possible overload variants: main:13: note: def prefetch_related(self, None, /) -> RawQuerySet[Book] main:13: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> RawQuerySet[Book] main:14: error: No overload variant of "prefetch_related" of "RawQuerySet" matches argument type "int" [call-overload] main:14: note: Possible overload variants: main:14: note: def prefetch_related(self, None, /) -> RawQuerySet[Book] main:14: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> RawQuerySet[Book] main:15: error: No overload variant of "prefetch_related" of "RawQuerySet" matches argument type "int" [call-overload] main:15: note: Possible overload variants: main:15: note: def prefetch_related(self, None, /) -> RawQuerySet[Book] main:15: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> RawQuerySet[Book] main:16: error: No overload variant of "prefetch_related" of "RawQuerySet" matches argument type "bool" [call-overload] main:16: note: Possible overload variants: main:16: note: def prefetch_related(self, None, /) -> RawQuerySet[Book] main:16: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> RawQuerySet[Book] main:17: error: No overload variant of "prefetch_related" of "RawQuerySet" matches argument type "bool" [call-overload] main:17: note: Possible overload variants: main:17: note: def prefetch_related(self, None, /) -> RawQuerySet[Book] main:17: note: def [_LookupT: str, _PrefetchedQuerySetT: QuerySet[Model, Model], _ToAttrT: str] prefetch_related(self, *lookups: str | Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> RawQuerySet[Book] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Person(models.Model): pass class Book(models.Model): author = models.ForeignKey(Person, on_delete=models.CASCADE) - case: prefetch_related_traversing_multiple_relations main: | from typing_extensions import reveal_type from django.db.models import Prefetch, F from django.contrib.auth.models import User, Group # When prefetching a relation that is traversing multiple relations # The `to_attr` arg is set on the last item of the chain, not the initial one. # We should NOT annotate the root model (User) with the to_attr. user = ( User.objects .prefetch_related(Prefetch("groups__user_set", User.objects.all(), to_attr="users")) .get() ) reveal_type(user) # N: Revealed type is "django.contrib.auth.models.User" reveal_type(user.groups) # N: Revealed type is "django.contrib.auth.models.Group_ManyRelatedManager[django.contrib.auth.models.User_groups]" last_group = user.groups.get() reveal_type(last_group) # N: Revealed type is "django.contrib.auth.models.Group" # Ideally we would like the type to be inferred as list[User] here last_group.users # E: "Group" has no attribute "users"; maybe "user_set"? [attr-defined] installed_apps: - django.contrib.auth - django.contrib.contenttypes typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_bulk_create.yml000066400000000000000000000256361526064357400321050ustar00rootroot00000000000000- case: bulk_create_valid_fields installed_apps: - myapp main: | from myapp.models import Article, Author, Category from typing import Literal # Valid update_fields articles = [Article(title="Test")] Article.objects.bulk_create(articles, update_fields=["title"]) Article.objects.bulk_create(articles, update_fields=["content"]) Article.objects.bulk_create(articles, update_fields=["published"]) # Valid update_fields with multiple fields Article.objects.bulk_create(articles, update_fields=("title", "content")) Article.objects.bulk_create(articles, update_fields={"title", "content", "published"}) # Valid update_fields with foreign key field Article.objects.bulk_create(articles, update_fields=["author"]) Article.objects.bulk_create(articles, update_fields=["author_id"]) Article.objects.bulk_create(articles, update_fields=["category"]) Article.objects.bulk_create(articles, update_fields=["category_id"]) # Valid unique_fields Article.objects.bulk_create(articles, unique_fields=["id"]) Article.objects.bulk_create(articles, unique_fields=["title"]) Article.objects.bulk_create(articles, unique_fields=["author"]) Article.objects.bulk_create(articles, unique_fields=["author_id"]) # Valid unique_fields with 'pk' alias Article.objects.bulk_create(articles, unique_fields=["pk"]) Article.objects.bulk_create(articles, unique_fields=("pk", "title")) # Valid combination of update_fields and unique_fields Article.objects.bulk_create( articles, update_fields=["title", "content"], unique_fields=["id"] ) Article.objects.bulk_create( articles, update_fields=["content"], unique_fields=["pk", "title"] ) # Valid on different models authors = [Author(name="Test")] Author.objects.bulk_create(authors, update_fields=["name"]) Author.objects.bulk_create(authors, unique_fields=["id"]) categories = [Category(name="Test")] Category.objects.bulk_create(categories, update_fields=["name"]) Category.objects.bulk_create(categories, unique_fields=["pk"]) # Variables with Literal types update_field: Literal["title"] = "title" unique_field: Literal["id"] = "id" Article.objects.bulk_create(articles, update_fields=[update_field], unique_fields=[unique_field]) # Dynamic lists (no validation, passes through) def get_fields() -> list[str]: return ["title"] Article.objects.bulk_create(articles, update_fields=get_fields(), unique_fields=get_fields()) # Async version async def test_async_bulk_create() -> None: articles = [Article(title="Test")] await Article.objects.abulk_create(articles, update_fields=["title"]) await Article.objects.abulk_create(articles, unique_fields=["pk"]) await Article.objects.abulk_create( articles, update_fields=["content"], unique_fields=["id"] ) files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() class Category(models.Model): name = models.CharField(max_length=100) parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE) category = models.ForeignKey(Category, on_delete=models.CASCADE) tags = models.ManyToManyField('myapp.Tag') class Tag(models.Model): name = models.CharField(max_length=50) - case: bulk_create_invalid_fields installed_apps: - myapp main: | from myapp.models import Article, Author, Category from typing import Literal articles = [Article(title="Test")] # Invalid field names in update_fields Article.objects.bulk_create(articles, update_fields=["nonexistent"]) # E: Article has no field named 'nonexistent' [misc] Article.objects.bulk_create(articles, update_fields=["invalid_field"]) # E: Article has no field named 'invalid_field' [misc] # Cannot update primary key fields in update_fields Article.objects.bulk_create(articles, update_fields=["id"]) # E: "bulk_create()" does not support primary key fields in "update_fields=". Got "id" [misc] # ManyToMany is not a concrete updatable field Article.objects.bulk_create(articles, update_fields={"tags"}) # E: "bulk_create()" can only be used with concrete fields. Got "tags" [misc] # Invalid field names in unique_fields Article.objects.bulk_create(articles, unique_fields=["nonexistent"]) # E: Article has no field named 'nonexistent' [misc] Article.objects.bulk_create(articles, unique_fields=["invalid_field"]) # E: Article has no field named 'invalid_field' [misc] # ManyToMany is not allowed in unique_fields either Article.objects.bulk_create(articles, unique_fields={"tags"}) # E: "bulk_create()" can only be used with concrete fields. Got "tags" [misc] # Mixed valid and invalid fields in update_fields Article.objects.bulk_create(articles, update_fields={"title", "nonexistent"}) # E: Article has no field named 'nonexistent' [misc] Article.objects.bulk_create(articles, update_fields=("id", "title")) # E: "bulk_create()" does not support primary key fields in "update_fields=". Got "id" [misc] # Mixed valid and invalid fields in unique_fields Article.objects.bulk_create(articles, unique_fields={"title", "nonexistent"}) # E: Article has no field named 'nonexistent' [misc] # Whitespace-only field names Article.objects.bulk_create(articles, update_fields=[""]) # E: Article has no field named '' [misc] Article.objects.bulk_create(articles, unique_fields=[" "]) # E: Article has no field named ' ' [misc] # Nested field lookups are not supported Article.objects.bulk_create(articles, update_fields=["author__name"]) # E: Article has no field named 'author__name' [misc] Article.objects.bulk_create(articles, unique_fields=["category__parent__name"]) # E: Article has no field named 'category__parent__name' [misc] # Multiple invalid fields Article.objects.bulk_create(articles, update_fields=["nonexistent1", "nonexistent2"]) # E: Article has no field named 'nonexistent1' [misc] # E: Article has no field named 'nonexistent2' [misc] Article.objects.bulk_create(articles, unique_fields=["nonexistent1", "nonexistent2"]) # E: Article has no field named 'nonexistent1' [misc] # E: Article has no field named 'nonexistent2' [misc] # Literal type variables are validated invalid_field: Literal["nonexistent"] = "nonexistent" Article.objects.bulk_create(articles, update_fields=[invalid_field]) # E: Article has no field named 'nonexistent' [misc] Article.objects.bulk_create(articles, unique_fields=[invalid_field]) # E: Article has no field named 'nonexistent' [misc] pk_field: Literal["id"] = "id" Article.objects.bulk_create(articles, update_fields=[pk_field]) # E: "bulk_create()" does not support primary key fields in "update_fields=". Got "id" [misc] # Test with different models authors = [Author(name="Test")] Author.objects.bulk_create(authors, update_fields=["id"]) # E: "bulk_create()" does not support primary key fields in "update_fields=". Got "id" [misc] Author.objects.bulk_create(authors, update_fields=["invalid"]) # E: Author has no field named 'invalid' [misc] Author.objects.bulk_create(authors, unique_fields=["invalid"]) # E: Author has no field named 'invalid' [misc] categories = [Category(name="Test")] Category.objects.bulk_create(categories, update_fields=["id"]) # E: "bulk_create()" does not support primary key fields in "update_fields=". Got "id" [misc] Category.objects.bulk_create(categories, update_fields=["invalid"]) # E: Category has no field named 'invalid' [misc] Category.objects.bulk_create(categories, unique_fields=["invalid"]) # E: Category has no field named 'invalid' [misc] # Async version async def test_async_bulk_create_invalid() -> None: articles = [Article(title="Test")] # Invalid field names in update_fields await Article.objects.abulk_create(articles, update_fields=["invalid_field"]) # E: Article has no field named 'invalid_field' [misc] # Cannot update primary key fields in update_fields await Article.objects.abulk_create(articles, update_fields=["id"]) # E: "abulk_create()" does not support primary key fields in "update_fields=". Got "id" [misc] # Invalid field names in unique_fields await Article.objects.abulk_create(articles, unique_fields=["invalid_field"]) # E: Article has no field named 'invalid_field' [misc] # ManyToMany is not allowed await Article.objects.abulk_create(articles, update_fields={"tags"}) # E: "abulk_create()" can only be used with concrete fields. Got "tags" [misc] await Article.objects.abulk_create(articles, unique_fields={"tags"}) # E: "abulk_create()" can only be used with concrete fields. Got "tags" [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() class Category(models.Model): name = models.CharField(max_length=100) parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE) category = models.ForeignKey(Category, on_delete=models.CASCADE) tags = models.ManyToManyField('myapp.Tag') class Tag(models.Model): name = models.CharField(max_length=50) typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_bulk_update.yml000066400000000000000000000260011526064357400321070ustar00rootroot00000000000000- case: bulk_update_valid_fields installed_apps: - myapp main: | from myapp.models import Article, Author, Category # Valid single field updates articles = Article.objects.all() Article.objects.bulk_update(articles, ["title"]) Article.objects.bulk_update(articles, ["content"]) Article.objects.bulk_update(articles, ["published"]) # Valid multiple field updates Article.objects.bulk_update(articles, ("title", "content")) Article.objects.bulk_update(articles, {"title", "content", "published"}) # Valid foreign key field updates (by field name and attname) Article.objects.bulk_update(articles, ["author"]) Article.objects.bulk_update(articles, ["author_id"]) Article.objects.bulk_update(articles, ["category"]) Article.objects.bulk_update(articles, ["category_id"]) # Valid updates on different models authors = Author.objects.all() Author.objects.bulk_update(authors, ["name"]) Author.objects.bulk_update(authors, ["email"]) categories = Category.objects.all() Category.objects.bulk_update(categories, ["name"]) Category.objects.bulk_update(categories, ["parent"]) Category.objects.bulk_update(categories, ["parent_id"]) # Variables containing field names field_name = "title" Article.objects.bulk_update(articles, [field_name]) # Dynamic field lists def get_fields() -> list[str]: return ["title"] Article.objects.bulk_update(articles, get_fields()) async def test_async_bulk_update() -> None: # Valid single field updates articles = Article.objects.all() await Article.objects.abulk_update(articles, {"published"}) # Valid multiple field updates await Article.objects.abulk_update(articles, ("title", "content", "published")) # Valid foreign key field updates (by field name and attname) await Article.objects.abulk_update(articles, ["category_id"]) # Valid updates on different models authors = Author.objects.all() await Author.objects.abulk_update(authors, ["email"]) categories = Category.objects.all() await Category.objects.abulk_update(categories, ["parent_id"]) # Variables containing field names field_name = "title" await Article.objects.abulk_update(articles, [field_name]) # Dynamic field lists def get_fields() -> list[str]: return ["title"] await Article.objects.abulk_update(articles, get_fields()) files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Category(models.Model): name = models.CharField(max_length=100) parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() class Tag(models.Model): name = models.CharField(max_length=50) class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE) category = models.ForeignKey(Category, on_delete=models.CASCADE) tags = models.ManyToManyField(Tag) - case: bulk_update_invalid_fields installed_apps: - myapp main: | from myapp.models import Article, Author, Category from typing import Literal articles = Article.objects.all() # Empty fields list Article.objects.bulk_update() # E: Missing positional arguments "objs", "fields" in call to "bulk_update" of "Manager" [call-arg] Article.objects.bulk_update(articles, []) # E: Field names must be given to "bulk_update()" [misc] # Invalid field names (Django's FieldError) Article.objects.bulk_update(articles, ["nonexistent"]) # E: Article has no field named 'nonexistent' [misc] Article.objects.bulk_update(articles, ["invalid_field"]) # E: Article has no field named 'invalid_field' [misc] # Cannot update primary key fields Article.objects.bulk_update(articles, ["id"]) # E: "bulk_update()" does not support primary key fields. Got "id" [misc] # Mixed valid and invalid fields Article.objects.bulk_update(articles, {"title", "nonexistent"}) # E: Article has no field named 'nonexistent' [misc] Article.objects.bulk_update(articles, ("id", "title")) # E: "bulk_update()" does not support primary key fields. Got "id" [misc] # Whitespace-only field names Article.objects.bulk_update(articles, [""]) # E: Article has no field named '' [misc] Article.objects.bulk_update(articles, [" "]) # E: Article has no field named ' ' [misc] # ManyToMany is not a concrete updatable field Article.objects.bulk_update(articles, {"tags"}) # E: "bulk_update()" can only be used with concrete fields. Got "tags" [misc] # Nested field lookups are not supported Article.objects.bulk_update(articles, ["author__name"]) # E: Article has no field named 'author__name' [misc] Article.objects.bulk_update(articles, ["category__parent__name"]) # E: Article has no field named 'category__parent__name' [misc] # Multiple invalid fields Article.objects.bulk_update(articles, ["nonexistent1", "nonexistent2"]) # E: Article has no field named 'nonexistent1' [misc] # E: Article has no field named 'nonexistent2' [misc] # Primary key with valid fields Article.objects.bulk_update(articles, ["title", "id", "content"]) # E: "bulk_update()" does not support primary key fields. Got "id" [misc] # Literal type variables are validated invalid_field: Literal["nonexistent"] = "nonexistent" Article.objects.bulk_update(articles, [invalid_field]) # E: Article has no field named 'nonexistent' [misc] pk_field: Literal["id"] = "id" Article.objects.bulk_update(articles, [pk_field]) # E: "bulk_update()" does not support primary key fields. Got "id" [misc] # Test with different models authors = Author.objects.all() Author.objects.bulk_update(authors, ["id"]) # E: "bulk_update()" does not support primary key fields. Got "id" [misc] Author.objects.bulk_update(authors, ["invalid"]) # E: Author has no field named 'invalid' [misc] categories = Category.objects.all() Category.objects.bulk_update(categories, ["id"]) # E: "bulk_update()" does not support primary key fields. Got "id" [misc] Category.objects.bulk_update(categories, ["invalid"]) # E: Category has no field named 'invalid' [misc] # Async version async def test_async_bulk_update_invalid() -> None: articles = Article.objects.all() # Empty fields list await Article.objects.abulk_update() # E: Missing positional arguments "objs", "fields" in call to "abulk_update" of "Manager" [call-arg] await Article.objects.abulk_update(articles, []) # E: Field names must be given to "abulk_update()" [misc] # Invalid field names (Django's FieldError) await Article.objects.abulk_update(articles, ["invalid_field"]) # E: Article has no field named 'invalid_field' [misc] # Cannot update primary key fields await Article.objects.abulk_update(articles, ["id"]) # E: "abulk_update()" does not support primary key fields. Got "id" [misc] # Mixed valid and invalid fields await Article.objects.abulk_update(articles, ["id", "title"]) # E: "abulk_update()" does not support primary key fields. Got "id" [misc] # Whitespace-only field names await Article.objects.abulk_update(articles, [" "]) # E: Article has no field named ' ' [misc] # ManyToMany is not a concrete updatable field await Article.objects.abulk_update(articles, ["tags"]) # E: "abulk_update()" can only be used with concrete fields. Got "tags" [misc] # Nested field lookups are not supported await Article.objects.abulk_update(articles, ["author__name"]) # E: Article has no field named 'author__name' [misc] await Article.objects.abulk_update(articles, ["category__parent__name"]) # E: Article has no field named 'category__parent__name' [misc] # Multiple invalid fields await Article.objects.abulk_update(articles, ("nonexistent1", "nonexistent2")) # E: Article has no field named 'nonexistent1' [misc] # E: Article has no field named 'nonexistent2' [misc] # Primary key with valid fields await Article.objects.abulk_update(articles, ["title", "id", "content"]) # E: "abulk_update()" does not support primary key fields. Got "id" [misc] # Literal type variables are validated invalid_field: Literal["nonexistent"] = "nonexistent" await Article.objects.abulk_update(articles, {invalid_field}) # E: Article has no field named 'nonexistent' [misc] pk_field: Literal["id"] = "id" await Article.objects.abulk_update(articles, [pk_field]) # E: "abulk_update()" does not support primary key fields. Got "id" [misc] # Test with different models authors = Author.objects.all() await Author.objects.abulk_update(authors, ["invalid"]) # E: Author has no field named 'invalid' [misc] categories = Category.objects.all() await Category.objects.abulk_update(categories, ["invalid"]) # E: Category has no field named 'invalid' [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Category(models.Model): name = models.CharField(max_length=100) parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE) category = models.ForeignKey(Category, on_delete=models.CASCADE) tags = models.ManyToManyField('myapp.Tag') class Tag(models.Model): name = models.CharField(max_length=50) typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_defer_only.yml000066400000000000000000000330271526064357400317440ustar00rootroot00000000000000- case: defer_valid_fields installed_apps: - myapp main: | from myapp.models import Article, Author from django.db.models import F # Simple fields Article.objects.defer("id") Article.objects.defer("title") Article.objects.defer("content") Article.objects.defer("published") # Multiple fields in one call Article.objects.defer("title", "content") # FK field (by name and attname) Article.objects.defer("author") Article.objects.defer("author_id") # FK traversal Article.objects.defer("author__name") Article.objects.defer("author__email") # M2M (silently ignored by Django) Article.objects.defer("tags") # Clear deferrals Article.objects.defer(None) # Non-literal strings (skipped by validation) field: str = "foo" Article.objects.defer(field) # Chained defer() calls are additive — each is valid Article.objects.defer("title").defer("content") Article.objects.defer("content").filter(published=True).defer("title") # Re-deferring an already-deferred field is harmless Article.objects.defer("title").defer("title") # defer(None) clears all accumulated deferrals Article.objects.defer("title").defer("content").defer(None) # Valid double-underscore traversal alongside select_related() Article.objects.select_related().defer("author__name") Article.objects.select_related("author").defer("author__email") Article.objects.select_related("author").defer("author__name", "author__email") # Multi-level FK traversal with select_related Article.objects.select_related("author__profile").defer("author__profile__bio") # only() followed by defer() to exclude one of the loaded fields Article.objects.only("title", "content").defer("content") # defer() followed by only() Article.objects.defer("content").only("title") files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Profile(models.Model): bio = models.TextField() class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() profile = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL) class Tag(models.Model): name = models.CharField(max_length=50) class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE) tags = models.ManyToManyField(Tag) - case: defer_invalid_fields installed_apps: - myapp main: | from myapp.models import Article, Author from django.db.models import F from typing import Literal # Non-existent field Article.objects.defer("nonexistent") # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc] # Invalid chained lookup Article.objects.defer("author__nonexistent") # E: Invalid field in "defer()": Author has no field named 'nonexistent' [misc] # Nested lookup on non-relation field Article.objects.defer("title__something") # E: Invalid field in "defer()": something [misc] # Annotated fields cannot be deferred Article.objects.annotate(foo=F("id")).defer("foo") # E: Invalid field in "defer()": Article has no field named 'foo' [misc] Article.objects.annotate(bar=F("id")).defer("bar", "title") # E: Invalid field in "defer()": Article has no field named 'bar' [misc] Article.objects.annotate(foo=F("id")).defer("nonexistent") # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc] # Literal typed invalid field: Literal["nonexistent"] = "nonexistent" Article.objects.defer(field) # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc] # Invalid field in a chain — error still raised Article.objects.filter(published=True).defer("nonexistent") # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc] # First defer valid, second invalid Article.objects.defer("title").defer("nonexistent") # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc] # Invalid after defer(None) reset Article.objects.defer(None).defer("nonexistent") # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc] # Invalid traversal even with select_related Article.objects.select_related("author").defer("author__nonexistent") # E: Invalid field in "defer()": Author has no field named 'nonexistent' [misc] # Attempting to defer the primary key (pk alias and concrete field name) Article.objects.defer("pk") # E: Invalid field in "defer()": Article has no field named 'pk' [misc] # Invalid field in only() when combined with defer() Article.objects.only("nonexistent").defer("content") # E: Invalid field in "only()": Article has no field named 'nonexistent' [misc] Article.objects.only("title").defer("nonexistent") # E: Invalid field in "defer()": Article has no field named 'nonexistent' [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE) - case: only_valid_fields installed_apps: - myapp main: | from myapp.models import Article, Author from django.db.models import F # Simple fields Article.objects.only("pk") Article.objects.only("id") Article.objects.only("title") Article.objects.only("content") Article.objects.only("published") # Multiple fields Article.objects.only("title", "content") # FK field (by name and attname) Article.objects.only("author") Article.objects.only("author_id") # FK traversal Article.objects.only("author__name") Article.objects.only("author__email") # M2M Article.objects.only("tags") # Non-literal strings (skipped by validation) field: str = "foo" Article.objects.only(field) # Chained only() calls — each is independently valid Article.objects.only("title").only("content") Article.objects.only("title", "content").only("published") Article.objects.only("title").filter(published=True).only("content") # Valid double-underscore traversal with select_related Article.objects.select_related("author").only("title", "author__name") Article.objects.select_related("author").only("author__email") # Multi-level FK traversal with select_related Article.objects.select_related("author__profile").only("title", "author__profile__bio") # Two separate FK relations in one only() call Article.objects.only("author__name", "editor__username") Article.objects.only("title", "author__name", "editor__username") files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Profile(models.Model): bio = models.TextField() class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() profile = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL) class Editor(models.Model): username = models.CharField(max_length=50) class Tag(models.Model): name = models.CharField(max_length=50) class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE) editor = models.ForeignKey(Editor, null=True, on_delete=models.SET_NULL) tags = models.ManyToManyField(Tag) - case: only_pk_on_abstract_model_no_crash installed_apps: - myapp main: | from django.db.models import QuerySet from myapp.models import AbstractArticle from typing_extensions import reveal_type def test(qs: QuerySet[AbstractArticle]) -> None: reveal_type(qs.only("pk")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.AbstractArticle, myapp.models.AbstractArticle]" files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class AbstractArticle(models.Model): title = models.CharField(max_length=200) class Meta: abstract = True class Article(AbstractArticle): pass - case: only_invalid_fields installed_apps: - myapp main: | from myapp.models import Article, Author from django.db.models import F from typing import Literal # Non-existent field Article.objects.only("nonexistent") # E: Invalid field in "only()": Article has no field named 'nonexistent' [misc] # Invalid chained lookup Article.objects.only("author__nonexistent") # E: Invalid field in "only()": Author has no field named 'nonexistent' [misc] # Nested lookup on non-relation field Article.objects.only("title__something") # E: Invalid field in "only()": something [misc] # Annotated field skipped, valid real field alongside it Article.objects.annotate(foo=F("id")).only("foo") # E: Invalid field in "only()": Article has no field named 'foo' [misc] Article.objects.annotate(bar=F("id")).only("bar", "title") # E: Invalid field in "only()": Article has no field named 'bar' [misc] Article.objects.annotate(foo=F("id")).only("nonexistent",) # E: Invalid field in "only()": Article has no field named 'nonexistent' [misc] # Literal typed invalid field: Literal["nonexistent"] = "nonexistent" Article.objects.only(field) # E: Invalid field in "only()": Article has no field named 'nonexistent' [misc] # Invalid field in a chained only() call Article.objects.only("nonexistent").only("content") # E: Invalid field in "only()": Article has no field named 'nonexistent' [misc] Article.objects.only("title").only("nonexistent") # E: Invalid field in "only()": Article has no field named 'nonexistent' [misc] # Invalid traversal with select_related Article.objects.select_related("author").only("title", "author__nonexistent") # E: Invalid field in "only()": Author has no field named 'nonexistent' [misc] # Multi-level invalid traversal Article.objects.select_related("author__profile").only("author__profile__nonexistent") # E: Invalid field in "only()": Profile has no field named 'nonexistent' [misc] # Two FK relations — first invalid, second valid Article.objects.only("author__nonexistent", "editor__username") # E: Invalid field in "only()": Author has no field named 'nonexistent' [misc] # Two FK relations — first valid, second invalid Article.objects.only("author__name", "editor__nonexistent") # E: Invalid field in "only()": Editor has no field named 'nonexistent' [misc] # Both FK paths invalid — two errors expected Article.objects.only("author__bad") # E: Invalid field in "only()": Author has no field named 'bad' [misc] Article.objects.only("editor__bad") # E: Invalid field in "only()": Editor has no field named 'bad' [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Profile(models.Model): bio = models.TextField() class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() profile = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL) class Editor(models.Model): username = models.CharField(max_length=50) class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE) editor = models.ForeignKey(Editor, null=True, on_delete=models.SET_NULL) typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_distinct.yml000066400000000000000000000077411526064357400314430ustar00rootroot00000000000000- case: distinct_valid_fields installed_apps: - myapp main: | from myapp.models import Article, Author from django.db.models import F from django.db.models.functions import Lower # Bare distinct (no field names) Article.objects.distinct() # Simple fields Article.objects.distinct("title") Article.objects.distinct("pk") Article.objects.distinct("id") # FK traversal Article.objects.distinct("author__name") # Multiple fields Article.objects.distinct("title", "author__name") # FK id field Article.objects.distinct("author_id") # Transform Article.objects.distinct("created__date") # Annotated fields Article.objects.annotate(foo=F("id")).distinct("foo") # Fields selected via values()/values_list(), including aliases Article.objects.values("title").distinct("title") Article.objects.values(lower_title=Lower("title")).distinct("lower_title") # Non-literal strings (skipped by validation) field: str = "foo" Article.objects.distinct(field) # Reverse FK traversal Author.objects.distinct("article__title") # Chained Article.objects.filter(published=True).distinct("title") files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) created = models.DateTimeField(auto_now_add=True) author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="article") - case: distinct_invalid_fields installed_apps: - myapp main: | from myapp.models import Article, Author from typing import Literal # Non-existent field Article.objects.distinct("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc] # Invalid chained lookup Article.objects.distinct("author__nonexistent") # E: Cannot resolve keyword 'nonexistent' into field or transform on 'author'. [misc] # Lookup suffix on a valid field Article.objects.distinct("title__exact") # E: Cannot resolve keyword 'exact' into field or transform on 'title'. [misc] # Literal typed invalid field: Literal["nonexistent"] = "nonexistent" Article.objects.distinct(field) # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc] # Invalid field at depth > 2 Article.objects.distinct("author__name__nonexistent") # E: Cannot resolve keyword 'nonexistent' into field or transform on 'name'. [misc] # Unlike order_by, distinct does not support the "-" descending prefix Article.objects.distinct("-title") # E: Cannot resolve keyword '-title' into field. Choices are: author, author_id, content, id, published, title [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="article") typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_filter.yml000066400000000000000000000450501526064357400311020ustar00rootroot00000000000000- case: filtering_with_proper_types main: | from myapp.models import User User.objects.filter(username='maksim') User.objects.get(username='maksim') User.objects.exclude(username='maksim') installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) - case: no_such_field_for_filter main: | from myapp.models import User User.objects.filter(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: id [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass - case: filter_with_invalid_type main: | from myapp.models import User User.objects.filter(age=User()) # E: Incompatible type for lookup 'age': (got "User", expected "str | int") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db import models class User(models.Model): age = models.IntegerField() # Regression test for #2831 - case: filter_with_decimal main: | from myapp.models import MyModel from decimal import Decimal MyModel.objects.filter(a=1) MyModel.objects.filter(a="1.0") MyModel.objects.filter(a=Decimal(1.0)) MyModel.objects.filter(a=1.0) # E: Incompatible type for lookup 'a': (got "float", expected "str | int | Decimal") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): a = models.DecimalField() - case: filter_with_multiple_fields main: | from myapp.models import User User.objects.filter(age=User(), gender=User()) installed_apps: - myapp out: | main:2: error: Incompatible type for lookup 'age': (got "User", expected "str | int") [misc] main:2: error: Incompatible type for lookup 'gender': (got "User", expected "str | int") [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): age = models.IntegerField() gender = models.IntegerField() - case: valid_filter_with_lookup main: | from myapp.models import User # Simple lookups which expect the same type. User.objects.filter(username__contains='hello') User.objects.filter(age__gt=1) # The `__in` lookup expects an iterable of the field type. # Regression test for https://github.com/typeddjango/django-stubs/issue/xxxx User.objects.filter(age__in=[1, 2, 3]) User.objects.filter(age__in=(1, 2, 3)) User.objects.filter(age__in=range(4)) User.objects.filter(age__in=123) # E: Incompatible type for lookup 'age__in': (got "int", expected "Iterable[str | int]") [misc] User.objects.filter(age__in=None) # E: Incompatible type for lookup 'age__in': (got "None", expected "Iterable[str | int]") [misc] User.objects.filter(age__in="abc") # Doesn't error because `Iterable[str]` is valid so `str` is valid. User.objects.filter(age__in=(User(),)) # E: Incompatible type for lookup 'age__in': (got "tuple[User]", expected "Iterable[str | int]") [misc] User.objects.filter(age__in=[User()]) # Doesn't error because mypy sees the provided type as `list[Any]`. users: list[User] = [User()] User.objects.filter(age__in=users) # E: Incompatible type for lookup 'age__in': (got "list[User]", expected "Iterable[str | int]") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) age = models.IntegerField() - case: invalid_filter_with_lookup main: | from myapp.models import User User.objects.filter(username__contains=1) # E: Incompatible type for lookup 'username__contains': (got "int", expected "str") [misc] User.objects.filter(username__icontains=1) # E: Incompatible type for lookup 'username__icontains': (got "int", expected "str") [misc] User.objects.filter(username__isnull=1) # E: Incompatible type for lookup 'username__isnull': (got "int", expected "bool") [misc] User.objects.filter(created_at=User()) # E: Incompatible type for lookup 'created_at': (got "User", expected "str | datetime") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) age = models.IntegerField() created_at = models.DateTimeField() - case: strings_are_allowed_for_exact_for_dates main: | from myapp.models import User User.objects.filter(created_at='2018') User.objects.filter(created_at__exact='2018') installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): created_at = models.DateTimeField() - case: related_model_foreign_key_lookups main: | from myapp.models import Blog, Publisher blog = Blog() publisher = Publisher() Blog.objects.filter(publisher=publisher) Blog.objects.filter(publisher_id=1) Blog.objects.filter(publisher__id=1) Blog.objects.filter(publisher=blog) # E: Incompatible type for lookup 'publisher': (got "Blog", expected "Publisher | int | None") [misc] Blog.objects.filter(publisher_id=blog) # E: Incompatible type for lookup 'publisher_id': (got "Blog", expected "str | int") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Blog(models.Model): publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name='blogs') - case: related_model_reverse_foreign_key_lookup main: | from myapp.models import Blog, Publisher, Category blog = Blog() publisher = Publisher() # With related_name Publisher.objects.filter(blogs=Blog()) Publisher.objects.filter(blogs__id=1) Publisher.objects.filter(blogs=publisher) # E: Incompatible type for lookup 'blogs': (got "Publisher", expected "Blog | int | None") [misc] Publisher.objects.filter(blogs__id=publisher) # E: Incompatible type for lookup 'blogs__id': (got "Publisher", expected "str | int") [misc] # Without related_name Category.objects.filter(blog=Blog()) Category.objects.filter(blog__id=1) Category.objects.filter(blog=publisher) # E: Incompatible type for lookup 'blog': (got "Publisher", expected "Blog | int | None") [misc] Category.objects.filter(blog__id=publisher) # E: Incompatible type for lookup 'blog__id': (got "Publisher", expected "str | int") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Category(models.Model): pass class Blog(models.Model): publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name='blogs') category = models.ForeignKey(Category, on_delete=models.CASCADE) - case: many_to_many_lookups main: | from myapp.models import Book, Author book = Book() author = Author() Book.objects.filter(authors=author) Book.objects.filter(authors=book) # E: Incompatible type for lookup 'authors': (got "Book", expected "Author | int | None") [misc] Book.objects.filter(authors='hello') # E: Incompatible type for lookup 'authors': (got "str", expected "Author | int | None") [misc] Author.objects.filter(books=book) Author.objects.filter(books=author) # E: Incompatible type for lookup 'books': (got "Author", expected "Book | int | None") [misc] Author.objects.filter(books='hello') # E: Incompatible type for lookup 'books': (got "str", expected "Book | int | None") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Book(models.Model): pass class Author(models.Model): books = models.ManyToManyField(Book, related_name='authors') - case: one_to_one_lookups main: | from myapp.models import User, Profile user = User() profile = Profile() User.objects.filter(profile=profile) User.objects.filter(profile=user) # E: Incompatible type for lookup 'profile': (got "User", expected "Profile | int | None") [misc] User.objects.filter(profile='hello') # E: Incompatible type for lookup 'profile': (got "str", expected "Profile | int | None") [misc] Profile.objects.filter(user=user) Profile.objects.filter(user=profile) # E: Incompatible type for lookup 'user': (got "Profile", expected "User | int | None") [misc] Profile.objects.filter(user='hello') # E: Incompatible type for lookup 'user': (got "str", expected "User | int | None") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') - case: lookup_with_union_of_model_and_outer_ref main: | from django.db.models import Exists, OuterRef, QuerySet from myapp.models import Profile, User def profiles_for(user: User | OuterRef) -> "QuerySet[Profile]": return Profile.objects.filter(user=user) profiles_for(User()) users_with_profile = User.objects.filter(Exists(profiles_for(OuterRef("pk")))) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') # TODO - case: f_expression_simple_case main: | from myapp.models import User from django.db import models User.objects.filter(username=models.F('username2')) User.objects.filter(username=models.F('age')) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.TextField() username2 = models.TextField() age = models.IntegerField() # TODO - case: f_expression_with_expression_math_is_not_supported main: | from myapp.models import User from django.db import models User.objects.filter(username=models.F('username2') + 'hello') installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.TextField() username2 = models.TextField() age = models.IntegerField() - case: alias_and_annotate_can_be_used_with_dynamic_new_fields main: | from django.db import models from myapp.models import Blog Blog.objects.alias(alias_entries=models.Count("entry")).annotate( annotate_entries=models.Count("entry"), ).filter(alias_entries__gt=5, annotate_entries__gt=5) Blog.objects.alias(alias_entries=models.Count("entry")).filter(alias_entries=5) Blog.objects.alias(alias_entries=models.Count("entry")).filter(alias_entries__gt=5) Blog.objects.alias( # E: Cannot resolve keyword 'alias_e' into field. Choices are: entry, id, alias_entries [misc] alias_entries=models.Count("entry") ).filter( # Wrong name: alias_e=5 ) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Blog(models.Model): pass class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) # Regression test for #1172 - case: chained_filter_lookups main: | from myapp.models import Cheese Cheese.objects.filter(field=True).filter(field2=True) qs = Cheese.objects.all() qs.filter(field=True) out: | main:3: error: Cannot resolve keyword 'field' into field. Choices are: a, id [misc] main:3: error: Cannot resolve keyword 'field2' into field. Choices are: a, id [misc] main:5: error: Cannot resolve keyword 'field' into field. Choices are: a, id [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Cheese(models.Model): a = models.BooleanField() - case: lookups_from_custom_queryset main: | from myapp.models import MyModel qs = MyModel.objects.all() qs.filter(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: age, id [misc] qs.filter(age=MyModel()) # E: Incompatible type for lookup 'age': (got "MyModel", expected "str | int") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyQuerySet(models.QuerySet["MyModel"]): ... class MyModel(models.Model): age = models.IntegerField() objects = MyQuerySet.as_manager() - case: async_filtering_with_aget main: | from myapp.models import User async def test_async_get() -> None: # Valid aget calls user = await User.objects.aget(username='maksim') user2 = await User.objects.aget(age=25) user3 = await User.objects.aget(username__contains='hello') user4 = await User.objects.aget(age__gt=1) # Invalid field await User.objects.aget(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: age, id, username [misc] # Invalid type await User.objects.aget(age=User()) # E: Incompatible type for lookup 'age': (got "User", expected "str | int") [misc] # Invalid lookup type await User.objects.aget(username__contains=1) # E: Incompatible type for lookup 'username__contains': (got "int", expected "str") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): username = models.CharField(max_length=100) age = models.IntegerField() - case: transform_then_lookup_uses_transform_output_type main: | from datetime import date from myapp.models import Event def by_int_years(years: list[int]) -> None: # `year` transform outputs an int, so lookups on it expect ints Event.objects.filter(start_date__year__in=years) Event.objects.filter(start_date__year__exact=2000) # a bare transform lookup (`__year`) is the same as `__year__exact` Event.objects.filter(start_date__year=2000) def by_date_years(years: list[date]) -> None: Event.objects.filter(start_date__year__in=years) # E: Incompatible type for lookup 'start_date__year__in': (got "list[date]", expected "Iterable[str | int]") [misc] Event.objects.filter(start_date__year__in=range(5)) Event.objects.filter(start_date__year__in=123) # E: Incompatible type for lookup 'start_date__year__in': (got "int", expected "Iterable[str | int]") [misc] def by_date(day: date) -> None: Event.objects.filter(start_date__year__exact=day) # E: Incompatible type for lookup 'start_date__year__exact': (got "date", expected "str | int") [misc] def by_days(days: list[date]) -> None: # `date` truncates a datetime, so `created_at__date` outputs a date again Event.objects.filter(created_at__date__in=days) def by_numbers(numbers: list[int]) -> None: Event.objects.filter(created_at__date__in=numbers) # E: Incompatible type for lookup 'created_at__date__in': (got "list[int]", expected "Iterable[str | date]") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Event(models.Model): start_date = models.DateField() created_at = models.DateTimeField() typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_from_queryset.yml000066400000000000000000001461271526064357400325300ustar00rootroot00000000000000- case: from_queryset_self_return_management main: | from typing_extensions import reveal_type from myapp.models import MyModel, MyModelWithoutSelf reveal_type(MyModel.objects.example_simple()) # N: Revealed type is "myapp.models.MyQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.example_list()) # N: Revealed type is "list[myapp.models.MyQuerySet[myapp.models.MyModel]]" reveal_type(MyModel.objects.example_simple().just_int()) # N: Revealed type is "int" reveal_type(MyModel.objects.example_dict()) # N: Revealed type is "dict[str, myapp.models.MyQuerySet[myapp.models.MyModel]]" reveal_type(MyModel.objects.test_custom_manager()) # N: Revealed type is "myapp.models.CustomManagerFromMyQuerySet[myapp.models.MyModel]" reveal_type(MyModelWithoutSelf.objects.method()) # N: Revealed type is "myapp.models.QuerySetWithoutSelf[myapp.models.MyModelWithoutSelf, myapp.models.MyModelWithoutSelf]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager from typing_extensions import Self, TypeVar M = TypeVar("M", covariant=True, bound=models.Model) class CustomManager(Manager[M]): def test_custom_manager(self) -> Self: raise NotImplementedError class BaseQuerySet(models.QuerySet[M]): def example_dict(self) -> dict[str, Self]: raise NotImplementedError class MyQuerySet(BaseQuerySet[M]): def example_simple(self) -> Self: raise NotImplementedError def example_list(self) -> list[Self]: raise NotImplementedError def just_int(self) -> int: raise NotImplementedError NewManager = CustomManager.from_queryset(MyQuerySet) class MyModel(models.Model): objects = NewManager() class QuerySetWithoutSelf(models.QuerySet["MyModelWithoutSelf"]): def method(self) -> "QuerySetWithoutSelf": return self ManagerWithoutSelf = Manager.from_queryset(QuerySetWithoutSelf) class MyModelWithoutSelf(models.Model): objects = ManagerWithoutSelf() - case: from_queryset_model_inheritance main: | from typing_extensions import reveal_type from myapp.models import Base, Sub reveal_type(Base.objects) # N: Revealed type is "myapp.models.MyManager[myapp.models.Base]" reveal_type(Sub.objects) # N: Revealed type is "myapp.models.MyManager[myapp.models.Sub]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import ClassVar from typing_extensions import Self from django.db.models import Model from django.db.models.manager import Manager from django.db.models.query import QuerySet MyManager = Manager.from_queryset(QuerySet, "MyManager") class Base(Model): objects: ClassVar[MyManager[Self]] = MyManager() class Sub(Base): pass - case: from_queryset_with_base_manager main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "str" reveal_type(MyModel.objects.filter(id=1).queryset_method()) # N: Revealed type is "str" reveal_type(MyModel.objects.filter(id=1)) # N: Revealed type is "myapp.models.ModelQuerySet[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import TypeVar from django.db import models from django.db.models.manager import Manager M = TypeVar("M", bound=models.Model, covariant=True) class ModelQuerySet(models.QuerySet[M]): def queryset_method(self) -> str: return 'hello' NewManager = Manager.from_queryset(ModelQuerySet) class MyModel(models.Model): objects = NewManager() - case: from_queryset_queryset_imported_from_other_module main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "myapp.querysets.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.queryset_method_2()) # N: Revealed type is "typing.Iterable[myapp.querysets.Custom]" reveal_type(MyModel.objects.queryset_method_3()) # N: Revealed type is "str" reveal_type(MyModel.objects.queryset_method_4([])) # N: Revealed type is "None" reveal_type(MyModel.objects.filter(id=1).queryset_method()) # N: Revealed type is "myapp.querysets.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.filter(id=1)) # N: Revealed type is "myapp.querysets.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/querysets.py content: | from collections.abc import Iterable, Sequence from typing import TYPE_CHECKING from django.db import models if TYPE_CHECKING: from .models import MyModel class Custom: ... class ModelQuerySet(models.QuerySet["MyModel"]): def queryset_method(self) -> "ModelQuerySet": return self.filter() def queryset_method_2(self) -> Iterable[Custom]: return [] def queryset_method_3(self) -> str: return 'hello' def queryset_method_4(self, arg: Sequence) -> None: return None - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager from .querysets import ModelQuerySet NewManager = Manager.from_queryset(ModelQuerySet) class MyModel(models.Model): objects = NewManager() - case: from_queryset_custom_manager_subclass main: | from typing_extensions import reveal_type from myapp.models import NewManager reveal_type(NewManager().example()) # N: Revealed type is "myapp.models.MyModel" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/querysets.py content: | from typing import TYPE_CHECKING from typing_extensions import TypeVar from django.db import models from django.db.models.manager import Manager if TYPE_CHECKING: from .models import MyModel _CTE = TypeVar("_CTE", bound=models.Model) class _MyModelQuerySet(models.QuerySet[_CTE]): def example(self) -> _CTE: raise NotImplementedError class MyModelQuerySet(_MyModelQuerySet["MyModel"]): ... - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager from .querysets import MyModelQuerySet class TypedManager(Manager["MyModel"]): ... NewManager = TypedManager.from_queryset(MyModelQuerySet) class MyModel(models.Model): objects = NewManager() - case: handles_subclasses_of_queryset main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects.example()) # N: Revealed type is "myapp.models.MyModel" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/querysets.py content: | from typing import TYPE_CHECKING from typing_extensions import TypeVar from django.db import models from django.db.models.manager import Manager if TYPE_CHECKING: from .models import MyModel _CTE = TypeVar("_CTE", bound=models.Model) class _MyModelQuerySet(models.QuerySet[_CTE]): def example(self) -> _CTE: raise NotImplementedError class MyModelQuerySet(_MyModelQuerySet["MyModel"]): ... - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager from .querysets import MyModelQuerySet NewManager = Manager.from_queryset(MyModelQuerySet) class MyModel(models.Model): objects = NewManager() - case: from_queryset_generated_manager_imported_from_other_module main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.querysets.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "myapp.querysets.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.queryset_method_2()) # N: Revealed type is "typing.Iterable[myapp.querysets.Custom]" reveal_type(MyModel.objects.queryset_method_3()) # N: Revealed type is "str" reveal_type(MyModel.objects.queryset_method_4([])) # N: Revealed type is "None" reveal_type(MyModel.objects.filter(id=1).queryset_method()) # N: Revealed type is "myapp.querysets.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.filter(id=1)) # N: Revealed type is "myapp.querysets.ModelQuerySet[myapp.models.MyModel, myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/querysets.py content: | from collections.abc import Iterable, Sequence from typing import TYPE_CHECKING from django.db import models from django.db.models.manager import Manager if TYPE_CHECKING: from .models import MyModel class Custom: ... class ModelQuerySet(models.QuerySet["MyModel"]): def queryset_method(self) -> "ModelQuerySet": return self.filter() def queryset_method_2(self) -> Iterable[Custom]: return [] def queryset_method_3(self) -> str: return 'hello' def queryset_method_4(self, arg: Sequence) -> None: return None NewManager = Manager.from_queryset(ModelQuerySet) - path: myapp/models.py content: | from django.db import models from .querysets import NewManager class MyModel(models.Model): objects = NewManager() - case: from_queryset_annotates_manager_variable_as_type main: | from typing_extensions import reveal_type from myapp.models import NewManager reveal_type(NewManager) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ModelQuerySet(models.QuerySet): ... NewManager = models.Manager.from_queryset(ModelQuerySet) - case: from_queryset_with_manager main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ModelQuerySet(models.QuerySet): def queryset_method(self) -> str: return 'hello' NewManager = models.Manager.from_queryset(ModelQuerySet) class MyModel(models.Model): objects = NewManager() - case: from_queryset_with_manager_of_union main: | from typing_extensions import reveal_type from myapp.models import MyModel1, MyModel2 kls: type[MyModel1 | MyModel2] = MyModel1 reveal_type(kls.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet1[myapp.models.MyModel1] | myapp.models.ManagerFromModelQuerySet2[myapp.models.MyModel2]" reveal_type(kls.objects.all()) # N: Revealed type is "myapp.models.ModelQuerySet1[myapp.models.MyModel1, myapp.models.MyModel1] | myapp.models.ModelQuerySet2[myapp.models.MyModel2, myapp.models.MyModel2]" reveal_type(kls.objects.get()) # N: Revealed type is "myapp.models.MyModel1 | myapp.models.MyModel2" reveal_type(kls.objects.queryset_method()) # N: Revealed type is "int | str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ModelQuerySet1(models.QuerySet["MyModel1"]): def queryset_method(self) -> int: return 1 class ModelQuerySet2(models.QuerySet["MyModel2"]): def queryset_method(self) -> str: return 'hello' NewManager1 = models.Manager.from_queryset(ModelQuerySet1) class MyModel1(models.Model): objects = NewManager1() NewManager2 = models.Manager.from_queryset(ModelQuerySet2) class MyModel2(models.Model): objects = NewManager2() - case: from_queryset_returns_intersection_of_manager_and_queryset main: | from typing_extensions import reveal_type from myapp.models import MyModel, NewManager reveal_type(NewManager()) # N: Revealed type is "myapp.models.ModelBaseManagerFromModelQuerySet[Never]" reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ModelBaseManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.manager_only_method()) # N: Revealed type is "int" reveal_type(MyModel.objects.manager_and_queryset_method()) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ModelBaseManager(models.Manager): def manager_only_method(self) -> int: return 1 class ModelQuerySet(models.QuerySet): def manager_and_queryset_method(self) -> str: return 'hello' NewManager = ModelBaseManager.from_queryset(ModelQuerySet) class MyModel(models.Model): objects = NewManager() - case: from_queryset_with_class_name_provided main: | from typing_extensions import reveal_type from myapp.models import MyModel, NewManager, OtherModel, OtherManager reveal_type(NewManager()) # N: Revealed type is "myapp.models.NewManager[Never]" reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.NewManager[myapp.models.MyModel]" reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.manager_only_method()) # N: Revealed type is "int" reveal_type(MyModel.objects.manager_and_queryset_method()) # N: Revealed type is "str" reveal_type(OtherManager()) # N: Revealed type is "myapp.models.X[Never]" reveal_type(OtherModel.objects) # N: Revealed type is "myapp.models.X[myapp.models.OtherModel]" reveal_type(OtherModel.objects.manager_only_method()) # N: Revealed type is "int" reveal_type(OtherModel.objects.manager_and_queryset_method()) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ModelBaseManager(models.Manager): def manager_only_method(self) -> int: return 1 class ModelQuerySet(models.QuerySet): def manager_and_queryset_method(self) -> str: return 'hello' NewManager = ModelBaseManager.from_queryset(ModelQuerySet, class_name='NewManager') class MyModel(models.Model): objects = NewManager() OtherManager = ModelBaseManager.from_queryset(ModelQuerySet, class_name='X') class OtherModel(models.Model): objects = OtherManager() - case: from_queryset_with_class_inheritance main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager class BaseQuerySet(models.QuerySet): def queryset_method(self) -> str: return 'hello' class ModelQuerySet(BaseQuerySet): pass NewManager = Manager.from_queryset(ModelQuerySet) class MyModel(models.Model): objects = NewManager() - case: from_queryset_with_manager_in_another_directory_and_imports main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.managers.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.queryset_method) # N: Revealed type is "def (param: str | None =) -> str | None" reveal_type(MyModel.objects.queryset_method('str')) # N: Revealed type is "str | None" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from myapp.managers import NewManager class MyModel(models.Model): objects = NewManager() - path: myapp/managers.py content: | from django.db import models class ModelQuerySet(models.QuerySet): def queryset_method(self, param: str | None = None) -> str | None: return param NewManager = models.Manager.from_queryset(ModelQuerySet) - case: from_queryset_with_inherited_manager_and_typing_no_return disable_cache: true main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.managers.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.objects.base_queryset_method) # N: Revealed type is "def (param: int | str) -> Never" reveal_type(MyModel.objects.base_queryset_method(2)) # N: Revealed type is "Never" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from myapp.managers import NewManager class MyModel(models.Model): objects = NewManager() - path: myapp/managers.py content: | from django.db import models from myapp.base_queryset import BaseQuerySet class ModelQuerySet(BaseQuerySet): pass NewManager = models.Manager.from_queryset(ModelQuerySet) - path: myapp/base_queryset.py content: | from typing import NoReturn from django.db import models class BaseQuerySet(models.QuerySet): def base_queryset_method(self, param: int | str) -> NoReturn: raise ValueError - case: from_queryset_with_decorated_queryset_methods main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "str" reveal_type(MyModel.objects.queryset_method_2()) # N: Revealed type is "int" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models, transaction class ModelQuerySet(models.QuerySet): @transaction.atomic def queryset_method(self) -> str: return 'hello' @transaction.atomic @transaction.atomic def queryset_method_2(self) -> int: return 2 NewManager = models.Manager.from_queryset(ModelQuerySet) class MyModel(models.Model): objects = NewManager() - case: from_queryset_with_static_and_class_queryset_methods main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects.static_method) # N: Revealed type is "def (x: int =) -> str" reveal_type(MyModel.objects.static_method(2)) # N: Revealed type is "str" reveal_type(MyModel.objects.static_method_required_arg(2)) # N: Revealed type is "str" MyModel.objects.static_method_required_arg() # E: Missing positional argument "x" in call to "static_method_required_arg" of "ModelQuerySet" [call-arg] reveal_type(MyModel.objects.class_method(2)) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ModelQuerySet(models.QuerySet): @staticmethod def static_method(x: int = 1) -> str: return 'hello' @staticmethod def static_method_required_arg(x: int) -> str: return 'hello' @classmethod def class_method(cls, x: int = 1) -> str: return 'hello' NewManager = models.Manager.from_queryset(ModelQuerySet) class MyModel(models.Model): objects = NewManager() - case: from_queryset_model_gets_generated_manager_as_default_manager main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.queryset_method()) # N: Revealed type is "str" reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" # Overloads reveal_type(MyModel.objects.overloaded_method(1)) # N: Revealed type is "int" reveal_type(MyModel.objects.overloaded_method('a')) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import overload from django.db import models class ModelQuerySet(models.QuerySet): def queryset_method(self) -> str: return 'hello' @overload def overloaded_method(self, arg: int) -> int: raise NotImplementedError @overload def overloaded_method(self, arg: str) -> str: raise NotImplementedError def overloaded_method(self, arg: int | str) -> int | str: return arg NewManager = models.Manager.from_queryset(ModelQuerySet) class MyModel(models.Model): objects = NewManager() - case: from_queryset_can_resolve_explicit_any_methods main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.MyManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.objects.queryset_method(1)) # N: Revealed type is "Any" reveal_type(MyModel.objects.queryset_method) # N: Revealed type is "def (qarg: Any) -> Any" reveal_type(MyModel.objects.manager_method(2)) # N: Revealed type is "Any" reveal_type(MyModel.objects.manager_method) # N: Revealed type is "def (marg: Any) -> Any" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from typing import Any class ModelQuerySet(models.QuerySet): def queryset_method(self, qarg: Any) -> Any: return 'hello' class MyManager(models.Manager): def manager_method(self, marg: Any) -> Any: return 'hello' NewManager = MyManager.from_queryset(ModelQuerySet) class MyModel(models.Model): objects = NewManager() - case: test_queryset_in_model_class_body main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet" reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet" reveal_type(MyModel.objects.all) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.custom) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.all().filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.custom().filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects2) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet" reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.MyManagerFromMyQuerySet" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyManager(models.Manager["MyModel"]): pass class MyQuerySet(models.QuerySet["MyModel"]): def custom(self) -> "MyQuerySet": raise NotImplementedError class MyModel(models.Model): objects = MyManager.from_queryset(MyQuerySet)() objects2 = MyManager.from_queryset(MyQuerySet)() - case: test_queryset_in_model_class_body_subclass main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.BaseManagerFromBaseQuerySet" reveal_type(MyModel.objects.get()) # N: Revealed type is "myapp.models.BaseModel" reveal_type(MyModel.objects.filter()) # N: Revealed type is "myapp.models.BaseQuerySet[myapp.models.BaseModel, myapp.models.BaseModel]" reveal_type(MyModel.objects.filter().get()) # N: Revealed type is "myapp.models.BaseModel" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class BaseManager(models.Manager["BaseModel"]): pass class BaseQuerySet(models.QuerySet["BaseModel"]): def custom(self) -> "BaseQuerySet": raise NotImplementedError class BaseModel(models.Model): objects = BaseManager.from_queryset(BaseQuerySet)() class MyModel(BaseModel): pass - case: from_queryset_includes_methods_returning_queryset main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects.alias) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.all) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.annotate) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.complex_filter) # N: Revealed type is "def (filter_obj: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.defer) # N: Revealed type is "Overload(def (None) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel], def (*fields: str) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel])" reveal_type(MyModel.objects.difference) # N: Revealed type is "def (*other_qs: django.db.models.query.QuerySet[django.db.models.base.Model, Any]) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.distinct) # N: Revealed type is "def (*field_names: str) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.exclude) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.extra) # N: Revealed type is "def (select: dict[str, Any] | None =, where: typing.Sequence[str] | None =, params: typing.Sequence[Any] | None =, tables: typing.Sequence[str] | None =, order_by: typing.Sequence[str | django.db.models.expressions.Combinable] | None =, select_params: typing.Sequence[Any] | None =) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.filter) # N: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.intersection) # N: Revealed type is "def (*other_qs: django.db.models.query.QuerySet[django.db.models.base.Model, Any]) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.none) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.only) # N: Revealed type is "def (*fields: str) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.order_by) # N: Revealed type is "def (*field_names: str | django.db.models.expressions.Combinable) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.prefetch_related) # N: Revealed type is "Overload(def (None) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel], def [_LookupT <: str, _PrefetchedQuerySetT <: django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model] = django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model], _ToAttrT <: str = str] (*lookups: str | django.db.models.query.Prefetch[_LookupT, _PrefetchedQuerySetT, _ToAttrT]) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel])" reveal_type(MyModel.objects.reverse) # N: Revealed type is "def () -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.select_for_update) # N: Revealed type is "def (nowait: bool =, skip_locked: bool =, of: typing.Sequence[str] =, no_key: bool =) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.select_related) # N: Revealed type is "Overload(def (None) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel], def (*fields: str) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel])" reveal_type(MyModel.objects.union) # N: Revealed type is "def (*other_qs: django.db.models.query.QuerySet[django.db.models.base.Model, Any], all: bool =) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.objects.using) # N: Revealed type is "def (alias: str | None) -> myapp.models.MyQuerySet[myapp.models.MyModel, myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager class MyQuerySet(models.QuerySet["MyModel"]): ... MyManager = Manager.from_queryset(MyQuerySet) class MyModel(models.Model): objects = MyManager() # This tests a regression where mypy would generate phantom warnings about # undefined types due to unresolved types when copying methods from QuerySet to # a manager dynamically created using Manager.from_queryset(). # # For details see: https://github.com/typeddjango/django-stubs/issues/1022 - case: from_queryset_custom_auth_user_model # Cache needs to be disabled to consistently reproduce the bug disable_cache: true main: | from users.models import User custom_settings: | AUTH_USER_MODEL = "users.User" INSTALLED_APPS = ("django.contrib.auth", "django.contrib.contenttypes", "users") files: - path: users/__init__.py - path: users/models.py content: | from django.contrib.auth.models import AbstractBaseUser from django.db import models from .querysets import UserQuerySet UserManager = models.Manager.from_queryset(UserQuerySet) class User(AbstractBaseUser): email = models.EmailField(unique=True) objects = UserManager() USERNAME_FIELD = "email" - path: users/querysets.py content: | from django.db import models from typing import TYPE_CHECKING if TYPE_CHECKING: from .models import User class UserQuerySet(models.QuerySet["User"]): pass - case: reuses_type_when_called_twice_identically main: | from typing_extensions import reveal_type from myapp.models import MyModel, FirstManager, SecondManager reveal_type(FirstManager) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]" reveal_type(SecondManager) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]" reveal_type(MyModel.first) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" reveal_type(MyModel.second) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager class ModelQuerySet(models.QuerySet["MyModel"]): ... FirstManager = Manager.from_queryset(ModelQuerySet) SecondManager = Manager.from_queryset(ModelQuerySet) class MyModel(models.Model): first = FirstManager() second = SecondManager() - case: handles_name_collision_with_generated_type main: | from typing_extensions import reveal_type from myapp.models import MyModel, ManagerFromModelQuerySet reveal_type(ManagerFromModelQuerySet()) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[Never]" reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager class ModelQuerySet(models.QuerySet["MyModel"]): ... ManagerFromModelQuerySet = Manager.from_queryset(ModelQuerySet) class MyModel(models.Model): objects = ManagerFromModelQuerySet() - case: resolves_name_collision_with_other_module_level_object main: | from typing_extensions import reveal_type from myapp.models import MyModel, Generated, ManagerFromModelQuerySet reveal_type(ManagerFromModelQuerySet) # N: Revealed type is "int" reveal_type(Generated()) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet2[Never]" reveal_type(MyModel.objects) # N: Revealed type is "myapp.models.ManagerFromModelQuerySet2[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager class ModelQuerySet(models.QuerySet["MyModel"]): ... ManagerFromModelQuerySet = 1 Generated = Manager.from_queryset(ModelQuerySet) class MyModel(models.Model): objects = Generated() - case: accepts_explicit_none_as_class_name main: | from typing_extensions import reveal_type from myapp.models import PositionalNone, NoneAsKwarg reveal_type(PositionalNone) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]" reveal_type(NoneAsKwarg) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager class ModelQuerySet(models.QuerySet): ... PositionalNone = Manager.from_queryset(ModelQuerySet, None) NoneAsKwarg = Manager.from_queryset(ModelQuerySet, class_name=None) - case: uses_fallback_class_name_when_argument_is_not_string_expression main: | from typing_extensions import reveal_type from myapp.models import StrCallable reveal_type(StrCallable) # N: Revealed type is "def [_T <: django.db.models.base.Model] () -> myapp.models.ManagerFromModelQuerySet[_T]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db.models.manager import Manager class ModelQuerySet(models.QuerySet): ... StrCallable = Manager.from_queryset(ModelQuerySet, class_name=str(1)) - case: queryset_inheritable_does_not_clobber_super_init main: | from typing_extensions import reveal_type from myapp.models import BaseManager reveal_type(BaseManager().ttl) # N: Revealed type is "int" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import Any, TYPE_CHECKING from django.db import models from django.db.models.manager import Manager from django.db.models.query import QuerySet if TYPE_CHECKING: from django.db.models.manager import _T from django.db.models.query import _Model, _Row class MyQuerySet(QuerySet["_Model", "_Row"]): def __init__(self, *a: Any, **k: Any) -> None: super().__init__(*a, **k) _base = Manager.from_queryset(MyQuerySet) class BaseManager(_base["_T"]): def __init__(self, *a: Any, ttl: int = 0, **k: Any) -> None: self.ttl = ttl super().__init__(*a, **k) - case: test_from_queryset_with_deferral main: | from typing_extensions import reveal_type from myapp.models import Concrete reveal_type(Concrete.objects.qs_meth()) # N: Revealed type is "int" reveal_type(Concrete.objects.manager_meth()) # N: Revealed type is "str" mypy_config: | [mypy.plugins.django-stubs] django_settings_module = myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import ClassVar from typing_extensions import Self, TypeVar from django.db import models from django.db.models.manager import Manager M = TypeVar("M", bound=models.Model, covariant=True) # bogus forward-`metaclass=` to trigger second semanal pass similar to #2224 class CustomQuerySet(models.QuerySet[M], metaclass=MCS): def qs_meth(self) -> int: return 1 _base = Manager.from_queryset(CustomQuerySet) class CustomBase(_base[M]): def manager_meth(self) -> str: return 'hi' class Concrete(models.Model): objects: ClassVar[CustomBase[Self]] = CustomBase() class MCS(type): pass - case: test_from_queryset_with_concrete_subclass main: | from typing_extensions import reveal_type from myapp.models import Concrete reveal_type(Concrete.objects) # N: Revealed type is "myapp.models.ConcreteManager" reveal_type(Concrete.objects.get()) # N: Revealed type is "myapp.models.Concrete" reveal_type(Concrete.objects.all()) # N: Revealed type is "myapp.models.CustomQuerySet[myapp.models.Concrete, myapp.models.Concrete]" reveal_type(Concrete.objects.all().get()) # N: Revealed type is "myapp.models.Concrete" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import ClassVar from typing_extensions import Self, TypeVar from django.db.models import Model, QuerySet from django.db.models.manager import Manager M = TypeVar("M", bound=Model, covariant=True) D = TypeVar("D", covariant=True, default=M) class CustomQuerySet(QuerySet[M, D]): pass _base = Manager.from_queryset(CustomQuerySet) class CustomBase(_base[M]): ... class BaseModel(Model): objects: ClassVar[CustomBase[Self]] = CustomBase() class ConcreteManager(CustomBase["Concrete"]): ... class Concrete(BaseModel): objects: ClassVar[ConcreteManager] = ConcreteManager() - case: test_queryset_arg_as_unsupported_expressions main: | from typing import Generic from typing_extensions import TypeAlias, TypeVar, reveal_type from django.db import models from django.db.models.manager import Manager class QS1(models.QuerySet[models.Model]): ... class QS2(models.QuerySet[models.Model]): ... Alias: TypeAlias = QS1 | QS2 reveal_type(Manager[models.Model].from_queryset(Alias)) T = TypeVar("T") class NonQSGeneric(Generic[T]): ... reveal_type(Manager[models.Model].from_queryset(NonQSGeneric[int])) out: | main:12: note: Revealed type is "type[django.db.models.manager.Manager[django.db.models.base.Model]]" main:12: error: Argument 1 to "from_queryset" of "BaseManager" has incompatible type "UnionType[QS1[Model, Model], QS2[Model, Model]]"; expected "type[QuerySet[Model, Model]]" [arg-type] main:17: note: Revealed type is "type[django.db.models.manager.Manager[django.db.models.base.Model]]" main:17: error: Argument 1 to "from_queryset" of "BaseManager" has incompatible type "type[NonQSGeneric[int]]"; expected "type[QuerySet[Model, Model]]" [arg-type] - case: test_reverse_manager_with_foreign_key main: | from typing_extensions import reveal_type from myapp.models import B reveal_type(B().a_set.filter(field="something")) # N: Revealed type is "myapp.models.QS[myapp.models.A, myapp.models.A]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class B(models.Model): ... class QS(models.QuerySet["A"]): ... Manager = models.Manager.from_queryset(QS) class A(models.Model): field = models.CharField() b = models.ForeignKey(B, on_delete=models.CASCADE) objects = Manager() # Regression test for #2373: Ensure from_queryset handles repeated deferrals # correctly. When create_manager_info_from_from_queryset_call returns None due # to forward references, PlaceholderNode should only be added once, not on # every iteration. - case: test_from_queryset_repeated_deferral_with_forward_metaclass main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects.custom_method()) out: | main:3: error: Access to generic instance variables via class is ambiguous [misc] main:3: note: Revealed type is "str" mypy_config: | [mypy.plugins.django-stubs] django_settings_module = myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import TypeVar from django.db import models from django.db.models.manager import Manager M = TypeVar("M", bound=models.Model, covariant=True) # Forward reference to metaclass triggers deferral, causing # create_manager_info_from_from_queryset_call to return None # on initial passes. The fix ensures PlaceholderNode is not # re-added on each iteration, preventing progress flag from # being set repeatedly. class CustomQuerySet(models.QuerySet[M], metaclass=ForwardMCS): def custom_method(self) -> str: return "test" CustomManager = Manager.from_queryset(CustomQuerySet) class MyModel(models.Model): objects = CustomManager() # Forward-referenced metaclass defined after use class ForwardMCS(type): pass - case: subclass_queryset_without_type_parameters_disallow_any_generics main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) reveal_type(MyModel.objects.get()) installed_apps: - myapp mypy_config: | [mypy-myapp.models] disallow_any_generics = true out: | main:3: note: Revealed type is "myapp.models.ManagerFromMyQuerySet[myapp.models.MyModel]" main:4: note: Revealed type is "myapp.models.MyModel" myapp/models:3: error: Missing type arguments for generic type "QuerySet" [type-arg] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyQuerySet(models.QuerySet): pass MyManager = models.Manager.from_queryset(MyQuerySet) class MyModel(models.Model): objects = MyManager() typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_get_or_create.yml000066400000000000000000000071631526064357400324220ustar00rootroot00000000000000- case: get_or_create_typechecks_kwargs main: | from typing_extensions import reveal_type from myapp.models import MyModel # Return type is preserved reveal_type(MyModel.objects.get_or_create(num=1)) # N: Revealed type is "tuple[myapp.models.MyModel, bool]" # Valid field kwarg and lookup expression MyModel.objects.get_or_create(num=1) MyModel.objects.get_or_create(num__gte=1) # `defaults` alongside lookup kwargs MyModel.objects.get_or_create(num=1, defaults={"num": 2}) # Unknown field is rejected MyModel.objects.get_or_create(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: id, num [misc] # Invalid type for a known field is rejected MyModel.objects.get_or_create(num=MyModel()) # E: Incompatible type for lookup 'num': (got "MyModel", expected "str | int") [misc] # Async variant shares the same validation async def main() -> None: await MyModel.objects.aget_or_create(num=1) await MyModel.objects.aget_or_create(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: id, num [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): num = models.IntegerField() - case: get_or_create_typechecks_defaults main: | from myapp.models import MyModel # Unknown key in defaults is rejected MyModel.objects.get_or_create(num=1, defaults={"unknown_field": True}) # E: Unexpected attribute "unknown_field" for model "MyModel" [misc] # Incompatible value type in defaults is rejected MyModel.objects.get_or_create(num=1, defaults={"num": MyModel()}) # E: Incompatible type for "num" of "MyModel" (got "MyModel", expected "float | int | str | Combinable") [misc] # Valid defaults: no errors MyModel.objects.get_or_create(num=1, defaults={"num": 2, "name": "hello"}) # Non-literal defaults variable is silently accepted (no false positives) some_defaults: dict[str, object] = {"unknown_field": True} MyModel.objects.get_or_create(num=1, defaults=some_defaults) # `**kwargs` variable unpacking is silently accepted kwargs = {"defaults": {"unknown_field": True}} MyModel.objects.get_or_create(num=1, **kwargs) # `**dict_literal` unpacking is also silently accepted; only a direct # `defaults=` dict literal is validated. MyModel.objects.get_or_create(num=1, **{"defaults": {"unknown_field": True}}) # `**other_fields` inside a `defaults=` dict literal: literal keys are # still validated, the unpacked portion is skipped. other_fields = {"num": 2} MyModel.objects.get_or_create(num=1, defaults={"unknown_field": True, **other_fields}) # E: Unexpected attribute "unknown_field" for model "MyModel" [misc] # Async variant shares the same validation async def main() -> None: await MyModel.objects.aget_or_create(num=1, defaults={"unknown_field": True}) # E: Unexpected attribute "unknown_field" for model "MyModel" [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): num = models.IntegerField() name = models.CharField(max_length=100) typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_in_bulk.yml000066400000000000000000000071771526064357400312500ustar00rootroot00000000000000- case: in_bulk_valid installed_apps: - myapp main: | from myapp.models import Article # Default (no field_name — uses pk) Article.objects.in_bulk() # Explicit pk Article.objects.in_bulk(field_name="pk") # Unique field Article.objects.in_bulk(field_name="slug") # Field unique through a single-field UniqueConstraint Article.objects.in_bulk(field_name="code") # Non-literal field_name (skipped by validation) field: str = "title" Article.objects.in_bulk(field_name=field) # With id_list Article.objects.in_bulk([1, 2, 3]) Article.objects.in_bulk([1, 2], field_name="pk") # Async variant with valid field async def test_async() -> None: await Article.objects.ain_bulk(field_name="slug") files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Article(models.Model): title = models.CharField(max_length=200) slug = models.SlugField(unique=True) code = models.CharField(max_length=10) category = models.CharField(max_length=10) published = models.BooleanField(default=False) class Meta: constraints = [ models.UniqueConstraint(fields=["code"], name="unique_code"), models.UniqueConstraint(fields=["category", "title"], name="unique_category_title"), ] - case: in_bulk_invalid installed_apps: - myapp main: | from myapp.models import Article from django.db.models import F # Non-existent field Article.objects.in_bulk(field_name="nonexistent") # E: Article has no field named 'nonexistent' [misc] # Non-unique field Article.objects.in_bulk(field_name="title") # E: "in_bulk()"'s field_name must be a unique field but "title" isn't [misc] # Field only unique as part of a multi-field UniqueConstraint Article.objects.in_bulk(field_name="category") # E: "in_bulk()"'s field_name must be a unique field but "category" isn't [misc] # Annotated field (not supported at runtime, `Options.get_field` raises `FieldDoesNotExist`) Article.objects.annotate(foo=F("slug")).in_bulk(field_name="foo") # E: Article has no field named 'foo' [misc] # Async variant with invalid field async def test_async() -> None: await Article.objects.ain_bulk(field_name="nonexistent") # E: Article has no field named 'nonexistent' [misc] await Article.objects.ain_bulk(field_name="title") # E: "in_bulk()"'s field_name must be a unique field but "title" isn't [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Article(models.Model): title = models.CharField(max_length=200) slug = models.SlugField(unique=True) code = models.CharField(max_length=10) category = models.CharField(max_length=10) published = models.BooleanField(default=False) class Meta: constraints = [ models.UniqueConstraint(fields=["code"], name="unique_code"), models.UniqueConstraint(fields=["category", "title"], name="unique_category_title"), ] typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_iteration.yml000066400000000000000000000017751526064357400316210ustar00rootroot00000000000000- case: sync_for main: | from typing_extensions import reveal_type from myapp.models import User for user in User.objects.all(): reveal_type(user) # N: Revealed type is "myapp.models.User" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass - case: async_for main: | from typing_extensions import reveal_type from myapp.models import User async def main() -> None: async for user in User.objects.all(): reveal_type(user) # N: Revealed type is "myapp.models.User" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_order_by.yml000066400000000000000000000303401526064357400314160ustar00rootroot00000000000000- case: order_by_valid_fields installed_apps: - myapp main: | from myapp.models import Article, Author from django.db.models import F, OrderBy # Simple fields Article.objects.order_by("title") Article.objects.order_by("pk") Article.objects.order_by("id") # Descending Article.objects.order_by("-title") Article.objects.order_by("-pk") # Random ordering Article.objects.order_by("?") # FK traversal Article.objects.order_by("author__name") Article.objects.order_by("-author__name") # Multiple fields Article.objects.order_by("title", "-author__name") # Annotated fields Article.objects.annotate(foo=F("id")).order_by("foo") # Non-literal strings (skipped by validation) field: str = "title" Article.objects.order_by(field) # F expressions and OrderBy objects (not string literals, skipped) Article.objects.order_by(F("title")) Article.objects.order_by(OrderBy(F("title"))) # earliest / latest Article.objects.earliest("title") Article.objects.latest("title") Article.objects.earliest("author__name") Article.objects.latest("-title") # FK id field Article.objects.order_by("author_id") # Clear ordering with no arguments Article.objects.order_by() # Chained order_by calls (second overrides first) Article.objects.order_by("title").order_by("-author__name") # Reverse FK traversal (Author -> Article) Author.objects.order_by("article__title") Author.objects.order_by("-article__title") # values() / values_list() then order_by Article.objects.values("title").order_by("title") Article.objects.values_list("title", flat=True).order_by("title") # values() with annotation then order_by Article.objects.values(name=F("author__name")).order_by("name") # values() alias preserved through a subsequent annotate() Article.objects.values(name=F("id")).annotate(foo=F("id")).order_by("name") Article.objects.values(name=F("id")).annotate(foo=F("id")).order_by("foo") files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="article") - case: order_by_invalid_fields installed_apps: - myapp main: | from myapp.models import Article, Author from typing import Literal # Non-existent field Article.objects.order_by("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc] # Invalid chained lookup Article.objects.order_by("author__nonexistent") # E: Cannot resolve keyword 'nonexistent' into field or transform on 'author'. [misc] # Descending invalid Article.objects.order_by("-nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc] # Literal typed invalid field: Literal["nonexistent"] = "nonexistent" Article.objects.order_by(field) # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc] # Literal typed descending invalid field2: Literal["-nonexistent"] = "-nonexistent" Article.objects.order_by(field2) # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc] # Literal typed invalid FK traversal field3: Literal["author__nonexistent"] = "author__nonexistent" Article.objects.order_by(field3) # E: Cannot resolve keyword 'nonexistent' into field or transform on 'author'. [misc] # earliest / latest with invalid fields Article.objects.earliest("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc] Article.objects.latest("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc] # Async variants async def test_async() -> None: await Article.objects.aearliest("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc] await Article.objects.alatest("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc] # Lookup suffix on a valid field — __exact is a lookup, not a traversal Article.objects.order_by("title__exact") # E: Cannot resolve keyword 'exact' into field or transform on 'title'. [misc] # Invalid field at depth > 2 Article.objects.order_by("author__name__nonexistent") # E: Cannot resolve keyword 'nonexistent' into field or transform on 'name'. [misc] # values() then order_by with invalid field Article.objects.values("title").order_by("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: author, author_id, content, id, published, title [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Author(models.Model): name = models.CharField(max_length=100) email = models.EmailField() class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="article") # Regression test for https://github.com/typeddjango/django-stubs/issues/3184 # Abstract models have _meta.pk = None, which caused an AttributeError crash # in Django's Query.names_to_path() when validating order_by lookups. - case: order_by_abstract_model_no_crash installed_apps: - myapp main: | from myapp.models import AbstractModel from django.db.models import QuerySet def test(qs: QuerySet[AbstractModel]) -> None: qs.order_by("pk") files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class AbstractModel(models.Model): class Meta: abstract = True class ConcreteModel(AbstractModel): pass - case: order_by_with_field_transforms installed_apps: - myapp main: | from myapp.models import Article Article.objects.order_by("created__year", "created__month") Article.objects.order_by("-created__year") Article.objects.order_by("author__created__year") Article.objects.values("created__month", "created__year").order_by("created__year") files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Author(models.Model): created = models.DateTimeField(auto_now_add=True) class Article(models.Model): created = models.DateTimeField(auto_now_add=True) author = models.ForeignKey(Author, on_delete=models.CASCADE) - case: order_by_with_jsonfield_key_transforms installed_apps: - myapp main: | from myapp.models import Item Item.objects.order_by("data__field") Item.objects.order_by("-data__field") Item.objects.order_by("data__nested__key") files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Item(models.Model): data = models.JSONField() - case: order_by_with_annotations_typeddict installed_apps: - myapp main: | from typing import TYPE_CHECKING, TypedDict from django.db.models import QuerySet, Value, IntegerField from django_stubs_ext import WithAnnotations from myapp.models import Item class ExtraAnnotation(TypedDict): extra_id: int | None if TYPE_CHECKING: ItemWithExtraAnnotation = WithAnnotations[Item, ExtraAnnotation] else: ItemWithExtraAnnotation = Item ItemWithExtraAnnotationQuerySet = QuerySet[Item, ItemWithExtraAnnotation] def annotate_extra(qs: QuerySet[Item]) -> ItemWithExtraAnnotationQuerySet: return qs.annotate(extra_id=Value(None, output_field=IntegerField())) qs = annotate_extra(Item.objects.all()) qs.order_by("extra_id") qs.order_by("-extra_id") qs.order_by("name", "extra_id") qs.order_by("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: id, name [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Item(models.Model): name = models.CharField(max_length=100) - case: order_by_combined_annotate_and_withannotations installed_apps: - myapp main: | from typing import TYPE_CHECKING, TypedDict from django.db.models import QuerySet, F from django_stubs_ext import WithAnnotations from myapp.models import Item class DeclaredAnnotation(TypedDict): declared_field: int if TYPE_CHECKING: ItemWithDeclared = WithAnnotations[Item, DeclaredAnnotation] else: ItemWithDeclared = Item def get_qs() -> QuerySet[Item, ItemWithDeclared]: return Item.objects.all() # type: ignore[return-value] qs = get_qs().annotate(runtime_field=F("id")) qs.order_by("declared_field") qs.order_by("runtime_field") qs.order_by("declared_field", "-runtime_field", "name") qs.order_by("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: id, name [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Item(models.Model): name = models.CharField(max_length=100) - case: order_by_with_multiple_withannotations_fields installed_apps: - myapp main: | from typing import TYPE_CHECKING, TypedDict from django.db.models import QuerySet from django_stubs_ext import WithAnnotations from myapp.models import Item class MultipleAnnotations(TypedDict): field_a: int field_b: str field_c: float if TYPE_CHECKING: ItemWithMultiple = WithAnnotations[Item, MultipleAnnotations] else: ItemWithMultiple = Item def get_qs() -> QuerySet[Item, ItemWithMultiple]: return Item.objects.all() # type: ignore[return-value] qs = get_qs() qs.order_by("field_a") qs.order_by("-field_b") qs.order_by("field_c") qs.order_by("field_a", "-field_b", "field_c", "name") qs.order_by("nonexistent") # E: Cannot resolve keyword 'nonexistent' into field. Choices are: id, name [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Item(models.Model): name = models.CharField(max_length=100) typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_prefetch_related.yml000066400000000000000000001063721526064357400331220ustar00rootroot00000000000000- case: prefetch_related_to_attr installed_apps: - myapp main: | from myapp.models import Article, Tag from django.db.models import Prefetch, F, QuerySet from django.db import models from typing_extensions import Literal, TypedDict, reveal_type from django_stubs_ext import WithAnnotations ### Noop (to_attr not provided) reveal_type(Article.objects.prefetch_related(Prefetch("tags")).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article, myapp.models.Article]" reveal_type(Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all())).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article, myapp.models.Article]" reveal_type(Prefetch("tags")) # N: Revealed type is "django.db.models.query.Prefetch[Literal['tags'], django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model], str]" reveal_type(Prefetch("tags", Tag.objects.all())) # N: Revealed type is "django.db.models.query.Prefetch[Literal['tags'], django.db.models.query.QuerySet[myapp.models.Tag, myapp.models.Tag], str]" # Prefetch created in a function with no to_attr def get_prefetch_no_to_attr() -> Prefetch[Literal["tags"], QuerySet[Tag]]: return Prefetch("tags", Tag.objects.all()) reveal_type(Article.objects.prefetch_related(get_prefetch_no_to_attr()).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article, myapp.models.Article]" # Prefetch created in a function with no to_attr and no queryset def get_prefetch_no_to_attr_no_qs() -> Prefetch[Literal["tags"]]: return Prefetch("tags") reveal_type(Article.objects.prefetch_related(get_prefetch_no_to_attr_no_qs()).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article, myapp.models.Article]" # On the QuerySet article_qs = Article.objects.all().prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="every_tags")) reveal_type(article_qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]" reveal_type(article_qs.get().every_tags) # N: Revealed type is "list[myapp.models.Tag]" reveal_type( Tag.objects.all().prefetch_related( # N: Revealed type is "list[myapp.models.Article]" Prefetch("tags", Article.objects.all(), to_attr="every_articles") ).get().every_articles ) # On the Manager reveal_type( Article.objects.prefetch_related( # N: Revealed type is "list[myapp.models.Tag]" Prefetch("tags", Tag.objects.all(), to_attr="every_tags") ).get().every_tags ) reveal_type( Tag.objects.prefetch_related( # N: Revealed type is "list[myapp.models.Article]" Prefetch("tags", Article.objects.all(), to_attr="every_articles") ).get().every_articles ) # Member expr reveal_type( Article.objects.prefetch_related( # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]" models.Prefetch("tags", Tag.objects.all(), to_attr="every_tags") ).all() ) # pos args only reveal_type( Article.objects.prefetch_related( # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]" models.Prefetch("tags", Tag.objects.all(), "every_tags") ).all() ) # Multiple Prefetch items: both `to_attr` annotations should be present multi_qs = Article.objects.all().prefetch_related( Prefetch("tags", Tag.objects.all(), to_attr="ts"), Prefetch("tags", Tag.objects.all(), to_attr="ts2"), ) reveal_type(multi_qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'ts': list[myapp.models.Tag], 'ts2': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'ts': list[myapp.models.Tag], 'ts2': list[myapp.models.Tag]})]]" reveal_type(multi_qs.get().ts) # N: Revealed type is "list[myapp.models.Tag]" reveal_type(multi_qs.get().ts2) # N: Revealed type is "list[myapp.models.Tag]" # Mixed inline `Prefetch` and plain lookup string in one call; string should be ignored mixed_plain = Article.objects.prefetch_related( "tags", Prefetch("tags", Article.objects.all(), to_attr="arts3"), ) reveal_type(mixed_plain) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'arts3': list[myapp.models.Article]})], myapp.models.Article@AnnotatedWith[TypedDict({'arts3': list[myapp.models.Article]})]]" # Intermediary variable -- function scope def foo() -> None: tag_prefetch = Prefetch("tags", Tag.objects.all(), to_attr="every_tags") reveal_type(Article.objects.prefetch_related(tag_prefetch).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]" # Intermediary variable -- module scope tag_prefetch = Prefetch("tags", Tag.objects.all(), to_attr="every_tags") reveal_type(Article.objects.prefetch_related(tag_prefetch).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]" # Prefetch created in a function def get_invalid_prefetch() -> Prefetch[Literal["tags"], QuerySet[Tag], Literal["every_tags"]]: return Prefetch("tags", Tag.objects.all(), to_attr="foo") # E: Incompatible return value type (got "Prefetch[Literal['tags'], QuerySet[Tag, Tag], Literal['foo']]", expected "Prefetch[Literal['tags'], QuerySet[Tag, Tag], Literal['every_tags']]") [return-value] # E: Argument "to_attr" to "Prefetch" has incompatible type "Literal['foo']"; expected "Literal['every_tags'] | None" [arg-type] def get_prefetch() -> Prefetch[Literal["tags"], QuerySet[Tag], Literal["every_tags"]]: return Prefetch("tags", Tag.objects.all(), to_attr="every_tags") reveal_type(Article.objects.prefetch_related(get_prefetch()).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]" # Prefetch created in a function with to_attr as an intermediary variable def get_prefetch_with_var() -> Prefetch[Literal["tags"], QuerySet[Tag], Literal["every_tags"]]: to_attr = "every_tags" return Prefetch("tags", Tag.objects.all(), to_attr) # E: Argument 3 to "Prefetch" has incompatible type "str"; expected "Literal['every_tags'] | None" [arg-type] reveal_type(Article.objects.prefetch_related(get_prefetch_with_var()).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag]})]]" # Mixed inline `Prefetch` and variable `Prefetch` in one call mixed_qs = Article.objects.prefetch_related( tag_prefetch, Prefetch("tags", Article.objects.all(), to_attr="arts2"), ) reveal_type(mixed_qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'arts2': list[myapp.models.Article]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'arts2': list[myapp.models.Article]})]]" # Prefetch with `to_attr` arg but without the `queryset` arg reveal_type(Article.objects.prefetch_related(models.Prefetch("tags", to_attr="just_tags")).get().just_tags) # N: Revealed type is "list[myapp.models.Tag]" # Prefetch with annotated `queryset` reveal_type(Article.objects.prefetch_related( # N: Revealed type is "list[myapp.models.Tag@AnnotatedWith[TypedDict({'foo': Any})]]" models.Prefetch("tags", Tag.objects.annotate(foo=F("id")).all(), to_attr="just_tags")).get().just_tags ) class MyDict(TypedDict): foo: str def get_prefetch_with_annotations() -> Prefetch[Literal["tags"], QuerySet[WithAnnotations[Tag, MyDict]], Literal["every_tags"]]: return Prefetch("tags", Tag.objects.annotate(foo=F("id")), "every_tags") reveal_type(Article.objects.prefetch_related(get_prefetch_with_annotations()).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag@AnnotatedWith[TypedDict(main.MyDict, {'foo': str})]]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag@AnnotatedWith[TypedDict(main.MyDict, {'foo': str})]]})]]" reveal_type(Article.objects.prefetch_related(get_prefetch_with_annotations()).get().every_tags[0].foo) # N: Revealed type is "str" # *args prefetch first_prefetch = Prefetch("tags", Tag.objects.all(), to_attr="every_tags") second_prefetch = Prefetch("tags", Tag.objects.all(), to_attr="every_tags2") third_prefetch = Prefetch("tags", Tag.objects.all(), to_attr="every_tags3") fourth_prefetch = Prefetch("tags", Tag.objects.all(), to_attr="every_tags4") prefetch_objs = (first_prefetch, second_prefetch) reveal_type(Article.objects.prefetch_related(*prefetch_objs).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag]})]]" reveal_type(Article.objects.prefetch_related(third_prefetch, *prefetch_objs).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags3': list[myapp.models.Tag], 'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags3': list[myapp.models.Tag], 'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag]})]]" reveal_type(Article.objects.prefetch_related(*prefetch_objs, third_prefetch).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag], 'every_tags3': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag], 'every_tags3': list[myapp.models.Tag]})]]" reveal_type(Article.objects.prefetch_related(fourth_prefetch, *prefetch_objs, third_prefetch).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags4': list[myapp.models.Tag], 'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag], 'every_tags3': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags4': list[myapp.models.Tag], 'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag], 'every_tags3': list[myapp.models.Tag]})]]" # *args prefetch from helper function def _get_prefetches() -> tuple[ Prefetch[Literal["tags"], QuerySet[Tag], Literal["every_tags"]], Prefetch[Literal["tags"], QuerySet[Tag], Literal["every_tags2"]], ]: return prefetch_objs reveal_type(Article.objects.prefetch_related(*_get_prefetches()).all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag]})], myapp.models.Article@AnnotatedWith[TypedDict({'every_tags': list[myapp.models.Tag], 'every_tags2': list[myapp.models.Tag]})]]" files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Tag(models.Model): ... class Article(models.Model): tags = models.ManyToManyField(to=Tag, related_name="articles", blank=True) - case: prefetch_related_and_annotate installed_apps: - django.contrib.auth - django.contrib.contenttypes main: | from django.db.models import Prefetch, F from django.contrib.auth.models import User, Group from typing_extensions import reveal_type user = ( User.objects .annotate(annotated_user=F("username")) .prefetch_related(Prefetch("groups", Group.objects.all(), to_attr="to_attr_groups")) .get() ) reveal_type(user.annotated_user) # N: Revealed type is "Any" reveal_type(user.to_attr_groups) # N: Revealed type is "list[django.contrib.auth.models.Group]" - case: prefetch_related_to_attr_conflict_with_annotate installed_apps: - django.contrib.auth - django.contrib.contenttypes main: | from django.db.models import Prefetch, F from django.contrib.auth.models import User, Group # When mixing `.annotate(foo=...)` and `prefetch_related(Prefetch(...,to_attr=foo))` # The last annotate in the chain takes precedence (even if it is prior to the prefetch_related) annotate_into_prefetch = ( User.objects # E: Attribute "foo" already defined on "django.contrib.auth.models.User@AnnotatedWith[TypedDict({'foo': Any})]" [no-redef] .annotate(foo=F("username")) .prefetch_related(Prefetch("groups", Group.objects.all(), to_attr="foo")) .get() ) prefetch_into_annotate = ( User.objects # E: Attribute "foo" already defined on "django.contrib.auth.models.User@AnnotatedWith[TypedDict({'foo': list[django.contrib.auth.models.Group]})]" [no-redef] .prefetch_related(Prefetch("groups", Group.objects.all(), to_attr="foo")) .annotate(foo=F("username")) .get() ) - case: prefetch_related_to_attr_conflict_with_withannotations installed_apps: - myapp main: | from django.db.models import Prefetch, QuerySet, Value, IntegerField from myapp.models import Article, Tag from typing import TYPE_CHECKING, TypedDict from django_stubs_ext import WithAnnotations class ExtraAnnotation(TypedDict): extra_id: int | None if TYPE_CHECKING: ArticleWithExtra = WithAnnotations[Article, ExtraAnnotation] else: ArticleWithExtra = Article ArticleWithExtraQuerySet = QuerySet[Article, ArticleWithExtra] def annotate_extra(qs: QuerySet[Article]) -> ArticleWithExtraQuerySet: return qs.annotate(extra_id=Value(None, output_field=IntegerField())) qs = annotate_extra(Article.objects.all()) qs.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="extra_id")) # E: Attribute "extra_id" already defined on "myapp.models.Article" [no-redef] qs.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="prefetched_tags")) files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Tag(models.Model): ... class Article(models.Model): tags = models.ManyToManyField(to=Tag, related_name="articles", blank=True) - case: prefetch_related_to_attr_conflict_with_model_attr installed_apps: - myapp main: | from django.db.models import Prefetch, F from myapp.models import Article, Tag Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="pk")) # E: Attribute "pk" already defined on "myapp.models.Article" [no-redef] Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="id")) # E: Attribute "id" already defined on "myapp.models.Article" [no-redef] Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="tags")) # E: Attribute "tags" already defined on "myapp.models.Article" [no-redef] Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="my_property")) # E: Attribute "my_property" already defined on "myapp.models.Article" [no-redef] Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="my_method")) # E: Attribute "my_method" already defined on "myapp.models.Article" [no-redef] Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="my_classmethod")) # E: Attribute "my_classmethod" already defined on "myapp.models.Article" [no-redef] Article.objects.prefetch_related(Prefetch("tags", Tag.objects.all(), to_attr="my_staticmethod")) # E: Attribute "my_staticmethod" already defined on "myapp.models.Article" [no-redef] Tag.objects.prefetch_related(Prefetch("articles", Article.objects.all(), to_attr="articles")) # E: Attribute "articles" already defined on "myapp.models.Tag" [no-redef] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Tag(models.Model): ... class Article(models.Model): tags = models.ManyToManyField(to=Tag, related_name="articles", blank=True) @property def my_property(self) -> int: raise NotImplementedError def my_method(self) -> int: raise NotImplementedError @staticmethod def my_staticmethod() -> int: raise NotImplementedError @classmethod def my_classmethod(cls) -> int: raise NotImplementedError - case: raw_queryset_prefetch_related_signatures main: | from typing_extensions import reveal_type from myapp.models import Person, Book from django.db.models import Prefetch raw_qs = Book.objects.raw("SELECT 1") reveal_type(raw_qs.prefetch_related()) # N: Revealed type is "django.db.models.query.RawQuerySet[myapp.models.Book]" reveal_type(raw_qs.prefetch_related(None)) # N: Revealed type is "django.db.models.query.RawQuerySet[myapp.models.Book]" reveal_type(raw_qs.prefetch_related("author")) # N: Revealed type is "django.db.models.query.RawQuerySet[myapp.models.Book]" reveal_type(raw_qs.prefetch_related(Prefetch("author"))) # N: Revealed type is "django.db.models.query.RawQuerySet[myapp.models.Book]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Person(models.Model): ... class Book(models.Model): author = models.ForeignKey(Person, on_delete=models.CASCADE) - case: prefetch_related_conflicting_prefetches_on_same_attr installed_apps: - django.contrib.auth - django.contrib.contenttypes main: | from django.db.models import Prefetch from django.contrib.auth.models import User, Group User.objects.prefetch_related( # E: Attribute "new_attr" already defined on "django.contrib.auth.models.User" [no-redef] Prefetch("groups", Group.objects.filter(name="test"), to_attr="new_attr"), Prefetch("groups", Group.objects.all(), to_attr="new_attr"), ) User.objects.prefetch_related( # E: Attribute "new_attr" already defined on "django.contrib.auth.models.User@AnnotatedWith[TypedDict({'new_attr': list[django.contrib.auth.models.Group]})]" [no-redef] Prefetch("groups", Group.objects.all(), to_attr="new_attr"), ).prefetch_related( Prefetch("groups", Group.objects.all(), to_attr="new_attr"), ) # Mostly mirror https://github.com/django/django/blob/0a67611b81567687cd24d2be1c0e390931f06262/tests/prefetch_related/tests.py#L574-L619 - case: prefetch_related_ambiguous_prefetches installed_apps: - django.contrib.auth - django.contrib.contenttypes main: | from django.db.models import Prefetch from django.contrib.auth.models import User, Group User.objects.prefetch_related("groups", Prefetch("groups")) # Ok User.objects.prefetch_related("groups", "groups__user_set") # Ok User.objects.prefetch_related("groups__user_set", Prefetch("groups", to_attr="groups_lst")) # Ok User.objects.prefetch_related("groups", Prefetch("groups", Group.objects.filter(name="test"), to_attr="another_attr")) # Ok User.objects.prefetch_related("groups", Prefetch("groups", Group.objects.filter(name="test"))) # E: Lookup "groups" was already seen with a different queryset [no-redef] User.objects.prefetch_related(Prefetch("groups"), Prefetch("groups", Group.objects.filter(name="test"))) # E: Lookup "groups" was already seen with a different queryset [no-redef] User.objects.prefetch_related(Prefetch("groups", Group.objects.filter(name="test")), "groups") # E: Lookup "groups" was already seen with a different queryset [no-redef] - case: prefetch_related_check_valid_lookup main: | from django.db.models import Prefetch, F from myapp.models import Article, Tag, Author, Category from django.contrib.auth.models import User Tag.objects.prefetch_related("tagged_items__content_object") Article.objects.prefetch_related("tags") Article.objects.prefetch_related("tags__articles") Article.objects.prefetch_related("tags__articles__tags") Article.objects.prefetch_related("related_articles__tags") Article.objects.prefetch_related("subject") Author.objects.prefetch_related("article_set") Author.objects.prefetch_related("article_set__tags") Article.objects.prefetch_related("xyz") # E: Cannot find "xyz" on "Article" object, "xyz" is an invalid parameter to "prefetch_related()" [misc] Article.objects.prefetch_related("id") # E: "id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc] ## M2M -- forward / backward Article.objects.prefetch_related("tags__xyz") # E: Cannot find "xyz" on "Tag" object, "tags__xyz" is an invalid parameter to "prefetch_related()" [misc] Article.objects.prefetch_related("tags__id") # E: "tags__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc] Tag.objects.prefetch_related("articles__xyz") # E: Cannot find "xyz" on "Article" object, "articles__xyz" is an invalid parameter to "prefetch_related()" [misc] Tag.objects.prefetch_related("articles__id") # E: "articles__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc] ## FK -- forward / backward Article.objects.prefetch_related("author__xyz") # E: Cannot find "xyz" on "Author" object, "author__xyz" is an invalid parameter to "prefetch_related()" [misc] Author.objects.prefetch_related("article_set__xyz") # E: Cannot find "xyz" on "Article" object, "article_set__xyz" is an invalid parameter to "prefetch_related()" [misc] Article.objects.prefetch_related("author__id") # E: "author__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc] Author.objects.prefetch_related("article_set__id") # E: "article_set__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc] ## OneToOne -- forward / backward Author.objects.prefetch_related("user__xyz") # E: Cannot find "xyz" on "User" object, "user__xyz" is an invalid parameter to "prefetch_related()" [misc] User.objects.prefetch_related("author_profile__xyz") # E: Cannot find "xyz" on "Author" object, "author_profile__xyz" is an invalid parameter to "prefetch_related()" [misc] Author.objects.prefetch_related("user__id") # E: "user__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc] User.objects.prefetch_related("author_profile__id") # E: "author_profile__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc] ## Generic FK -- forward / backward Article.objects.prefetch_related("subject") # Generic foreign keys can point to any model, so we cannot validate lookups after Article.objects.prefetch_related("subject__xyz") Article.objects.prefetch_related("subject__id") ## GenericRelation -- forward / backward Tag.objects.prefetch_related("tagged_items") Category.objects.prefetch_related("tagged_items") Tag.objects.prefetch_related("tagged_items__content_object") Tag.objects.prefetch_related("tagged_items__xyz") # E: Cannot find "xyz" on "TaggedItem" object, "tagged_items__xyz" is an invalid parameter to "prefetch_related()" [misc] Tag.objects.prefetch_related("tagged_items__id") # E: "tagged_items__id" does not resolve to an item that supports prefetching - this is an invalid parameter to "prefetch_related()" [misc] installed_apps: - myapp - django.contrib.auth - django.contrib.contenttypes files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation class Category(models.Model): tagged_items = GenericRelation('TaggedItem') class Tag(models.Model): category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="tags") tagged_items = GenericRelation('TaggedItem') class Author(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="author_profile") class TaggedItem(models.Model): content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') class Article(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE) tags = models.ManyToManyField(Tag, related_name="articles", blank=True) category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="articles") related_articles = models.ManyToManyField("self", related_name="articles", blank=True) subject_content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) subject_id = models.PositiveIntegerField() subject = GenericForeignKey("subject_content_type", "subject_id") - case: django_contrib_contenttypes_generic_prefetch installed_apps: - django.contrib.contenttypes - myapp main: | from django.contrib.contenttypes.prefetch import GenericPrefetch from myapp.models import Bookmark, Animal, TaggedItem, Dog, Cat from typing_extensions import reveal_type # Basic GenericPrefetch usage prefetch = GenericPrefetch( "content_object", [Bookmark.objects.all(), Animal.objects.only("name")] ) reveal_type(prefetch) # N: Revealed type is "django.contrib.contenttypes.prefetch.GenericPrefetch[Literal['content_object'], list[django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model]], str]" # GenericPrefetch usage with custom querysets prefetch_custom = GenericPrefetch( "content_object", [Dog.objects.all(), Cat.objects.all()] ) reveal_type(prefetch_custom) # N: Revealed type is "django.contrib.contenttypes.prefetch.GenericPrefetch[Literal['content_object'], list[myapp.models.CustomQuerySet[django.db.models.base.Model, django.db.models.base.Model]], str]" prefetch_custom_mixed = GenericPrefetch( "content_object", [Bookmark.objects.all(), Animal.objects.only("name"), Dog.objects.all(), Cat.objects.all()] ) reveal_type(prefetch_custom_mixed) # N: Revealed type is "django.contrib.contenttypes.prefetch.GenericPrefetch[Literal['content_object'], list[django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model]], str]" # Using GenericPrefetch with prefetch_related qs = TaggedItem.objects.prefetch_related(prefetch).all() reveal_type(qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.TaggedItem, myapp.models.TaggedItem]" # GenericPrefetch with to_attr prefetch_with_attr = GenericPrefetch( "content_object", [Bookmark.objects.all(), Animal.objects.only("name")], to_attr="prefetched_object" ) qs_with_attr = TaggedItem.objects.prefetch_related(prefetch_with_attr).all() reveal_type(qs_with_attr) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.TaggedItem@AnnotatedWith[TypedDict({'prefetched_object': list[Any]})], myapp.models.TaggedItem@AnnotatedWith[TypedDict({'prefetched_object': list[Any]})]]" reveal_type(qs_with_attr.get().prefetched_object) # N: Revealed type is "list[Any]" # GenericPrefetch on invalid field (not a GenericForeignKey) regular_fk_prefetch = GenericPrefetch( "content_type", [Bookmark.objects.all(), Animal.objects.only("name")], ) TaggedItem.objects.prefetch_related(regular_fk_prefetch).all() # E: "content_type" on "TaggedItem" is not a GenericForeignKey, GenericPrefetch can only be used with GenericForeignKey fields [misc] regular_field_prefetch = GenericPrefetch( "tag", [Bookmark.objects.all(), Animal.objects.only("name")], ) TaggedItem.objects.prefetch_related(regular_field_prefetch).all() # E: "tag" on "TaggedItem" is not a GenericForeignKey, GenericPrefetch can only be used with GenericForeignKey fields [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey class Bookmark(models.Model): url = models.URLField() class Animal(models.Model): name = models.CharField(max_length=100) class CustomQuerySet(models.QuerySet): pass CustomManager = models.Manager.from_queryset(CustomQuerySet) class Dog(models.Model): objects = CustomManager() class Cat(models.Model): objects = CustomManager() class TaggedItem(models.Model): tag = models.CharField(max_length=100) content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') - case: uninstalled_django_contrib_contenttypes_generic_prefetch installed_apps: - myapp main: | from django.contrib.contenttypes.prefetch import GenericPrefetch from myapp.models import Bookmark, Animal, TaggedItem from typing_extensions import reveal_type # Basic GenericPrefetch usage prefetch = GenericPrefetch( "content_object", [Bookmark.objects.all(), Animal.objects.only("name")] ) reveal_type(prefetch) # N: Revealed type is "django.contrib.contenttypes.prefetch.GenericPrefetch[Literal['content_object'], list[django.db.models.query.QuerySet[django.db.models.base.Model, django.db.models.base.Model]], str]" # Using GenericPrefetch with prefetch_related qs = TaggedItem.objects.prefetch_related(prefetch).all() # E: Cannot find "content_object" on "TaggedItem" object, "content_object" is an invalid parameter to "prefetch_related()" [misc] reveal_type(qs) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.TaggedItem, myapp.models.TaggedItem]" files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Bookmark(models.Model): url = models.URLField() class Animal(models.Model): name = models.CharField(max_length=100) class TaggedItem(models.Model): tag = models.CharField(max_length=100) - case: prefetch_related_from_queryset_incompatible_type installed_apps: - myapp main: | from myapp.models import Object, RelatedObject from django.db.models import Prefetch Object.objects.prefetch_related(Prefetch("related_objects")).all() Object.objects.prefetch_related(Prefetch("related_objects", queryset=RelatedObject.objects.select_related("other_object"))).all() files: - path: myapp/__init__.py - path: myapp/models.py content: | import typing from django.db import models T = typing.TypeVar("T", bound="models.Model") class BaseManager(models.Manager[T]): ... class BaseObject(models.Model): objects = BaseManager["BaseObject"]() class ObjectQuerySet(models.QuerySet["Object"]): ... class ObjectManager(BaseManager["Object"]): ... class Object(BaseObject): objects: typing.ClassVar = ObjectManager.from_queryset(ObjectQuerySet)() class OtherObject(models.Model): ... class RelatedObject(models.Model): object = models.ForeignKey(Object, on_delete=models.CASCADE, related_name="related_objects") other_object = models.ForeignKey(OtherObject, on_delete=models.CASCADE) typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_querysetany.yml000066400000000000000000000027741526064357400322140ustar00rootroot00000000000000- case: queryset_isinstance_check main: | from typing import Any from typing_extensions import reveal_type from django.db.models.query import QuerySet from django_stubs_ext import QuerySetAny def foo(q: QuerySet[Any]) -> None: pass def bar(q: QuerySetAny) -> None: pass def baz(obj: object) -> None: if isinstance(obj, QuerySetAny): reveal_type(obj) # N: Revealed type is "django.db.models.query.QuerySet[Any, Any]" foo(obj) bar(obj) if isinstance(obj, QuerySet): reveal_type(obj) # N: Revealed type is "django.db.models.query.QuerySet[Any, Any]" foo(obj) bar(obj) - case: queryset_list main: | from django.db.models.query import QuerySet from django_stubs_ext import QuerySetAny from myapp.models import User, Book def try_append(queryset_instance: QuerySetAny, queryset: QuerySet[User], queryset_book: QuerySet[Book]) -> None: user_querysets: list[QuerySet[User]] = [] user_querysets.append(queryset_instance) user_querysets.append(queryset) user_querysets.append(queryset_book) # E: Argument 1 to "append" of "list" has incompatible type "QuerySet[Book, Book]"; expected "QuerySet[User, User]" [arg-type] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass class Book(models.Model): pass typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_select_related.yml000066400000000000000000000147041526064357400325760ustar00rootroot00000000000000- case: select_related_valid_lookups installed_apps: - myapp main: | from myapp.models import Article, Author, Category, Blog, Post # Valid forward relations Article.objects.select_related("author") Article.objects.select_related("category") # Valid reverse relations (unique=True) Author.objects.select_related("profile") # Valid chained lookups Article.objects.select_related("author__profile") Article.objects.select_related("category__parent") Post.objects.select_related("blog__owner") Post.objects.select_related("category__parent__parent") # Multiple valid lookups Article.objects.select_related("author", "category") Article.objects.select_related("author__profile", "category") # Self-referential relationships Category.objects.select_related("parent") Category.objects.select_related("parent__parent") # Variables containing strings author_lookup = "aaa" Article.objects.select_related(author_lookup) # Dynamic lookups (should not be validated) def get_lookup() -> str: return "author" Article.objects.select_related(get_lookup()) # Chaining select_related calls qs1 = Article.objects.select_related("author") qs2 = qs1.select_related("category") Article.objects.select_related("author").select_related("category") files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Category(models.Model): parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) class Author(models.Model): pass class AuthorProfile(models.Model): author = models.OneToOneField(Author, on_delete=models.CASCADE, related_name='profile') class Blog(models.Model): owner = models.ForeignKey(Author, on_delete=models.CASCADE) class Article(models.Model): title = models.CharField(max_length=200) # Keep for testing non-relation field author = models.ForeignKey(Author, on_delete=models.CASCADE) category = models.ForeignKey(Category, on_delete=models.CASCADE) class Post(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) author = models.ForeignKey(Author, on_delete=models.CASCADE) category = models.ForeignKey(Category, on_delete=models.CASCADE) - case: select_related_invalid_lookups installed_apps: - myapp main: | from myapp.models import Article, Author, Category, Post from typing import Literal # Invalid field names Article.objects.select_related("nonexistent") # E: Invalid field name "nonexistent" in select_related lookup. Choices are: author, category [misc] Article.objects.select_related("title") # E: Invalid field name "title" in select_related lookup. Choices are: author, category [misc] # Invalid chained lookups Article.objects.select_related("author__nonexistent") # E: Invalid field name "nonexistent" in select_related lookup. Choices are: profile [misc] Article.objects.select_related("category__invalid") # E: Invalid field name "invalid" in select_related lookup. Choices are: parent [misc] # Reverse many-to-many (not allowed) Category.objects.select_related("article_set") # E: Invalid field name "article_set" in select_related lookup. Choices are: parent [misc] # Mixed valid and invalid in same call Post.objects.select_related("blog", "invalid") # E: Invalid field name "invalid" in select_related lookup. Choices are: author, blog, category [misc] # Intermediary variable not validated if non literal invalid_lookup = "nonexistent" Article.objects.select_related(invalid_lookup) # No error - variables not validated # Intermediary variable validated if literal invalid_lookup2: Literal["nonexistent"] = "nonexistent" Article.objects.select_related(invalid_lookup2) # E: Invalid field name "nonexistent" in select_related lookup. Choices are: author, category [misc] # Chaining with invalid lookups qs3 = Article.objects.select_related("author").select_related("invalid") # E: Invalid field name "invalid" in select_related lookup. Choices are: author, category [misc] Article.objects.select_related("author").select_related("invalid") # E: Invalid field name "invalid" in select_related lookup. Choices are: author, category [misc] # Multiple arguments with invalid lookups Article.objects.select_related("author", "invalid", "category") # E: Invalid field name "invalid" in select_related lookup. Choices are: author, category [misc] # Whitespace-only lookup (invalid) Article.objects.select_related("") # E: Invalid field name "" in select_related lookup [misc] Article.objects.select_related(" ") # E: Invalid field name " " in select_related lookup [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Category(models.Model): parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) class Author(models.Model): pass class AuthorProfile(models.Model): author = models.OneToOneField(Author, on_delete=models.CASCADE, related_name='profile') class Blog(models.Model): owner = models.ForeignKey(Author, on_delete=models.CASCADE) class Article(models.Model): title = models.CharField(max_length=200) # Keep for testing non-relation field author = models.ForeignKey(Author, on_delete=models.CASCADE) category = models.ForeignKey(Category, on_delete=models.CASCADE) class Post(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) author = models.ForeignKey(Author, on_delete=models.CASCADE) category = models.ForeignKey(Category, on_delete=models.CASCADE) typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_union_type.yml000066400000000000000000000025331526064357400320050ustar00rootroot00000000000000- case: union_queryset_custom_method main: | from typing_extensions import reveal_type from django.db.models import QuerySet from myapp.models import User, Order instance: Order | User = User() model_cls = type(instance) reveal_type(model_cls) # N: Revealed type is "type[myapp.models.Order] | type[myapp.models.User]" reveal_type(model_cls.objects) # N: Revealed type is "myapp.models.ManagerFromMyQuerySet[myapp.models.Order] | myapp.models.ManagerFromMyQuerySet[myapp.models.User]" reveal_type(model_cls.objects.my_method()) # N: Revealed type is "myapp.models.MyQuerySet[Any, Any]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from __future__ import annotations from django.db import models class MyQuerySet(models.QuerySet): def my_method(self) -> MyQuerySet: raise NotImplementedError UserManager = models.Manager.from_queryset(MyQuerySet) class User(models.Model): objects = UserManager() OrderManager = models.Manager.from_queryset(MyQuerySet) class Order(models.Model): objects = OrderManager() typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_update.yml000066400000000000000000000113661526064357400311020ustar00rootroot00000000000000- case: update_valid_fields installed_apps: - myapp main: | from typing import Any from myapp.models import Article, Author from django.db.models import F # Simple field Article.objects.update(title="new title") # Multiple fields Article.objects.update(title="new title", published=True) # FK id field (concrete) Article.objects.update(author_id=1) # FK by object author = Author.objects.get(pk=1) Article.objects.update(author=author) # Expression value Article.objects.update(title=F("content")) # Unpacked kwargs (skipped by validation, field names are not statically known) Article.objects.update(**{"title": "new title"}) fields: dict[str, Any] = {"title": "new title"} Article.objects.update(**fields) # Chained with filter Article.objects.filter(published=False).update(published=True) # Async variant async def test_async() -> None: await Article.objects.aupdate(title="new title") files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Tag(models.Model): name = models.CharField(max_length=50) class Author(models.Model): name = models.CharField(max_length=100) class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE) tags = models.ManyToManyField(Tag) - case: update_invalid_fields installed_apps: - myapp main: | from myapp.models import Article, Author from django.db.models import F # Non-existent field Article.objects.update(nonexistent=1) # E: Article has no field named 'nonexistent' [misc] # M2M field (not concrete) Article.objects.update(tags=1) # E: "update()" can only be used with concrete fields. Got "tags" [misc] # "pk" alias (not supported by `Options.get_field` at runtime) Article.objects.update(pk=1) # E: Article has no field named 'pk' [misc] # Reverse relation (not concrete) Author.objects.update(article=1) # E: "update()" can only be used with concrete fields. Got "article" [misc] # Annotated field (not supported at runtime, `Options.get_field` raises `FieldDoesNotExist`) Article.objects.annotate(foo=F("title")).update(foo="new") # E: Article has no field named 'foo' [misc] # Async variant with invalid field async def test_async() -> None: await Article.objects.aupdate(nonexistent=1) # E: Article has no field named 'nonexistent' [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Tag(models.Model): name = models.CharField(max_length=50) class Author(models.Model): name = models.CharField(max_length=100) class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE) tags = models.ManyToManyField(Tag) - case: update_override_with_declared_kwargs installed_apps: - myapp main: | from myapp.models import Article # Kwargs declared explicitly by an `update()` override are consumed by # the override; only ones destined for `**kwargs` are model fields. Article.objects.update(title="new title", author_name="foo") Article.objects.update(nonexistent=1, author_name="foo") # E: Article has no field named 'nonexistent' [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import Any from django.db import models from typing_extensions import override class ArticleQuerySet(models.QuerySet["Article"]): @override def update(self, *, author_name: str | None = None, **kwargs: Any) -> int: return super().update(**kwargs) class Article(models.Model): title = models.CharField(max_length=200) objects = ArticleQuerySet.as_manager() typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_update_or_create.yml000066400000000000000000000105511526064357400331200ustar00rootroot00000000000000- case: update_or_create_typechecks_kwargs main: | from typing_extensions import reveal_type from myapp.models import MyModel # Return type is preserved reveal_type(MyModel.objects.update_or_create(num=1)) # N: Revealed type is "tuple[myapp.models.MyModel, bool]" # Valid field kwarg, lookup expression, defaults and create_defaults MyModel.objects.update_or_create(num=1) MyModel.objects.update_or_create(num__gte=1) MyModel.objects.update_or_create(num=1, defaults={"num": 2}, create_defaults={"num": 3}) # Unknown field is rejected MyModel.objects.update_or_create(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: id, num [misc] # Invalid type for a known field is rejected MyModel.objects.update_or_create(num=MyModel()) # E: Incompatible type for lookup 'num': (got "MyModel", expected "str | int") [misc] # Async variant shares the same validation async def main() -> None: await MyModel.objects.aupdate_or_create(num=1) await MyModel.objects.aupdate_or_create(unknown_field=True) # E: Cannot resolve keyword 'unknown_field' into field. Choices are: id, num [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): num = models.IntegerField() - case: update_or_create_typechecks_defaults main: | from myapp.models import MyModel # Unknown key in defaults is rejected MyModel.objects.update_or_create(num=1, defaults={"unknown_field": True}) # E: Unexpected attribute "unknown_field" for model "MyModel" [misc] # Incompatible value type in defaults is rejected MyModel.objects.update_or_create(num=1, defaults={"num": MyModel()}) # E: Incompatible type for "num" of "MyModel" (got "MyModel", expected "float | int | str | Combinable") [misc] # Valid defaults: no errors MyModel.objects.update_or_create(num=1, defaults={"num": 2, "name": "hello"}) # Unknown key in create_defaults is rejected MyModel.objects.update_or_create(num=1, create_defaults={"unknown_field": True}) # E: Unexpected attribute "unknown_field" for model "MyModel" [misc] # Incompatible value type in create_defaults is rejected MyModel.objects.update_or_create(num=1, create_defaults={"num": MyModel()}) # E: Incompatible type for "num" of "MyModel" (got "MyModel", expected "float | int | str | Combinable") [misc] # Valid create_defaults: no errors MyModel.objects.update_or_create(num=1, create_defaults={"num": 3, "name": "hi"}) # Both defaults and create_defaults validated in a single call MyModel.objects.update_or_create( num=1, defaults={"unknown_in_defaults": True}, # E: Unexpected attribute "unknown_in_defaults" for model "MyModel" [misc] create_defaults={"unknown_in_create_defaults": True}, # E: Unexpected attribute "unknown_in_create_defaults" for model "MyModel" [misc] ) # `**kwargs` variable unpacking is silently accepted kwargs = { "defaults": {"unknown_field": True}, "create_defaults": {"unknown_field": True}, } MyModel.objects.update_or_create(num=1, **kwargs) # `**dict_literal` unpacking is also silently accepted; only a direct # `defaults=` / `create_defaults=` dict literal is validated. MyModel.objects.update_or_create( num=1, **{"defaults": {"unknown_field": True}, "create_defaults": {"unknown_field": True}}, ) # Async variant shares the same validation async def main() -> None: await MyModel.objects.aupdate_or_create( num=1, defaults={"unknown_field": True}, # E: Unexpected attribute "unknown_field" for model "MyModel" [misc] ) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): num = models.IntegerField() name = models.CharField(max_length=100) typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_values.yml000066400000000000000000000223131526064357400311110ustar00rootroot00000000000000- case: queryset_values_method_returns_typeddict main: | from typing_extensions import reveal_type from myapp.models import Blog values = Blog.objects.values('num_posts', 'text').get() reveal_type(values) # N: Revealed type is "TypedDict({'num_posts': int, 'text': str})" reveal_type(values["num_posts"]) # N: Revealed type is "int" reveal_type(values["text"]) # N: Revealed type is "str" values_pk = Blog.objects.values('pk').get() reveal_type(values_pk) # N: Revealed type is "TypedDict({'pk': int})" reveal_type(values_pk["pk"]) # N: Revealed type is "int" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Blog(models.Model): num_posts = models.IntegerField() text = models.CharField(max_length=100) - case: queryset_values_all_values main: | from typing_extensions import reveal_type from myapp.models import Blog all_values_dict = Blog.objects.values().get() reveal_type(all_values_dict) # N: Revealed type is "TypedDict({'id': int, 'num_posts': int, 'text': str})" reveal_type(all_values_dict["id"]) # N: Revealed type is "int" reveal_type(all_values_dict["num_posts"]) # N: Revealed type is "int" reveal_type(all_values_dict["text"]) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Blog(models.Model): num_posts = models.IntegerField() text = models.CharField(max_length=100) - case: queryset_foreign_key_object_always_a_primary_key main: | from typing_extensions import reveal_type from myapp.models import Blog values1 = Blog.objects.values('publisher').get() reveal_type(values1) # N: Revealed type is "TypedDict({'publisher': int})" reveal_type(values1['publisher']) # N: Revealed type is "int" values2 = Blog.objects.values('publisher_id').get() reveal_type(values2) # N: Revealed type is "TypedDict({'publisher_id': int})" reveal_type(values2["publisher_id"]) # N: Revealed type is "int" # all values return _id version all_values = Blog.objects.values().get() reveal_type(all_values) # N: Revealed type is "TypedDict({'id': int, 'publisher_id': int})" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Blog(models.Model): publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE) - case: values_with_related_model_fields main: | from typing_extensions import reveal_type from myapp.models import Entry values = Entry.objects.values('blog__num_articles', 'blog__publisher__name').get() reveal_type(values) # N: Revealed type is "TypedDict({'blog__num_articles': int, 'blog__publisher__name': str})" pk_values = Entry.objects.values('blog__pk', 'blog__publisher__pk').get() reveal_type(pk_values) # N: Revealed type is "TypedDict({'blog__pk': int, 'blog__publisher__pk': int})" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): name = models.CharField(max_length=100) class Blog(models.Model): num_articles = models.IntegerField() publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE) class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) - case: select_all_related_model_values_for_every_current_value main: | from typing_extensions import reveal_type from myapp.models import Publisher related_model_values = Publisher.objects.values('id', 'blog__name').get() reveal_type(related_model_values) # N: Revealed type is "TypedDict({'id': int, 'blog__name': str})" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Blog(models.Model): name = models.CharField(max_length=100) publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE) - case: values_of_many_to_many_field main: | from typing_extensions import reveal_type from myapp.models import Author, Book reveal_type(Book.objects.values('authors')) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, TypedDict({'authors': int})]" reveal_type(Author.objects.values('books')) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Author, TypedDict({'books': int})]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Author(models.Model): pass class Book(models.Model): authors = models.ManyToManyField(Author, related_name='books') - case: queryset_values_blank_charfield main: | from typing_extensions import reveal_type from myapp.models import Blog values = Blog.objects.values('text').get() reveal_type(values) # N: Revealed type is "TypedDict({'text': str})" reveal_type(values["text"]) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Blog(models.Model): num_posts = models.IntegerField() text = models.CharField(max_length=100, blank=True) - case: queryset_values_with_expressions main: | from typing_extensions import reveal_type from django.db.models import F from django.db.models.functions import Lower from myapp.models import Blog reveal_type(Blog.objects.values("id")) reveal_type(Blog.objects.values("id", "num_posts", "text")) reveal_type(Blog.objects.values(foo=F("id"))) reveal_type(Blog.objects.values("id", foo=F("id"))) reveal_type(Blog.objects.values("id", lower_text=Lower("text"))) out: | main:6: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, TypedDict({'id': int})]" main:7: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, TypedDict({'id': int, 'num_posts': int, 'text': str})]" main:8: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, TypedDict({'foo': Any})]" main:9: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, TypedDict({'id': int, 'foo': Any})]" main:10: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, TypedDict({'id': int, 'lower_text': Any})]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Blog(models.Model): num_posts = models.IntegerField() text = models.CharField(max_length=100) - case: queryset_values_m2m_fk_with_expressions main: | from typing_extensions import reveal_type from django.db.models import F from django.db.models.functions import Lower from myapp.models import Book reveal_type(Book.objects.values(premium_price=F("premiumbookdetails__price"))) reveal_type(Book.objects.values(team_name=F("authors__name"))) out: | main:6: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, TypedDict({'premium_price': Any})]" main:7: note: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, TypedDict({'team_name': Any})]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): authors = models.ManyToManyField(Author, related_name='books') class PremiumBookDetails(models.Model): book = models.OneToOneField(Book, on_delete=models.CASCADE) price = models.DecimalField(max_digits=10, decimal_places=2) typeddjango-django-stubs-fa03b48/tests/typecheck/managers/querysets/test_values_list.yml000066400000000000000000000377341526064357400321610ustar00rootroot00000000000000- case: values_list_simple_field_returns_queryset_of_tuples main: | from typing_extensions import reveal_type from myapp.models import MyUser reveal_type(MyUser.objects.values_list('name').get()) # N: Revealed type is "tuple[str]" reveal_type(MyUser.objects.values_list('id', 'name').get()) # N: Revealed type is "tuple[int, str]" values_tuple = MyUser.objects.values_list('name', 'age').get() reveal_type(values_tuple[0]) # N: Revealed type is "str" reveal_type(values_tuple[1]) # N: Revealed type is "int" # no fields specified return all fields all_values_tuple = MyUser.objects.values_list().get() reveal_type(all_values_tuple) # N: Revealed type is "tuple[int, str, int]" # pk as field pk_values = MyUser.objects.values_list('pk').get() reveal_type(pk_values) # N: # N: Revealed type is "tuple[int]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() - case: values_list_field_repetition main: | from typing_extensions import reveal_type from myapp.models import MyUser # Values tuples can have the same field repeated values_tuple = MyUser.objects.values_list('name', 'age', 'name').get() reveal_type(values_tuple) # N: Revealed type is "tuple[str, int, str]" reveal_type(values_tuple[0]) # N: Revealed type is "str" reveal_type(values_tuple[1]) # N: Revealed type is "int" reveal_type(values_tuple[2]) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() - case: values_list_types_are_field_types main: | from typing_extensions import reveal_type from myapp.models import Concrete ret = list(Concrete.objects.values_list('id', 'data')) reveal_type(ret) # N: Revealed type is "list[tuple[int, dict[str, str]]]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from __future__ import annotations from django.db import models class JSONField(models.TextField): pass # incomplete class Concrete(models.Model): id = models.IntegerField() data: models.Field[dict[str, str], dict[str, str]] = JSONField() - case: values_list_supports_queryset_methods main: | from typing_extensions import reveal_type from myapp.models import MyUser from django.db.models.functions import Length query = MyUser.objects.values_list('name') reveal_type(query.order_by("name").get()) # N: Revealed type is "tuple[str]" reveal_type(query.distinct("name").get()) # N: Revealed type is "tuple[str]" reveal_type(query.distinct().get()) # N: Revealed type is "tuple[str]" reveal_type(query.all().get()) # N: Revealed type is "tuple[str]" reveal_type(query.filter(age__gt=16).get()) # N: Revealed type is "tuple[str]" reveal_type(query.exclude(age__lte=16).get()) # N: Revealed type is "tuple[str]" reveal_type(query.annotate(name_length=Length("name")).get()) # N: Revealed type is "tuple[Any, ...]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() - case: values_list_related_model_fields main: | from typing_extensions import reveal_type from myapp.models import Post, Blog values_tuple = Post.objects.values_list('blog', 'blog__num_posts', 'blog__publisher', 'blog__publisher__name').get() reveal_type(values_tuple[0]) # N: Revealed type is "int" reveal_type(values_tuple[1]) # N: Revealed type is "int" reveal_type(values_tuple[2]) # N: Revealed type is "int" reveal_type(values_tuple[3]) # N: Revealed type is "str" reverse_fields_list = Blog.objects.values_list('post__text').get() reveal_type(reverse_fields_list) # N: Revealed type is "tuple[str]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): name = models.CharField(max_length=100) class Blog(models.Model): num_posts = models.IntegerField() publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE) class Post(models.Model): text = models.CharField(max_length=100) blog = models.ForeignKey(to=Blog, on_delete=models.CASCADE) - case: values_list_flat_true_methods main: | from typing_extensions import reveal_type from myapp.models import MyUser, MyUser2 reveal_type(MyUser.objects.values_list('name', flat=True).get()) # N: Revealed type is "str" reveal_type(MyUser.objects.values_list('name', 'age', flat=True).get()) # flat=True without specified fields returns primary key values reveal_type(MyUser.objects.values_list(flat=True)[0]) # N: Revealed type is "int" reveal_type(MyUser2.objects.values_list(flat=True)[0]) # N: Revealed type is "str" out: | main:4: error: 'flat' is not valid when 'values_list' is called with more than one field [misc] main:4: note: Revealed type is "Any" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() class MyUser2(models.Model): name = models.CharField(max_length=100, primary_key=True) - case: values_list_named_true main: | from typing_extensions import reveal_type from myapp.models import MyUser values_named_tuple = MyUser.objects.values_list('name', 'age', named=True).get() reveal_type(values_named_tuple) # N: Revealed type is "tuple[str, int, fallback=main.Row]" reveal_type(values_named_tuple.name) # N: Revealed type is "str" reveal_type(values_named_tuple.age) # N: Revealed type is "int" # no fields specified, returns all fields namedtuple all_values_named_tuple = MyUser.objects.values_list(named=True).get() reveal_type(all_values_named_tuple.id) # N: Revealed type is "int" reveal_type(all_values_named_tuple.name) # N: Revealed type is "str" reveal_type(all_values_named_tuple.age) # N: Revealed type is "int" reveal_type(all_values_named_tuple.is_admin) # N: Revealed type is "bool" # pk as field pk_values = MyUser.objects.values_list('pk', named=True).get() reveal_type(pk_values) # N: Revealed type is "tuple[int, fallback=main.Row2]" reveal_type(pk_values.pk) # N: # N: Revealed type is "int" # values_list(named=True) inside function def func() -> None: from myapp.models import MyUser reveal_type(MyUser.objects.values_list('name', named=True).get()) # N: Revealed type is "tuple[str, fallback=main.Row3]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() is_admin = models.BooleanField() - case: values_list_flat_true_named_true_error main: | from typing_extensions import reveal_type from myapp.models import MyUser reveal_type(MyUser.objects.values_list('name', flat=True, named=True).get()) out: | main:3: error: 'flat' and 'named' can't be used together [misc] main:3: note: Revealed type is "Any" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): name = models.CharField(max_length=100) - case: invalid_lookups main: | from typing_extensions import reveal_type from myapp.models import Blog reveal_type(Blog.objects.values_list('unknown').get()) reveal_type(Blog.objects.values_list('unknown', flat=True).get()) reveal_type(Blog.objects.values_list('unknown', named=True).get()) reveal_type(Blog.objects.values_list('publisher__unknown').get()) out: | main:3: error: Cannot resolve keyword 'unknown' into field. Choices are: id, publisher, publisher_id [misc] main:3: note: Revealed type is "Any" main:4: error: Cannot resolve keyword 'unknown' into field. Choices are: id, publisher, publisher_id [misc] main:4: note: Revealed type is "Any" main:5: error: Cannot resolve keyword 'unknown' into field. Choices are: id, publisher, publisher_id [misc] main:5: note: Revealed type is "Any" main:6: note: Revealed type is "tuple[Any]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Blog(models.Model): publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE) - case: named_true_with_related_model_fields main: | from typing_extensions import reveal_type from myapp.models import Entry, Blog values = Entry.objects.values_list('blog__num_articles', 'blog__publisher__name', named=True).get() reveal_type(values.blog__num_articles) # N: Revealed type is "int" reveal_type(values.blog__publisher__name) # N: Revealed type is "str" pk_values = Entry.objects.values_list('blog__pk', 'blog__publisher__pk', named=True).get() reveal_type(pk_values.blog__pk) # N: Revealed type is "int" reveal_type(pk_values.blog__publisher__pk) # N: Revealed type is "int" # reverse relation reverse_values = Blog.objects.values_list('entry__text', named=True).get() reveal_type(reverse_values.entry__text) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): name = models.CharField(max_length=100) class Blog(models.Model): num_articles = models.IntegerField() publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE) class Entry(models.Model): text = models.CharField(max_length=100) blog = models.ForeignKey(Blog, on_delete=models.CASCADE) - case: values_list_flat_true_with_ids main: | from typing_extensions import reveal_type from myapp.models import Blog, Publisher reveal_type(Blog.objects.values_list('id', flat=True)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, int]" reveal_type(Blog.objects.values_list('publisher', flat=True)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, int]" reveal_type(Blog.objects.values_list('publisher_id', flat=True)) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Blog, int]" # is Iterable[int] reveal_type(list(Blog.objects.values_list('id', flat=True))) # N: Revealed type is "list[int]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Blog(models.Model): publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE) - case: subclass_of_queryset_has_proper_typings_on_methods main: | from typing_extensions import reveal_type from myapp.models import TransactionQuerySet reveal_type(TransactionQuerySet()) # N: Revealed type is "myapp.models.TransactionQuerySet[myapp.models.Transaction, myapp.models.Transaction]" reveal_type(TransactionQuerySet().values()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Transaction, TypedDict({'id': int, 'total': int})]" reveal_type(TransactionQuerySet().values_list()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Transaction, tuple[int, int]]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class TransactionQuerySet(models.QuerySet['Transaction']): pass class Transaction(models.Model): total = models.IntegerField() - case: values_list_of_many_to_many_field main: | from typing_extensions import reveal_type from myapp.models import Author, Book reveal_type(Book.objects.values_list('authors')) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Book, tuple[int]]" reveal_type(Author.objects.values_list('books')) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Author, tuple[int]]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Author(models.Model): pass class Book(models.Model): authors = models.ManyToManyField(Author, related_name='books') - case: queryset_values_list_blank_charfield main: | from typing_extensions import reveal_type from myapp.models import Blog values = Blog.objects.values_list('text').get() reveal_type(values) # N: Revealed type is "tuple[str]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Blog(models.Model): num_posts = models.IntegerField() text = models.CharField(max_length=100, blank=True) - case: handles_field_with_same_name_on_other_model main: | from typing_extensions import reveal_type from myapp.models import A reveal_type(A.objects.values_list("name", "b__name").get()) # N: Revealed type is "tuple[int, str]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class B(models.Model): name = models.CharField() class A(models.Model): b = models.ForeignKey(B, on_delete=models.CASCADE) name = models.IntegerField() typeddjango-django-stubs-fa03b48/tests/typecheck/managers/test_managers.yml000066400000000000000000001061101526064357400273410ustar00rootroot00000000000000- case: test_every_model_has_objects_queryset_available main: | from typing_extensions import reveal_type from myapp.models import User reveal_type(User.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.User]" reveal_type(User.objects.get()) # N: Revealed type is "myapp.models.User" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): pass - case: every_model_has_its_own_objects_queryset main: | from typing_extensions import reveal_type from myapp.models import Parent, Child reveal_type(Parent.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.Parent]" reveal_type(Child.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.Child]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Parent(models.Model): pass class Child(Parent): pass - case: if_custom_manager_defined_it_is_set_to_default_manager main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.CustomManager[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import TypeVar from django.db import models _T = TypeVar('_T', bound=models.Model) class CustomManager(models.Manager[_T]): pass class MyModel(models.Model): manager = CustomManager['MyModel']() - case: if_default_manager_name_is_passed_set_default_manager_to_it main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel._default_manager) # N: Revealed type is "myapp.models.Manager2[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import TypeVar from django.db import models from django_stubs_ext.db.models import TypedModelMeta _T = TypeVar('_T', bound=models.Model) class Manager1(models.Manager[_T]): pass class Manager2(models.Manager[_T]): pass class MyModel(models.Model): class Meta(TypedModelMeta): default_manager_name = 'm2' m1 = Manager1['MyModel']() m2 = Manager2['MyModel']() - case: test_leave_as_is_if_objects_is_set_and_fill_typevars_with_outer_class main: | from typing_extensions import reveal_type from myapp.models import MyUser reveal_type(MyUser.objects) # N: Revealed type is "myapp.models.UserManager" reveal_type(MyUser.objects.get()) # N: Revealed type is "myapp.models.MyUser" reveal_type(MyUser.objects.get_or_404()) # N: Revealed type is "myapp.models.MyUser" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class UserManager(models.Manager['MyUser']): def get_or_404(self) -> 'MyUser': raise NotImplementedError class MyUser(models.Model): objects = UserManager() - case: model_imported_from_different_file main: | from typing_extensions import reveal_type from myapp.models import Inventory, Band reveal_type(Inventory.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.main.Inventory]" reveal_type(Band.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.Band]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models/__init__.py content: | from django.db import models from .main import Inventory as Inventory class Band(models.Model): pass - path: myapp/models/main.py content: | from django.db import models class Inventory(models.Model): pass - case: managers_that_defined_on_other_models_do_not_influence main: | from typing_extensions import reveal_type from myapp.models import AbstractPerson, Book reveal_type(AbstractPerson.abstract_persons) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.AbstractPerson]" reveal_type(Book.published_objects) # N: Revealed type is "myapp.models.PublishedBookManager" Book.published_objects.create(title='hello') reveal_type(Book.annotated_objects) # N: Revealed type is "myapp.models.AnnotatedBookManager" Book.annotated_objects.create(title='hello') installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class AbstractPerson(models.Model): abstract_persons = models.Manager['AbstractPerson']() class PublishedBookManager(models.Manager['Book']): pass class AnnotatedBookManager(models.Manager['Book']): pass class Book(models.Model): title = models.CharField(max_length=50) published_objects = PublishedBookManager() annotated_objects = AnnotatedBookManager() - case: managers_inherited_from_abstract_classes_multiple_inheritance main: | from typing_extensions import reveal_type from myapp.models import AbstractBase1, AbstractBase2, Child reveal_type(Child.manager1) reveal_type(Child.restricted) reveal_type(AbstractBase1.manager1) reveal_type(AbstractBase2.restricted) out: | main:3: note: Revealed type is "myapp.models.CustomManager1" main:4: note: Revealed type is "myapp.models.CustomManager2" main:5: note: Revealed type is "myapp.models.CustomManager1" main:6: note: Revealed type is "myapp.models.CustomManager2" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class CustomManager1(models.Manager['AbstractBase1']): pass class AbstractBase1(models.Model): class Meta: abstract = True name = models.CharField(max_length=50) manager1 = CustomManager1() class CustomManager2(models.Manager['AbstractBase2']): pass class AbstractBase2(models.Model): class Meta: abstract = True value = models.CharField(max_length=50) restricted = CustomManager2() class Child(AbstractBase1, AbstractBase2): pass - case: managers_inherited_from_abstract_classes_multiple_inheritance_with_generic main: | from typing_extensions import reveal_type from myapp.models import AbstractBase1, AbstractBase2, Child reveal_type(Child.manager1) # N: Revealed type is "myapp.models.CustomManager1[myapp.models.Child]" reveal_type(Child.manager1.get()) # N: Revealed type is "myapp.models.Child" reveal_type(Child.restricted) # N: Revealed type is "myapp.models.CustomManager2[myapp.models.Child]" reveal_type(Child.restricted.get()) # N: Revealed type is "myapp.models.Child" reveal_type(AbstractBase1.manager1) # N: Revealed type is "myapp.models.CustomManager1[myapp.models.AbstractBase1]" reveal_type(AbstractBase1.manager1.get()) # N: Revealed type is "myapp.models.AbstractBase1" reveal_type(AbstractBase2.restricted) # N: Revealed type is "myapp.models.CustomManager2[myapp.models.AbstractBase2]" reveal_type(AbstractBase2.restricted.get()) # N: Revealed type is "myapp.models.AbstractBase2" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import Generic from typing_extensions import TypeVar from django.db import models T1 = TypeVar("T1", bound="AbstractBase1") class CustomManager1(models.Manager[T1], Generic[T1]): ... class AbstractBase1(models.Model): class Meta: abstract = True name = models.CharField(max_length=50) manager1 = CustomManager1() T2 = TypeVar("T2", bound="AbstractBase2") class CustomManager2(models.Manager[T2], Generic[T2]): ... class AbstractBase2(models.Model): class Meta: abstract = True value = models.CharField(max_length=50) restricted = CustomManager2() class Child(AbstractBase1, AbstractBase2): ... - case: model_has_a_manager_of_the_same_type main: | from typing_extensions import reveal_type from myapp.models import UnrelatedModel, MyModel reveal_type(UnrelatedModel.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.UnrelatedModel]" reveal_type(UnrelatedModel.objects.first()) # N: Revealed type is "myapp.models.UnrelatedModel | None" reveal_type(MyModel.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel]" reveal_type(MyModel.objects.first()) # N: Revealed type is "myapp.models.MyModel | None" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class UnrelatedModel(models.Model): objects = models.Manager['UnrelatedModel']() class MyModel(models.Model): pass - case: manager_without_annotation_of_the_model_gets_it_from_outer_one main: | from typing_extensions import reveal_type from myapp.models import UnrelatedModel2, MyModel2 reveal_type(UnrelatedModel2.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.UnrelatedModel2]" reveal_type(UnrelatedModel2.objects.first()) # N: Revealed type is "myapp.models.UnrelatedModel2 | None" reveal_type(MyModel2.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel2]" reveal_type(MyModel2.objects.first()) # N: Revealed type is "myapp.models.MyModel2 | None" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class UnrelatedModel2(models.Model): objects = models.Manager() class MyModel2(models.Model): pass - case: inherited_manager_has_the_proper_type_of_model main: | from typing_extensions import reveal_type from myapp.models import ParentOfMyModel3, MyModel3 reveal_type(ParentOfMyModel3.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.ParentOfMyModel3]" reveal_type(ParentOfMyModel3.objects.first()) # N: Revealed type is "myapp.models.ParentOfMyModel3 | None" reveal_type(MyModel3.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel3]" reveal_type(MyModel3.objects.first()) # N: Revealed type is "myapp.models.MyModel3 | None" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ParentOfMyModel3(models.Model): objects = models.Manager() class MyModel3(ParentOfMyModel3): pass - case: inheritance_with_explicit_type_on_child_manager main: | from typing_extensions import reveal_type from myapp.models import ParentOfMyModel4, MyModel4 reveal_type(ParentOfMyModel4.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.ParentOfMyModel4]" reveal_type(ParentOfMyModel4.objects.first()) # N: Revealed type is "myapp.models.ParentOfMyModel4 | None" reveal_type(MyModel4.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel4]" reveal_type(MyModel4.objects.first()) # N: Revealed type is "myapp.models.MyModel4 | None" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import ClassVar from django.db import models class ParentOfMyModel4(models.Model): objects = models.Manager() class MyModel4(ParentOfMyModel4): objects: ClassVar[models.Manager["MyModel4"]] = models.Manager["MyModel4"]() # TODO: make it work someday #- case: inheritance_of_two_models_with_custom_objects_manager # main: | # from typing_extensions import reveal_type # from myapp.models import MyBaseUser, MyUser # reveal_type(MyBaseUser.objects) # N: Revealed type is "myapp.models.MyBaseManager[myapp.models.MyBaseUser]" # reveal_type(MyBaseUser.objects.get()) # N: Revealed type is "myapp.models.MyBaseUser" # # reveal_type(MyUser.objects) # N: Revealed type is "myapp.models.MyManager[myapp.models.MyUser]" # reveal_type(MyUser.objects.get()) # N: Revealed type is "myapp.models.MyUser" # installed_apps: # - myapp # files: # - path: myapp/__init__.py # - path: myapp/models.py # content: | # from django.db import models # # class MyBaseManager(models.Manager): # pass # class MyBaseUser(models.Model): # objects = MyBaseManager() # # class MyManager(models.Manager): # pass # class MyUser(MyBaseUser): # objects = MyManager() - case: custom_manager_returns_proper_model_types main: | from typing_extensions import reveal_type from myapp.models import User reveal_type(User.objects) # N: Revealed type is "myapp.models.MyManager[myapp.models.User]" reveal_type(User.objects.select_related()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.User, myapp.models.User]" reveal_type(User.objects.get()) # N: Revealed type is "myapp.models.User" reveal_type(User.objects.get_instance()) # N: Revealed type is "int" reveal_type(User.objects.get_instance_untyped('hello')) # N: Revealed type is "Any" from myapp.models import ChildUser reveal_type(ChildUser.objects) # N: Revealed type is "myapp.models.MyManager[myapp.models.ChildUser]" reveal_type(ChildUser.objects.select_related()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.ChildUser, myapp.models.ChildUser]" reveal_type(ChildUser.objects.get()) # N: Revealed type is "myapp.models.ChildUser" reveal_type(ChildUser.objects.get_instance()) # N: Revealed type is "int" reveal_type(ChildUser.objects.get_instance_untyped('hello')) # N: Revealed type is "Any" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import Any from django.db import models class MyManager(models.Manager): def get_instance(self) -> int: raise NotImplementedError def get_instance_untyped(self, name: str): # type: ignore[no-untyped-def] raise NotImplementedError class User(models.Model): objects = MyManager() class ChildUser(models.Model): objects = MyManager() - case: custom_manager_annotate_method_before_type_declaration main: | from typing_extensions import reveal_type from myapp.models import ModelA, ModelB, ManagerA reveal_type(ModelA.objects) # N: Revealed type is "myapp.models.ManagerA[myapp.models.ModelA]" reveal_type(ModelA.objects.do_something) # N: Revealed type is "def (other_obj: myapp.models.ModelB) -> str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ManagerA(models.Manager): def do_something(self, other_obj: "ModelB") -> str: return 'test' class ModelA(models.Model): title = models.TextField() objects = ManagerA() class ModelB(models.Model): movie = models.TextField() - case: regression_manager_scope_foreign main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.on_site) # N: Revealed type is "django.contrib.sites.managers.CurrentSiteManager[myapp.models.MyModel]" installed_apps: - myapp - django.contrib.sites files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.sites.models import Site from django.contrib.sites.managers import CurrentSiteManager class MyModel(models.Model): site = models.ForeignKey(Site, on_delete=models.CASCADE) on_site = CurrentSiteManager() - case: test_emits_error_for_unresolved_managers main: | from myapp import models installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import reveal_type from django.db import models def LocalManager() -> models.Manager: """ Returns a manager instance of an inlined manager type that can't be resolved. """ class InnerManager(models.Manager): ... return InnerManager() class User(models.Model): name = models.TextField() class Booking(models.Model): renter = models.ForeignKey(User, on_delete=models.PROTECT) owner = models.ForeignKey(User, on_delete=models.PROTECT, related_name='bookingowner_set') objects = LocalManager() class TwoUnresolvable(models.Model): objects = LocalManager() second_objects = LocalManager() class AbstractUnresolvable(models.Model): objects = LocalManager() class Meta: abstract = True class InvisibleUnresolvable(AbstractUnresolvable): text = models.TextField() def process_booking(user: User) -> None: reveal_type(User.objects) reveal_type(User._default_manager) reveal_type(Booking.objects) reveal_type(Booking._default_manager) reveal_type(TwoUnresolvable.objects) reveal_type(TwoUnresolvable.second_objects) reveal_type(TwoUnresolvable._default_manager) reveal_type(InvisibleUnresolvable.objects) reveal_type(InvisibleUnresolvable._default_manager) reveal_type(user.bookingowner_set) reveal_type(user.booking_set) # Check QuerySet methods on UnknownManager reveal_type(Booking.objects.all) reveal_type(Booking.objects.custom) reveal_type(Booking.objects.all().filter) reveal_type(Booking.objects.all().custom) reveal_type(Booking.objects.first()) reveal_type(Booking.objects.get()) reveal_type([booking for booking in Booking.objects.all()]) reveal_type([booking for booking in Booking.objects.all().filter()]) # Check QuerySet methods for unresolvable manager reveal_type(user.booking_set.all) reveal_type(user.booking_set.custom) reveal_type(user.booking_set.all().filter) reveal_type(user.booking_set.all().custom) reveal_type(user.booking_set.all().first()) out: | myapp/models:14: error: Couldn't resolve related manager 'booking_set' for relation 'myapp.models.Booking.renter'. [django-manager-missing] myapp/models:14: error: Couldn't resolve related manager 'bookingowner_set' for relation 'myapp.models.Booking.owner'. [django-manager-missing] myapp/models:21: error: Could not resolve manager type for "myapp.models.Booking.objects" [django-manager-missing] myapp/models:24: error: Could not resolve manager type for "myapp.models.TwoUnresolvable.objects" [django-manager-missing] myapp/models:25: error: Could not resolve manager type for "myapp.models.TwoUnresolvable.second_objects" [django-manager-missing] myapp/models:28: error: Could not resolve manager type for "myapp.models.AbstractUnresolvable.objects" [django-manager-missing] myapp/models:37: note: Revealed type is "django.db.models.manager.Manager[myapp.models.User]" myapp/models:38: note: Revealed type is "django.db.models.manager.Manager[myapp.models.User]" myapp/models:40: note: Revealed type is "myapp.models.UnknownManager[myapp.models.Booking]" myapp/models:41: note: Revealed type is "django.db.models.manager.Manager[myapp.models.Booking]" myapp/models:43: note: Revealed type is "myapp.models.UnknownManager[myapp.models.TwoUnresolvable]" myapp/models:44: note: Revealed type is "myapp.models.UnknownManager[myapp.models.TwoUnresolvable]" myapp/models:45: note: Revealed type is "django.db.models.manager.Manager[myapp.models.TwoUnresolvable]" myapp/models:47: note: Revealed type is "myapp.models.UnknownManager[myapp.models.InvisibleUnresolvable]" myapp/models:48: note: Revealed type is "django.db.models.manager.Manager[myapp.models.InvisibleUnresolvable]" myapp/models:50: note: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Booking]" myapp/models:51: note: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Booking]" myapp/models:54: note: Revealed type is "def () -> myapp.models.UnknownQuerySet[myapp.models.Booking, myapp.models.Booking]" myapp/models:55: note: Revealed type is "Any" myapp/models:56: note: Revealed type is "def (*args: Any, **kwargs: Any) -> myapp.models.UnknownQuerySet[myapp.models.Booking, myapp.models.Booking]" myapp/models:57: note: Revealed type is "Any" myapp/models:58: note: Revealed type is "myapp.models.Booking | None" myapp/models:59: note: Revealed type is "myapp.models.Booking" myapp/models:60: note: Revealed type is "list[myapp.models.Booking]" myapp/models:61: note: Revealed type is "list[myapp.models.Booking]" myapp/models:65: note: Revealed type is "def () -> django.db.models.query.QuerySet[myapp.models.Booking, myapp.models.Booking]" myapp/models:66: error: "RelatedManager[Booking]" has no attribute "custom" [attr-defined] myapp/models:66: note: Revealed type is "Any" myapp/models:67: note: Revealed type is "def (*args: Any, **kwargs: Any) -> django.db.models.query.QuerySet[myapp.models.Booking, myapp.models.Booking]" myapp/models:68: error: "QuerySet[Booking, Booking]" has no attribute "custom" [attr-defined] myapp/models:68: note: Revealed type is "Any" myapp/models:69: note: Revealed type is "myapp.models.Booking | None" - case: subclass_manager_without_type_parameters main: | from typing_extensions import reveal_type from myapp.models import MySubModel reveal_type(MySubModel.objects) # N: Revealed type is "myapp.models.MySubManager[myapp.models.MySubModel]" reveal_type(MySubModel.objects.get()) # N: Revealed type is "myapp.models.MySubModel" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import ClassVar from typing_extensions import Self, TypeVar from django.db import models T = TypeVar("T", bound="MyModel") class MyManager(models.Manager[T]): pass class MySubManager(MyManager): pass class MyModel(models.Model): pass class MySubModel(MyModel): objects: ClassVar[MySubManager[Self]] = MySubManager() - case: subclass_manager_without_type_parameters_disallow_any_generics main: | from typing_extensions import reveal_type from myapp.models import MySubModel reveal_type(MySubModel.objects) reveal_type(MySubModel.objects.get()) installed_apps: - myapp mypy_config: | [mypy-myapp.models] disallow_any_generics = true out: | main:3: note: Revealed type is "myapp.models.MySubManager" main:4: note: Revealed type is "Any" myapp/models:10: error: Missing type arguments for generic type "MyManager" [type-arg] files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import ClassVar from typing_extensions import TypeVar from django.db import models T = TypeVar("T", bound="MyModel") class MyManager(models.Manager[T]): pass class MySubManager(MyManager): pass class MyModel(models.Model): pass class MySubModel(MyModel): objects: ClassVar[MySubManager] = MySubManager() - case: nested_manager_class_definition main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.objects) reveal_type(MyModel.objects.get()) installed_apps: - myapp out: | main:3: note: Revealed type is "myapp.models.MyModel.MyManager[myapp.models.MyModel]" main:4: note: Revealed type is "myapp.models.MyModel" files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import Any from django.db import models class MyModel(models.Model): class MyManager(models.Manager): def get_instance(self) -> int: raise NotImplementedError objects = MyManager() - case: test_typechecks_filter_methods_of_queryset_type main: | from myapp.models import MyModel MyModel.objects.filter(id=1).filter(invalid=1) # E: Cannot resolve keyword 'invalid' into field. Choices are: id [misc] MyModel.objects.filter(id=1).get(invalid=1) # E: Cannot resolve keyword 'invalid' into field. Choices are: id [misc] MyModel.objects.filter(id=1).exclude(invalid=1) # E: Cannot resolve keyword 'invalid' into field. Choices are: id [misc] MyModel.objects.filter(id=1).create(invalid=1) # E: Unexpected attribute "invalid" for model "MyModel" [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): ... - case: test_does_not_populate_an_unexpected_type_argument main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel.populated_manager) # N: Revealed type is "myapp.models.PopulatedManager" reveal_type(MyModel.populated_manager.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.populated_manager.filter()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.populated_manager_from_generic_queryset) # N: Revealed type is "myapp.models.PopulatedManagerFromQuerySet" reveal_type(MyModel.populated_manager_from_generic_queryset.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.populated_manager_from_generic_queryset.filter()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.populated_manager_from_populated_queryset) # N: Revealed type is "myapp.models.PopulatedManagerFromPopulatedQuerySet" reveal_type(MyModel.populated_manager_from_populated_queryset.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.populated_manager_from_populated_queryset.filter()) # N: Revealed type is "myapp.models.PopulatedQuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.generic_manager) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel]" reveal_type(MyModel.generic_manager.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.generic_manager.filter()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.generic_manager_from_generic_queryset) # N: Revealed type is "myapp.models.ManagerFromQuerySet[myapp.models.MyModel]" reveal_type(MyModel.generic_manager_from_generic_queryset.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.generic_manager_from_generic_queryset.filter()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyModel, myapp.models.MyModel]" reveal_type(MyModel.generic_manager_from_populated_queryset) # N: Revealed type is "myapp.models.ManagerFromPopulatedQuerySet[myapp.models.MyModel]" reveal_type(MyModel.generic_manager_from_populated_queryset.get()) # N: Revealed type is "myapp.models.MyModel" reveal_type(MyModel.generic_manager_from_populated_queryset.filter()) # N: Revealed type is "myapp.models.PopulatedQuerySet[myapp.models.MyModel, myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class PopulatedManager(models.Manager["MyModel"]): ... class PopulatedQuerySet(models.QuerySet["MyModel"]): ... PopulatedManagerFromGenericQuerySet = PopulatedManager.from_queryset(models.QuerySet) PopulatedManagerFromPopulatedQuerySet = PopulatedManager.from_queryset(PopulatedQuerySet) GenericManagerFromGenericQuerySet = models.Manager.from_queryset(models.QuerySet) GenericManagerFromPopulatedQuerySet = models.Manager.from_queryset(PopulatedQuerySet) class MyModel(models.Model): populated_manager = PopulatedManager() populated_manager_from_generic_queryset = PopulatedManagerFromGenericQuerySet() populated_manager_from_populated_queryset = PopulatedManagerFromPopulatedQuerySet() generic_manager = models.Manager() generic_manager_from_generic_queryset = GenericManagerFromGenericQuerySet() generic_manager_from_populated_queryset = GenericManagerFromPopulatedQuerySet() # Regression test for #2304 - case: test_objects_managers_is_kept_with_specific_import_graph main: | from typing_extensions import reveal_type from zerver.models import RealmFilter reveal_type(RealmFilter.objects) # N: Revealed type is "django.db.models.manager.Manager[zerver.models.linkifiers.RealmFilter]" installed_apps: - django.contrib.auth - django.contrib.contenttypes - confirmation - zerver files: - path: confirmation/__init__.py - path: confirmation/models.py content: | from django.db import models from zerver.models import Realm class Confirmation(models.Model): realm = models.ForeignKey(Realm, on_delete=models.CASCADE) - path: zerver/__init__.py - path: zerver/models/__init__.py content: | from zerver.models.linkifiers import RealmFilter as RealmFilter from zerver.models.realms import Realm as Realm from zerver.models.streams import Stream as Stream from zerver.models.users import UserProfile as UserProfile RealmFilter.objects - path: zerver/models/linkifiers.py content: | from django.db import models class RealmFilter(models.Model): pass - path: zerver/models/realms.py content: | from django.db import models class Realm(models.Model): pass - path: zerver/models/streams.py content: | from django.db import models from zerver.models.realms import Realm from zerver.models.users import UserProfile class Stream(models.Model): realm = models.ForeignKey(Realm, on_delete=models.RESTRICT) creator = models.ForeignKey(UserProfile, on_delete=models.RESTRICT) - path: zerver/models/users.py content: | from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin class UserProfile(AbstractBaseUser, PermissionsMixin): pass typeddjango-django-stubs-fa03b48/tests/typecheck/models/000077500000000000000000000000001526064357400234515ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_abstract.yml000066400000000000000000000175621526064357400270510ustar00rootroot00000000000000- case: test_filter_on_abstract_user_pk main: | from typing_extensions import reveal_type from django.contrib.auth.models import AbstractUser AbstractUser.objects.get(pk=1) AbstractUser.objects.get(pk__in=[1]) au: AbstractUser reveal_type(au.pk) # N: Revealed type is "Any" installed_apps: - django.contrib.auth - django.contrib.contenttypes - case: test_filter_on_abstract_user_pk_wrong_name main: | from django.contrib.auth.models import AbstractUser AbstractUser.objects.get(pkey=1) # ER: Cannot resolve keyword 'pkey' into field..* installed_apps: - django.contrib.auth - django.contrib.contenttypes - case: test_fetch_pk_with_custom_manager_on_abstract_model main: | from myapp.models import MyModel installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import reveal_type from django.db import models class BaseManager(models.Manager): pass class BaseModel(models.Model): objects = BaseManager() class Meta: abstract = True def lock(self) -> None: reveal_type(type(self).objects.values_list("pk")) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.BaseModel, tuple[Any]]" class MyModel(BaseModel): field = models.IntegerField() - case: test_can_instantiate_with_recursive_relation_on_abstract_model main: | from myapp.models import Concrete, Recursive first = Concrete.objects.create(parent=None) Concrete.objects.create(parent=first) Recursive.objects.create(parent=None) Recursive(parent=Recursive(parent=None)) Concrete(parent=Concrete(parent=None)) out: | main:4: error: "type[Recursive]" has no attribute "objects" [attr-defined] main:5: error: Cannot instantiate abstract class "Recursive" with abstract attributes "DoesNotExist", "MultipleObjectsReturned" and "NotUpdated" [abstract] main:5: error: Unexpected attribute "parent" for model "Recursive" [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Recursive(models.Model): parent = models.ForeignKey("self", null=True, on_delete=models.CASCADE) class Meta: abstract = True class Concrete(Recursive): ... - case: test_abstract_model_type_cannot_be_used_as_runtime_arg main: | from myapp.models import Abstract, Concrete, LiteralAbstract from typing import Generic, overload from typing_extensions import TypeVar Abstract() # E: Cannot instantiate abstract class "Abstract" with abstract attributes "DoesNotExist", "MultipleObjectsReturned" and "NotUpdated" [abstract] LiteralAbstract() # E: Cannot instantiate abstract class "LiteralAbstract" with abstract attributes "DoesNotExist", "MultipleObjectsReturned" and "NotUpdated" [abstract] def f(klass: type[Abstract]) -> None: return None f(Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract] f(Concrete) def second_arg(arg: str, klass: type[Abstract]) -> None: return None second_arg("abc", Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract] second_arg(Abstract, Concrete) # E: Argument 1 to "second_arg" has incompatible type "type[Abstract]"; expected "str" [arg-type] T = TypeVar("T", bound=Abstract) def g(klass: type[T]) -> None: return None g(Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract] g(Concrete) @overload def o(klass: type[T], arg: str) -> None: ... @overload def o(klass: type[T], arg: int) -> None: ... def o(klass: type[T], arg: str | int) -> None: return None o(Abstract, "a") # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract] o(Abstract, 1) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract] o(Concrete, 1) class M: def method(self, klass: type[Abstract]) -> None: return None @overload def overloaded(self, arg: int, klass: type[Abstract]) -> None: ... @overload def overloaded(self, arg: str, klass: type[Abstract]) -> None: ... def overloaded(self, arg: str | int, klass: type[Abstract]) -> None: return None M().method(Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract] M().overloaded(1, Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract] M().overloaded("1", Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract] class G(Generic[T]): def method(self, klass: type[T]) -> None: return None G[Abstract]().method(Abstract) # E: Only concrete class can be given where "type[Abstract]" is expected [type-abstract] # Additional plugin coverage unknown(Abstract) # E: Name "unknown" is not defined [name-defined] M().unknown(Abstract) # E: "M" has no attribute "unknown" [attr-defined] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from typing import Literal, ClassVar class Abstract(models.Model): field = models.CharField() class Meta: abstract = True class Concrete(Abstract): ... class LiteralAbstract(models.Model): class Meta: abstract: ClassVar[Literal[True]] - case: test_use_abstract_model main: | from myapp.models import create_animal, create_animal_generic, Cat, Animal, ExplicitConcrete create_animal(Cat, "Garfield") create_animal(Animal, "Animal") # E: Only concrete class can be given where "type[Animal]" is expected [type-abstract] create_animal_generic(Cat, "Grumpy") create_animal_generic(Animal, "Animal") # E: Only concrete class can be given where "type[Animal]" is expected [type-abstract] Animal() # E: Cannot instantiate abstract class "Animal" with abstract attributes "DoesNotExist", "MultipleObjectsReturned" and "NotUpdated" [abstract] ExplicitConcrete() installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import Protocol from typing_extensions import TypeVar, reveal_type from django.db import models from django_stubs_ext.db.models import TypedModelMeta class Animal(models.Model): name = models.CharField(max_length=100) class Meta(TypedModelMeta): abstract = True class Cat(Animal): # Concrete model pass class ExplicitConcrete(Animal): class Meta: abstract = False def f() -> None: x: type[Animal] x() return None def create_animal(klass: type[Animal], name: str) -> Animal: obj = klass(name=name) obj.save() return obj T = TypeVar("T", bound=Animal) def create_animal_generic(klass: type[T], name: str) -> T: reveal_type(klass) # N: Revealed type is "type[T]" return klass._default_manager.create(name=name) typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_contrib_models.yml000066400000000000000000000216221526064357400302410ustar00rootroot00000000000000- case: contrib_auth_model_fields main: | from typing_extensions import reveal_type from django.contrib.auth.models import User reveal_type(User().username) # N: Revealed type is "str" reveal_type(User().password) # N: Revealed type is "str" reveal_type(User().first_name) # N: Revealed type is "str" reveal_type(User().last_name) # N: Revealed type is "str" reveal_type(User().email) # N: Revealed type is "str" reveal_type(User().is_staff) # N: Revealed type is "bool" reveal_type(User().is_active) # N: Revealed type is "bool" reveal_type(User().date_joined) # N: Revealed type is "datetime.datetime" reveal_type(User().last_login) # N: Revealed type is "datetime.datetime | None" reveal_type(User().is_authenticated) # N: Revealed type is "Literal[True]" reveal_type(User().is_anonymous) # N: Revealed type is "Literal[False]" reveal_type(User().groups.get()) # N: Revealed type is "django.contrib.auth.models.Group" reveal_type(User().user_permissions.get()) # N: Revealed type is "django.contrib.auth.models.Permission" reveal_type(User.groups) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[django.contrib.auth.models.Group, django.contrib.auth.models.User_groups]" reveal_type(User.user_permissions) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[django.contrib.auth.models.Permission, django.db.models.base.Model]" from django.contrib.auth.models import AnonymousUser reveal_type(AnonymousUser().is_authenticated) # N: Revealed type is "Literal[False]" reveal_type(AnonymousUser().is_anonymous) # N: Revealed type is "Literal[True]" from django.contrib.auth.models import Permission reveal_type(Permission().name) # N: Revealed type is "str" reveal_type(Permission().codename) # N: Revealed type is "str" from django.contrib.auth.models import PermissionsMixin p: type[PermissionsMixin] reveal_type(p().is_superuser) # N: Revealed type is "bool" from django.contrib.auth.models import Group reveal_type(Group().name) # N: Revealed type is "str" reveal_type(Group().permissions.get()) # N: Revealed type is "django.contrib.auth.models.Permission" reveal_type(Group.permissions) # N: Revealed type is "django.db.models.fields.related_descriptors.ManyToManyDescriptor[django.contrib.auth.models.Permission, django.contrib.auth.models.Group_permissions]" - case: can_override_abstract_user_manager main: | from typing_extensions import reveal_type from myapp.models import MyBaseUser, MyUser reveal_type(MyBaseUser.objects) # N: Revealed type is "myapp.models.MyBaseUserManager" reveal_type(MyBaseUser.objects.all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyBaseUser, myapp.models.MyBaseUser]" reveal_type(MyUser.objects) # N: Revealed type is "myapp.models.MyUserManager" reveal_type(MyUser.objects.all()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.MyUser, myapp.models.MyUser]" installed_apps: - django.contrib.auth - django.contrib.contenttypes - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager from django.contrib.auth.models import AbstractUser, UserManager from typing import ClassVar class MyBaseUserManager(BaseUserManager["MyBaseUser"]): ... class MyBaseUser(AbstractBaseUser): objects = MyBaseUserManager() class MyUserManager(UserManager["MyUser"]): ... class MyUser(AbstractUser): objects: ClassVar[MyUserManager] = MyUserManager() - case: can_combine_permissions_mixin_and_abstract_base_user main: | from typing_extensions import reveal_type from django.contrib.auth.base_user import AbstractBaseUser from django.contrib.auth.models import PermissionsMixin from myapp.models import AuthUser reveal_type(AuthUser._meta) reveal_type(AuthUser()._meta) reveal_type(PermissionsMixin._meta) reveal_type(AbstractBaseUser._meta) out: | main:5: note: Revealed type is "django.db.models.options.Options[myapp.models.AuthUser]" main:6: note: Revealed type is "django.db.models.options.Options[myapp.models.AuthUser]" main:7: note: Revealed type is "django.db.models.options.Options[django.contrib.auth.models.PermissionsMixin]" main:8: note: Revealed type is "django.db.models.options.Options[django.contrib.auth.base_user.AbstractBaseUser]" installed_apps: - django.contrib.auth - django.contrib.contenttypes - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.contrib.auth.base_user import AbstractBaseUser from django.contrib.auth.models import PermissionsMixin class AuthUser(AbstractBaseUser, PermissionsMixin): class Meta: abstract = False db_table = "auth_user" - case: test_relation_specified_by_auth_user_model main: | from typing_extensions import reveal_type from other.models import Other reveal_type(Other().users.get()) reveal_type(Other.users.through) reveal_type(Other.users.through().myuser) reveal_type(Other.users.through.objects.get().myuser) reveal_type(Other().user) reveal_type(Other().unq_user) out: | main:3: note: Revealed type is "myapp.models.MyUser" main:4: note: Revealed type is "type[other.models.Other_users]" main:5: note: Revealed type is "myapp.models.MyUser" main:6: note: Revealed type is "myapp.models.MyUser" main:8: note: Revealed type is "myapp.models.MyUser" main:10: note: Revealed type is "myapp.models.MyUser" custom_settings: | INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth', 'myapp', 'other') AUTH_USER_MODEL='myapp.MyUser' files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): ... - path: other/__init__.py - path: other/models.py content: | from django.conf import settings from django.db import models class Other(models.Model): users = models.ManyToManyField(settings.AUTH_USER_MODEL) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) unq_user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) - case: test_relate_to_auth_user_model_when_auth_not_installed main: | from typing_extensions import reveal_type from other.models import Other reveal_type(Other().user) out: | main:3: note: Revealed type is "myapp.models.MyUser" custom_settings: | INSTALLED_APPS = ('django.contrib.contenttypes', 'myapp', 'other') AUTH_USER_MODEL='myapp.MyUser' files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): ... - path: other/__init__.py - path: other/models.py content: | from django.conf import settings from django.db import models class Other(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) - case: test_permissions_inherited_reverse_relations main: | from typing_extensions import reveal_type from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType reveal_type(Permission().user_set) # N: Revealed type is "django.contrib.auth.models.User_ManyRelatedManager[django.contrib.auth.models.User_user_permissions]" reveal_type(Group().user_set) # N: Revealed type is "django.contrib.auth.models.User_ManyRelatedManager[django.contrib.auth.models.User_groups]" reveal_type(ContentType.permission_set) # N: Revealed type is "django.db.models.fields.related_descriptors.ReverseManyToOneDescriptor[django.contrib.auth.models.Permission]" reveal_type(ContentType().permission_set) # N: Revealed type is "django.contrib.auth.models.Permission_RelatedManager" custom_settings: | INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth') AUTH_USER_MODEL='auth.User' typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_create.yml000066400000000000000000000174641526064357400265120ustar00rootroot00000000000000- case: default_manager_create_is_typechecked main: | from myapp.models import User User.objects.create(pk=1, name='Max', age=10) User.objects.create(age=[]) # E: Incompatible type for "age" of "User" (got "list[Any]", expected "float | int | str | Combinable") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() - case: model_recognises_parent_attributes main: | from typing_extensions import reveal_type from myapp.models import Child c = Child.objects.create(name='Maxim', lastname='Maxim2') reveal_type(c.id) # N: Revealed type is "int" reveal_type(c.name) # N: Revealed type is "str" reveal_type(c.lastname) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Parent(models.Model): name = models.CharField(max_length=100) class Child(Parent): lastname = models.CharField(max_length=100) - case: deep_multiple_inheritance_with_create main: | from myapp.models import Child4 Child4.objects.create(name1='n1', name2='n2', value=1, value4=4) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Parent1(models.Model): name1 = models.CharField(max_length=50) class Parent2(models.Model): id2 = models.AutoField(primary_key=True) name2 = models.CharField(max_length=50) class Child1(Parent1, Parent2): value = models.IntegerField() class Child4(Child1): value4 = models.IntegerField() - case: mro_is_walked_for_field_annotations main: | from myapp.models import Child Child.objects.create(dct={"hello": "world"}) # no errors installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from __future__ import annotations from django.db import models class JSONField(models.TextField): pass # incomplete class Base(models.Model): dct: models.Field[dict[str, str], dict[str, str]] = JSONField() class Child(Base): pass - case: optional_id_fields_for_create_is_error_if_not_autofield skip: __import__("django").VERSION < (6, 0) main: | from myapp.models import Publisher, Book Book.objects.create(id=None) # E: Incompatible type for "id" of "Book" (got "None", expected "float | int | str | Combinable") [misc] Book.objects.create(publisher=None) # E: Incompatible type for "publisher" of "Book" (got "None", expected "Publisher | Combinable") [misc] Book.objects.create(publisher_id=None) # E: Incompatible type for "publisher_id" of "Book" (got "None", expected "float | int | str | Combinable") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class Book(models.Model): id = models.IntegerField(primary_key=True) publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE) - case: none_for_primary_key_is_allowed_if_field_is_autogenerated main: | from myapp.models import Book Book.objects.create(id=None) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Book(models.Model): pass - case: when_default_for_primary_key_is_specified_allow_none_to_be_set main: | from typing_extensions import reveal_type from myapp.models import MyModel first = MyModel(id=None) reveal_type(first.id) # N: Revealed type is "int" first = MyModel.objects.create(id=None) reveal_type(first.id) # N: Revealed type is "int" first = MyModel() first.id = None reveal_type(first.id) # N: Revealed type is "int" from myapp.models import MyModel2 MyModel2(id=None) # E: Incompatible type for "id" of "MyModel2" (got "None", expected "float | int | str | Combinable") [misc] MyModel2.objects.create(id=None) # E: Incompatible type for "id" of "MyModel2" (got "None", expected "float | int | str | Combinable") [misc] second = MyModel2() second.id = None # E: Incompatible types in assignment (expression has type "None", variable has type "float | int | str | Combinable") [assignment] reveal_type(second.id) # N: Revealed type is "int" # default set but no primary key doesn't allow None from myapp.models import MyModel3 MyModel3(default=None) # E: Incompatible type for "default" of "MyModel3" (got "None", expected "float | int | str | Combinable") [misc] MyModel3.objects.create(default=None) # E: Incompatible type for "default" of "MyModel3" (got "None", expected "float | int | str | Combinable") [misc] third = MyModel3() third.default = None # E: Incompatible types in assignment (expression has type "None", variable has type "float | int | str | Combinable") [assignment] reveal_type(third.default) # N: Revealed type is "int" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models def return_int() -> int: return 0 class MyModel(models.Model): id = models.IntegerField(primary_key=True, default=return_int) class MyModel2(models.Model): id = models.IntegerField(primary_key=True) class MyModel3(models.Model): default = models.IntegerField(default=return_int) - case: default_manager_acreate_is_typechecked main: | import asyncio from typing_extensions import reveal_type from myapp.models import User async def amain() -> None: reveal_type(await User.objects.acreate(pk=1, name='Max', age=10)) # N: Revealed type is "myapp.models.User" await User.objects.acreate(age=[]) # E: Incompatible type for "age" of "User" (got "list[Any]", expected "float | int | str | Combinable") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class User(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() - case: too_many_keyword_arguments_on_create main: | from myapp.models import MyUser MyUser.objects.create(id=1, foo="bbb") # E: Unexpected attribute "foo" for model "MyUser" [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): pass typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_extra_methods.yml000066400000000000000000000052771526064357400301140ustar00rootroot00000000000000- case: if_field_has_choices_set_model_has_get_FIELDNAME_display_method main: | from typing_extensions import reveal_type from myapp.models import MyUser user = MyUser(name='user', gender='M') user.get_name_display() # E: "MyUser" has no attribute "get_name_display"; maybe "get_gender_display"? [attr-defined] reveal_type(user.get_gender_display()) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models GENDER_CHOICES = ( ('M', 'Male'), ('F', 'Female'), ) class MyUser(models.Model): name = models.CharField(max_length=100) gender = models.CharField(max_length=100, choices=GENDER_CHOICES) - case: date_datetime_fields_have_get_next_by_get_previous_by disable_cache: true parametrized: - allow_any: "true" - allow_any: "false" mypy_config: | [mypy-myapp.models] disallow_any_generics = {{ allow_any }} disallow_any_explicit = {{ allow_any }} main: | from typing_extensions import reveal_type from myapp.models import MyUser reveal_type(MyUser().get_next_by_date()) # N: Revealed type is "myapp.models.MyUser" reveal_type(MyUser().get_next_by_datetime()) # N: Revealed type is "myapp.models.MyUser" reveal_type(MyUser().get_previous_by_date()) # N: Revealed type is "myapp.models.MyUser" reveal_type(MyUser().get_previous_by_datetime()) # N: Revealed type is "myapp.models.MyUser" # accept arbitrary kwargs MyUser().get_next_by_date(arg1=1, arg2=2) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): date = models.DateField() datetime = models.DateTimeField() - case: get_next_by_get_previous_by_absent_if_null_true main: | from myapp.models import MyUser MyUser().get_next_by_date() # E: "MyUser" has no attribute "get_next_by_date" [attr-defined] MyUser().get_previous_by_date() # E: "MyUser" has no attribute "get_previous_by_date" [attr-defined] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): date = models.DateField(null=True) typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_inheritance.yml000066400000000000000000000123651526064357400275330ustar00rootroot00000000000000- case: test_meta_nested_class_allows_subclassing_in_multiple_inheritance main: | from typing import Any from django.db import models class Mixin1(models.Model): class Meta: abstract = True class Mixin2(models.Model): class Meta: abstract = True class User(Mixin1, Mixin2): pass - case: test_inheritance_from_abstract_model_does_not_fail_if_field_with_id_exists main: | from django.db import models class Abstract(models.Model): class Meta: abstract = True class User(Abstract): id = models.AutoField(primary_key=True) - case: test_typechecking_for_model_subclasses main: | from myapp.models import A, B, C def service(a: A) -> int: raise NotImplementedError b_instance = B() service(b_instance) # E: Argument 1 to "service" has incompatible type "B"; expected "A" [arg-type] a_instance = A() c_instance = C() service(a_instance) service(c_instance) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class A(models.Model): pass class B(models.Model): b_attr = 1 class C(A): pass - case: fail_if_no_such_attribute_on_model main: | from typing_extensions import reveal_type from myapp.models import B b_instance = B() reveal_type(b_instance.b_attr) # N: Revealed type is "int" b_instance.non_existent_attribute # E: "B" has no attribute "non_existent_attribute" [attr-defined] b_instance.non_existent_attribute = 2 # E: "B" has no attribute "non_existent_attribute" [attr-defined] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class B(models.Model): b_attr = 1 - case: fields_recognized_if_base_model_is_subclass_of_models_model main: | from typing_extensions import reveal_type from myapp.models import User reveal_type(User().username) # N: Revealed type is "str" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from myapp.utils import MyBaseModel class User(MyBaseModel): username = models.CharField(max_length=100) - path: myapp/utils.py content: | from django.db.models import Model class MyBaseModel(Model): pass - case: django_contrib_gis_base_model_mixin_inheritance main: | from typing_extensions import reveal_type from myapp.models import User reveal_type(User().name) # N: Revealed type is "str" reveal_type(User().updated_at) # N: Revealed type is "datetime.datetime" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.gis.db import models as gis_models class Mixin1(gis_models.Model): class Meta: abstract = True class Mixin2(gis_models.Model): updated_at = models.DateTimeField(auto_now=True) class Meta: abstract = True class User(Mixin1, Mixin2): name = models.TextField() - case: test_manager_typevar_through_bounds main: | from typing_extensions import reveal_type from myapp.models import ResultProcessorConcrete reveal_type(ResultProcessorConcrete().f()) # N: Revealed type is "myapp.models.Concrete" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from __future__ import annotations from django.db.models import Model from django.db.models.manager import Manager from typing import ClassVar, Generic from typing_extensions import Self, TypeVar M = TypeVar("M", bound=Model, covariant=True) class BaseManager(Manager[M]): ... class Base(Model): custom_objects: ClassVar[BaseManager[Self]] = BaseManager() class Bound(Base): pass T = TypeVar("T", bound=Bound) class ResultProcessorBase(Generic[T]): @property def model_cls(self) -> type[T]: raise NotImplementedError def f(self) -> T: return self.model_cls.custom_objects.get() class Concrete(Bound): pass class ResultProcessorConcrete(ResultProcessorBase[Concrete]): pass typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_init.yml000066400000000000000000000325531526064357400262060ustar00rootroot00000000000000- case: arguments_to_init_unexpected_attributes main: | from myapp.models import MyUser user = MyUser(name=1, age=12) out: | main:2: error: Unexpected attribute "name" for model "MyUser" [misc] main:2: error: Unexpected attribute "age" for model "MyUser" [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): pass - case: plain_function_which_returns_model main: | from myapp.models import MyUser def func(i: int) -> MyUser: raise NotImplementedError func("hello") # E: Argument 1 to "func" has incompatible type "str"; expected "int" [arg-type] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): pass - case: arguments_to_init_from_class_incompatible_type main: | from myapp.models import MyUser user = MyUser(name='hello', age=[]) out: | main:2: error: Incompatible type for "age" of "MyUser" (got "list[Any]", expected "float | int | str | Combinable") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() - case: arguments_to_init_combined_from_base_classes main: | from myapp.models import BaseUser, ChildUser user = ChildUser(name='Max', age=12, lastname='Lastname') installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class BaseUser(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() class ChildUser(BaseUser): lastname = models.CharField(max_length=100) - case: fields_from_abstract_user_propagate_to_init main: | from myapp.models import MyUser user = MyUser(name='Maxim', number=1) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class AbstractUser(models.Model): class Meta: abstract = True name = models.CharField(max_length=100) class MyUser(AbstractUser): number = models.IntegerField() - case: pk_refers_to_primary_key_and_could_be_passed_to_init main: | from myapp.models import MyUser1, MyUser2 user2 = MyUser1(pk='hello') user3 = MyUser2(pk=1, name='maxim') installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser1(models.Model): mypk = models.CharField(primary_key=True) class MyUser2(models.Model): name = models.CharField(max_length=100) - case: typechecking_of_pk main: | from myapp.models import MyUser1 user = MyUser1(pk=[]) # E: Incompatible type for "pk" of "MyUser1" (got "list[Any]", expected "float | int | str | Combinable | None") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser1(models.Model): mypk = models.IntegerField(primary_key=True) - case: set_foreign_key_by_its_primary_key skip: __import__("django").VERSION < (6, 0) main: | from datetime import datetime now = datetime.now() from myapp.models import Publisher, PublisherDatetime, Book Book(publisher_id=1, publisher_dt_id=now) Book(publisher_id=[], publisher_dt_id=now) # E: Incompatible type for "publisher_id" of "Book" (got "list[Any]", expected "float | int | str | Combinable") [misc] Book(publisher_id=1, publisher_dt_id=1) # E: Incompatible type for "publisher_dt_id" of "Book" (got "int", expected "str | datetime | date | Combinable") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): pass class PublisherDatetime(models.Model): dt_pk = models.DateTimeField(primary_key=True) class Book(models.Model): publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE) publisher_dt = models.ForeignKey(PublisherDatetime, on_delete=models.CASCADE) - case: setting_value_to_an_array_of_ints main: | from myapp.models import MyModel array_val: tuple[int, ...] = (1,) MyModel(array=array_val) array_val2: list[int] = [1] MyModel(array=array_val2) class NotAValid: pass array_val3: list[NotAValid] = [NotAValid()] MyModel(array=array_val3) # E: Incompatible type for "array" of "MyModel" (got "list[NotAValid]", expected "Sequence[float | int | str] | Combinable") [misc] non_init = MyModel() non_init.array = array_val non_init.array = array_val2 non_init.array = array_val3 # E: Incompatible types in assignment (expression has type "list[NotAValid]", variable has type "Sequence[float | int | str] | Combinable") [assignment] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.postgres.fields import ArrayField class MyModel(models.Model): array = ArrayField(base_field=models.IntegerField()) - case: if_no_explicit_primary_key_id_can_be_passed main: | from myapp.models import MyModel MyModel(id=1, name='maxim') installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): name = models.CharField(max_length=100) - case: arguments_can_be_passed_as_positionals main: | from myapp.models import MyModel, MyModel2 MyModel(1) MyModel2(1, 12) MyModel2(1, []) # E: Incompatible type for "name" of "MyModel2" (got "list[Any]", expected "float | int | str | Combinable") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): pass class MyModel2(models.Model): name = models.IntegerField() - case: charfield_with_integer_choices main: | from myapp.models import MyModel MyModel(day=1) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): day = models.CharField(max_length=3, choices=((1, 'Fri'), (2, 'Sat'))) - case: optional_id_fields_allowed_in_init main: | from myapp.models import Book, Publisher Book(id=None) Book(publisher=None) Book(publisher_id=None) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Publisher(models.Model): name = models.CharField(primary_key=True, max_length=100) class Book(models.Model): publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, null=True) - case: init_in_abstract_model_classmethod_should_not_throw_error_for_valid_fields main: | from myapp.models import MyModel MyModel.base_init() installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from typing_extensions import Self class AbstractModel(models.Model): class Meta: abstract = True text = models.CharField(max_length=100) @classmethod def base_init(cls) -> Self: return cls(text='mytext') class MyModel(AbstractModel): pass - case: field_set_type_honors_type_redefinition main: | from typing_extensions import reveal_type from myapp.models import MyModel non_init = MyModel() reveal_type(non_init.redefined_set_type) reveal_type(non_init.redefined_union_set_type) reveal_type(non_init.redefined_array_set_type) reveal_type(non_init.default_set_type) reveal_type(non_init.unset_set_type) non_init.redefined_set_type = "invalid" non_init.redefined_union_set_type = "invalid" array_val: list[str] = ["invalid"] non_init.redefined_array_set_type = array_val non_init.default_set_type = [] non_init.unset_set_type = [] MyModel( redefined_set_type="invalid", redefined_union_set_type="invalid", redefined_array_set_type=33, default_set_type=[], unset_set_type=[], ) out: | main:4: note: Revealed type is "int" main:5: note: Revealed type is "int" main:6: note: Revealed type is "list[int]" main:7: note: Revealed type is "int" main:8: note: Revealed type is "Any" main:9: error: Incompatible types in assignment (expression has type "str", variable has type "int") [assignment] main:10: error: Incompatible types in assignment (expression has type "str", variable has type "int | float") [assignment] main:12: error: Incompatible types in assignment (expression has type "list[str]", variable has type "Sequence[int | float]") [assignment] main:13: error: Incompatible types in assignment (expression has type "list[Never]", variable has type "float | int | str | Combinable") [assignment] main:15: error: Incompatible type for "redefined_set_type" of "MyModel" (got "str", expected "int") [misc] main:15: error: Incompatible type for "redefined_union_set_type" of "MyModel" (got "str", expected "int | float") [misc] main:15: error: Incompatible type for "redefined_array_set_type" of "MyModel" (got "int", expected "Sequence[int | float]") [misc] main:15: error: Incompatible type for "default_set_type" of "MyModel" (got "list[Any]", expected "float | int | str | Combinable") [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.contrib.postgres.fields import ArrayField from django.db import models from collections.abc import Sequence from typing import cast class MyModel(models.Model): redefined_set_type = cast("models.Field[int, int]", models.IntegerField()) redefined_union_set_type = cast("models.Field[int | float, int]", models.IntegerField()) redefined_array_set_type = cast( "ArrayField[Sequence[int | float], list[int]]", ArrayField(base_field=models.IntegerField()), ) default_set_type = models.IntegerField() unset_set_type = cast("models.Field", models.IntegerField()) - case: too_many_positional_arguments_on_init main: | from myapp.models import MyUser default_args: list[int] default_kwargs: dict[str, int] MyUser(1, "BB") # E: Too many arguments for "MyUser" [call-arg] MyUser("bbb", id=2) # E: Too many arguments for "MyUser" [call-arg] MyUser(1, "BB", *default_args) # E: Too many arguments for "MyUser" [call-arg] MyUser(1, "BB", **default_kwargs) # E: Too many arguments for "MyUser" [call-arg] # Should be ok because we cannot easily determine arg count MyUser(*"BB") MyUser(1, *["BB"]) MyUser(1, *("BB",)) MyUser(1, *default_args) MyUser(1, **default_kwargs) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): pass typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_meta_options.yml000066400000000000000000000264001526064357400277360ustar00rootroot00000000000000- case: meta_attribute_has_a_type_of_current_model main: | from typing_extensions import reveal_type from myapp.models import MyUser reveal_type(MyUser._meta) # N: Revealed type is "django.db.models.options.Options[myapp.models.MyUser]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): pass - case: get_field_returns_proper_field_type main: | from typing_extensions import reveal_type from myapp.models import MyUser reveal_type(MyUser._meta.get_field('base_name')) # N: Revealed type is "django.db.models.fields.CharField[str | int | django.db.models.expressions.Combinable, str]" reveal_type(MyUser.base_name.field) # N: Revealed type is "django.db.models.fields.CharField[str | int | django.db.models.expressions.Combinable, str]" reveal_type(MyUser._meta.get_field('name')) # N: Revealed type is "django.db.models.fields.CharField[str | int | django.db.models.expressions.Combinable, str]" reveal_type(MyUser.name.field) # N: Revealed type is "django.db.models.fields.CharField[str | int | django.db.models.expressions.Combinable, str]" reveal_type(MyUser._meta.get_field('age')) # N: Revealed type is "django.db.models.fields.IntegerField[float | int | str | django.db.models.expressions.Combinable, int]" reveal_type(MyUser.age.field) # N: Revealed type is "django.db.models.fields.IntegerField[float | int | str | django.db.models.expressions.Combinable, int]" reveal_type(MyUser._meta.get_field('to_user')) # N: Revealed type is "django.db.models.fields.related.ForeignKey[myapp.models.MyUser | django.db.models.expressions.Combinable, myapp.models.MyUser]" reveal_type(MyUser.to_user.field) # N: Revealed type is "django.db.models.fields.related.ForeignKey[myapp.models.MyUser | django.db.models.expressions.Combinable, myapp.models.MyUser]" MyUser._meta.get_field('unknown') # E: MyUser has no field named 'unknown' [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyBaseUser(models.Model): base_name = models.CharField(max_length=100) class MyUser(MyBaseUser): name = models.CharField(max_length=100) age = models.IntegerField() to_user = models.ForeignKey('self', on_delete=models.SET_NULL) - case: get_field_with_abstract_inheritance main: | from typing_extensions import reveal_type from myapp.models import MyModel MyModel._meta.get_field('non_existant') # E: MyModel has no field named 'non_existant' [misc] reveal_type(MyModel._meta.get_field('field')) # N: Revealed type is "django.contrib.postgres.fields.array.ArrayField[typing.Sequence[float | int | str] | django.db.models.expressions.Combinable, list[int]]" field: str reveal_type(MyModel._meta.get_field(field)) # N: Revealed type is "django.db.models.fields.Field[Any, Any] | django.db.models.fields.reverse_related.ForeignObjectRel" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.contrib.postgres.fields import ArrayField from django_stubs_ext.db.models import TypedModelMeta class AbstractModel(models.Model): class Meta(TypedModelMeta): abstract = True class MyModel(AbstractModel): field = ArrayField(models.IntegerField(), default=[]) - case: get_field_reverse_relations main: | from typing_extensions import reveal_type from myapp.models import ModelA reveal_type(ModelA._meta.get_field("model_b")) # N: Revealed type is "django.db.models.fields.reverse_related.ManyToOneRel" reveal_type(ModelA.modelb_set.field) # N: Revealed type is "django.db.models.fields.related.ForeignKey[myapp.models.ModelB, myapp.models.ModelB]" reveal_type(ModelA._meta.get_field("model_b_bis")) # N: Revealed type is "django.db.models.fields.reverse_related.ManyToOneRel" reveal_type(ModelA.model_b_bis.field) # N: Revealed type is "django.db.models.fields.related.ForeignKey[myapp.models.ModelB, myapp.models.ModelB]" # The reverse o2o accessor is a two arg descriptor, not a field reveal_type(ModelA._meta.get_field("modelc")) # N: Revealed type is "django.db.models.fields.reverse_related.OneToOneRel" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class ModelA(models.Model): ... class ModelB(models.Model): model_a = models.ForeignKey(ModelA, on_delete=models.CASCADE, related_query_name="model_b") model_a_bis = models.ForeignKey(ModelA, on_delete=models.CASCADE, related_name="model_b_bis") class ModelC(models.Model): model_a = models.OneToOneField(ModelA, on_delete=models.CASCADE) # Regression test for #2833 - case: get_field_with_model_defined_later_in_module main: | from myapp.models import MyModel installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import reveal_type from django.db import models def get_field_before_model_is_defined() -> None: # Definition order is the test: this body is checked before `MyModel`'s fields are inferred. reveal_type(MyModel._meta.get_field('short_id')) # N: Revealed type is "django.db.models.fields.IntegerField[float | int | str | django.db.models.expressions.Combinable, int]" # A module-level lambda has nothing to defer, so this falls back to the runtime lookup. unresolvable = lambda: reveal_type(MyModel._meta.get_field('short_id')) # N: Revealed type is "django.db.models.fields.IntegerField" class MyModel(models.Model): short_id = models.IntegerField() - case: base_model_meta_incompatible_types main: | from django.db import models from django.contrib.postgres.fields import ArrayField from django_stubs_ext.db.models import TypedModelMeta class MyModel(models.Model): example = models.CharField(max_length=100) class Meta(TypedModelMeta): abstract = 7 # E: Incompatible types in assignment (expression has type "int", base class "TypedModelMeta" defined the type as "bool") [assignment] verbose_name = ['test'] # E: Incompatible types in assignment (expression has type "list[str]", base class "TypedModelMeta" defined the type as "str | _StrPromise") [assignment] unique_together = {1: 2} # E: Incompatible types in assignment (expression has type "dict[int, int]", base class "TypedModelMeta" defined the type as "Sequence[Sequence[str]]") [assignment] unknown_attr = True # can't check this class MyModelMultipleBaseMeta(models.Model): class Meta(MyModel.Meta, TypedModelMeta): abstract = 7 # E: Incompatible types in assignment (expression has type "int", base class "TypedModelMeta" defined the type as "bool") [assignment] - case: auto_base_model_meta_incompatible_types main: | from myapp.models import MyModelWithAutoTypedMeta installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModelWithAutoTypedMeta(models.Model): example = models.CharField(max_length=100) class Meta: abstract = 0 # E: Incompatible types in assignment (expression has type "int", base class "TypedModelMeta" defined the type as "bool") [assignment] verbose_name = ['test'] # E: Incompatible types in assignment (expression has type "list[str]", base class "TypedModelMeta" defined the type as "str | _StrPromise") [assignment] unique_together = {1: 2} # E: Incompatible types in assignment (expression has type "dict[int, int]", base class "TypedModelMeta" defined the type as "Sequence[Sequence[str]]") [assignment] class DefinitelyNotAModel: class Meta: abstract = 7 verbose_name = ['test'] unique_together = {1: 2} unknown_attr = True - case: auto_base_model_meta_incompatible_types_multiple_inheritance main: | from myapp.models import MyModel, MyModel2, MyModel3 installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): class Meta: abstract = 5 # E: Incompatible types in assignment (expression has type "int", base class "TypedModelMeta" defined the type as "bool") [assignment] class MyModel2(models.Model): class Meta: abstract = 5 # E: Incompatible types in assignment (expression has type "int", base class "TypedModelMeta" defined the type as "bool") [assignment] class MyModel3(models.Model): class Meta(MyModel.Meta, MyModel2.Meta): abstract = 0 # OK because both base classes currently define this as int verbose_name = ['test'] # E: Incompatible types in assignment (expression has type "list[str]", base class "TypedModelMeta" defined the type as "str | _StrPromise") [assignment] unique_together = {1: 2} # E: Incompatible types in assignment (expression has type "dict[int, int]", base class "TypedModelMeta" defined the type as "Sequence[Sequence[str]]") [assignment] - case: instantiate_abstract_model main: | from myapp.models import AbstractModel, MyModel # Should not raise: MyModel(field=1) MyModel.objects.create(field=2) AbstractModel._default_manager.create() # Errors: AbstractModel() # E: Cannot instantiate abstract class "AbstractModel" with abstract attributes "DoesNotExist", "MultipleObjectsReturned" and "NotUpdated" [abstract] AbstractModel.objects.create() # E: "type[AbstractModel]" has no attribute "objects" [attr-defined] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class AbstractModel(models.Model): base = models.TextField() class Meta: abstract = True class MyModel(AbstractModel): field = models.IntegerField() typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_metaclass.yml000066400000000000000000000326551526064357400272220ustar00rootroot00000000000000- case: test_contributions_from_modelbase_metaclass main: | from typing_extensions import reveal_type from myapp.models import Abstract1, Abstract2, Concrete1, Concrete2, Concrete3 from django.db import models models.Model.DoesNotExist # E: "type[Model]" has no attribute "DoesNotExist" [attr-defined] models.Model.NotUpdated # E: "type[Model]" has no attribute "NotUpdated" [attr-defined] models.Model.MultipleObjectsReturned # E: "type[Model]" has no attribute "MultipleObjectsReturned" [attr-defined] reveal_type(Abstract1.DoesNotExist) # N: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]" reveal_type(Abstract2.DoesNotExist) # N: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]" reveal_type(Concrete1.DoesNotExist) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete1.DoesNotExist" reveal_type(Concrete2.DoesNotExist) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete2.DoesNotExist" reveal_type(Abstract1.NotUpdated) # N: Revealed type is "type[django.core.exceptions.ObjectNotUpdated]" reveal_type(Abstract2.NotUpdated) # N: Revealed type is "type[django.core.exceptions.ObjectNotUpdated]" reveal_type(Concrete1.NotUpdated) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete1.NotUpdated" reveal_type(Concrete2.NotUpdated) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete2.NotUpdated" reveal_type(Abstract1.MultipleObjectsReturned) # N: Revealed type is "type[django.core.exceptions.MultipleObjectsReturned]" reveal_type(Abstract2.MultipleObjectsReturned) # N: Revealed type is "type[django.core.exceptions.MultipleObjectsReturned]" reveal_type(Concrete1.MultipleObjectsReturned) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete1.MultipleObjectsReturned" reveal_type(Concrete2.MultipleObjectsReturned) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete2.MultipleObjectsReturned" reveal_type(super(Concrete1, Concrete1()).DoesNotExist()) # N: Revealed type is "django.core.exceptions.ObjectDoesNotExist" reveal_type(super(Concrete2, Concrete2()).DoesNotExist()) # N: Revealed type is "myapp.models.Concrete1.DoesNotExist" reveal_type(super(Concrete1, Concrete1()).NotUpdated()) # N: Revealed type is "django.core.exceptions.ObjectNotUpdated" reveal_type(super(Concrete2, Concrete2()).NotUpdated()) # N: Revealed type is "myapp.models.Concrete1.NotUpdated" a: type[Concrete1.DoesNotExist] a = Concrete1.DoesNotExist a = Concrete2.DoesNotExist a = Concrete3.DoesNotExist b: type[Concrete2.DoesNotExist] b = Concrete1.DoesNotExist # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.DoesNotExist]", variable has type "type[myapp.models.Concrete2.DoesNotExist]") [assignment] b = Concrete2.DoesNotExist b = Concrete3.DoesNotExist c: type[Concrete3.DoesNotExist] c = Concrete1.DoesNotExist # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.DoesNotExist]", variable has type "type[myapp.models.Concrete3.DoesNotExist]") [assignment] c = Concrete2.DoesNotExist # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.DoesNotExist]", variable has type "type[myapp.models.Concrete3.DoesNotExist]") [assignment] c = Concrete3.DoesNotExist d: type[Concrete1.NotUpdated] d = Concrete1.NotUpdated d = Concrete2.NotUpdated d = Concrete3.NotUpdated e: type[Concrete2.NotUpdated] e = Concrete1.NotUpdated # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.NotUpdated]", variable has type "type[myapp.models.Concrete2.NotUpdated]") [assignment] e = Concrete2.NotUpdated e = Concrete3.NotUpdated f: type[Concrete3.NotUpdated] f = Concrete1.NotUpdated # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.NotUpdated]", variable has type "type[myapp.models.Concrete3.NotUpdated]") [assignment] f = Concrete2.NotUpdated # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.NotUpdated]", variable has type "type[myapp.models.Concrete3.NotUpdated]") [assignment] f = Concrete3.NotUpdated g: type[Concrete1.MultipleObjectsReturned] g = Concrete1.MultipleObjectsReturned g = Concrete2.MultipleObjectsReturned g = Concrete3.MultipleObjectsReturned h: type[Concrete2.MultipleObjectsReturned] h = Concrete1.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete2.MultipleObjectsReturned]") [assignment] h = Concrete2.MultipleObjectsReturned h = Concrete3.MultipleObjectsReturned i: type[Concrete3.MultipleObjectsReturned] i = Concrete1.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete3.MultipleObjectsReturned]") [assignment] i = Concrete2.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete3.MultipleObjectsReturned]") [assignment] i = Concrete3.MultipleObjectsReturned installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Abstract1(models.Model): class Meta: abstract = True class Abstract2(Abstract1): class Meta: abstract = True class Concrete1(Abstract2): ... class Concrete2(Concrete1): ... class Concrete3(Concrete2): ... - case: test_contributions_from_modelbase_metaclass_no_processing mypy_config: | [mypy.plugins.django-stubs] django_settings_module = mysettings strict_model_abstract_attrs = false main: | from typing_extensions import reveal_type from myapp.models import Abstract1, Abstract2, Concrete1, Concrete2, Concrete3 from django.db import models reveal_type(models.Model.DoesNotExist) # N: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]" reveal_type(models.Model.NotUpdated) # N: Revealed type is "type[django.core.exceptions.ObjectNotUpdated]" reveal_type(models.Model.MultipleObjectsReturned) # N: Revealed type is "type[django.core.exceptions.MultipleObjectsReturned]" reveal_type(models.Model.objects) # N: Revealed type is "django.db.models.manager.Manager[django.db.models.base.Model]" reveal_type(Abstract1.DoesNotExist) # N: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]" reveal_type(Abstract2.DoesNotExist) # N: Revealed type is "type[django.core.exceptions.ObjectDoesNotExist]" reveal_type(Concrete1.DoesNotExist) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete1.DoesNotExist" reveal_type(Concrete2.DoesNotExist) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete2.DoesNotExist" reveal_type(Abstract1.NotUpdated) # N: Revealed type is "type[django.core.exceptions.ObjectNotUpdated]" reveal_type(Abstract2.NotUpdated) # N: Revealed type is "type[django.core.exceptions.ObjectNotUpdated]" reveal_type(Concrete1.NotUpdated) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete1.NotUpdated" reveal_type(Concrete2.NotUpdated) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete2.NotUpdated" reveal_type(Abstract1.MultipleObjectsReturned) # N: Revealed type is "type[django.core.exceptions.MultipleObjectsReturned]" reveal_type(Abstract2.MultipleObjectsReturned) # N: Revealed type is "type[django.core.exceptions.MultipleObjectsReturned]" reveal_type(Concrete1.MultipleObjectsReturned) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete1.MultipleObjectsReturned" reveal_type(Concrete2.MultipleObjectsReturned) # N: Revealed type is "def (*args: object) -> myapp.models.Concrete2.MultipleObjectsReturned" reveal_type(super(Concrete1, Concrete1()).DoesNotExist()) # N: Revealed type is "django.core.exceptions.ObjectDoesNotExist" reveal_type(super(Concrete2, Concrete2()).DoesNotExist()) # N: Revealed type is "myapp.models.Concrete1.DoesNotExist" reveal_type(super(Concrete1, Concrete1()).NotUpdated()) # N: Revealed type is "django.core.exceptions.ObjectNotUpdated" reveal_type(super(Concrete2, Concrete2()).NotUpdated()) # N: Revealed type is "myapp.models.Concrete1.NotUpdated" a: type[Concrete1.DoesNotExist] a = Concrete1.DoesNotExist a = Concrete2.DoesNotExist a = Concrete3.DoesNotExist b: type[Concrete2.DoesNotExist] b = Concrete1.DoesNotExist # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.DoesNotExist]", variable has type "type[myapp.models.Concrete2.DoesNotExist]") [assignment] b = Concrete2.DoesNotExist b = Concrete3.DoesNotExist c: type[Concrete3.DoesNotExist] c = Concrete1.DoesNotExist # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.DoesNotExist]", variable has type "type[myapp.models.Concrete3.DoesNotExist]") [assignment] c = Concrete2.DoesNotExist # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.DoesNotExist]", variable has type "type[myapp.models.Concrete3.DoesNotExist]") [assignment] c = Concrete3.DoesNotExist d: type[Concrete1.NotUpdated] d = Concrete1.NotUpdated d = Concrete2.NotUpdated d = Concrete3.NotUpdated e: type[Concrete2.NotUpdated] e = Concrete1.NotUpdated # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.NotUpdated]", variable has type "type[myapp.models.Concrete2.NotUpdated]") [assignment] e = Concrete2.NotUpdated e = Concrete3.NotUpdated f: type[Concrete3.NotUpdated] f = Concrete1.NotUpdated # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.NotUpdated]", variable has type "type[myapp.models.Concrete3.NotUpdated]") [assignment] f = Concrete2.NotUpdated # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.NotUpdated]", variable has type "type[myapp.models.Concrete3.NotUpdated]") [assignment] f = Concrete3.NotUpdated g: type[Concrete1.MultipleObjectsReturned] g = Concrete1.MultipleObjectsReturned g = Concrete2.MultipleObjectsReturned g = Concrete3.MultipleObjectsReturned h: type[Concrete2.MultipleObjectsReturned] h = Concrete1.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete2.MultipleObjectsReturned]") [assignment] h = Concrete2.MultipleObjectsReturned h = Concrete3.MultipleObjectsReturned i: type[Concrete3.MultipleObjectsReturned] i = Concrete1.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete1.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete3.MultipleObjectsReturned]") [assignment] i = Concrete2.MultipleObjectsReturned # E: Incompatible types in assignment (expression has type "type[myapp.models.Concrete2.MultipleObjectsReturned]", variable has type "type[myapp.models.Concrete3.MultipleObjectsReturned]") [assignment] i = Concrete3.MultipleObjectsReturned installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Abstract1(models.Model): class Meta: abstract = True class Abstract2(Abstract1): class Meta: abstract = True class Concrete1(Abstract2): ... class Concrete2(Concrete1): ... class Concrete3(Concrete2): ... - case: test_custom_model_base_metaclass main: | from typing_extensions import reveal_type from myapp.models import This, Other this = This(field=Other()) reveal_type(this.field) # N: Revealed type is "myapp.models.Other" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django.db.models.base import ModelBase class MyBase(ModelBase): ... class MyModel(models.Model, metaclass=MyBase): ... class Other(MyModel): ... class This(MyModel): field = models.ForeignKey(Other, on_delete=models.CASCADE) typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_primary_key.yml000066400000000000000000000054161526064357400275740ustar00rootroot00000000000000- case: test_access_to_id_field_through_self_if_no_primary_key_defined main: | from typing_extensions import reveal_type from myapp.models import MyModel x = MyModel.objects.get(id=1) reveal_type(x.id) # N: Revealed type is "int" reveal_type(x.pk) # N: Revealed type is "int" MyModel.objects.get(pk=1) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import override, reveal_type from django.db import models class MyModel(models.Model): @override def __str__(self) -> str: reveal_type(self.id) # N: Revealed type is "int" reveal_type(self.pk) # N: Revealed type is "int" return '' - case: test_access_to_id_field_through_self_if_primary_key_is_defined main: | from typing_extensions import reveal_type from myapp.models import MyModel x = MyModel.objects.get(id='a') reveal_type(x.id) # N: Revealed type is "str" reveal_type(x.pk) # N: Revealed type is "str" MyModel.objects.get(pk='a') installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import override, reveal_type from django.db import models class MyModel(models.Model): id = models.CharField(max_length=10, primary_key=True) @override def __str__(self) -> str: reveal_type(self.id) # N: Revealed type is "str" reveal_type(self.pk) # N: Revealed type is "str" return self.id - case: test_access_to_id_field_through_self_if_primary_key_has_different_name main: | from typing_extensions import reveal_type from myapp.models import MyModel x = MyModel.objects.get(primary='a') reveal_type(x.primary) # N: Revealed type is "str" reveal_type(x.pk) # N: Revealed type is "str" x.id # E: "MyModel" has no attribute "id" [attr-defined] MyModel.objects.get(pk='a') MyModel.objects.get(id='a') # E: Cannot resolve keyword 'id' into field. Choices are: primary [misc] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing_extensions import override, reveal_type from django.db import models class MyModel(models.Model): primary = models.CharField(max_length=10, primary_key=True) @override def __str__(self) -> str: reveal_type(self.primary) # N: Revealed type is "str" reveal_type(self.pk) # N: Revealed type is "str" self.id # E: "MyModel" has no attribute "id" [attr-defined] return self.primary typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_proxy_models.yml000066400000000000000000000017621526064357400277650ustar00rootroot00000000000000- case: foreign_key_to_proxy_model_accepts_first_non_proxy_model main: | from typing_extensions import reveal_type from myapp.models import Blog, Publisher, PublisherProxy Blog(publisher=Publisher()) Blog.objects.create(publisher=Publisher()) Blog().publisher = Publisher() reveal_type(Blog().publisher) # N: Revealed type is "myapp.models.PublisherProxy" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models from django_stubs_ext.db.models import TypedModelMeta class Publisher(models.Model): pass class PublisherProxy(Publisher): class Meta(TypedModelMeta): proxy = True class Blog(models.Model): publisher = models.ForeignKey(to=PublisherProxy, on_delete=models.CASCADE) typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_related_fields.yml000066400000000000000000000160551526064357400302100ustar00rootroot00000000000000- case: test_related_name_custom_manager main: | from typing_extensions import reveal_type from app1.models import Model1 from app2.models import Model2 reveal_type(Model1().test) # N: Revealed type is "app3.models.Model3_RelatedManager" reveal_type(Model2().test) # N: Revealed type is "app3.models.Model3_RelatedManager" reveal_type(Model1().test2) # N: Revealed type is "app3.models.Model4_RelatedManager" reveal_type(Model2().test2) # N: Revealed type is "app3.models.Model4_RelatedManager" installed_apps: - base - users - app1 - app2 - app3 files: - path: base/__init__.py - path: base/models.py content: | from django.db import models class OwnedModel(models.Model): owner = models.ForeignKey("users.User", on_delete=models.CASCADE) class Meta: abstract = True - path: users/__init__.py - path: users/models.py content: | from django.db import models class User(models.Model): pass - path: app1/__init__.py - path: app1/models.py content: | from django.db import models from base.models import OwnedModel from typing import TYPE_CHECKING if TYPE_CHECKING: from app3.models import Model3 class CustomQuerySet(models.QuerySet): pass Model1Manager = models.Manager.from_queryset(CustomQuerySet) class Model1(OwnedModel): objects = Model1Manager() - path: app2/__init__.py - path: app2/models.py content: | from django.db import models from base.models import OwnedModel from typing import TYPE_CHECKING if TYPE_CHECKING: from app3.models import Model3 class CustomQuerySet(models.QuerySet): pass Model2Manager = models.Manager.from_queryset(CustomQuerySet) class Model2(OwnedModel): objects = Model2Manager() - path: app3/__init__.py - path: app3/models.py content: | from django.db import models from app1.models import Model1 from app2.models import Model2 from base.models import OwnedModel class CustomQuerySet(models.QuerySet): pass Model3Manager = models.Manager.from_queryset(CustomQuerySet) class Model3(OwnedModel): a = models.ForeignKey(Model1, related_name="test", on_delete=models.CASCADE) b = models.ForeignKey(Model2, related_name="test", on_delete=models.CASCADE) objects = Model3Manager() Model4Manager = models.Manager.from_queryset(CustomQuerySet) class Model4(OwnedModel): a = models.ForeignKey(Model1, related_name="test2", on_delete=models.CASCADE) b = models.ForeignKey(Model2, related_name="test2", on_delete=models.CASCADE) objects = Model4Manager() - case: test_related_name_foreign_object_multi_column main: | from typing_extensions import reveal_type from app1.models import Model1, Model2 reveal_type(Model2.model_1.field) # N: Revealed type is "django.db.models.fields.related.ForeignObject[app1.models.Model1, app1.models.Model1]" reveal_type(Model2().model_1) # N: Revealed type is "app1.models.Model1" reveal_type(Model1.model_2s) # N: Revealed type is "django.db.models.fields.related_descriptors.ReverseManyToOneDescriptor[app1.models.Model2]" reveal_type(Model1().model_2s) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[app1.models.Model2]" installed_apps: - app1 files: - path: app1/__init__.py - path: app1/models.py content: | from django.db import models from django.db.models.fields.related import ForeignObject class Model1(models.Model): type = models.TextField() ref = models.TextField() class Model2(models.Model): name = models.TextField() model_1_type = models.TextField() model_2_ref = models.TextField() model_1 = ForeignObject( Model1, to_fields=["type", "ref"], from_fields=["model_1_type", "model_2_ref"], on_delete=models.CASCADE, related_name="model_2s", ) - case: test_processes_other_relations_when_one_field_is_broken main: | from typing_extensions import reveal_type from myapp.models import MyModel reveal_type(MyModel().others) # N: Revealed type is "django.db.models.fields.related_descriptors.RelatedManager[myapp.models.Other]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): # Plugin doesn't handle lazy reference without app label broken = models.ManyToManyField("MyModel", related_name="mymodels") # type: ignore[var-annotated] class Other(models.Model): field = models.ForeignKey(MyModel, related_name="others", on_delete=models.CASCADE) - case: test_related_fields_with_two_generic_parameters main: | from typing_extensions import reveal_type from myapp.models import Address, School, Student reveal_type(Student().school) # N: Revealed type is "myapp.models.School" reveal_type(Student().address) # N: Revealed type is "myapp.models.Address" s = Student() s.school = School() s.address = Address() installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class School(models.Model): pass class Address(models.Model): pass class Student(models.Model): school = models.ForeignKey["School","School"](to="School", on_delete=models.CASCADE) address = models.OneToOneField["Address","Address"](to="Address", on_delete=models.CASCADE) - case: test_related_fields_with_one_generic_parameter main: | from typing_extensions import reveal_type from myapp.models import Address, School, Student reveal_type(Student().school) # N: Revealed type is "myapp.models.School" reveal_type(Student().address) # N: Revealed type is "myapp.models.Address" s = Student() s.school = School() s.address = Address() installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class School(models.Model): pass class Address(models.Model): pass class Student(models.Model): school = models.ForeignKey["School"](to="School", on_delete=models.CASCADE) address = models.OneToOneField["Address"](to="Address", on_delete=models.CASCADE) typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_save.yml000066400000000000000000000117211526064357400261730ustar00rootroot00000000000000- case: save_update_fields_valid installed_apps: - myapp main: | from myapp.models import Article article = Article() # Concrete fields accepted as list, tuple and set literals article.save(update_fields=["title"]) article.save(update_fields=("title", "content")) article.save(update_fields={"title", "content", "published"}) # Foreign keys accepted both by field name and by attname article.save(update_fields=["author", "author_id"]) # Empty collection, None and an absent argument are all valid no-ops article.save(update_fields=[]) article.save(update_fields=None) article.save() # Non-literal collections cannot be checked statically (bad name not flagged) fields = ["nonexistent"] article.save(update_fields=fields) # asave is checked the same way async def test_async_save() -> None: await Article().asave(update_fields=["title", "author_id"]) files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Category(models.Model): name = models.CharField(max_length=100) class Author(models.Model): name = models.CharField(max_length=100) class Tag(models.Model): name = models.CharField(max_length=50) class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() published = models.BooleanField(default=False) author = models.ForeignKey(Author, on_delete=models.CASCADE) category = models.ForeignKey(Category, on_delete=models.CASCADE) tags = models.ManyToManyField(Tag) - case: save_update_fields_invalid installed_apps: - myapp main: | from myapp.models import Article, Author from typing import Literal article = Article() # Unknown field name article.save(update_fields=["nonexistent"]) # E: Article has no field named 'nonexistent' [misc] # Primary key is not an updatable field article.save(update_fields=["id"]) # E: "save()" does not support primary key fields. Got "id" [misc] # ManyToMany is not a concrete field article.save(update_fields={"tags"}) # E: "save()" can only be used with concrete fields. Got "tags" [misc] # Related lookups are not field names article.save(update_fields=["author__name"]) # E: Article has no field named 'author__name' [misc] # Every invalid field in a collection is reported article.save(update_fields=["nonexistent1", "nonexistent2"]) # E: Article has no field named 'nonexistent1' [misc] # E: Article has no field named 'nonexistent2' [misc] # Literal-typed values are resolved and checked pk_field: Literal["id"] = "id" article.save(update_fields=[pk_field]) # E: "save()" does not support primary key fields. Got "id" [misc] # Non-field attributes are not model fields article.save(update_fields=["get_display_title"]) # E: Article has no field named 'get_display_title' [misc] article.save(update_fields=["is_recent"]) # E: Article has no field named 'is_recent' [misc] article.save(update_fields=["CATEGORY"]) # E: Article has no field named 'CATEGORY' [misc] article.save(update_fields=["extra_objects"]) # E: Article has no field named 'extra_objects' [misc] # The model is resolved from the instance, so the message names the right model Author().save(update_fields=["invalid"]) # E: Author has no field named 'invalid' [misc] # asave is checked too, reporting its own name async def test_async_save_invalid() -> None: await Article().asave(update_fields=["id"]) # E: "asave()" does not support primary key fields. Got "id" [misc] files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import ClassVar from django.db import models class Author(models.Model): name = models.CharField(max_length=100) class Tag(models.Model): name = models.CharField(max_length=50) class Article(models.Model): title = models.CharField(max_length=200) author = models.ForeignKey(Author, on_delete=models.CASCADE) tags = models.ManyToManyField(Tag) CATEGORY: ClassVar[str] = "news" extra_objects = models.Manager() def get_display_title(self) -> str: return self.title @property def is_recent(self) -> bool: return True typeddjango-django-stubs-fa03b48/tests/typecheck/models/test_state.yml000066400000000000000000000010171526064357400263520ustar00rootroot00000000000000- case: state_attribute_has_a_type_of_model_state main: | from typing_extensions import reveal_type from myapp.models import MyUser user = MyUser(pk=1) reveal_type(user._state) # N: Revealed type is "django.db.models.base.ModelState" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): pass typeddjango-django-stubs-fa03b48/tests/typecheck/test_annotated.yml000066400000000000000000000020701526064357400257240ustar00rootroot00000000000000# Regression test for #893 - case: annotated_should_not_interfere main: | from dataclasses import dataclass from typing_extensions import Annotated, TypedDict, reveal_type from myapp.models import Blog class IntegerType: def __init__(self, min_value: int, max_value: int) -> None: pass @dataclass(unsafe_hash=True) class RatingComposite: max_value: Annotated[int, IntegerType(min_value=1, max_value=10)] = 5 class Obj(TypedDict): foo: int class X: x: Annotated[Blog, Obj] reveal_type(X().x) # N: Revealed type is "myapp.models.Blog" reveal_type(X().x.foo) # E: "Blog" has no attribute "foo" [attr-defined] # N: Revealed type is "Any" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Blog(models.Model): text = models.CharField(max_length=100) typeddjango-django-stubs-fa03b48/tests/typecheck/test_config.yml000066400000000000000000000050231526064357400252150ustar00rootroot00000000000000- case: pyproject_toml_config main: | from typing_extensions import reveal_type from myapp.models import MyModel mymodel = MyModel(user_id=1) reveal_type(mymodel.id) # N: Revealed type is "int" reveal_type(mymodel.user) # N: Revealed type is "django.contrib.auth.models.User" reveal_type(MyModel.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyModel]" mypy_config: | [mypy.plugins.django-stubs] django_settings_module = mysettings custom_settings: | SECRET_KEY = '1' INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth', 'myapp') files: - path: myapp/__init__.py - path: myapp/models.py content: | from typing import TYPE_CHECKING from typing_extensions import reveal_type from django.db import models class MyModel(models.Model): user = models.ForeignKey('auth.User', on_delete=models.CASCADE) if TYPE_CHECKING: reveal_type(MyModel().user) # N: Revealed type is "django.contrib.auth.models.User" - case: generate_pyproject_toml_and_settings_file_from_installed_apps_key main: | from typing_extensions import reveal_type from myapp.models import MyModel mymodel = MyModel(user_id=1) reveal_type(mymodel.id) # N: Revealed type is "int" installed_apps: - django.contrib.auth - django.contrib.contenttypes - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): user = models.ForeignKey('auth.User', on_delete=models.CASCADE) - case: add_mypy_path_to_package_search main: | import extra_module mypy_config: | [mypy] mypy_path = ./extras [mypy.plugins.django-stubs] django_settings_module = mysettings files: - path: extras/extra_module.py content: | def extra_fn() -> None: pass - case: add_mypypath_env_var_to_package_search main: | import extra_module mypy_config: | [mypy.plugins.django-stubs] django_settings_module = mysettings files: - path: extras/extra_module.py content: | def extra_fn() -> None: pass env: - MYPYPATH=./extras typeddjango-django-stubs-fa03b48/tests/typecheck/test_forms.yml000066400000000000000000000157471526064357400251140ustar00rootroot00000000000000- case: no_incompatible_meta_nested_class_false_positive main: | from django import forms from myapp.models import Article, Category class ArticleForm(forms.ModelForm): class Meta: model = Article fields = '__all__' class CategoryForm(forms.ModelForm): class Meta: model = Category fields = '__all__' class CompositeForm(ArticleForm, CategoryForm): pass installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Article(models.Model): pass class Category(models.Model): pass - case: no_incompatible_meta_nested_class_false_positive_through_indirect_bases main: | from myapp.forms import ArticleFormBase, CategoryFormBase class ArticleForm(ArticleFormBase): class Meta: fields = '__all__' class CategoryForm(CategoryFormBase): class Meta: exclude = ('id',) class CompositeForm(ArticleForm, CategoryForm): pass files: - path: myapp/__init__.py - path: myapp/forms.py content: | from django import forms class FormBase(forms.ModelForm): pass class ArticleFormBase(FormBase): pass class CategoryFormBase(FormBase): pass - case: formview_methods_on_forms_return_proper_types main: | from typing import Any from typing_extensions import reveal_type from django import forms from django.http import HttpRequest, HttpResponse from django.views.generic.edit import FormView from typing_extensions import override class MyForm(forms.ModelForm): pass class MyForm2(forms.ModelForm): pass # FormView generic param provided class MyView(FormView[MyForm]): form_class = MyForm @override def post(self, request: HttpRequest, *args: Any, **kwds: Any) -> HttpResponse: form_class = self.get_form_class() reveal_type(form_class) # N: Revealed type is "type[main.MyForm]" reveal_type(self.get_form(None)) # N: Revealed type is "main.MyForm" reveal_type(self.get_form()) # N: Revealed type is "main.MyForm" reveal_type(self.get_form(form_class)) # N: Revealed type is "main.MyForm" reveal_type(self.get_form(MyForm2)) # N: Revealed type is "main.MyForm" # E: Argument 1 to "get_form" of "FormMixin" has incompatible type "type[MyForm2]"; expected "type[MyForm] | None" [arg-type] return HttpResponse() # FormView generic param omitted -- fallback to TypeVar default class MyView2(FormView): form_class = MyForm @override def post(self, request: HttpRequest, *args: Any, **kwds: Any) -> HttpResponse: form_class = self.get_form_class() reveal_type(form_class) # N: Revealed type is "type[Any]" reveal_type(self.get_form(None)) # N: Revealed type is "Any" reveal_type(self.get_form()) # N: Revealed type is "Any" reveal_type(self.get_form(form_class)) # N: Revealed type is "Any" reveal_type(self.get_form(MyForm2)) # N: Revealed type is "Any" return HttpResponse() - case: formview_form_valid_proper_type main: | from django.http import HttpRequest, HttpResponse from django.forms import models from django.views.generic.edit import FormView from typing_extensions import override class RegistrationForm(models.ModelForm): ... class RegistrationViewNoGeneric(FormView): form_class = RegistrationForm template_name = 'web_app/registration.html' @override def form_valid(self, form: RegistrationForm) -> HttpResponse: form.save() return super().form_valid(form) class RegistrationViewWithGeneric(FormView[RegistrationForm]): form_class = RegistrationForm template_name = 'web_app/registration.html' @override def form_valid(self, form: RegistrationForm) -> HttpResponse: form.save() return super().form_valid(form) - case: updateview_form_valid_has_form_save main: | from typing_extensions import reveal_type from django import forms from django.http import HttpResponse from django.views.generic.edit import UpdateView from typing_extensions import override class MyForm(forms.ModelForm): pass class MyView(UpdateView): form_class = MyForm @override def form_valid(self, form: forms.BaseModelForm) -> HttpResponse: reveal_type(form.save) # N: Revealed type is "def (commit: bool =) -> Any" return HttpResponse() - case: generic_modelchoicefield_label_from_instance main: | from django import forms from myapp.models import Article, Category from typing_extensions import override class ArticleChoiceField(forms.ModelChoiceField[Article]): @override def label_from_instance(self, obj: Article) -> str: return obj.name class BrokenArticleChoiceField(forms.ModelChoiceField[Article]): @override def label_from_instance(self, obj: Article) -> str: obj.title # E: "Article" has no attribute "title" [attr-defined] return 'a' class ArticleMultipleChoiceField(forms.ModelMultipleChoiceField[Article]): @override def label_from_instance(self, obj: Article) -> str: return obj.name class ChooseArticleForm(forms.Form): articles = ArticleMultipleChoiceField( queryset=Article.objects.none(), ) best_article = ArticleChoiceField( queryset=Article.objects.none(), ) best_category = ArticleChoiceField( queryset=Category.objects.none(), # E: Argument "queryset" to "ArticleChoiceField" has incompatible type "QuerySet[Category, Category]"; expected "Manager[Article] | QuerySet[Article, Article] | None" [arg-type] ) installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Category(models.Model): title = models.CharField(max_length=128) class Article(models.Model): name = models.CharField(max_length=128) typeddjango-django-stubs-fa03b48/tests/typecheck/test_formsets.yml000066400000000000000000000017171526064357400256200ustar00rootroot00000000000000- case: inlineformset_factory main: | from typing import Any from typing_extensions import reveal_type from django import forms from myapp.models import Article, Category ArticleFS: type[forms.BaseInlineFormSet[Article, Category, Any]] = forms.inlineformset_factory(Category, Article) ArticleFS(instance=Article()) # E: Argument "instance" to "BaseInlineFormSet" has incompatible type "Article"; expected "Category | None" [arg-type] fs = ArticleFS(instance=Category()) reveal_type(fs.instance) # N: Revealed type is "myapp.models.Category" reveal_type(fs.get_queryset()) # N: Revealed type is "django.db.models.query.QuerySet[myapp.models.Article, myapp.models.Article]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Article(models.Model): pass class Category(models.Model): pass typeddjango-django-stubs-fa03b48/tests/typecheck/test_request.yml000066400000000000000000000113341526064357400254420ustar00rootroot00000000000000- case: request_object_has_user_of_type_auth_user_model main: | from typing_extensions import reveal_type from django.http.request import HttpRequest reveal_type(HttpRequest().user) # N: Revealed type is "myapp.models.MyUser | django.contrib.auth.models.AnonymousUser" # check that other fields work ok reveal_type(HttpRequest().method) # N: Revealed type is "str | None" custom_settings: | INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth', 'myapp') AUTH_USER_MODEL='myapp.MyUser' files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): pass - case: request_object_user_can_be_discriminated main: | from typing_extensions import reveal_type from django.http.request import HttpRequest request = HttpRequest() reveal_type(request.user) # N: Revealed type is "django.contrib.auth.models.User | django.contrib.auth.models.AnonymousUser" if not request.user.is_anonymous: reveal_type(request.user) # N: Revealed type is "django.contrib.auth.models.User" if request.user.is_authenticated: reveal_type(request.user) # N: Revealed type is "django.contrib.auth.models.User" reveal_type(request.user.groups.all().get()) # N: Revealed type is "django.contrib.auth.models.Group" custom_settings: | INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth') - case: request_object_user_without_auth_and_contenttypes_apps main: | from typing_extensions import reveal_type from django.http.request import HttpRequest request = HttpRequest() reveal_type(request.user) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser | django.contrib.auth.models.AnonymousUser" if request.user.is_authenticated: reveal_type(request.user) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser" - case: request_object_user_without_auth_but_with_contenttypes_apps main: | from typing_extensions import reveal_type from django.http.request import HttpRequest request = HttpRequest() reveal_type(request.user) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser | django.contrib.auth.models.AnonymousUser" if request.user.is_authenticated: reveal_type(request.user) # N: Revealed type is "django.contrib.auth.base_user.AbstractBaseUser" custom_settings: | INSTALLED_APPS = ('django.contrib.contenttypes',) - case: subclass_request_not_changed_user_type main: | from typing_extensions import reveal_type from django.http.request import HttpRequest class MyRequest(HttpRequest): foo: int # Just do something request = MyRequest() reveal_type(request.user) # N: Revealed type is "django.contrib.auth.models.User | django.contrib.auth.models.AnonymousUser" custom_settings: | INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth') - case: subclass_request_changed_user_type main: | from typing_extensions import reveal_type from django.http.request import HttpRequest from django.contrib.auth.models import User class MyRequest(HttpRequest): user: User # Override the type of user request = MyRequest() reveal_type(request) # N: Revealed type is "main.MyRequest" reveal_type(request.user) # N: Revealed type is "django.contrib.auth.models.User" custom_settings: | INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth') - case: request_get_post main: | from typing_extensions import reveal_type from django.http.request import HttpRequest request = HttpRequest() reveal_type(request) # N: Revealed type is "django.http.request.HttpRequest" reveal_type(request.GET) # N: Revealed type is "django.http.request._ImmutableQueryDict" request.GET['foo'] = 'bar' # E: This QueryDict is immutable. [misc] - case: request_get_post_func_ret main: | from typing_extensions import reveal_type from django.http.request import HttpRequest def mk_request() -> HttpRequest: return HttpRequest() req = mk_request() reveal_type(req) # N: Revealed type is "django.http.request.HttpRequest" reveal_type(req.GET) # N: Revealed type is "django.http.request._ImmutableQueryDict" req.GET.setdefault('foo', 'bar') # E: This QueryDict is immutable. [misc] x = 1 # E: Statement is unreachable [unreachable] typeddjango-django-stubs-fa03b48/tests/typecheck/test_settings.yml000066400000000000000000000101031526064357400256030ustar00rootroot00000000000000- case: settings_loaded_from_different_files disable_cache: true main: | from typing_extensions import reveal_type from django.conf import settings # standard settings reveal_type(settings.AUTH_USER_MODEL) # N: Revealed type is "str" reveal_type(settings.ROOT_DIR) # N: Revealed type is "str" reveal_type(settings.APPS_DIR) # N: Revealed type is "pathlib.Path" reveal_type(settings.NUMBERS) # N: Revealed type is "list[str]" reveal_type(settings.DICT) # N: Revealed type is "dict[Any, Any]" custom_settings: | from base import * SECRET_KEY = 112233 NUMBERS = ['one', 'two'] DICT = {} # type: ignore[var-annotated] files: - path: base.py content: | from pathlib import Path ROOT_DIR = '/etc' APPS_DIR = Path(ROOT_DIR) - case: global_settings_are_always_loaded main: | from typing_extensions import reveal_type from django.conf import settings reveal_type(settings.AUTH_USER_MODEL) # N: Revealed type is "str" reveal_type(settings.AUTHENTICATION_BACKENDS) # N: Revealed type is "typing.Sequence[str]" installed_apps: [] - case: fail_if_there_is_no_setting main: | from django.conf import settings settings.NOT_EXISTING # E: 'Settings' object has no attribute 'NOT_EXISTING' [misc] - case: override_default_setting_with_different_type_in_the_different_module custom_settings: | from settings.basic_settings import * main: | from typing_extensions import reveal_type from django.conf import settings reveal_type(settings.MEDIA_ROOT) # N: Revealed type is "pathlib.Path" reveal_type(settings.MEDIA_ROOT / 'part') # N: Revealed type is "pathlib.Path" files: - path: settings/__init__.py - path: settings/basic_settings.py content: | from pathlib import Path MEDIA_ROOT = Path() - case: settings_hasattr main: | from typing_extensions import reveal_type from django.conf import settings if hasattr(settings, 'AUTH_USER_MODEL') and settings.AUTH_USER_MODEL: reveal_type(settings.AUTH_USER_MODEL) if hasattr(settings, 'NON_EXISTENT_SETTING') and settings.NON_EXISTENT_SETTING: reveal_type(settings.NON_EXISTENT_SETTING) out: | main:4: note: Revealed type is "str" main:5: error: 'Settings' object has no attribute 'NON_EXISTENT_SETTING' [misc] main:6: error: 'Settings' object has no attribute 'NON_EXISTENT_SETTING' [misc] main:6: note: Revealed type is "Any" - case: settings_loaded_from_runtime_magic disable_cache: true main: | from typing_extensions import reveal_type from django.conf import settings # Global: reveal_type(settings.SECRET_KEY) # N: Revealed type is "str" # Custom: reveal_type(settings.A) # N: Revealed type is "Any" reveal_type(settings.B) # E: 'Settings' object has no attribute 'B' [misc] # N: Revealed type is "Any" custom_settings: | # Some code that mypy cannot analyze, but values exist in runtime: exec('A = 1') mypy_config: | [mypy.plugins.django-stubs] django_settings_module = mysettings strict_settings = false - case: settings_loaded_from_runtime_magic_strict_default disable_cache: true main: | from typing_extensions import reveal_type from django.conf import settings # Global: reveal_type(settings.SECRET_KEY) # N: Revealed type is "str" # Custom: reveal_type(settings.A) # E: 'Settings' object has no attribute 'A' [misc] # N: Revealed type is "Any" reveal_type(settings.B) # E: 'Settings' object has no attribute 'B' [misc] # N: Revealed type is "Any" custom_settings: | # Some code that mypy cannot analyze, but values exist in runtime: exec('A = 1') mypy_config: | [mypy.plugins.django-stubs] django_settings_module = mysettings typeddjango-django-stubs-fa03b48/tests/typecheck/test_shortcuts.yml000066400000000000000000000034211526064357400260060ustar00rootroot00000000000000- case: get_object_or_404_returns_proper_types main: | from typing_extensions import reveal_type from django.shortcuts import get_object_or_404, get_list_or_404 from myapp.models import MyModel reveal_type(get_object_or_404(MyModel)) # N: Revealed type is "myapp.models.MyModel" reveal_type(get_object_or_404(MyModel.objects)) # N: Revealed type is "myapp.models.MyModel" reveal_type(get_object_or_404(MyModel.objects.get_queryset())) # N: Revealed type is "myapp.models.MyModel" reveal_type(get_list_or_404(MyModel)) # N: Revealed type is "list[myapp.models.MyModel]" reveal_type(get_list_or_404(MyModel.objects)) # N: Revealed type is "list[myapp.models.MyModel]" reveal_type(get_list_or_404(MyModel.objects.get_queryset())) # N: Revealed type is "list[myapp.models.MyModel]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): pass - case: get_user_model_returns_proper_class main: | from typing_extensions import reveal_type from django.contrib.auth import get_user_model UserModel = get_user_model() reveal_type(UserModel.objects) # N: Revealed type is "django.db.models.manager.Manager[myapp.models.MyUser]" custom_settings: | INSTALLED_APPS = ('django.contrib.contenttypes', 'django.contrib.auth', 'myapp') AUTH_USER_MODEL = 'myapp.MyUser' files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyUser(models.Model): pass typeddjango-django-stubs-fa03b48/tests/typecheck/views/000077500000000000000000000000001526064357400233235ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/views/generic/000077500000000000000000000000001526064357400247375ustar00rootroot00000000000000typeddjango-django-stubs-fa03b48/tests/typecheck/views/generic/test_detail.yml000066400000000000000000000045551526064357400277740ustar00rootroot00000000000000- case: generic_detail_view main: | from django.views.generic import DetailView from django.db.models import QuerySet from typing_extensions import override from myapp.models import MyModel class MyDetailView(DetailView[MyModel]): model = MyModel queryset = MyModel.objects.all() @override def get_queryset(self) -> QuerySet[MyModel]: self.get_object(super().get_queryset()) return super().get_queryset() custom_settings: | INSTALLED_APPS = ('myapp',) files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): ... - case: generic_detail_view_wrong main: | from django.views.generic import DetailView from django.db.models import QuerySet from typing_extensions import override from myapp.models import MyModel, Other class MyDetailView(DetailView[Other]): model = MyModel queryset = MyModel.objects.all() @override def get_queryset(self) -> QuerySet[MyModel]: self.get_object(super().get_queryset()) return super().get_queryset() installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): ... class Other(models.Model): ... out: | main:8: error: Incompatible types in assignment (expression has type "type[MyModel]", base class "SingleObjectMixin" defined the type as "type[Other]") [assignment] main:9: error: Incompatible types in assignment (expression has type "QuerySet[MyModel, MyModel]", base class "SingleObjectMixin" defined the type as "QuerySet[Other, Other] | None") [assignment] main:12: error: Return type "QuerySet[MyModel, MyModel]" of "get_queryset" incompatible with return type "QuerySet[Other, Other]" in supertype "django.views.generic.detail.SingleObjectMixin" [override] main:14: error: Incompatible return value type (got "QuerySet[Other, Other]", expected "QuerySet[MyModel, MyModel]") [return-value] typeddjango-django-stubs-fa03b48/tests/typecheck/views/generic/test_edit.yml000066400000000000000000000076431526064357400274600ustar00rootroot00000000000000- case: login_form_form_valid_typechecks main: | from django.contrib.auth.views import LoginView from django.contrib.auth import login as auth_login from django.http import HttpResponseRedirect from django.contrib.auth.forms import AuthenticationForm from typing_extensions import override class MyLoginView(LoginView): @override def form_valid(self, form: AuthenticationForm) -> HttpResponseRedirect: """Ensure that form can have type AuthenticationForm.""" form.get_user() return HttpResponseRedirect(self.get_success_url()) - case: dispatch_http_response main: | from typing import Any from django.http import HttpRequest, HttpResponse from django.views.generic.base import View from typing_extensions import override class MyView(View): @override def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: response: HttpResponse return response - case: dispatch_streaming_http_response main: | from typing import Any from django.http import HttpRequest, StreamingHttpResponse from django.views.generic.base import View from typing_extensions import override class MyView(View): @override def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> StreamingHttpResponse: response: StreamingHttpResponse return response - case: generic_form_views main: | from typing_extensions import reveal_type from django.views.generic.edit import CreateView, UpdateView from django import forms from myapp.models import Article class ArticleModelForm(forms.ModelForm[Article]): class Meta: model = Article class MyCreateView(CreateView[Article, ArticleModelForm]): def some(self) -> None: reveal_type(self.get_form_class()) # N: Revealed type is "type[main.ArticleModelForm]" class MyUpdateView(UpdateView[Article, ArticleModelForm]): def some(self) -> None: reveal_type(self.get_form_class()) # N: Revealed type is "type[main.ArticleModelForm]" installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Article(models.Model): pass - case: generic_form_views_different_form_classes main: | from typing_extensions import reveal_type from django.views.generic.edit import CreateView from django import forms from myapp.models import Article class ArticleModelForm(forms.ModelForm[Article]): class Meta: model = Article class SubArticleModelForm(ArticleModelForm): pass class AnotherArticleModelForm(forms.ModelForm[Article]): class Meta: model = Article class MyCreateView(CreateView[Article, ArticleModelForm]): def some(self) -> None: reveal_type(self.get_form()) # N: Revealed type is "main.ArticleModelForm" reveal_type(self.get_form(SubArticleModelForm)) # N: Revealed type is "main.ArticleModelForm" reveal_type(self.get_form(AnotherArticleModelForm)) # N: Revealed type is "main.ArticleModelForm" # E: Argument 1 to "get_form" of "FormMixin" has incompatible type "type[AnotherArticleModelForm]"; expected "type[ArticleModelForm] | None" [arg-type] installed_apps: - myapp files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class Article(models.Model): pass typeddjango-django-stubs-fa03b48/tests/typecheck/views/generic/test_list.yml000066400000000000000000000041741526064357400275020ustar00rootroot00000000000000- case: generic_list_view main: | from django.views.generic import ListView from django.db.models import QuerySet from typing_extensions import override from myapp.models import MyModel class MyListView(ListView[MyModel]): model = MyModel queryset = MyModel.objects.all() @override def get_queryset(self) -> QuerySet[MyModel]: raise NotImplementedError custom_settings: | INSTALLED_APPS = ('myapp',) files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): ... - case: generic_list_view_wrong main: | from django.views.generic import ListView from django.db.models import QuerySet from typing_extensions import override from myapp.models import MyModel, Other class MyListView(ListView[Other]): model = MyModel queryset = MyModel.objects.all() @override def get_queryset(self) -> QuerySet[MyModel]: raise NotImplementedError custom_settings: | INSTALLED_APPS = ('myapp',) files: - path: myapp/__init__.py - path: myapp/models.py content: | from django.db import models class MyModel(models.Model): ... class Other(models.Model): ... out: | main:8: error: Incompatible types in assignment (expression has type "type[MyModel]", base class "MultipleObjectMixin" defined the type as "type[Other] | None") [assignment] main:9: error: Incompatible types in assignment (expression has type "QuerySet[MyModel, MyModel]", base class "MultipleObjectMixin" defined the type as "QuerySet[Other, Other] | None") [assignment] main:12: error: Return type "QuerySet[MyModel, MyModel]" of "get_queryset" incompatible with return type "QuerySet[Other, Other]" in supertype "django.views.generic.list.MultipleObjectMixin" [override] typeddjango-django-stubs-fa03b48/tests/typecheck/views/generic/test_template.yml000066400000000000000000000010401526064357400303270ustar00rootroot00000000000000- case: generic_template_view_mutable_extra_context main: | from django.views.generic import TemplateView class MyTemplateView(TemplateView): template_name = "template.html" extra_context = {} - case: generic_template_view_immutable_extra_context main: | from types import MappingProxyType from django.views.generic import TemplateView class MyTemplateView(TemplateView): template_name = "template.html" extra_context = MappingProxyType({}) typeddjango-django-stubs-fa03b48/uv.lock000066400000000000000000012502711526064357400203610ustar00rootroot00000000000000version = 1 revision = 3 requires-python = ">=3.11" resolution-markers = [ "python_full_version >= '3.15'", "python_full_version >= '3.12' and python_full_version < '3.15'", "python_full_version < '3.12'", ] [manifest] members = [ "django-stubs", "django-stubs-ext", ] [[package]] name = "asgiref" version = "3.12.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e6/26/3b59f2bdae5f640389becb1f673cded775287f5fc4f816309d9ca9a3f93d/asgiref-3.12.1.tar.gz", hash = "sha256:59dcb51c272ad209d59bed5708a64a333083e86017d7fcdd67498eeab7784340", size = 42378, upload-time = "2026-07-14T09:56:18.087Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c0/1b/54f4ad77cd8a584fa70746c47df988e002cf1ee1eba43364d46f87803647/asgiref-3.12.1-py3-none-any.whl", hash = "sha256:fe386d1c2bff7259ea95929266d12a8cf9a8b5a1c2598402967d8792e7a7c094", size = 25478, upload-time = "2026-07-14T09:56:16.926Z" }, ] [[package]] name = "ast-serialize" version = "0.12.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/c2/1c/7257e6ec9382843915ce475558ce4492ccb5ed39122c256bb369c27e2ebf/ast_serialize-0.12.1.tar.gz", hash = "sha256:5285a390caf1c44368ae270f037f797b91427d138b7d43cad0f1fda4c83518d9", size = 954408, upload-time = "2026-10-03T12:25:00.221Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/4a/f7/e976169da322c009bb083a52d21e88fbfe5f071e1806e8c8361ab4ac477a/ast_serialize-0.12.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:e73255c9227fd74eac8a9b55c4049e8ad7b66d1f690bf827c98a86b2e594def7", size = 897232, upload-time = "2026-10-03T12:23:21.945Z" }, { url = "https://files.pythonhosted.org/packages/e1/89/5545f6f4d38dd41b4e2a20050967ccd722508bc90fab0dfba463d8c8b994/ast_serialize-0.12.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:4655ef993e69e01bb47d2d99647de9bbb74af03938438656832cd010d95de348", size = 1235397, upload-time = "2026-10-03T12:23:23.835Z" }, { url = "https://files.pythonhosted.org/packages/22/19/e9b839ef9b57626e15e20dd7cf764a9a6b50f9750f86d0a49bc3a971fb72/ast_serialize-0.12.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bac5a99a2c91dd823be9b8c44645694fccbb0750773cc5b27889a9f6f22fce89", size = 1216331, upload-time = "2026-10-03T12:23:25.557Z" }, { url = "https://files.pythonhosted.org/packages/26/2a/d054d4ff8ba42472a22e3da6eb6dee0e69a32c477b5077eefdbada99f554/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6485e681625ed7a094221f16a7ff2ef154946112266a05cf83bde50c959ef345", size = 1281194, upload-time = "2026-10-03T12:23:27.349Z" }, { url = "https://files.pythonhosted.org/packages/7e/0c/c73eddfa180a7a4c1613c0f3d3ef020b05dca9b922ac08212463c33ad11f/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a513bc6f60980d01767f7cbe39b17ce0373e722824a74ce28d6cea49ee3c8460", size = 1287170, upload-time = "2026-10-03T12:23:29.333Z" }, { url = "https://files.pythonhosted.org/packages/94/77/39dc75d8b718844859b64a9067c9df0cfce218ca45ea215fb24a1fda3cf7/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:82866f3523d53ffca8d2a69a750bec52908b69f728012e40959bebce2620453c", size = 1531238, upload-time = "2026-10-03T12:23:30.954Z" }, { url = "https://files.pythonhosted.org/packages/b9/c0/6a6a6f94f45a288c4bac2eb8379a3d9654574a0f9249380ce3b07f6d64bb/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:243054a05a5190f5d087b5c8b16423e7f1cefa4991bac26e9c8ace18074b75b6", size = 1307154, upload-time = "2026-10-03T12:23:32.645Z" }, { url = "https://files.pythonhosted.org/packages/f9/3d/80f843892bd0f7c0d95ec5422ba3dc315c1ce011e6f08b06d5f71bd82c25/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9fbe5a3e8acddfc2fddff3dbbc7ea0e9798b3df3428f851b8abc52a3806f31", size = 1301506, upload-time = "2026-10-03T12:23:34.63Z" }, { url = "https://files.pythonhosted.org/packages/df/cc/49a5fe852706f545e3e005584c5be89456bc637a8c9179aeaa8b9f26e8e4/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:d3d516da3463071d27e64caf54d88cba25cf4ad4afcc807e0bcf67743719f03e", size = 1297616, upload-time = "2026-10-03T12:23:36.377Z" }, { url = "https://files.pythonhosted.org/packages/49/5c/1208c91d6e00cc43cc276bd6233c40c9b4ec3ef8537c83281dd5372cbdb8/ast_serialize-0.12.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d6711adf11136c77e3a35517de9488a5081d1012874fae99c2876b64f4daace", size = 1354884, upload-time = "2026-10-03T12:23:38.035Z" }, { url = "https://files.pythonhosted.org/packages/a9/80/2b5fc912ff0be64d8d61ff5dc7dc405c6311297a0e2039b848b7d14333f2/ast_serialize-0.12.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:cbe239bee4bd609186daf60b95b7b0f47146c7f7f55f6da83807d747d6fe753f", size = 1457911, upload-time = "2026-10-03T12:23:39.679Z" }, { url = "https://files.pythonhosted.org/packages/b2/f8/d720429bf8933efbd0cc2038c0a50b6267a585d503500845c44bc6c8ff66/ast_serialize-0.12.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:5bbf582286c9dc6b4c544ef645dc99e4b3aa09db28892bc60344141f6926641f", size = 1563023, upload-time = "2026-10-03T12:23:41.585Z" }, { url = "https://files.pythonhosted.org/packages/7e/0a/99e6cc92bdbae5db60f84a14a0fb1ae77b6087e451d77808d87558162c9a/ast_serialize-0.12.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:99e33c93efb5254a70c525b46038212371dfe5693d48eb2d0d5f17d936a263d7", size = 1556601, upload-time = "2026-10-03T12:23:43.361Z" }, { url = "https://files.pythonhosted.org/packages/7a/05/59de9e16a2e333da534f30776d0f5e426034b64c67c17843425e3cc827d1/ast_serialize-0.12.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:aa6c17a2b7f07e81fa8cfcc4aa7c832b3e57733853aebea113ab502f9b0963db", size = 1665039, upload-time = "2026-10-03T12:23:45.257Z" }, { url = "https://files.pythonhosted.org/packages/33/83/35ed67a127167b484b42a071df440f84b14c0d20ea8f69dbed5cc96bfd98/ast_serialize-0.12.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f896fa38e0af38821e1ab1425c5dee89e359623e165765bdeae7d0eb6909e76d", size = 1472263, upload-time = "2026-10-03T12:23:46.811Z" }, { url = "https://files.pythonhosted.org/packages/c4/b0/3ab8613bbb690297f1bb687d780a248c486df0f4131b6a82044fcb49e438/ast_serialize-0.12.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:af699e81fd7ce80b8b03945826d8ea23dd36d072f10d4613402da597ba4ee9c6", size = 1499242, upload-time = "2026-10-03T12:23:48.531Z" }, { url = "https://files.pythonhosted.org/packages/9d/a0/a28894d3b06f8775cea8989f371bd9f72ce562c32bc807770e7fb920ce17/ast_serialize-0.12.1-cp314-cp314t-win32.whl", hash = "sha256:10b59afc108eb285146acb23d1b5ec0fc58bb3c09cb2ab8876402df06c373c3b", size = 1119488, upload-time = "2026-10-03T12:23:50.419Z" }, { url = "https://files.pythonhosted.org/packages/c1/b2/0c44952f4ba4e14bb7f60a5858e2960dfefb9884e6ff007aaf64337dba5c/ast_serialize-0.12.1-cp314-cp314t-win_amd64.whl", hash = "sha256:72e871f6995a066c1b19104f8a6b5832b1163adb9a8267c2aa4711fbb0f4d1f3", size = 1157434, upload-time = "2026-10-03T12:23:52.383Z" }, { url = "https://files.pythonhosted.org/packages/1f/1e/cb594c63f46a01d53629af1c4f9e42cd02afcea1c2fe483e12f22743ebac/ast_serialize-0.12.1-cp314-cp314t-win_arm64.whl", hash = "sha256:3398e458047d21c9bc1b323fe5aab77c608dc9ddb65b2d44deebaff503a1f1eb", size = 1129094, upload-time = "2026-10-03T12:23:54.133Z" }, { url = "https://files.pythonhosted.org/packages/16/05/ca16884f9498386f3646bb18be59f0e31d44e992d252d7d6f5e4f8ae1ee2/ast_serialize-0.12.1-cp315-abi3.abi3t-macosx_10_12_x86_64.whl", hash = "sha256:410233de149ab8414cb27c6fc73e9d2baa35d6f971672d540d752060d980ffb4", size = 1235686, upload-time = "2026-10-03T12:23:55.863Z" }, { url = "https://files.pythonhosted.org/packages/29/f2/34e87ed30e292cf365523712c4bcfef1967d9c3c2749de21b1f93b1fe0f3/ast_serialize-0.12.1-cp315-abi3.abi3t-macosx_11_0_arm64.whl", hash = "sha256:b9a2310845302f1a6bd45ae8a67d5760211103a8d66410b854bfa440d107e093", size = 1215598, upload-time = "2026-10-03T12:23:57.48Z" }, { url = "https://files.pythonhosted.org/packages/f8/dc/c498f41c957b6ff31b97ed8ceccf3a84f85af7debca1125183cab95bb58b/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ff65f40f49d5e1a1a043ba366081d59a4e26a9f5c1b07eb1170e172115da7ca", size = 1281911, upload-time = "2026-10-03T12:23:58.954Z" }, { url = "https://files.pythonhosted.org/packages/dc/60/70ccefae9d88058c4c234bf0aed93f54aca36eb74087736e76e9515aee96/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:536d783c4d91331f094e0a892221e619be5ffbe6fb6640885f14d7f226ec90ca", size = 1287296, upload-time = "2026-10-03T12:24:00.429Z" }, { url = "https://files.pythonhosted.org/packages/08/e9/4fc697879c7128e29f9dab2ed19a9b586a56b621e5ea4aee2ae28c18e116/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c42d2d65f388d1960c5796231eb9bf5a988c46228633eb489605c4549ad16c52", size = 1532339, upload-time = "2026-10-03T12:24:02.053Z" }, { url = "https://files.pythonhosted.org/packages/8a/9e/9e2bd489731602a94dbd0c576ebe1cc487a2d0f6127be743f44711166f0d/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5628a12acc875fe7a167910f18d101dd101c2a7b1e6c2b6f7289ffaff25805c", size = 1308988, upload-time = "2026-10-03T12:24:03.61Z" }, { url = "https://files.pythonhosted.org/packages/3f/69/e9cae837bd766a66db6953ffb5fc7f04b1945e02b0a9e4c6a0b6acb08f17/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e855adfa5bb982b2e6fe09056b2d584f6dd4fce085d91a07d1155683751b6b5", size = 1303412, upload-time = "2026-10-03T12:24:05.62Z" }, { url = "https://files.pythonhosted.org/packages/b2/1e/5ef8c62d5031d93187ed0d8dade5d942de9920c3fbd678c7652362b9a7a2/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_31_riscv64.whl", hash = "sha256:fafe1471e8aca6c87b4913b7b54ff97197adf702fbe28692284b929dfa62ff96", size = 1298466, upload-time = "2026-10-03T12:24:07.242Z" }, { url = "https://files.pythonhosted.org/packages/c2/f3/25ded60844a1a437edc840e597b6f81daf91dc4a26035416e14298d3a091/ast_serialize-0.12.1-cp315-abi3.abi3t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a5cac246474d2a703147d1605a6ac5ba0fa9e0a443cf1cf42513adf4df02686f", size = 1355617, upload-time = "2026-10-03T12:24:09.125Z" }, { url = "https://files.pythonhosted.org/packages/05/68/a0d3cc8d8042208a2cbef7b26483f4941b44dd5dd717bb19f20e4a4c0d66/ast_serialize-0.12.1-cp315-abi3.abi3t-musllinux_1_2_aarch64.whl", hash = "sha256:6e25cd319fb0d7b39fcac666784ec86708ccbc78d07a698b1400cf5ed40c045b", size = 1458949, upload-time = "2026-10-03T12:24:10.772Z" }, { url = "https://files.pythonhosted.org/packages/df/a0/5e4d355c48a9f125b8bec7b1b98d4d2dcd8324ff1d4dfcb03678a03c1414/ast_serialize-0.12.1-cp315-abi3.abi3t-musllinux_1_2_armv7l.whl", hash = "sha256:657a7354ea16ed4d29f8127ed477c6fee3915c111d135f020ca835a991438e90", size = 1562328, upload-time = "2026-10-03T12:24:12.404Z" }, { url = "https://files.pythonhosted.org/packages/8a/5f/3d40f6a7908200f2f0ed9ce1bad130d00e06d0405baa7918d4a4299b25dd/ast_serialize-0.12.1-cp315-abi3.abi3t-musllinux_1_2_i686.whl", hash = "sha256:9eb9de7e59621acdb3e66984f374272b33d56d15a04763e2fd0604211e1c8303", size = 1557751, upload-time = "2026-10-03T12:24:14.455Z" }, { url = "https://files.pythonhosted.org/packages/3f/13/d53e5a7e299d6dbaeab23a424eea2c98c821b46ed7b05abbe14743beeb63/ast_serialize-0.12.1-cp315-abi3.abi3t-musllinux_1_2_ppc64le.whl", hash = "sha256:09cc4d3103c1fc97f6845ba307af1db9cde5226bef47f8843220dde83f2276ba", size = 1666238, upload-time = "2026-10-03T12:24:16.171Z" }, { url = "https://files.pythonhosted.org/packages/37/5b/7638ee3ae35a64e4467160a37dc7565cddfe2a87f06cef2fd07c93cfd503/ast_serialize-0.12.1-cp315-abi3.abi3t-musllinux_1_2_riscv64.whl", hash = "sha256:c9e2a592706fd791c2271ce9c8f4e38c98d3ea0b4a86b511e09a4fe3ac44ab37", size = 1472620, upload-time = "2026-10-03T12:24:18.053Z" }, { url = "https://files.pythonhosted.org/packages/fc/e7/6e9e621e0e4a3be5a9a5f8b6961982964d2367013dbe64feb5adaa43e56d/ast_serialize-0.12.1-cp315-abi3.abi3t-musllinux_1_2_x86_64.whl", hash = "sha256:f4ac042e95a575432c1730ca4cb9183066a2074886a599f46c1f1b0955fb8198", size = 1500141, upload-time = "2026-10-03T12:24:20.036Z" }, { url = "https://files.pythonhosted.org/packages/4a/4f/3217da5b671711c09cc6be580095839cad539983662a6599405bd75c1a19/ast_serialize-0.12.1-cp315-abi3.abi3t-win32.whl", hash = "sha256:b3cd105995942cc6163a229674a86161ba1305f646493efd59bd6723a357ee14", size = 1118382, upload-time = "2026-10-03T12:24:21.599Z" }, { url = "https://files.pythonhosted.org/packages/80/1e/6074cf29dca8ceff27d50e845c88e7a2eaaa7f0b6f3972909e878d844737/ast_serialize-0.12.1-cp315-abi3.abi3t-win_amd64.whl", hash = "sha256:a9cd24a26126088693ca054547ea0a391398a29cf1a3a2bec1009b4b6acc8b82", size = 1158034, upload-time = "2026-10-03T12:24:23.316Z" }, { url = "https://files.pythonhosted.org/packages/92/a0/81ce428f9f3f1ca45f8b62c9711c30452bf8190476e8685cea0f72d8d008/ast_serialize-0.12.1-cp315-abi3.abi3t-win_arm64.whl", hash = "sha256:9649cd903db0dc047906c6dd740784a2ba665d54f7e43ba31457edbce76c9493", size = 1129437, upload-time = "2026-10-03T12:24:25.044Z" }, { url = "https://files.pythonhosted.org/packages/3a/d9/1c08adb90728607d0d07d188df4558ae863d688b4458087efe9fafeca458/ast_serialize-0.12.1-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:5ef62601db3ce5c23445132262a193075e211fb2fc87b46b7550dd351fac0976", size = 897419, upload-time = "2026-10-03T12:24:26.699Z" }, { url = "https://files.pythonhosted.org/packages/80/fb/1eabd2c0673283054468b1c6cb539aeb877636d6c84b280279f2d7a177a9/ast_serialize-0.12.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:98d91cd3a6cb76a39512ee090a539d1e3206b732ad8150eb38918cffa1ddf515", size = 1241515, upload-time = "2026-10-03T12:24:28.493Z" }, { url = "https://files.pythonhosted.org/packages/1b/d7/c56955934a431a0fa3e4e9aa7af4a53ceab2a61241005427545208945eb4/ast_serialize-0.12.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:8a32f184ce3e4b1d0b06d642a1243281cf55b99e0323680b1b8f904029fd7700", size = 1228048, upload-time = "2026-10-03T12:24:30.556Z" }, { url = "https://files.pythonhosted.org/packages/1e/4e/2b2ca4602baf92f842316ea617423402089df4fbd2ea42571ba28725ba46/ast_serialize-0.12.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e62126ac2be2d9340ac1b3ee7a0466a883ecbed634cff0929c88ca0b671483b7", size = 1292087, upload-time = "2026-10-03T12:24:32.45Z" }, { url = "https://files.pythonhosted.org/packages/d9/49/9ebd05218a87ca31f4f855d5e3df14239bba3c58f2aed9d02c7cba5d94f5/ast_serialize-0.12.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0f93a70fa9826c04ea9f2c3a880f87f4cca09a828144ed5084682abd28110980", size = 1295355, upload-time = "2026-10-03T12:24:34.423Z" }, { url = "https://files.pythonhosted.org/packages/dc/09/6db7c4327e7a56aba805f7190d377a159fc0bf6bdefb410dc7860624dfa3/ast_serialize-0.12.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1858887be56a64a2aea899423dfe43787c34c75c18b0d7497de8e618d54b2790", size = 1541231, upload-time = "2026-10-03T12:24:36.05Z" }, { url = "https://files.pythonhosted.org/packages/ed/85/7ab6097e5fe23cd4657b0e5a2fabb4f789f91e441a3ee40b3ca8b79be238/ast_serialize-0.12.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89a2bc39a820bc7785b60c53a5742b4e8dd4c1a599294e2dd68fae545883d44a", size = 1317324, upload-time = "2026-10-03T12:24:37.737Z" }, { url = "https://files.pythonhosted.org/packages/c0/60/58961e7fd129e226ce36788fe328d20034f3105f5d3380df690050517737/ast_serialize-0.12.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50a9eaedf1db4857dad7cc47dd757ed70bfcc40b89d44d516c4a2f0d5033bd76", size = 1311809, upload-time = "2026-10-03T12:24:39.306Z" }, { url = "https://files.pythonhosted.org/packages/15/c7/09d973db87d4575cba470fd80a3fa489322f7d6882546e43a4b21012468e/ast_serialize-0.12.1-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:c30b609e8fea426b310543126de876592236a25aa8ebd59f1e2b323dd52a4085", size = 1306678, upload-time = "2026-10-03T12:24:40.891Z" }, { url = "https://files.pythonhosted.org/packages/84/27/84f69c22bcdaa5256b4fe43ff972fc117668fff8e68495807d5792eadcce/ast_serialize-0.12.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b1ad06513022cfa1337744959255af0ef16119d2beb1e547b67f37ad9433d4a", size = 1362009, upload-time = "2026-10-03T12:24:42.809Z" }, { url = "https://files.pythonhosted.org/packages/43/46/76ee342ef22cd6d82ccd6089d5e2f7163246de73d1816ccb4b6ec0550db6/ast_serialize-0.12.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6add54b495e37ae3cf3a1f0d5eaba364814eb72e93026adc41b7791e4b0d45d3", size = 1467959, upload-time = "2026-10-03T12:24:44.496Z" }, { url = "https://files.pythonhosted.org/packages/31/4d/18e48154bbf6058eed8d9b54fcebb2e130f8a380db1a2a202b4faac48626/ast_serialize-0.12.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:5fc136cd08001b817ad0b3e7426f50a7d2b8982dc7c6491f0af78af4c3dd8672", size = 1571157, upload-time = "2026-10-03T12:24:46.156Z" }, { url = "https://files.pythonhosted.org/packages/34/76/6b16ddf0510e713613a5f5441b13407c1bde6158df04946b9f1fdc65add3/ast_serialize-0.12.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:45a9e6b700bbd973d49942668a5cdbeffa693f2e250b8a5409abd1fa9d351854", size = 1566873, upload-time = "2026-10-03T12:24:48.542Z" }, { url = "https://files.pythonhosted.org/packages/75/33/9f6169ae7f60c2da4baec03450073d3f1edb39e95ab538be0d25a7d2f72e/ast_serialize-0.12.1-cp39-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:a1d8267f83c613ea0a31f2518df074bd62e98a4b3a4892f6a529d74e08e02dba", size = 1673030, upload-time = "2026-10-03T12:24:50.566Z" }, { url = "https://files.pythonhosted.org/packages/11/51/0d78755bd61d6cf8980f0cfdc7fa8ede38df46a5423c9f7a3da0cff587ec/ast_serialize-0.12.1-cp39-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:9a0cbab9796e6ce841197feeba4008faa96b4cc7741129542fd81c882d7a4f01", size = 1480052, upload-time = "2026-10-03T12:24:52.277Z" }, { url = "https://files.pythonhosted.org/packages/01/ae/ad4c0e5129991f2761f388420c5ded37cb134ec5882e3e59043d33c1ad87/ast_serialize-0.12.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b4282695f1d51a3c6ef76560351bad5af880eff7d755aefea325bffb9bf68c25", size = 1508940, upload-time = "2026-10-03T12:24:53.846Z" }, { url = "https://files.pythonhosted.org/packages/38/6b/3299182794d38815ae6e9c7ede9bb8f2e4aa93c3578bed201c1ea746643a/ast_serialize-0.12.1-cp39-abi3-win32.whl", hash = "sha256:119d1b0cadaba4a6e475f9bbe79eecc79351e373142eabe7c353f0250d70aebb", size = 1125618, upload-time = "2026-10-03T12:24:55.405Z" }, { url = "https://files.pythonhosted.org/packages/86/14/5d4fb733c18a1d69e237c067b183842f3a7ea1c999a51ddc87093a281c88/ast_serialize-0.12.1-cp39-abi3-win_amd64.whl", hash = "sha256:3d6ed63d4fc1ec867b8cb522d58c36df0e8f05e487bea0ffd102043a37636d72", size = 1165798, upload-time = "2026-10-03T12:24:57.052Z" }, { url = "https://files.pythonhosted.org/packages/f1/f4/b54123680025c0b7253117418f023d1b2487f1102552acbdd9d8ee96b622/ast_serialize-0.12.1-cp39-abi3-win_arm64.whl", hash = "sha256:610a41351de68199de9a1434499083b4256c0df7658ec1cfc0a0a7b20b08d317", size = 1136560, upload-time = "2026-10-03T12:24:58.689Z" }, ] [[package]] name = "async-timeout" version = "5.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, ] [[package]] name = "attrs" version = "26.1.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, ] [[package]] name = "cffi" version = "2.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/70/d2/16d99a0c4948febc0ebd133a13b2f688ff7f8cb04da971e1128872ce0c03/cffi-2.1.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12", size = 183838, upload-time = "2026-08-03T21:19:29.637Z" }, { url = "https://files.pythonhosted.org/packages/cd/95/31b535a9f0220ae9f357de4a08d57ce89cb417653c2fd9f075f50822a388/cffi-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1", size = 184168, upload-time = "2026-08-03T21:19:30.764Z" }, { url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" }, { url = "https://files.pythonhosted.org/packages/ad/66/c19feabb28485b6e0bbaaafa90837a1ef5d302e90f2178bd33f17a49879b/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813", size = 218716, upload-time = "2026-08-03T21:19:32.896Z" }, { url = "https://files.pythonhosted.org/packages/a7/92/500760486c8baab49a7a8a58ba7fc3355ec3974b454b8a09e528efde9e1d/cffi-2.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990", size = 205569, upload-time = "2026-08-03T21:19:34.142Z" }, { url = "https://files.pythonhosted.org/packages/a5/a7/a67c733254d6e7373f7822f8082d8d6beade791e0cf12a7611f376fa61c7/cffi-2.1.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af", size = 204907, upload-time = "2026-08-03T21:19:35.174Z" }, { url = "https://files.pythonhosted.org/packages/f7/a4/4399daaf8f7dfee9d7c3327fdb0426ee041cc63edc358b93911ceb2bfc7a/cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632", size = 217807, upload-time = "2026-08-03T21:19:36.286Z" }, { url = "https://files.pythonhosted.org/packages/28/f7/dabe6da2466ecbd82dc62e7342dc6b1065dad990c06f00f0ede9ebf2a0ed/cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd", size = 221252, upload-time = "2026-08-03T21:19:37.416Z" }, { url = "https://files.pythonhosted.org/packages/ce/87/616202d8e51342c07d2534c510111c4cc37201775ce8f60802c9335d1edd/cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a", size = 214214, upload-time = "2026-08-03T21:19:38.507Z" }, { url = "https://files.pythonhosted.org/packages/b4/c6/ab025d75d2c26c19b087c0124e75ee31cb65032f4fe345d356d8c507ab97/cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa", size = 219408, upload-time = "2026-08-03T21:19:39.809Z" }, { url = "https://files.pythonhosted.org/packages/db/e2/7e8109f65445bdc673a7b54f02c677de462db75674220fd1335efc8eb598/cffi-2.1.1-cp311-cp311-win32.whl", hash = "sha256:f8ec5e643a9a937f64e1999eb9f75d072263751912dc5cd06d3c85f8f44be7c3", size = 174470, upload-time = "2026-08-03T21:19:41.246Z" }, { url = "https://files.pythonhosted.org/packages/73/c0/77ba02423c2f7d7091143c45cd49e0e6575c4c1967394bb542bd923a9b74/cffi-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:42f6930c31dc7f50732c9ae793c2786c7b6b044195967bbdde40bb9be81c4cc0", size = 185096, upload-time = "2026-08-03T21:19:42.615Z" }, { url = "https://files.pythonhosted.org/packages/7c/47/9f1f85f9672ceda4984dc6c4f8824e8558992a2972c3d3c81fb8eb28d4ba/cffi-2.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:c7659f22557c5a0bc4855cd635f55edec690cc008a40768527762cb9fb263455", size = 179941, upload-time = "2026-08-03T21:19:43.747Z" }, { url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" }, { url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" }, { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" }, { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" }, { url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" }, { url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" }, { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" }, { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" }, { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" }, { url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" }, { url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" }, { url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" }, { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" }, { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" }, { url = "https://files.pythonhosted.org/packages/a7/46/2e5fdde8555706dd98139a910ca11be02809f3f605ce956f655d0214e100/cffi-2.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6", size = 184805, upload-time = "2026-08-03T21:20:02.02Z" }, { url = "https://files.pythonhosted.org/packages/55/41/4c7042f317b9217502988f0873af87e16ad606dc20f84e546e3e6ce9764c/cffi-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971", size = 184764, upload-time = "2026-08-03T21:20:03.141Z" }, { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" }, { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" }, { url = "https://files.pythonhosted.org/packages/02/10/4b3c75dde3d9663c9e02ba05c2668b954f671d4bbe346413ca8c696b295a/cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264", size = 210175, upload-time = "2026-08-03T21:20:06.75Z" }, { url = "https://files.pythonhosted.org/packages/df/62/14f74b9543e605d17701dc797b815958b8bb70b7624ce1b832ddad48ed6c/cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3", size = 208670, upload-time = "2026-08-03T21:20:08.04Z" }, { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" }, { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" }, { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" }, { url = "https://files.pythonhosted.org/packages/70/ea/839b50531021a647fb5e929f72cf97bc1ff702b5472166164b5b6e76b851/cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac", size = 175263, upload-time = "2026-08-03T21:20:13.559Z" }, { url = "https://files.pythonhosted.org/packages/60/a6/8b149b2c3f2e11aaa1618ef64500b45f50f22c57a977a4dff1aff1f91042/cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d", size = 185688, upload-time = "2026-08-03T21:20:14.69Z" }, { url = "https://files.pythonhosted.org/packages/01/9a/11f687cb39d6a3504060d5242f04f48c735afb4d3d533958a20594890cb2/cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973", size = 180078, upload-time = "2026-08-03T21:20:15.917Z" }, { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" }, { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" }, { url = "https://files.pythonhosted.org/packages/d9/99/c4b0c17cacdc9c3b8f280026286a9826d6a208c0f047591a3c3ce99b91fd/cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54", size = 184964, upload-time = "2026-08-03T21:20:19.708Z" }, { url = "https://files.pythonhosted.org/packages/b3/a9/9db617d05d7367c1ad0ab00b3aa6e6f9281edd689b4ee9ea0e5a84e89c97/cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72", size = 184962, upload-time = "2026-08-03T21:20:20.833Z" }, { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" }, { url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" }, { url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" }, { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" }, { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" }, { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" }, { url = "https://files.pythonhosted.org/packages/0b/e9/d0061c364cde06ee43168a0d076ac1da512cbc380d44767b844ba34fe2b6/cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c", size = 177682, upload-time = "2026-08-03T21:20:44.288Z" }, { url = "https://files.pythonhosted.org/packages/a7/06/1c3e01e3ba14c39f6d10bfbac52753b7e22259e38088e5cfe1d704918690/cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48", size = 187949, upload-time = "2026-08-03T21:20:45.623Z" }, { url = "https://files.pythonhosted.org/packages/87/5b/da4e39efe18eeb89cf580ea9cfc66b6a7c3eadb808fc0cc1d3a295cb5a5d/cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836", size = 182947, upload-time = "2026-08-03T21:20:46.955Z" }, { url = "https://files.pythonhosted.org/packages/23/59/40338bf421c5accea1d45158170c87006ef1cd371b05c077e76476949728/cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3", size = 188504, upload-time = "2026-08-03T21:20:29.495Z" }, { url = "https://files.pythonhosted.org/packages/7d/47/5ecf1023850036e674c77ec4de86182d309ae344e39e7cba984b7df5d647/cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2", size = 188259, upload-time = "2026-08-03T21:20:31.291Z" }, { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" }, { url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" }, { url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" }, { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" }, { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" }, { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" }, { url = "https://files.pythonhosted.org/packages/eb/d2/3b7176cb570a1d3e27faf67b72f591af508036e0d8b2be2ef9af9e8c84bb/cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4", size = 182868, upload-time = "2026-08-03T21:20:40.388Z" }, { url = "https://files.pythonhosted.org/packages/56/78/31f00c1bcd97c9bbf55f1bfdf5bc809a5de8887473e90bb9960dca825e80/cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e", size = 194104, upload-time = "2026-08-03T21:20:41.725Z" }, { url = "https://files.pythonhosted.org/packages/7b/1b/58496f2ed0a35de575250c02a43ab3cc2c04d494a88fed31c1cabc0fd176/cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5", size = 186402, upload-time = "2026-08-03T21:20:43.042Z" }, { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" }, { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" }, { url = "https://files.pythonhosted.org/packages/1b/8a/af668013284634733f02d683458a0728739c7d6ddb5e14cb0c20832266fe/cffi-2.1.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4", size = 184933, upload-time = "2026-08-03T21:20:50.639Z" }, { url = "https://files.pythonhosted.org/packages/0c/75/2f5207ff6d1a613133b23a5203cc0c2a628313b5eb3974d7956ae3c57950/cffi-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8", size = 185002, upload-time = "2026-08-03T21:20:52.173Z" }, { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" }, { url = "https://files.pythonhosted.org/packages/50/e3/f6234a833e6e08c7007003074723c406559eecf9b48dfc97471e5a8eb7a0/cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80", size = 209919, upload-time = "2026-08-03T21:20:54.783Z" }, { url = "https://files.pythonhosted.org/packages/0d/fc/5f74e293fced6edb51af3a46c4ccf6c23c9943774ecb375ddbd522c76add/cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779", size = 208529, upload-time = "2026-08-03T21:20:56.066Z" }, { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" }, { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" }, { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" }, { url = "https://files.pythonhosted.org/packages/f8/7e/8debeb04f1ab9fe2a6963964cd6f1aaf7192627b83926586a6a4e089c9fa/cffi-2.1.1-cp315-cp315-win32.whl", hash = "sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac", size = 177683, upload-time = "2026-08-03T21:21:14.901Z" }, { url = "https://files.pythonhosted.org/packages/e0/31/5158704cc474ab65c1647932e88be78dc0873f47130e253be38bcaf13d01/cffi-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960", size = 187897, upload-time = "2026-08-03T21:21:16.108Z" }, { url = "https://files.pythonhosted.org/packages/cc/4b/b3a2da8570c704ffc0f9762cdc3ec0f02c8573798e0b5cf7f11c82bbb70f/cffi-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1", size = 182935, upload-time = "2026-08-03T21:21:17.271Z" }, { url = "https://files.pythonhosted.org/packages/d0/ef/5443574510a1207e6f6bc38ba6e1f1de36cb48fef07b2728bb896a21f430/cffi-2.1.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc", size = 188464, upload-time = "2026-08-03T21:21:01.163Z" }, { url = "https://files.pythonhosted.org/packages/7e/ae/a56fa8c4686ad50e148fcbc8d3ae0d03915ff5c30d795058988c24118cef/cffi-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab", size = 188262, upload-time = "2026-08-03T21:21:02.382Z" }, { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" }, { url = "https://files.pythonhosted.org/packages/8a/f6/c3ad28bd19f77047a03084424fbd4cbe997303267c14423737324be0385d/cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358", size = 211520, upload-time = "2026-08-03T21:21:04.863Z" }, { url = "https://files.pythonhosted.org/packages/a0/cd/ccac9013a5bd9fd764de118674ab9c805b5ca10c19270d90ee273f8b2240/cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231", size = 210673, upload-time = "2026-08-03T21:21:06.223Z" }, { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" }, { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" }, { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" }, { url = "https://files.pythonhosted.org/packages/6d/cd/a361394c94b2129d604bb846f624a8e88255a3ee33129c434a00d715e64f/cffi-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66", size = 182707, upload-time = "2026-08-03T21:21:11.226Z" }, { url = "https://files.pythonhosted.org/packages/9b/b5/ba2b299993c26577d529b6ae29841f9e15b9fcf004d65f423f4fcf94ade9/cffi-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3", size = 193772, upload-time = "2026-08-03T21:21:12.39Z" }, { url = "https://files.pythonhosted.org/packages/aa/29/35e016098c814cd93de9cd320c66b5bfba14dc6ecedd3cb518fa7c408c69/cffi-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692", size = 186360, upload-time = "2026-08-03T21:21:13.636Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] name = "cryptography" version = "50.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9d/af/182eb91b0df3fe75c4d9f26fe70684569566745f6ba7e5c9c73a862c5252/cryptography-50.0.2.tar.gz", hash = "sha256:7b46165bb56eb4704e2eaaf86f3c940d19154535d9b0ca7d6d590b04060e00d5", size = 880623, upload-time = "2026-09-30T15:30:04.884Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e5/56/d194340cc4a57535e82e1bee9e89667ac4b7c13b5d3f59686deae3094dd5/cryptography-50.0.2-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:fa8f5efb344d6908a1ce62f4a24e2e5780f825d6f53f5f50ec5ffacac72936cb", size = 3914904, upload-time = "2026-09-30T14:43:44.339Z" }, { url = "https://files.pythonhosted.org/packages/d9/69/c9bd862c3bf43d6399c433caf002df16e2dffd4be49bdf515cda38038711/cryptography-50.0.2-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:79def8d059362e7831389ed3be0ecdf58a89386e1271e35dd9f5af84e81bffd0", size = 4731146, upload-time = "2026-09-30T14:43:47.113Z" }, { url = "https://files.pythonhosted.org/packages/21/69/64cef1f702bf6657e0cc186ed1a2891d50d29fb41586b254e1c07adea261/cryptography-50.0.2-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:630ebfea3bf689d075f82316324ff7433dc447fe6bc1bfc76524b74b4a9567d2", size = 4719841, upload-time = "2026-09-30T14:43:49.01Z" }, { url = "https://files.pythonhosted.org/packages/38/6b/61a3f8d8c5e1e49a6cddccafc4015cc1c0021360ab0acb4080e7a423644a/cryptography-50.0.2-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f9f6143a8c75945eb960d9eb98905a441394abfa24afaae239d514ffb2586480", size = 4738340, upload-time = "2026-09-30T14:43:50.932Z" }, { url = "https://files.pythonhosted.org/packages/7b/2e/7212ca32fd43dc91f2f41db20160b268098874b4c9a0e7be94d6835f5b2e/cryptography-50.0.2-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:a582ab2ae1d34f67112cadc86702774c9ea4374df6bca6afe672817203c99134", size = 5367029, upload-time = "2026-09-30T14:43:52.911Z" }, { url = "https://files.pythonhosted.org/packages/1a/f1/b474e930c4d910328780e3940da76f5aa5cbc48ce1fc14e44d239d9ea9db/cryptography-50.0.2-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4061c0079120205fb760c58acab6443e217307dcf05e3702cf970e0689972856", size = 4753050, upload-time = "2026-09-30T14:43:55.272Z" }, { url = "https://files.pythonhosted.org/packages/7c/52/9af10e80ac16b0fcc2123f9cbd5e7afbd0fd5075bb7a607c592258a39cda/cryptography-50.0.2-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:ac9ed99d81760c62fe89d5f0815cdfa1ba9a35141cf30f1c2d044f04b4803d2e", size = 4376724, upload-time = "2026-09-30T14:43:57.24Z" }, { url = "https://files.pythonhosted.org/packages/71/37/6202e488cc1eb625ea110c292c6bda92823176e023f427d8d5660ce8d632/cryptography-50.0.2-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:87e9ce85beb6b328ba370cc6e6aea483c92617b4c95b1d33a49297eb662bfb04", size = 4737859, upload-time = "2026-09-30T14:43:59.541Z" }, { url = "https://files.pythonhosted.org/packages/8f/30/e86d7d518489b0ae2497091a35287abcb1a2ce4037837a34afbe9b1d6964/cryptography-50.0.2-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:f265528741e048bce55c3463ed721fb0aa45a5888d8add8cfeccb3035451bbdc", size = 5324103, upload-time = "2026-09-30T14:44:01.901Z" }, { url = "https://files.pythonhosted.org/packages/d3/69/2c833a049475e0a3444e94c7d0aca0aa51d166374a449b09e92ac98138de/cryptography-50.0.2-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9dab55f57c74c3cad24c323bacbbd04be4705ba6eb0d92e920b1fc4837ed5079", size = 4752576, upload-time = "2026-09-30T14:44:04.545Z" }, { url = "https://files.pythonhosted.org/packages/6c/5d/906970b83bbfc1f5bbfb677a143c181f2801f23b6a7204a3b47c42c97e65/cryptography-50.0.2-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25784ce8b9621c90c643efb9e1e2162ab3b0224cae446ad5e70e7fcb1ce18b51", size = 4870819, upload-time = "2026-09-30T14:44:06.884Z" }, { url = "https://files.pythonhosted.org/packages/68/e3/f2298d3bb55e0c4a91841ec4d01b3f020ba8c5fbf15ccdcc6dcf03f97025/cryptography-50.0.2-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:85d0d9a31b9098e98534226d5686b47264b95e62ce459dc2e62fdfc809f9fe93", size = 5030152, upload-time = "2026-09-30T14:44:09.443Z" }, { url = "https://files.pythonhosted.org/packages/9a/4f/adfc442765721292fff86d314ce385d3249d22db42295c0dd057727b60f3/cryptography-50.0.2-cp311-abi3-win_amd64.whl", hash = "sha256:7afa5a6602a9f29af1f3a2965f831bae7c9d5d597b7cbb716d41ab3b7d89879c", size = 3824692, upload-time = "2026-09-30T14:44:11.671Z" }, { url = "https://files.pythonhosted.org/packages/ce/cb/52eb3770c0d0be2702a98c6e96065ddc0a2877cf0845aa9c23397c142cd4/cryptography-50.0.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f785f6161f202ab04d8ca194158968798e480ca058943907972da5f12e2881e8", size = 3892731, upload-time = "2026-09-30T14:44:13.485Z" }, { url = "https://files.pythonhosted.org/packages/19/8e/aa1fc533d4546b127b45de8aa024eb5933d23eff9debfe25931e56861095/cryptography-50.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0ecbc5652bdb6fc9eaf89a7d196e20941adfe812f43bc4ca05d9150496821047", size = 4710431, upload-time = "2026-09-30T14:44:15.427Z" }, { url = "https://files.pythonhosted.org/packages/6a/64/72bc3f75176e7e406b748a3e3830432b8c51297b38368713df04dc04898a/cryptography-50.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ab50ee449bf968271e820086f10a33d101dd060370abc10bcd22279be2656539", size = 4694824, upload-time = "2026-09-30T14:44:17.69Z" }, { url = "https://files.pythonhosted.org/packages/4e/c6/62c77550edfa5ca3f14bf44a1e6739b9fa09d6e998a11d97ed8213bccc98/cryptography-50.0.2-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a9f7355e6fab51f6c369b86fb7571cffa05edee2c2121e0380a37fb9ac1cd5c1", size = 4716967, upload-time = "2026-09-30T14:44:19.661Z" }, { url = "https://files.pythonhosted.org/packages/f4/37/cce70f150c432914460157a6ecc161752e053aa5ec0ef3b3f7dc6e31039a/cryptography-50.0.2-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:94e5e9f108ee10471288214d3d233fbfbb492840a8457eb85178d643ddeb32c7", size = 5328676, upload-time = "2026-09-30T14:44:21.744Z" }, { url = "https://files.pythonhosted.org/packages/aa/9a/6f2f0304d634ceafdeaf23e84537336664ac419b5d07611675c2ad3f6b7a/cryptography-50.0.2-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:241449bf940a5d27309bd317e6f9a2af6932113818bb2b8f5c59ddc7ef16da18", size = 4727698, upload-time = "2026-09-30T14:44:24.178Z" }, { url = "https://files.pythonhosted.org/packages/1d/de/66bcf9244d118663b2e1aaded8990f4640e3d7b7411870a5765f252074d2/cryptography-50.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d8947001be83df1394050758ce0e745dd74fb134eef0a4b5124208dfc3a68c37", size = 4354821, upload-time = "2026-09-30T14:44:26.263Z" }, { url = "https://files.pythonhosted.org/packages/bd/e6/db28a28c7b6c676addce89136de3d8db49ea825a8c863472e36e42ead4ad/cryptography-50.0.2-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4a20ce1e5cb4284a86692fdcba7cb8754185c6b2e5c56fcef3751cf451d3cdc2", size = 4716748, upload-time = "2026-09-30T14:44:28.447Z" }, { url = "https://files.pythonhosted.org/packages/30/96/01546c7f69ea0e2ab790a2e4f0934a4052fb9b388147fbf83c2fd72f1e57/cryptography-50.0.2-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:84f964e537f916e2cc85199e5a88742e964939b575ac8598b3f9d6cc416cdaf1", size = 5285085, upload-time = "2026-09-30T14:44:30.704Z" }, { url = "https://files.pythonhosted.org/packages/6c/01/03263395f74d50b071e9e66daace3f8bef80493e5d410726f2ba8554736b/cryptography-50.0.2-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:828d49b0ff5a0e3975865571c5d91dbbdd0d38d8289b249a163e9425413a5e05", size = 4727268, upload-time = "2026-09-30T14:44:32.92Z" }, { url = "https://files.pythonhosted.org/packages/eb/94/2bfe8f29ec0cc9c0d99359c4161adf32858e4934b72c6d100d2ac0bbe962/cryptography-50.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:deb9fde5c60e437ee4821bc9bc39ff31b42135c27e1dc61ef0a629389c1de62e", size = 4849503, upload-time = "2026-09-30T14:44:34.969Z" }, { url = "https://files.pythonhosted.org/packages/54/44/e80651ecbf0e42b62e2bb5f5768916e07eea72e1297338956a61df361f88/cryptography-50.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8c71ba2cd31fc93748c38e1b613200ff1c2665cbfd5341fe3a61cfde35a1430e", size = 5004057, upload-time = "2026-09-30T14:44:37.064Z" }, { url = "https://files.pythonhosted.org/packages/f8/cc/1d33befb3cd7ea7e77d2d73f43f2066471da1b21f24a6156efcaabf6d2e8/cryptography-50.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:78198641e5be9521beea5aa782bb551a58068d10e6eb04c9c680c1b69f2e7d45", size = 3795868, upload-time = "2026-09-30T14:44:39.71Z" }, { url = "https://files.pythonhosted.org/packages/2d/49/93f6a6e7a87c9aa68d44d3e1cdb5fe8f60c90d5d2f46acae9a56892816b8/cryptography-50.0.2-cp315-abi3.abi3t-macosx_11_0_arm64.whl", hash = "sha256:edc3342adf8f697fc5f59c887a304356f147b397809440ed64e2fa6af2f50f37", size = 4133708, upload-time = "2026-09-30T14:44:41.807Z" }, { url = "https://files.pythonhosted.org/packages/8c/75/32ac2a56243d778805c16ca6a32b8f74fb757df7e28d7ecb560afafb59cf/cryptography-50.0.2-cp315-abi3.abi3t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d370b8d1dfcdf7130178137f6fbee6140774a1acc6cacefc4b42643ec11d0a3a", size = 4956267, upload-time = "2026-09-30T14:44:43.693Z" }, { url = "https://files.pythonhosted.org/packages/aa/a4/2c8d734e43d97f0842ee9f1b7b4bfb3d0cf5e19edebf43c2afe6675c2320/cryptography-50.0.2-cp315-abi3.abi3t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f2f9bd7f90c64fe89253f0a2c05e3c4856072660429ce8831b4235bf29403a67", size = 4966465, upload-time = "2026-09-30T14:44:45.769Z" }, { url = "https://files.pythonhosted.org/packages/c2/58/ee288c829a6f41f6235ae9dd33d82fd19b45442b65b4c8a3da36963d9f7a/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_28_aarch64.whl", hash = "sha256:e275096ea1e60cc595cda2836fd4a6c725d1125108b868be17f53684d164e2cc", size = 4959356, upload-time = "2026-09-30T14:44:48.211Z" }, { url = "https://files.pythonhosted.org/packages/92/20/9ded6d51ddd9897f6b6e81fb9ebea7951d7cc5d6c890b0ed8abf77a51a80/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_28_ppc64le.whl", hash = "sha256:b13478603dcd0a2479ff8e87e2c19a7d525734686fe3c49542472293a204212d", size = 5548822, upload-time = "2026-09-30T14:44:50.86Z" }, { url = "https://files.pythonhosted.org/packages/02/a8/8df951850d6b31d2a00218f19e2b3f999523437ed7a819df7fa427942fca/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_28_x86_64.whl", hash = "sha256:58a0c478eeca76fe5e07993c5a0703def34a6dc6a0cda4f5564639b33112ffe7", size = 5001199, upload-time = "2026-09-30T14:44:53.379Z" }, { url = "https://files.pythonhosted.org/packages/8b/f9/36b3022218ce75b7cdf068fb95f809f9bd0d820e4955ef43b90c255cc7ac/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_31_armv7l.whl", hash = "sha256:d38cdff612d06fa6a32840d5e1b1f7a27cee4a349aa9085d94a67789d6bfd408", size = 4629333, upload-time = "2026-09-30T14:44:55.635Z" }, { url = "https://files.pythonhosted.org/packages/8c/72/20f99a219f6af47cdd1cbd978c243b92d71496e168a746138af44ded4f29/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_34_aarch64.whl", hash = "sha256:fdd28f912fccfec1846a94e2e1e8f9b0012f557f0c46fe4f3eb0d7a87afcf90b", size = 4958822, upload-time = "2026-09-30T14:44:59.639Z" }, { url = "https://files.pythonhosted.org/packages/f2/20/196f112617fb08eb4d608a2a6c422373d46f9cc2857f38fc0667033c0899/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_34_ppc64le.whl", hash = "sha256:cbc8738fd8526d80f35cb3a40d41f41a2e7030bb3b18b09a6778ef63d291c2fd", size = 5506351, upload-time = "2026-09-30T14:45:02.267Z" }, { url = "https://files.pythonhosted.org/packages/24/95/83378121ef3eaaaf71d4b781577ff794acb39b9e1b87a3f156898c8497ed/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_34_x86_64.whl", hash = "sha256:e105ab60406787da31fccc883fc0f733af1efd78f0136a4599692c4083a73d0c", size = 5000859, upload-time = "2026-09-30T14:45:05.009Z" }, { url = "https://files.pythonhosted.org/packages/22/f7/70fd7ae4d1dbfa7ba29b02e1b9068771519a86027756510b700ce81086a8/cryptography-50.0.2-cp315-abi3.abi3t-musllinux_1_2_aarch64.whl", hash = "sha256:6f8700550aa1474a91e5dc07049c46f98b423b5b1ddd0483e0b51362eeeaf5be", size = 5092151, upload-time = "2026-09-30T15:29:15.932Z" }, { url = "https://files.pythonhosted.org/packages/d4/be/688367b74de86984bd58d8efacfc7c9e68b89a6a22ced0fb4f38db50254a/cryptography-50.0.2-cp315-abi3.abi3t-musllinux_1_2_x86_64.whl", hash = "sha256:c71be1cbfa5cd9a41ee452acf1eccd82b2c05950358b106ec8ceb83411d1a020", size = 5286120, upload-time = "2026-09-30T15:29:18.309Z" }, { url = "https://files.pythonhosted.org/packages/39/d1/55f8a3f2ef5d1529e16835ef10cf0fe3d559ce237b46dddc440c0bba3649/cryptography-50.0.2-cp315-abi3.abi3t-win_amd64.whl", hash = "sha256:c423ab384a46c4dff7217b2ea5ba2e11cffdeab6441acd04cf65a369caf0366c", size = 4111557, upload-time = "2026-09-30T15:29:20.155Z" }, { url = "https://files.pythonhosted.org/packages/23/ad/ac987755d00e1e64273760228d2635ae38dae2be83e3c6e0d3289d91dec3/cryptography-50.0.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:0ec5f09541743261e66e291b4a0cbf0fb2997aeaab6d9e9c740b9dba1b58d1c2", size = 3943588, upload-time = "2026-09-30T15:29:22.265Z" }, { url = "https://files.pythonhosted.org/packages/d5/8d/6d585339bedf85d45044c85d8412dac53f2bb6f918e8b7777efba1787844/cryptography-50.0.2-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c5e67125c7dca78d199ec4e116aa93dbb83494808ecbb8211a2cb09b1bf41dbd", size = 4756166, upload-time = "2026-09-30T15:29:24.58Z" }, { url = "https://files.pythonhosted.org/packages/bf/f1/1c1f6874e8550cfddd4b688ceb38cefb6ed15ceed224d56f133f3d88c214/cryptography-50.0.2-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee247f5c245c9a2fe7c8e2214e295918838e44e00a45a6718451e4004219e767", size = 4749145, upload-time = "2026-09-30T15:29:26.807Z" }, { url = "https://files.pythonhosted.org/packages/c1/63/61b15dc1a8de03fe0adbe3fd7608b3ad5c73bf50993bbcb1faaa930afe33/cryptography-50.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dfe9763530994147d9af1def057a5b9658b00e8f8fe8743d144d1e0911c2e454", size = 4763638, upload-time = "2026-09-30T15:29:28.588Z" }, { url = "https://files.pythonhosted.org/packages/fc/35/b345bdfa40c9126df1a9d33236aa98418367931b8725f84fc3ae2b98dc59/cryptography-50.0.2-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:58ddb5a8e3179d12f19e4ea34d2d32e9d63a4baa142c875c1eb59f41b7243acd", size = 5382217, upload-time = "2026-09-30T15:29:30.589Z" }, { url = "https://files.pythonhosted.org/packages/4f/87/ef344a9e616871f2519c22d6afcda79ddd5d35e9592d95eb6e677608d055/cryptography-50.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f21e8a22c8605750c7af886bab299a363721264061b4ac0a30efb73cfd58efc5", size = 4781387, upload-time = "2026-09-30T15:29:32.605Z" }, { url = "https://files.pythonhosted.org/packages/90/5b/f2fdb13cd0b96f6f932c8627bb292a45f11c64d21620a8e120aee9a3b848/cryptography-50.0.2-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:9c8402a82ea0dc4ceeab793db05f0fafa8ca139ca34fcde5df0f596103c74107", size = 4403790, upload-time = "2026-09-30T15:29:34.374Z" }, { url = "https://files.pythonhosted.org/packages/bc/ce/7e4f662b1e3c393513569e402cfc85ac7da0bd3d5435e122a3140219eb2d/cryptography-50.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:0ddc924c04591c2811ca024d62ecad4f7f6f08af8939c211438f48a16bd23602", size = 4764319, upload-time = "2026-09-30T15:29:36.149Z" }, { url = "https://files.pythonhosted.org/packages/3c/3f/86ff33ce34cc0de6847fb96e035a1a760d81652e38643f617c02ad32ef7a/cryptography-50.0.2-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:a6557e5f38e065ca9fbdaf7cfc7435ecb1d113aa81a022d1b51921ee7432e227", size = 5338560, upload-time = "2026-09-30T15:29:39.053Z" }, { url = "https://files.pythonhosted.org/packages/40/cf/6b5c8e2fd9202d98988ab7cb5cc5c991704c4ad55f492ff408e4969f83f1/cryptography-50.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:1981f1db4630889b9ef7803fadef12b056f428cb6b85c27ba57b774793b6093c", size = 4780973, upload-time = "2026-09-30T15:29:41.251Z" }, { url = "https://files.pythonhosted.org/packages/10/bf/8d6ebc7dded797bd0f0160d52188021211f011a2b164ef0ae1dac4587465/cryptography-50.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7a8701d6b584d76e909e3d305b7d126b41439876a5aaf76cddc67fc230eafa2e", size = 4897738, upload-time = "2026-09-30T15:29:43.106Z" }, { url = "https://files.pythonhosted.org/packages/d4/aa/f3f6e0de7e6253b8baa8b2d8fb9d50924fa75cee3d4624bd4bc1208ee923/cryptography-50.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ce47f66801c20ec6c6632453bb5960fe38939e9306970b48b3a5a26de7745d94", size = 5058280, upload-time = "2026-09-30T15:29:44.827Z" }, { url = "https://files.pythonhosted.org/packages/f6/b6/a1faf3a27ae9405fb34b1713cc73b2d8a26b04d5c561578fa2e6ef3e5bb9/cryptography-50.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:4e81d95e5bafc2d6e34e4bed780e53e4d5b9a2f928573428aa4d35fbec1eb0de", size = 3854095, upload-time = "2026-09-30T15:29:46.782Z" }, { url = "https://files.pythonhosted.org/packages/1d/7a/f08d34ce09d60f89ebd391e2ebc6ba2b995e6dd7552f41820f8085f94e53/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:92e665960f25fcdc73725b9cec7a3824f279ba97a98653afe9ffac2e43668f67", size = 4716035, upload-time = "2026-09-30T15:29:48.681Z" }, { url = "https://files.pythonhosted.org/packages/45/67/e18fb65592451a2acb76e9f2fbe14e0f47a8318b4c5430f1633851d03daa/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eef4c2f3423810b3070ab391f85436d2f8bbfcb286ac15cbc73190b3563b1f1a", size = 4726917, upload-time = "2026-09-30T15:29:50.608Z" }, { url = "https://files.pythonhosted.org/packages/83/28/38fdce17e60f6b825e69fc3b7f75e70a6612759980704697e1de4cbfaf6e/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:7c6d0330c472d96f6a6afe24d80dfdf15176c33096f0a4397ae4c60f3dd3be48", size = 4715341, upload-time = "2026-09-30T15:29:52.522Z" }, { url = "https://files.pythonhosted.org/packages/b6/b1/d9121a717e0f893c64bd6ca7702614778d7df2a5c309128a002421788516/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:1ba34f04897fcdaa73f74145c25f3ec146fbd56593853e88adc2e811303c5f42", size = 4726322, upload-time = "2026-09-30T15:29:54.263Z" }, { url = "https://files.pythonhosted.org/packages/36/8b/e6d153808bf353e152abd2fd4d8f09670d956ac78379ac46e60d7efbf04c/cryptography-50.0.2-pp311-pypy311_pp80-macosx_11_0_arm64.whl", hash = "sha256:3dc4fd8058cea1644971207d530e1a03a184a805ffc8ebdddf0599d78a331b81", size = 3873097, upload-time = "2026-09-30T15:29:56.097Z" }, { url = "https://files.pythonhosted.org/packages/ca/1d/1271f287ff7170ddafc2aad36260c4eec20ccd2fea70f38455e9d56d427b/cryptography-50.0.2-pp311-pypy311_pp80-win_amd64.whl", hash = "sha256:7b75de3c8b3be1cdb1052747c929440c3eea46c1bc2cb8a6e3a48388e9b7b452", size = 3805376, upload-time = "2026-09-30T15:29:58.729Z" }, ] [[package]] name = "decorator" version = "5.3.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, ] [[package]] name = "django" version = "5.2.17" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version < '3.12'", ] dependencies = [ { name = "asgiref" }, { name = "sqlparse" }, { name = "tzdata", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d5/d8/43e9d000519adceb189620b6869ff88031e046df91c2e9da72f8f6918399/django-5.2.17.tar.gz", hash = "sha256:9d4d93be539a18ab80d058eb515900e10951e04c537c5a6b394fc49528d3251f", size = 10889740, upload-time = "2026-08-04T15:04:03.173Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/df/f8/ce120525ca78f12b07daf65786679c5d0b54a75285a8958d3ae55e39da35/django-5.2.17-py3-none-any.whl", hash = "sha256:f04fb3b36ee119e1af4fa1d397d5fd6cf12700f49321e84d4f4c642c5b1973db", size = 8315563, upload-time = "2026-08-04T15:03:59.1Z" }, ] [[package]] name = "django" version = "6.1.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.15'", "python_full_version >= '3.12' and python_full_version < '3.15'", ] dependencies = [ { name = "asgiref" }, { name = "sqlparse" }, { name = "tzdata", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f8/d4/8314b5bdef20832f0ac6ae3b3e4d4924e4759fa3b4af27609dd747e7a6be/django-6.1.1.tar.gz", hash = "sha256:7ab93536d8e677aa14554c56426290c69480bf2ee68d7513d4a22f57d6bfeb84", size = 11284905, upload-time = "2026-09-02T17:20:45.621Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8d/ca/c1040a4fd15754ede7df15fd72fc2e123045b473b253ab5f5284e11c651e/django-6.1.1-py3-none-any.whl", hash = "sha256:585fb82bf15053c42cf52e67c2f1b54a032dca384759315fd6678ab1870d1d72", size = 8419512, upload-time = "2026-09-02T17:20:39.153Z" }, ] [[package]] name = "django-stubs" version = "6.1.2" source = { editable = "." } dependencies = [ { name = "django", version = "5.2.17", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "django", version = "6.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "django-stubs-ext" }, { name = "types-pyyaml" }, { name = "typing-extensions" }, ] [package.optional-dependencies] compatible-mypy = [ { name = "mypy" }, ] oracle = [ { name = "oracledb" }, ] redis = [ { name = "redis" }, { name = "types-redis" }, ] [package.dev-dependencies] dev = [ { name = "django", version = "5.2.17", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "django", version = "6.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "django-stubs", extra = ["compatible-mypy", "oracle", "redis"] }, { name = "jinja2" }, { name = "mysqlclient" }, { name = "psycopg", extra = ["binary"] }, { name = "psycopg2-binary" }, { name = "pyrefly" }, { name = "pyright" }, { name = "pytest" }, { name = "pytest-mypy-plugins" }, { name = "pytest-shard" }, { name = "pytest-xdist" }, { name = "pyyaml" }, { name = "ty" }, ] pyrefly = [ { name = "psycopg2-binary" }, { name = "pyrefly" }, ] pyright = [ { name = "pyright" }, ] tests = [ { name = "django", version = "5.2.17", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "django", version = "6.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "django-stubs", extra = ["compatible-mypy", "oracle", "redis"] }, { name = "jinja2" }, { name = "mysqlclient" }, { name = "psycopg", extra = ["binary"] }, { name = "psycopg2-binary" }, { name = "pytest" }, { name = "pytest-mypy-plugins" }, { name = "pytest-shard" }, { name = "pytest-xdist" }, { name = "pyyaml" }, ] ty = [ { name = "psycopg2-binary" }, { name = "ty" }, ] [package.metadata] requires-dist = [ { name = "django" }, { name = "django-stubs-ext", editable = "ext" }, { name = "mypy", marker = "extra == 'compatible-mypy'", specifier = ">=1.13,<2.5" }, { name = "oracledb", marker = "extra == 'oracle'" }, { name = "redis", marker = "extra == 'redis'" }, { name = "types-pyyaml" }, { name = "types-redis", marker = "extra == 'redis'" }, { name = "typing-extensions", specifier = ">=4.11.0" }, ] provides-extras = ["compatible-mypy", "oracle", "redis"] [package.metadata.requires-dev] dev = [ { name = "django", marker = "python_full_version < '3.12'", specifier = "==5.2.17" }, { name = "django", marker = "python_full_version >= '3.12'", specifier = "==6.1.1" }, { name = "django-stubs", extras = ["compatible-mypy", "oracle", "redis"], editable = "." }, { name = "jinja2", specifier = "==3.1.6" }, { name = "mysqlclient", specifier = "==2.3.0" }, { name = "psycopg", extras = ["binary"], specifier = "==3.3.6" }, { name = "psycopg2-binary" }, { name = "psycopg2-binary", specifier = "==2.9.13" }, { name = "pyrefly", specifier = "==1.3.2" }, { name = "pyright", specifier = "==1.1.414" }, { name = "pytest", specifier = "==9.1.1" }, { name = "pytest-mypy-plugins", specifier = "==4.0.3" }, { name = "pytest-shard", specifier = "==0.1.2" }, { name = "pytest-xdist", specifier = "==3.8.0" }, { name = "pyyaml", specifier = "==6.0.3" }, { name = "ty", specifier = "==0.0.83" }, ] pyrefly = [ { name = "psycopg2-binary" }, { name = "pyrefly", specifier = "==1.3.2" }, ] pyright = [{ name = "pyright", specifier = "==1.1.414" }] tests = [ { name = "django", marker = "python_full_version < '3.12'", specifier = "==5.2.17" }, { name = "django", marker = "python_full_version >= '3.12'", specifier = "==6.1.1" }, { name = "django-stubs", extras = ["compatible-mypy", "oracle", "redis"], editable = "." }, { name = "jinja2", specifier = "==3.1.6" }, { name = "mysqlclient", specifier = "==2.3.0" }, { name = "psycopg", extras = ["binary"], specifier = "==3.3.6" }, { name = "psycopg2-binary", specifier = "==2.9.13" }, { name = "pytest", specifier = "==9.1.1" }, { name = "pytest-mypy-plugins", specifier = "==4.0.3" }, { name = "pytest-shard", specifier = "==0.1.2" }, { name = "pytest-xdist", specifier = "==3.8.0" }, { name = "pyyaml", specifier = "==6.0.3" }, ] ty = [ { name = "psycopg2-binary" }, { name = "ty", specifier = "==0.0.83" }, ] [[package]] name = "django-stubs-ext" version = "6.1.2" source = { editable = "ext" } dependencies = [ { name = "django", version = "5.2.17", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "django", version = "6.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "typing-extensions" }, ] [package.metadata] requires-dist = [ { name = "django" }, { name = "typing-extensions" }, ] [[package]] name = "execnet" version = "2.1.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622, upload-time = "2025-11-12T09:56:37.75Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708, upload-time = "2025-11-12T09:56:36.333Z" }, ] [[package]] name = "iniconfig" version = "2.3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] [[package]] name = "jinja2" version = "3.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] [[package]] name = "jsonschema" version = "4.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "jsonschema-specifications" }, { name = "referencing" }, { name = "rpds-py" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, ] [[package]] name = "jsonschema-specifications" version = "2025.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, ] [[package]] name = "librt" version = "0.16.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/04/f5/9dc696772d241814bacac7880bac32f2930b5a6ebc1f85317b83161a011c/librt-0.16.0.tar.gz", hash = "sha256:ac38d6d8d66bf3d744148dbbc0b8e193e195a51e364ed55e224631f5721891fc", size = 219839, upload-time = "2026-09-29T00:55:32.891Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ba/0e/b04fd2d76b6a78a02286938251b2c119fb36ddece92c76cb4886ef7d44b8/librt-0.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fe4372c52d4849096c6cc1cda2817d293ec51440c890474ed59ef38d46556f18", size = 148058, upload-time = "2026-09-29T00:44:40.903Z" }, { url = "https://files.pythonhosted.org/packages/a3/fc/e1ed24aadb32d38603c0c07f579d739eb4d90e64e90d525b024e4a999b4d/librt-0.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c72c5295a84bd249526da9bdca38f2e176d15c31c13bb0063c5053f4ca023421", size = 153073, upload-time = "2026-09-29T00:44:42.165Z" }, { url = "https://files.pythonhosted.org/packages/be/38/133ab655409420e0c34a9a9836a7f4e5ae75fba758d7fe177099130d58ba/librt-0.16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be56ba9c884143495b517f23fe794ae367d58cd89ea0fdd6d437e3c024a87f9f", size = 493052, upload-time = "2026-09-29T00:44:44.043Z" }, { url = "https://files.pythonhosted.org/packages/94/42/aaa663bc9421f5bf7bbbe9d3316d7219749698ec7688ac3b519770a89c04/librt-0.16.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:ef46c1a29ffb8c72e882e22618ec618778eacd0578fb22c6e7cf9c11d15f357b", size = 485506, upload-time = "2026-09-29T00:44:45.479Z" }, { url = "https://files.pythonhosted.org/packages/7b/59/83a6eb5087ba8b45b083859e2085256963e06d4c2531944cdd962670bfb5/librt-0.16.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d3c94211ee0c4f8d649ec06b7c115c0ec4eadb873a0e3154ca15cef3f814b071", size = 498708, upload-time = "2026-09-29T00:44:46.916Z" }, { url = "https://files.pythonhosted.org/packages/a0/e4/15a8d62b2bc12935080ec7277e2e0b9b233047781eb784a51d3e25af669a/librt-0.16.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94aed6a8308818b91677957d1bd03188869cd7aeb23c5dba7912a6c0402f7602", size = 515981, upload-time = "2026-09-29T00:44:48.316Z" }, { url = "https://files.pythonhosted.org/packages/46/4f/287cc282ac5dd815204c0779e79401bb0a568c3a1335fb319bf0838fb566/librt-0.16.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:349c0bcb87ebd07481b6ff781e25cdc699723dbe2212e57dabb27f7a13b7b87d", size = 508670, upload-time = "2026-09-29T00:44:49.726Z" }, { url = "https://files.pythonhosted.org/packages/bf/5b/ab7292add898ade0d2b5b75d32a923aae315861671aa5c39f5491309f7ae/librt-0.16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:001bfd59a7d45b17e3e75f2a8c6405280b35e7b84471792778e718c4f368950e", size = 530393, upload-time = "2026-09-29T00:44:51.356Z" }, { url = "https://files.pythonhosted.org/packages/7a/9e/8e6bcf027d4bcbc16a4e864b3d158a1d3e5f55ffa53af0238020cad89271/librt-0.16.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:28e038895b998d7a0c7798922ce8a1dc157675df5cf1c9ef0aca809ed804b7a1", size = 534302, upload-time = "2026-09-29T00:44:52.893Z" }, { url = "https://files.pythonhosted.org/packages/96/a4/8c5ab4f3b3a8e905ff8305d76976a2e666f52fe049edd398aed2402beb36/librt-0.16.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0dbe4096a7ecc00fa835d24510ad8545a4efef738dac96e0e63516783ccde905", size = 536150, upload-time = "2026-09-29T00:44:54.421Z" }, { url = "https://files.pythonhosted.org/packages/ea/5e/7c4bc267e3cd4b8bd288de9f62d61fff203829c9cc649ea2aa12e9218cf0/librt-0.16.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5cd5b092441053364af968ea12084692cb9d4a22f3ce9524e377880bf028761e", size = 514316, upload-time = "2026-09-29T00:44:55.998Z" }, { url = "https://files.pythonhosted.org/packages/e0/75/c8bc6b50f43c73819334233f5a3259c81216742cef56d2140c3dd377c3f0/librt-0.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ddeb3c9dedb461bb457c6c7d9aa7fbf35329da313d1a7543d00c8d0f3473c96", size = 557731, upload-time = "2026-09-29T00:44:57.581Z" }, { url = "https://files.pythonhosted.org/packages/93/fb/e241f91bc8de6c7ac1c6a20ea6dd381bc52312b44d711ffcd97140db1e57/librt-0.16.0-cp311-cp311-win32.whl", hash = "sha256:e05108e0849966f53a8d2d3112a7af881d0efaa479bc735bba91108f9f2350a7", size = 104922, upload-time = "2026-09-29T00:44:59.078Z" }, { url = "https://files.pythonhosted.org/packages/d1/38/c892383d2bb1a6a80b2ec8ede84970a265a792c56614a06282bf3008517c/librt-0.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:5f49cff01bd608ef7d97104cb035c75455e79c2d70bf4a506cf773338ac1860d", size = 125093, upload-time = "2026-09-29T00:49:01.621Z" }, { url = "https://files.pythonhosted.org/packages/e4/56/8bbde1ed0b21480163617648f638fdaec9374cf5e9c846ebcee34ec02a42/librt-0.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:1d28ae980ae2218f9c5b95d191e947296f918c9bf0b400d467a9430275bbe678", size = 115910, upload-time = "2026-09-29T00:52:40.131Z" }, { url = "https://files.pythonhosted.org/packages/ad/76/bbdaeb87b7c47b5c7343e90222b9bfa4e4a8a83f647e02933ad0129225b1/librt-0.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe52bf4641069e7978a14253b036cb9002def1926317e710f2e249f8a8c47742", size = 151028, upload-time = "2026-09-29T00:52:41.508Z" }, { url = "https://files.pythonhosted.org/packages/fd/0c/ab8ed3dab0085931aec4a792c7eaac8dc6c5ff4691fda3a5360d9d8a9cd2/librt-0.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5bcc2c4726ced915b00de0c9856a4eeabfb3fddb93e10e0b8f735b7709358b6d", size = 155283, upload-time = "2026-09-29T00:52:42.873Z" }, { url = "https://files.pythonhosted.org/packages/eb/36/494e79d460c80c1f030661e8287c9eca5e1ad652dc2b2180b6cd42abce0a/librt-0.16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff7baa55f8e7c69851419e50a666015d02a74198716fd45c0125a2112e0a389f", size = 503185, upload-time = "2026-09-29T00:52:44.638Z" }, { url = "https://files.pythonhosted.org/packages/9b/34/a8464038dd9db6e4381fa2b6eb73dc9a50888d77102c4c139304ac35cddc/librt-0.16.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b95d5d92ab83d39e760a52091bb1baba664f3a2351e39b1e16801e5747c2f0e9", size = 496738, upload-time = "2026-09-29T00:52:46.441Z" }, { url = "https://files.pythonhosted.org/packages/6a/53/e0e5e334ef0c6ed27039d323819368b9ef6712be87d55ee2bf9799398afd/librt-0.16.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b6d085d70bce51d43c5c7c36d63490770180d8779e71c49305c87b4213918de7", size = 513818, upload-time = "2026-09-29T00:52:48.068Z" }, { url = "https://files.pythonhosted.org/packages/ad/f7/7ce72cbf19d0addd05090b339152fd0548a02562c2866a603e6e3b3da2df/librt-0.16.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36e53948e99bbe3ffea257124cfcae1cfb01831555c9a9c903c9f9a72db7fd07", size = 531952, upload-time = "2026-09-29T00:52:49.816Z" }, { url = "https://files.pythonhosted.org/packages/83/22/0b1bcb6a8e723c8b4fd60dfc8ae8ec6461c54073fbc8685efeb8d900d407/librt-0.16.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:54d11f726aae9df5a6ffbbf0a03a52449bbac84a53ef03669cb41cdfd4ae41bf", size = 524465, upload-time = "2026-09-29T00:52:51.354Z" }, { url = "https://files.pythonhosted.org/packages/64/2e/e9c23b8b9df1813da1be205deca9606beb7ddd033972246cd426d05374a0/librt-0.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4323193ac0cd025f85af531df8ba91bf24d1973b401697347a6282e8fd3fcf5e", size = 543191, upload-time = "2026-09-29T00:52:53.284Z" }, { url = "https://files.pythonhosted.org/packages/bc/e5/6a8b21b342c03ed7e230fa3afbfd2edc58e6e87ef1f0d11fa2b9a748c252/librt-0.16.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e42f8e098b9c5396fefa05fb1cc7e33b0e08fc51da106b5de4a45fd22aac6743", size = 546979, upload-time = "2026-09-29T00:52:54.932Z" }, { url = "https://files.pythonhosted.org/packages/84/9e/b5129023eced1be01e01c22757f53be551d463b1bb7264f787927404c1d6/librt-0.16.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:39ec1d5a14e37baf1450a6cabf03fe552340808bf1ad9d71824ab90117716459", size = 555317, upload-time = "2026-09-29T00:52:56.869Z" }, { url = "https://files.pythonhosted.org/packages/71/89/28bba5938c725fe91f06bf93f7fa6c6b150229df53a87b454b0d5c2a796e/librt-0.16.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d1aabe3925cbb4a08d15b7b20ba4011b53019da0c4173a25155139b7b1baed65", size = 535846, upload-time = "2026-09-29T00:52:58.475Z" }, { url = "https://files.pythonhosted.org/packages/22/92/63773026614f888c5d4e370e395ce42ca604b89f70b3acdfedbf94851b80/librt-0.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:300c3ffdc459f4a779a8411ecb188e3ac0b1ff3a3a7b099642555dedae06c69b", size = 573700, upload-time = "2026-09-29T00:53:00.127Z" }, { url = "https://files.pythonhosted.org/packages/66/8f/347d4677eefb57cd9f8e01d95a1dcee9a91b4e44e664173c32ff6f3752e5/librt-0.16.0-cp312-cp312-win32.whl", hash = "sha256:c17194318e4c0c0348b36f36c2ec7534436fe0a4c15582403162a4f08c80797a", size = 106158, upload-time = "2026-09-29T00:53:02.031Z" }, { url = "https://files.pythonhosted.org/packages/f0/2c/5193dc81127cd5ddfad031391b046bf32dda219b38463ab872407ca30646/librt-0.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:25a58a19ea8d83b68209f04912df765e9260635ef77646542ed4b4abe6bc7940", size = 126176, upload-time = "2026-09-29T00:53:03.445Z" }, { url = "https://files.pythonhosted.org/packages/ff/3d/9668a400c8dd81d162eba38b33fa49fa6205f1a64493570a13fbb815c3ee/librt-0.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7be7cf555bc30ec12622e9447299cc4a9b8ff307548b634794353db0c2065dc", size = 116572, upload-time = "2026-09-29T00:53:04.815Z" }, { url = "https://files.pythonhosted.org/packages/46/cd/ae5e0e9dba45d1399aa04a5395bcc0bead40d9fa06dc903634a7b4d7473d/librt-0.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c5e6144e68b577f157519f2ba88ca20e3ed61c29b00e5cdfa76cd2d45acf059a", size = 151036, upload-time = "2026-09-29T00:53:06.284Z" }, { url = "https://files.pythonhosted.org/packages/41/5a/48a16e323c5f9447a94cce7b59babf60fa04e62c3365ecf060c77ed8b320/librt-0.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:33f41443a1f4e1f099331b3d8120e409fbff84b9760bc1cc9ea496f37ddaa5cc", size = 155211, upload-time = "2026-09-29T00:53:07.72Z" }, { url = "https://files.pythonhosted.org/packages/3f/29/0f59299eb4251a409b2e690ad4b7d9f8a676db829d7817ec961f32b44f7e/librt-0.16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e510b7770bee609617a3374a96548eb114cae048023e3f049ee449e7ff2db32", size = 502587, upload-time = "2026-09-29T00:53:09.191Z" }, { url = "https://files.pythonhosted.org/packages/de/ba/d6fb4ef8d1537c396079d72289f16be7cd35a366e5065c51253fea2760b6/librt-0.16.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:efc49c462d4516b8a58b00b490078fa64689fd1fe66970cc190131d7afb8027e", size = 496146, upload-time = "2026-09-29T00:53:11.016Z" }, { url = "https://files.pythonhosted.org/packages/52/fc/8c50dd4d7cc97c0ee8f252c8a3104980f234391cf1519b554e8b9de08b60/librt-0.16.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:92caf82ebef5e12d21c72242b70d1e92536f1711cf2a727a4c276de4b4469087", size = 513336, upload-time = "2026-09-29T00:53:12.655Z" }, { url = "https://files.pythonhosted.org/packages/a9/59/16c409c56f708eda2db9a0553662845d45e3871c77d70a240dae3f3bdc56/librt-0.16.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17bac7f7a16b328fff77e440287693eb017abde913595b5827ebccbc21ecd8a6", size = 531689, upload-time = "2026-09-29T00:53:14.39Z" }, { url = "https://files.pythonhosted.org/packages/88/82/d34772a6c29d1446dcca6e64d74062efd508523ab351aa16625a4689d5cc/librt-0.16.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5b976054553670829985ed767feb78fb6bcede0175327c4844dd5c281c1be659", size = 524537, upload-time = "2026-09-29T00:53:16.064Z" }, { url = "https://files.pythonhosted.org/packages/77/8f/24c5631313746131ccee53bc91fdc8374f9cf25e0082a1fee9c93bb98acc/librt-0.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0058f9d68721094105917254c72ac0569117bb7b13b9769cf45d26d89f9d21cd", size = 543231, upload-time = "2026-09-29T00:53:17.939Z" }, { url = "https://files.pythonhosted.org/packages/f2/cb/5f8e0d41dbd8b499c2265e939c31acc9ba59845565bf99539ad1c06aebcf/librt-0.16.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b7beaf3f4487b7d8adef1f158b49067cb4d5a19fa7a3bf31a4e7a820e435c5", size = 546499, upload-time = "2026-09-29T00:53:19.666Z" }, { url = "https://files.pythonhosted.org/packages/be/61/063052de441d1385f59cea4223f184bf9e5d125de1ae3239b490aa1e486e/librt-0.16.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:468df902df016a06eb0e40b0747dc8d14e47d7a38b18b63b1fb167d85cb94d63", size = 555261, upload-time = "2026-09-29T00:53:21.292Z" }, { url = "https://files.pythonhosted.org/packages/14/11/a2ada0529372268d6401afa9d457a095b68cd7753532b6f7f33049a19b43/librt-0.16.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:aea7b1f2b125dad5de85f049136651bff256c883c65e6b9209b2da0a1ac3cdef", size = 536029, upload-time = "2026-09-29T00:53:23.07Z" }, { url = "https://files.pythonhosted.org/packages/23/9d/5bb6d38853382986dca702fc7e06c8256d30f5fa0676d882773b744610dc/librt-0.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a8afb6557920860b7a3a596eb804cf37e09e7cf8a803db2478c202acc72d8c2e", size = 573748, upload-time = "2026-09-29T00:53:24.696Z" }, { url = "https://files.pythonhosted.org/packages/99/f6/0025cde35ff7f607684dc775a2b2d732cce2561cec050a6ee1fb2e1fc6fe/librt-0.16.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:77c7a2b4fe2c1369e0d5aa1cade26740a7b14be32fbc9a5535d617d20065c39d", size = 79861, upload-time = "2026-09-29T00:53:26.089Z" }, { url = "https://files.pythonhosted.org/packages/93/93/303b8592909bd583f83f02818ffbea3f7647ca1e22b1cd5465d04b8145fe/librt-0.16.0-cp313-cp313-win32.whl", hash = "sha256:02d89c813d5ff74b17df72d3a34819d132cd168e56b81bf755b809bd9e46b8c4", size = 106236, upload-time = "2026-09-29T00:53:27.43Z" }, { url = "https://files.pythonhosted.org/packages/cf/24/80bbb463c60ed18e29cb26aba386ddb76609580e4e7160710e550587018c/librt-0.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:14ed6ebe3e4f85f326d7920011ad30ff49ed9334e62cf88caef9ba973d9e3a92", size = 126180, upload-time = "2026-09-29T00:53:28.7Z" }, { url = "https://files.pythonhosted.org/packages/43/80/b1a6fbdd7da825cdd55c71aa81eb6cfa82c513c360774152eacb50b4a771/librt-0.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:83d4041a3d9b2fd053a8a4e1f22878b3e5833e2712956382d5c048d791454e91", size = 116557, upload-time = "2026-09-29T00:53:30.012Z" }, { url = "https://files.pythonhosted.org/packages/1e/93/9e0cf7da129a93c3dc7f45bc3cd4a660f2aaa995aa8a6f95c2583ef41239/librt-0.16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:931a0bb0fcac88f263e269e46eb30ba8e21402cd3c62ca40cb97034c0693fab1", size = 149844, upload-time = "2026-09-29T00:53:31.391Z" }, { url = "https://files.pythonhosted.org/packages/8f/26/8a90d2a8f2b2e471bb486b7aec117b8ae622715ed6c39853aec48ea20073/librt-0.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1bc17e54e5305f8d40b7ca203671ff5a9e59c1d0f8ea0f625dcca53a3984de11", size = 154111, upload-time = "2026-09-29T00:53:32.718Z" }, { url = "https://files.pythonhosted.org/packages/35/ce/67abb46258da4d3e42ff5b141db6f38c59357bef84c7979f183b22f924f1/librt-0.16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:877698bf6bca5721d8be345f2fe09778e40ecadea8b58c73075f2b1a53666bf2", size = 494234, upload-time = "2026-09-29T00:53:34.466Z" }, { url = "https://files.pythonhosted.org/packages/12/f9/ea7162414a16f8f1bbd3b493ad6d22b926c5471916e078350bdbca8c4e5f/librt-0.16.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5981c011b306781ce561e18e14230a14524a3d8109b97553666c942c18f31a96", size = 491173, upload-time = "2026-09-29T00:53:36.124Z" }, { url = "https://files.pythonhosted.org/packages/b1/09/9b3e869060dd33f9989b80ba4fea306f6db8cecefcdfe6d7346ef0603f65/librt-0.16.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:afced3dfc17cd805ecf7a3d77996a71cf5f2c75aa66eb0c21a9930f4fc992f86", size = 505547, upload-time = "2026-09-29T00:53:37.686Z" }, { url = "https://files.pythonhosted.org/packages/50/07/79007d2165f649ea93e08c0962d1d62c70af9cde77965255095bf9d96f9a/librt-0.16.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ca8052401c55d7511dda6760719fda7618067e83535d7d0010096d216c34b667", size = 523057, upload-time = "2026-09-29T00:53:39.301Z" }, { url = "https://files.pythonhosted.org/packages/61/0c/8fbaff66d0ba376d8864653f5acce1569bae27e89648671f26f7eca67ab8/librt-0.16.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1e511762a074005bb0aa569166779834e75e438370226930d0ce1866d4b6a33b", size = 515158, upload-time = "2026-09-29T00:53:41.012Z" }, { url = "https://files.pythonhosted.org/packages/df/2e/23ff0dece76f07a4124413a57682efa0bbeb5765ac0122bc0955513f82ca/librt-0.16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f1e8591bd8a5a628cd7f07954c6a1592359a878bf032957a8e9057a41d644311", size = 534183, upload-time = "2026-09-29T00:53:42.451Z" }, { url = "https://files.pythonhosted.org/packages/26/c4/e11dea21d9a29486eba78887380374189d472734fa32cc50cb37ca44d3d0/librt-0.16.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4aaefb4ba6c07e1aeebb2795c8958148f1d6f9af3b555b53d23d766edb6d67a", size = 540663, upload-time = "2026-09-29T00:53:44.272Z" }, { url = "https://files.pythonhosted.org/packages/44/75/e873ae158a8b7f5359be33e7fd6c1fbe02d9a78a3e89a77de6b0e837f476/librt-0.16.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:d92db7a0f6aee44f1baee94750457e8d2d1c6ccea41842de6268d34e8dc7eddd", size = 545908, upload-time = "2026-09-29T00:53:45.812Z" }, { url = "https://files.pythonhosted.org/packages/ba/36/8939d3f6a93e11bd9592e6fe28d2b44f1c2dc4bed6e22e72359a91e18ffb/librt-0.16.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:378dfaffb38e59c24a87cde5713cd865d51ff7383fa12947f3907f306ea1ca55", size = 523302, upload-time = "2026-09-29T00:53:47.596Z" }, { url = "https://files.pythonhosted.org/packages/71/14/35309f44a077f0f42ade0e2e7cd88c0cea760c661af205c01ea90d3c0e1f/librt-0.16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3e0c39bdc85370422e8b637be76eb1fd07d30967551b03e62267dd156f553152", size = 565911, upload-time = "2026-09-29T00:53:49.278Z" }, { url = "https://files.pythonhosted.org/packages/78/0c/df6255b94967f3159ebc46f08d8e783c12da6ee269ddb74b2efed63c640c/librt-0.16.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:1b384b90ab79a7bc30b566895809a636e0666f21f3cf12b54823d025b7e83839", size = 79119, upload-time = "2026-09-29T00:53:50.938Z" }, { url = "https://files.pythonhosted.org/packages/6b/44/d30d5a5461378c9d33f36736c6791c3b4c4ba4b1ffe0da7350aedcb2c9a0/librt-0.16.0-cp314-cp314-win32.whl", hash = "sha256:52327da75a94012e7f932f913d20d3876bed3c102be00e6c3e8600ff7bdd58a7", size = 100140, upload-time = "2026-09-29T00:53:52.205Z" }, { url = "https://files.pythonhosted.org/packages/c2/98/769712f356a1e897df3581bb0c3100375d054a000de26099360ea65b5111/librt-0.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:3f0b8114c44b2ac06ff5dacd08e07e8e807ff4f46083f2a1602685122559be41", size = 120464, upload-time = "2026-09-29T00:53:53.495Z" }, { url = "https://files.pythonhosted.org/packages/bf/d3/ae2abccc8bdc8b063c1613a77686e17b74e9d3d60cfe6f12c63fa2821b9f/librt-0.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:8caf96a4ef8fb27d0ac0d1ad8337d26a240acd4a02fe4345d0a8f264753e8f99", size = 110889, upload-time = "2026-09-29T00:53:54.817Z" }, { url = "https://files.pythonhosted.org/packages/e4/26/0737d4be058dd6376eade7dd8b380d4b869b6394cee929393a5a431c45bb/librt-0.16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:953107e2f68d0f3512c48f898b0dbf0ce5cc52bba0f318d847c985dc555ee4cc", size = 159838, upload-time = "2026-09-29T00:53:56.22Z" }, { url = "https://files.pythonhosted.org/packages/01/96/9bc96531d7c620e9949af904470f02e3fa8f35129ab8e8f281c51eaa3788/librt-0.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad37d5b9abd49c9a655dcda7ea52a8a752884062ef1ee71ae17c2f2a0f81fe6a", size = 162018, upload-time = "2026-09-29T00:53:57.532Z" }, { url = "https://files.pythonhosted.org/packages/0e/fa/b0289dcb186eb3f97221ba00da5f4bd3ba7fa5e99752d48aa8d336615334/librt-0.16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c4aa329c17bd1aaea4f6e89335d8ccd494b3a5830b6654462273e50e11023f0", size = 703983, upload-time = "2026-09-29T00:53:59.024Z" }, { url = "https://files.pythonhosted.org/packages/d9/ab/05ebbbde7530fc5eeb58fbd1581522a9f64f132fa703c4c595eed6e14760/librt-0.16.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0ead24d2562a49473dddd9efef8581f020007eb0054389c3ee3ffad38b1ca4c9", size = 683847, upload-time = "2026-09-29T00:54:00.671Z" }, { url = "https://files.pythonhosted.org/packages/a3/75/f52aeecd4dbadbddf80725ba7de126d8bd5d0eb66247eae17a81ed90dd4d/librt-0.16.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:02118f56a9c36ddd07dfd9b919d9ecc117ba20a90987d56aa4c429fa34509188", size = 698045, upload-time = "2026-09-29T00:54:02.247Z" }, { url = "https://files.pythonhosted.org/packages/e6/55/fa277a835cd6eb42380591ceb85f48c5b4d2b2d7e2cb9869e1e17d24d237/librt-0.16.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4e29522c62e28595ff7e324c6834ade51127707f0e255b18d1c1cf03d39c1048", size = 724640, upload-time = "2026-09-29T00:54:04.078Z" }, { url = "https://files.pythonhosted.org/packages/25/e4/2cf64354f3fde8ebd591b3b48f96510bee24ac5f7d1e567adbbe210abdbd/librt-0.16.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ff4b2367926b69c6215635902cccb04048e73094e9862900d27cb2c6bbff143", size = 731748, upload-time = "2026-09-29T00:54:05.741Z" }, { url = "https://files.pythonhosted.org/packages/f8/c9/c180af3e94e01aa529fa93d7733fec2abc47f222345400cf21d5481d5f8a/librt-0.16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c6f1b27bf1632a7e016af9f145f82be95e1edd7721a646505c21059257cb5a04", size = 754960, upload-time = "2026-09-29T00:54:07.38Z" }, { url = "https://files.pythonhosted.org/packages/95/d6/01073aa78c58f356b10d9c57b3fe9abb143df338142bcd316df417b89db0/librt-0.16.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:5696d7f52e7b37217cb3a8f92c744fe835942602fdd4c1a8bc4741d3bfdce15e", size = 747000, upload-time = "2026-09-29T00:54:09.06Z" }, { url = "https://files.pythonhosted.org/packages/f7/d8/1de3783908658d697a8cfc00582f61299ffba7796d7260c112e4700b1109/librt-0.16.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:6072e92dd876ff6ceeb6cf371e35e51f479349837391341f479b08df4564242b", size = 749569, upload-time = "2026-09-29T00:54:10.702Z" }, { url = "https://files.pythonhosted.org/packages/b7/32/e817f66c96d6caa8bb8435ff93c4c220624d59efc506be59ab98fcd01d0c/librt-0.16.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:39ca4f2f2fe05de8e63493da592d84311adabe5bef52b193851981da9816b302", size = 729483, upload-time = "2026-09-29T00:54:12.25Z" }, { url = "https://files.pythonhosted.org/packages/7c/c9/23992ccd2b9d22798fdd0f61353183a47414e651da782ad83eb680f50833/librt-0.16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9807485a908f00355820f18e91e045ffdcdc5adb68aaec40a1e2b88c5f7bba1", size = 776584, upload-time = "2026-09-29T00:54:13.837Z" }, { url = "https://files.pythonhosted.org/packages/67/3b/e8af957f08e6e2e8e566b099e43d2748418aa565df6ee1d9d3331209fdfe/librt-0.16.0-cp314-cp314t-win32.whl", hash = "sha256:94be5cb7bca4df6201f4183e9e4fa2086c655283d20b38cd84500a69057575a7", size = 104402, upload-time = "2026-09-29T00:54:15.568Z" }, { url = "https://files.pythonhosted.org/packages/ca/1c/946e6443d7cd32347a086043395e421e52fd603c9163d2ec970ceab8eed6/librt-0.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d46ca272b251d033dd4527b0dec5f261a28a52bd5fa0f99c117b0a1f8588cc2d", size = 126227, upload-time = "2026-09-29T00:54:17.165Z" }, { url = "https://files.pythonhosted.org/packages/c2/a3/bc4f9959d3c62bcbf9e5fd3470a8bbd8bf33224ed4c25d7fba173201b8ac/librt-0.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:b9d6d4b14e92d876f8026b54c20c445f36425214c1081dc76f74e40db386b82b", size = 116493, upload-time = "2026-09-29T00:54:18.567Z" }, { url = "https://files.pythonhosted.org/packages/b6/4b/10fdb42dfab4c1533e1570e686b18e86ff4328b406361b39fb3016667638/librt-0.16.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:6fe436af2eaf630474f491af5d032cbe45f93fcff5c3b9fe4ab194a7255b20ff", size = 149829, upload-time = "2026-09-29T00:54:19.933Z" }, { url = "https://files.pythonhosted.org/packages/8e/30/a90ca13f1d3d91af1680000a4038536907018fbd51764767287a05d28b8b/librt-0.16.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:8ff5d26c529336be9bd7ae04483235d77778ee7d6444a95353102b542601ce81", size = 154522, upload-time = "2026-09-29T00:54:21.306Z" }, { url = "https://files.pythonhosted.org/packages/5c/dd/bcf364eacfa070bb1fc88d503111ae7177914197ba1fa717c748926e7930/librt-0.16.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:909d8e3c1faee44cb762b1c519ff8613dcc5ceae5c99987a00917b5a31fd1d6a", size = 497593, upload-time = "2026-09-29T00:54:22.798Z" }, { url = "https://files.pythonhosted.org/packages/18/c1/2c4e81e347bdabfe8346bfc6dc37ae5e154d61c88e30848ec0606025a5e0/librt-0.16.0-cp315-cp315-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:6d4a64283ee61824b5790de882bc68e2d9d7a5143537cb7a966f7354f71646d4", size = 480459, upload-time = "2026-09-29T00:54:24.364Z" }, { url = "https://files.pythonhosted.org/packages/ab/d7/fef2a3cb8400701be496f6e459876f650b3451f407e30cb243de571ae615/librt-0.16.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5810ba811297fdf37a1531a57667cb8ace0842013ca8606bf9eb7c24cf4be154", size = 507814, upload-time = "2026-09-29T00:54:25.997Z" }, { url = "https://files.pythonhosted.org/packages/e1/6f/53762927a32e9dc9eb1d1c1f3528da281290c86d96929a8af652f671266e/librt-0.16.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e56aaf8c167548dc8e5d6f3bd0f48dcdd299a23c73be3f744aab79d99e9c7f5d", size = 525114, upload-time = "2026-09-29T00:54:27.747Z" }, { url = "https://files.pythonhosted.org/packages/6c/67/0b9d031f303c4e8c691a9a8ef9d272f13b530c11cc563b819df621b6a348/librt-0.16.0-cp315-cp315-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f36c58e33b304b525c6c9c5076399c6ebf1109e17b9051a05a407b091b9215b", size = 520465, upload-time = "2026-09-29T00:54:29.331Z" }, { url = "https://files.pythonhosted.org/packages/ae/d5/2056a3a85864e882eb17a203a10ddb26fa748bc9718ec67e79059ab46cae/librt-0.16.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:242e00b3d4fa37c3d3c1ca5f5c9adb7d909ddb1eac9c41f2787320d00caa0af2", size = 537257, upload-time = "2026-09-29T00:54:30.915Z" }, { url = "https://files.pythonhosted.org/packages/54/57/e0d79790c163cbc0909e209a6f62e30bb713b647f905a176cdc64848fd4d/librt-0.16.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:0253721561787b8df8443eb347b7a6461015354e5bdd37ee38a41fef220d2bb0", size = 527442, upload-time = "2026-09-29T00:54:32.478Z" }, { url = "https://files.pythonhosted.org/packages/aa/50/1c0c95aba7af51f4752ea34fbf2eb79b36e7cae3a72536248e8c735de735/librt-0.16.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:3e483a8d69ede8067db70c0e83007423b6925de6fd53afed01d66160f2e9398c", size = 548139, upload-time = "2026-09-29T00:54:34.183Z" }, { url = "https://files.pythonhosted.org/packages/98/91/a8a43dd5138d4f55f88846b8f0c85454a4fad69952cebfcff9948f831290/librt-0.16.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:69ba927445cfaaffb4081003ef5224c55a5c2ab67ef956f416ef744916e44121", size = 529708, upload-time = "2026-09-29T00:54:35.761Z" }, { url = "https://files.pythonhosted.org/packages/2d/41/d5226881ab2b7c20d9d587b37bdd4a0ec8775a96d00ca87ac9f385587db4/librt-0.16.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:d6a365f2ab45a984d0e00eee0dd17f599ceab8cadab6ea07b6111c8132fc0e42", size = 567781, upload-time = "2026-09-29T00:54:37.409Z" }, { url = "https://files.pythonhosted.org/packages/bb/bf/2345ba57a626e8c78c4ddcc724636a8df5a593fe46c1ee76bbf477e32b0d/librt-0.16.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:f01f3805f2dae4781c0c34b440e31740d082950bdaf89a6f601ad589a28af57a", size = 79177, upload-time = "2026-09-29T00:54:38.792Z" }, { url = "https://files.pythonhosted.org/packages/1e/40/99e77936cc9207f629b077bf7cbc5e2f0827cddd7c29792f04ef881bd2c3/librt-0.16.0-cp315-cp315-win32.whl", hash = "sha256:b0e3e721c75d2e79a76d4422c79d7ba705fe1bbafec907037fe7a657a480a0e3", size = 100127, upload-time = "2026-09-29T00:54:40.251Z" }, { url = "https://files.pythonhosted.org/packages/56/1e/801fe26bc622061b9dfd010e166d94142cb774b733217e6d98d1c0cf2638/librt-0.16.0-cp315-cp315-win_amd64.whl", hash = "sha256:bc02954b1295de798bbdb0b4e2d8a28c2117de8b5c73dcbeb27dc32572dfb971", size = 120480, upload-time = "2026-09-29T00:54:41.722Z" }, { url = "https://files.pythonhosted.org/packages/bb/a9/d533983055bd36e112627384c2c038845d1df882540b8bcefb566475640b/librt-0.16.0-cp315-cp315-win_arm64.whl", hash = "sha256:c5db585d43449a5f54303d4b2774e45e1babd975cfe1630a3d708c0b80c3e560", size = 110915, upload-time = "2026-09-29T00:54:43.052Z" }, { url = "https://files.pythonhosted.org/packages/55/fe/d62238fa9c653b0e0613290349467cb65711b5800e8e474f45e942a0ad95/librt-0.16.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:f06c689cb14afd9b612727553a5ec5a40febf113ca41c4413a2b0b334285884b", size = 159714, upload-time = "2026-09-29T00:54:44.497Z" }, { url = "https://files.pythonhosted.org/packages/f3/ac/f31efe7818700be72ba4f9af8a80fa67c39808c8d26dacc55dc1f6f35172/librt-0.16.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:13b4e8aba90b0b1c82474e9844aa9ffe7ad3faa484350e1da64cb8188d903134", size = 162086, upload-time = "2026-09-29T00:54:45.968Z" }, { url = "https://files.pythonhosted.org/packages/d9/16/4d7487bf86a9d7e8e18f37ba5538789233ea693637379b75701bd35ec9de/librt-0.16.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a269c46ae327d8e6f8c1f85f7516cb52c0fa48127565a1105a4f4a05ff2a0b4", size = 712727, upload-time = "2026-09-29T00:54:47.486Z" }, { url = "https://files.pythonhosted.org/packages/77/74/50cd550ccc1a517b9ed62347625c01ddf8c4afad66490312677c011458f6/librt-0.16.0-cp315-cp315t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a33e0dae1f8592146a4764d54ce842b278732d21a84e17c3bbe6b1bc158a2248", size = 681106, upload-time = "2026-09-29T00:54:49.126Z" }, { url = "https://files.pythonhosted.org/packages/df/5d/7293f712975ee6fdd2251411fd9ef1c62bc99c7b83ecbe62dbc999b1fab7/librt-0.16.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:47ada6ea32636492c61aa8ad27ae3b9404bfe7a97e3ba946d1984236cc741da0", size = 705921, upload-time = "2026-09-29T00:54:50.905Z" }, { url = "https://files.pythonhosted.org/packages/67/f7/8aab946f11d59d1bece9ffc65d994b200c789a8ca5a95c17e17e609f912a/librt-0.16.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43bd6e642d8a248c114327f98dd25ac5a7cb5aa168ef02f0559b91874df16b8", size = 731786, upload-time = "2026-09-29T00:54:52.584Z" }, { url = "https://files.pythonhosted.org/packages/43/76/1c42ab31e7cb8384ebf6d3af607213c495222474f4940443ae7639ab7685/librt-0.16.0-cp315-cp315t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c3d1bb7841a816ace6449bb26d3f9560dbfa20e71c568d23f0f62bf1e68f50b1", size = 744964, upload-time = "2026-09-29T00:54:54.217Z" }, { url = "https://files.pythonhosted.org/packages/6f/2e/4b19982d933d2dfced671e840b219e4c1cd3f507df6e6dabb51bbd4e3850/librt-0.16.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:3931f7a3db322e7f44e02a280e3949326ce9579ad388ee8d691dc7c76da9fb70", size = 765305, upload-time = "2026-09-29T00:54:55.815Z" }, { url = "https://files.pythonhosted.org/packages/b8/1b/e872583de2dcb3ac7746e7a2321aeeb168274f3952a87dc66e05ddb29faf/librt-0.16.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:f4462528b6000afe8f16907b5c7c2553abf1df005ba5140e6eb394541c3624c3", size = 744959, upload-time = "2026-09-29T00:54:57.532Z" }, { url = "https://files.pythonhosted.org/packages/10/de/a18c6bcfb297af2674233e90b3c3661c3a0af0f1434a0c966d2ef708a835/librt-0.16.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:80039ba9b6a7d5f1a0175a4cca6bbefead87bd854c80abad1cb30afe47a830db", size = 758138, upload-time = "2026-09-29T00:54:59.484Z" }, { url = "https://files.pythonhosted.org/packages/22/1c/0df1d732539c297bb1a093e1fe3204d2faf76a9022cf4e1d1c2fce059790/librt-0.16.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:7a1d272724b581bb6bc769dfdafed6da2ecc9886ba2450311de55a4ac2e1e9cd", size = 744268, upload-time = "2026-09-29T00:55:01.179Z" }, { url = "https://files.pythonhosted.org/packages/a2/f7/ccaf31331f20c91a5bd9bd48ffc3f743f9c81bb5720cc7b2a720ca204f0a/librt-0.16.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:fbe4fb8c5445f7496d7f7f6bb0807875d09d47e6771ffa175fb2df2895fb86ba", size = 785783, upload-time = "2026-09-29T00:55:02.938Z" }, { url = "https://files.pythonhosted.org/packages/c1/ea/7421d9e6db894cd6cd788b604b3394a163ded6b942052b6f96c23ccf08e1/librt-0.16.0-cp315-cp315t-win32.whl", hash = "sha256:375bfe6b572a8f6cfc398709356046173bf27e64c4c5edaf5f7062f051fb4bf9", size = 104355, upload-time = "2026-09-29T00:55:04.533Z" }, { url = "https://files.pythonhosted.org/packages/85/6d/7c31a506eb847bc58aeb2402d58e17605e821f68ab5df5e66fe274a6df41/librt-0.16.0-cp315-cp315t-win_amd64.whl", hash = "sha256:bd3150023d3dc2bc70f3784e59ffa1140d56ddba3d8125b3d6f9f85221279bfc", size = 126134, upload-time = "2026-09-29T00:55:06.017Z" }, { url = "https://files.pythonhosted.org/packages/36/69/7a5d10ac409c4da0355e054a14371871da9b5557fcc42772cd00181c6cce/librt-0.16.0-cp315-cp315t-win_arm64.whl", hash = "sha256:8ceafb70f2a4f0826f11031942e59c0728fd98da112dc346d4352bde1e486866", size = 116391, upload-time = "2026-09-29T00:55:07.484Z" }, ] [[package]] name = "markupsafe" version = "3.0.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/38/9b/e422a865e1d5d57d0e509b4e0bf1c1a70a7f6382c29a5aa428df994c8bc8/markupsafe-3.0.4.tar.gz", hash = "sha256:2e9ad7dd851bf45fab9f75cbff4cb493fee9979e8d8c7c9c3ee119022518edd6", size = 153777, upload-time = "2026-10-02T23:07:22.29Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/32/55/18dbb4778b30ada5ce071608503cc3edc9e14e13d868c17a6d178fc30f7a/markupsafe-3.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e25feb9e330b63edb0278a0acdf85e50d0cb0fbf49c3084abbe4e24ae195346", size = 11520, upload-time = "2026-10-02T23:04:36.299Z" }, { url = "https://files.pythonhosted.org/packages/6c/14/0b05f79b4733e264a18d08fe08fa1df7347630ff32a6cb82180d9dccec55/markupsafe-3.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d3391b2188d18737cb2fa147028b1096236eaa7e156446c650a489fa2cadc91", size = 12063, upload-time = "2026-10-02T23:04:37.291Z" }, { url = "https://files.pythonhosted.org/packages/ca/3a/63ba10b6c1463216b3e4df669a9f0e5a3b0c3071557d2e8229e3968c79fb/markupsafe-3.0.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:849dd2bb0e5e4ab2b71c7191726a4a8d5aa8a610daa584728cbee0b710ddc4ef", size = 24321, upload-time = "2026-10-02T23:04:38.262Z" }, { url = "https://files.pythonhosted.org/packages/1a/2e/5f015261b76ad633d187ef6f388b413aedd64a8773c4df59e530a0be5525/markupsafe-3.0.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:befb4158af32106b9a93db8d6d1d1cbbd418c0d5aca0cabb7b1780abf0c89169", size = 28845, upload-time = "2026-10-02T23:04:39.295Z" }, { url = "https://files.pythonhosted.org/packages/33/cf/26e594b26be40c2f1fec63ccf8a8b99d0335a5b2cbe84835c7d82a994375/markupsafe-3.0.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71f88e749ea29f67f21f3b36433c1dc54c7729ed2a6d9e2da2e0d9e0d7b224eb", size = 24701, upload-time = "2026-10-02T23:04:40.348Z" }, { url = "https://files.pythonhosted.org/packages/81/a5/a513b76c139a3915b43404324e55c0b7979ae4f0d39eb6f075b0282e90a8/markupsafe-3.0.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6da83a088f8ef93b2d483a8232a4dbf4d69d3d8496b568a03c56becac43e1808", size = 22961, upload-time = "2026-10-02T23:04:41.372Z" }, { url = "https://files.pythonhosted.org/packages/46/cf/4c66192c100b4542bcbe392ae06696b670f66927be3ac38a213234778ff9/markupsafe-3.0.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f0fac8b13d14bb06c68195f849371924ae53dd7b1c00fed24650f704383b692", size = 21920, upload-time = "2026-10-02T23:04:42.429Z" }, { url = "https://files.pythonhosted.org/packages/cb/17/ac3662678bfbad649893117ada2ba44dc30bf56884e84f13154a792b10f1/markupsafe-3.0.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4a7cdc2a420ca01058182da4253329764d4bfa055564d1eced90e6ba1e8b1d3d", size = 23726, upload-time = "2026-10-02T23:04:43.531Z" }, { url = "https://files.pythonhosted.org/packages/f7/af/fe47cee339180a69ebca3c57fb3483d0f5cbd1e8337d1871fb1d9c1aebee/markupsafe-3.0.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:83b3944fea42a8400edf92fd1770fb8d0d4f7de651353bd2d8525a92dba69a21", size = 22539, upload-time = "2026-10-02T23:04:44.618Z" }, { url = "https://files.pythonhosted.org/packages/12/32/d55440ba140442800e02d799c9cb5ab597bf6ebdb1177b5ea39a11f797bd/markupsafe-3.0.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8138eb83940ec7299024d92d4dee45f601b9e6c5ffde9d25f4e35e326203c707", size = 23963, upload-time = "2026-10-02T23:04:45.656Z" }, { url = "https://files.pythonhosted.org/packages/50/9d/9c86042cb364c2ad4c971e6d1247929effd25f714cd7ee11b05e6316445b/markupsafe-3.0.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:811d02d5122171c1941357efd8f9bf4ffe907b7f0a1a4e729a880e4be3f46e3e", size = 21506, upload-time = "2026-10-02T23:04:46.671Z" }, { url = "https://files.pythonhosted.org/packages/75/ef/5b824f03ba40c3b3652b6272d083d2fc4fcdd440de519a3a39ba2c3e7262/markupsafe-3.0.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:50b5bedc9ed8a94fc8857a42ef4f84a81ea88f8d4f05dc8705fb23ee6d8dcca7", size = 22955, upload-time = "2026-10-02T23:04:47.698Z" }, { url = "https://files.pythonhosted.org/packages/1e/e8/44cfcb5ea40e5e43cec7793ef90704ed0c475280839076c4345757eb8e59/markupsafe-3.0.4-cp311-cp311-win32.whl", hash = "sha256:2e5a7cd7fdd14fcb1ae5d7d8bf23d24fbd1daefd1fbca2580132e1ea75f098b5", size = 14094, upload-time = "2026-10-02T23:04:48.788Z" }, { url = "https://files.pythonhosted.org/packages/91/89/f2b509f7bf79352e40117824c1070dbeafd4df67031d3fa98165a3134228/markupsafe-3.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:fdb4ca07ab75ffadab4a8b135ad59cdbb3156b99310f3d565370da74a15d6bd3", size = 14328, upload-time = "2026-10-02T23:04:49.801Z" }, { url = "https://files.pythonhosted.org/packages/2b/5a/ccf22672a0f64dc682306e288f0dabcb06c7a201f3bb6e6cbf86d9e8ad03/markupsafe-3.0.4-cp311-cp311-win_arm64.whl", hash = "sha256:569d65055d367e3dcdf30c3f41119467b73d9ee9faf332bdf40402644f5ac08e", size = 14188, upload-time = "2026-10-02T23:04:50.847Z" }, { url = "https://files.pythonhosted.org/packages/81/09/4c59d56b8461ae8eb0d8ba34bb25b7e618547044679d58a82ef9b2479fc1/markupsafe-3.0.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:61631e08084be9e21a8967ec3139c7616ed7c5e9368e05c86d1b39562c8a57b6", size = 11658, upload-time = "2026-10-02T23:04:51.876Z" }, { url = "https://files.pythonhosted.org/packages/a2/f0/d6613774d86fbf6d145751d43c59875e47a6f9f17daee0aef173bd36d90e/markupsafe-3.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0930db9bdc62d22944e10b066448bb65dc9abe9112880c7cab8da54db4284d5f", size = 12050, upload-time = "2026-10-02T23:04:52.931Z" }, { url = "https://files.pythonhosted.org/packages/0d/f2/8f18e0b806eb13c1f8d07d917a720831ead54253a6dec011fbc78098a6f8/markupsafe-3.0.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a45c3d514f2436064db00d7fc8778d888f0236ebfed649b53d13a59e69ad51b", size = 24363, upload-time = "2026-10-02T23:04:53.895Z" }, { url = "https://files.pythonhosted.org/packages/60/ce/fa07dbe8a5675558fa36dea033e19995bc783de2dec5f540ccb9030b06aa/markupsafe-3.0.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1e1451fab512d1bcc3dc26988ec1edb0b82c2db909132872cd9356070a6b63df", size = 28525, upload-time = "2026-10-02T23:04:54.905Z" }, { url = "https://files.pythonhosted.org/packages/85/40/be87c01f3868ec217f8a2015089d71c22c8c5a75324822e5ed1cdd87210d/markupsafe-3.0.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bd3ce56ae2cbae3ba82b683bc425cd7e48d2ed8b10f3e818186b6f5646d9271c", size = 24733, upload-time = "2026-10-02T23:04:56.229Z" }, { url = "https://files.pythonhosted.org/packages/4f/a7/aeedb5140afa41fc74c225e9184ab96723a6e873b6ee1c9fede7283456d8/markupsafe-3.0.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e124f974786f831d6043728e38296969d3579db8896fe004682f5758e613581", size = 22985, upload-time = "2026-10-02T23:04:57.521Z" }, { url = "https://files.pythonhosted.org/packages/c3/fc/e91352bb08c6a59da3ef0909d457bf95a5f5908fbf151b30a06d9dbcfbb4/markupsafe-3.0.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c02e8f18bdedba082cef725942ac823b9b60656db07f7e265cb31618dfd00d77", size = 22001, upload-time = "2026-10-02T23:04:58.597Z" }, { url = "https://files.pythonhosted.org/packages/5d/f8/bffee5e7d2a3deb59748a797650a48af7e672025cf641a79344a771ad106/markupsafe-3.0.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f098115c247e11d138ab83a28fa0323c77015007ea2df73ba5fd714dfefd67c", size = 23793, upload-time = "2026-10-02T23:04:59.686Z" }, { url = "https://files.pythonhosted.org/packages/ed/59/b853d6628ecb4d658e1d637224846d5e9bb4adf4f8df97f3be9f29dce2ec/markupsafe-3.0.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d5f93ebbeb8032d47e349328ec8662d973d9b05a70b3c35df1f91fe419b84749", size = 22640, upload-time = "2026-10-02T23:05:00.768Z" }, { url = "https://files.pythonhosted.org/packages/09/b2/1506df394f0f075797c418d0301498f49e43be194e3ffcb49e6fe6ccf022/markupsafe-3.0.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:64511c54db4e4987aef4c41923235927428729e8174c5dba488429be70a998ed", size = 24074, upload-time = "2026-10-02T23:05:01.813Z" }, { url = "https://files.pythonhosted.org/packages/c7/81/5ed69cda630ac69ef60d06c09ba5a7f84ff66a2e28cf986fd5614ab3c6e6/markupsafe-3.0.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e1a622f13970d81f95d0c72f9dc090dce9085fccfa4c9f2174377ee32bd15786", size = 21563, upload-time = "2026-10-02T23:05:03.239Z" }, { url = "https://files.pythonhosted.org/packages/0c/fe/fb1e79be0fea60aa32602ebefc9c35a82bb42b4df157285ab7dfec12341a/markupsafe-3.0.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9a7f43c0b202b334cc9184af09bb8f21d3a209e038efaf106936fb69e6b026e", size = 23048, upload-time = "2026-10-02T23:05:04.479Z" }, { url = "https://files.pythonhosted.org/packages/c8/52/7632a53360671a9b750cdbabaf9cdd89f18b42248b8e4cb42c0b0296e459/markupsafe-3.0.4-cp312-cp312-win32.whl", hash = "sha256:f0ec3b750b59375eab5b0fb2b9254810c00a3375be6d789899f1055a1d556237", size = 14108, upload-time = "2026-10-02T23:05:05.513Z" }, { url = "https://files.pythonhosted.org/packages/3f/bf/62495e180b7000aaf30000fff849e933f74264638057176cf46852500adc/markupsafe-3.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:11935df9bf455ed0c04eb87bcd720f02b1fe5e02128a9430f23aed6f93336fc7", size = 14303, upload-time = "2026-10-02T23:05:06.538Z" }, { url = "https://files.pythonhosted.org/packages/c5/8e/4c24208776a65878d656996945aacfbfe010d3720d1a98fc0eb8491fc03b/markupsafe-3.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:a4bbd2d87dd233b9fc5812160c3d0ffbe42edc22a26ce0469f58479ede633fe9", size = 14174, upload-time = "2026-10-02T23:05:07.617Z" }, { url = "https://files.pythonhosted.org/packages/6d/18/4bc5ba32499e87bb2b0ef5b3a9bb9c00a131fa961ddf0be548cb550f548b/markupsafe-3.0.4-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:de8b364c423ef0a4bad9069657d617f9a5d2b2062457a89b1fa16ee199c399c1", size = 12786, upload-time = "2026-10-02T23:05:08.709Z" }, { url = "https://files.pythonhosted.org/packages/4e/6f/17f0c099bf25f3e31e63cc19244d9f6af861a9a4ab778c203997903cfdd0/markupsafe-3.0.4-cp313-cp313-android_24_x86_64.whl", hash = "sha256:34bdde374c5932765d7dc685c4a1d191a3207852d67e8e0a9eb6ea85156181f1", size = 12510, upload-time = "2026-10-02T23:05:09.93Z" }, { url = "https://files.pythonhosted.org/packages/11/af/1a141081b905036ee904ec4bd945e1f70b4e1b32d33c4e59e8cf1d58b247/markupsafe-3.0.4-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:6bd9e1788e15bfcf6a9082de42e30387e7b85d211ab21e57a939bb8cfaaf8d96", size = 11583, upload-time = "2026-10-02T23:05:10.884Z" }, { url = "https://files.pythonhosted.org/packages/e7/0a/a89385ae590232622a03e091805cff12f24fabe6c11e0e8bae096cece81c/markupsafe-3.0.4-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:5066b244f576f91afc8ee3ba029a89f99d39c79b1853fe9d39bea9f0afbec148", size = 11801, upload-time = "2026-10-02T23:05:11.913Z" }, { url = "https://files.pythonhosted.org/packages/ed/85/ea548dc013962eb73653124bc595635fbf9e0fa41d1f181a967ccb784dfb/markupsafe-3.0.4-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7a83aa6e4805df46fed18e989d3d16f86ef60cb50bbc8d9ce3a6be89165fbf6e", size = 11443, upload-time = "2026-10-02T23:05:12.887Z" }, { url = "https://files.pythonhosted.org/packages/cc/72/15f2e5ec9cf2eb00d5cdfe968d94e4156a7bd7303832c3f3b2c403a36839/markupsafe-3.0.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2d1b7d9308288661f56672b1b157d75fc536714d3638487bbea17b6318a78248", size = 11665, upload-time = "2026-10-02T23:05:13.829Z" }, { url = "https://files.pythonhosted.org/packages/ca/e0/4030bea613677e333c8a2c901fd405055f657f9d06acba5b7357984b6ef7/markupsafe-3.0.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73e77980c7207854f00fc4e71fb1626868d5740ab4012623d55c7a99ad122a72", size = 12061, upload-time = "2026-10-02T23:05:14.807Z" }, { url = "https://files.pythonhosted.org/packages/f3/a5/28b76a7449eb702966b88bef599e2360b411fbb3afeee8fe560939be06ec/markupsafe-3.0.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7018d4af1cd272e847aa5917983ab5e83e4f6579f9dbfecd4a79c0ca80b144c2", size = 24395, upload-time = "2026-10-02T23:05:15.909Z" }, { url = "https://files.pythonhosted.org/packages/07/6c/21232811afc3a063b5e934b1ae2efda52f46154ec382f585149c020e61fe/markupsafe-3.0.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c90d5b3d4e944e065a301d741b3c1d784f6bd1f503aa68b4967e32b2ba313d85", size = 27183, upload-time = "2026-10-02T23:05:16.976Z" }, { url = "https://files.pythonhosted.org/packages/14/38/6ccdfa5b59049cb36fb80cbc80aee9cf1fc9bb77d1335ad435f2070b08cf/markupsafe-3.0.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:18a801868a884f216e784d7d14db2a4077143ce7610440aee2ce8f734e7cfcde", size = 24772, upload-time = "2026-10-02T23:05:18.209Z" }, { url = "https://files.pythonhosted.org/packages/63/e0/cec6865dfe88cb48fedd4b20aed6af5158e41092adcbf3e028bcc6ec2108/markupsafe-3.0.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:434139499bb20b502ed3baa1f169e618f924a97e7a777fea1a49446d80106cf6", size = 23017, upload-time = "2026-10-02T23:05:19.286Z" }, { url = "https://files.pythonhosted.org/packages/ee/76/6ed4940bb7648a9aac457c14f870cfdd5105f139a0fb1f29cd61fafa47d1/markupsafe-3.0.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9e227f3dbe6bde7491cf0a9965d00b88c6b1a4a95d11480ddf88bb96d397c19f", size = 22036, upload-time = "2026-10-02T23:05:20.352Z" }, { url = "https://files.pythonhosted.org/packages/a1/4f/ed476226d4fe46a09090a36025bf319296810028df55eb12f1253b540f3a/markupsafe-3.0.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b8cd1f918b26fd7b1832ece557cc18f2d8747309ff8b3f0ef9d4250c5ad67a39", size = 23786, upload-time = "2026-10-02T23:05:21.576Z" }, { url = "https://files.pythonhosted.org/packages/9a/35/66ff30450e35ef5fba9ebc930c9411747e537fd9447b65e44f5007e2b84d/markupsafe-3.0.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a5fcffb37e602b0b3c1638a97746b9b96125caa9bcf6fa41d337a9261de231ee", size = 22672, upload-time = "2026-10-02T23:05:22.922Z" }, { url = "https://files.pythonhosted.org/packages/32/0b/72f45ce4b4efcbca4b80cf1b06703eff0be8d37e82abb78f66c85a7ead1e/markupsafe-3.0.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5989cb26b2e1efc6a42216a9f6b5ee495ce5ace2e5b352a9af489976b32d1ee2", size = 24107, upload-time = "2026-10-02T23:05:24.175Z" }, { url = "https://files.pythonhosted.org/packages/d2/03/71776e5fdcba04614b384cc102e8a4198208579d896fd1394cb7cb9aa900/markupsafe-3.0.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:add96447a86d205ab616665d53b2950ee81083757f56e6ea833c8b2917646b46", size = 21615, upload-time = "2026-10-02T23:05:25.215Z" }, { url = "https://files.pythonhosted.org/packages/ab/5f/801ce02a02e7aee0f784b1ec7843026178f6adeb9c93ac67eb1992a9a84d/markupsafe-3.0.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2628d3a8cb648ecebb3c5d6b0a1052d400e4d8b7ac0fb786be8d285b50040d17", size = 23076, upload-time = "2026-10-02T23:05:26.423Z" }, { url = "https://files.pythonhosted.org/packages/4a/85/c43776625428f3bb4a61e8633940400e3efe6409e3c6f5bff26de5e45618/markupsafe-3.0.4-cp313-cp313-win32.whl", hash = "sha256:672d207103e6b16ca098611b0f9efad6bc00afd47c03d6ef62186495ca677dc0", size = 14118, upload-time = "2026-10-02T23:05:27.716Z" }, { url = "https://files.pythonhosted.org/packages/6f/36/163da64de88a13db79214ef75fa041be7fa13bdb42261cf5b7484de14bfb/markupsafe-3.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:1f1f9477e174582b0a1b583d60b66e1f2cf5d3fe12cee985e4aedf44766600e5", size = 14313, upload-time = "2026-10-02T23:05:28.749Z" }, { url = "https://files.pythonhosted.org/packages/9f/a8/9b662783ffaa1149221432a923cee562f78b9cbbb8baa3df9b3753e63e1e/markupsafe-3.0.4-cp313-cp313-win_arm64.whl", hash = "sha256:06de8ef6331f6e822c28d577dc8bf43fe398800477c49498f38fc38b67ff33fc", size = 14189, upload-time = "2026-10-02T23:05:29.917Z" }, { url = "https://files.pythonhosted.org/packages/5c/c3/a944f3b0df22bd129e96915b9f4e98d2eeca6516687d7618304a966c3c74/markupsafe-3.0.4-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:4ed644d75aa94a2baf7ec3a96eaa160ea58c742eb9d27c6506053c5c40fc84ed", size = 12787, upload-time = "2026-10-02T23:05:30.971Z" }, { url = "https://files.pythonhosted.org/packages/d4/d6/a44863f69d88b6c7e27889108f70d47aed259edf89d5df3c5fca1eac87d6/markupsafe-3.0.4-cp314-cp314-android_24_x86_64.whl", hash = "sha256:6d2a9efe686f9de00d0d1ea32a4a5a86d558a2277501bd78d964214eab625e59", size = 12525, upload-time = "2026-10-02T23:05:32.263Z" }, { url = "https://files.pythonhosted.org/packages/17/8f/168ba80e532dd6a93f96f8f706f1ad41d7990b6e1aeedc1cc0d211a33497/markupsafe-3.0.4-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8781a792a070cf2bd1b86d3aa943894115faaba6e88122a7bf32d62072742453", size = 11589, upload-time = "2026-10-02T23:05:33.251Z" }, { url = "https://files.pythonhosted.org/packages/32/b3/aa2c95a574d3af39403a469b295886eb9b6d448da568cbebb5a2cbfdc2e5/markupsafe-3.0.4-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:971a3bbb75d97ae4e2e8f7d4834236f86f85f0c85e04ab2e191db1123b04f80b", size = 11801, upload-time = "2026-10-02T23:05:34.315Z" }, { url = "https://files.pythonhosted.org/packages/60/d0/34b810107d83840e768bf485de795893ebbae35b26ab061b487adfa0a692/markupsafe-3.0.4-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:8909c2f1c6dd65e054ac4b573a91c8384d1492281e55d82d159d653f7a13adf6", size = 11447, upload-time = "2026-10-02T23:05:35.302Z" }, { url = "https://files.pythonhosted.org/packages/6c/ab/2f8488f0f817a39fca068d2b17daf446bf5cdb3eae28c3720af534d873b4/markupsafe-3.0.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:4cf3468d5ec187ffffcaca8e61929a37448f215dafc1386a12c750a72fe53634", size = 11722, upload-time = "2026-10-02T23:05:36.363Z" }, { url = "https://files.pythonhosted.org/packages/ad/40/e2d117b048d47282ade906fbfd92814cbee5647afc13fda88a3406039372/markupsafe-3.0.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:52704c5d36eb6dda8866493decd61111fff86244c9b1ad225ca01b9e91e5970f", size = 12061, upload-time = "2026-10-02T23:05:37.397Z" }, { url = "https://files.pythonhosted.org/packages/9a/a8/73a81135e85ba66217f5af7facb03bbb386807e1a729ab64532e4c802652/markupsafe-3.0.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1caa2fa5a6184fb233153b35f654e6687bd555476f6170f29d8ee9be1a8b0af9", size = 24434, upload-time = "2026-10-02T23:05:38.407Z" }, { url = "https://files.pythonhosted.org/packages/ac/ca/fa9216dd01efee2dfdacafe7df32b4d0170fbac694b0c258a193d6e53999/markupsafe-3.0.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:387d8cd30e69b3f0a72877b9ae717033396404e19095b17fe89753a981fda44f", size = 27183, upload-time = "2026-10-02T23:05:39.581Z" }, { url = "https://files.pythonhosted.org/packages/fa/4e/a469509e538d37af51103b17b073126973f2b1cbf197ff32c7ddf025cfe5/markupsafe-3.0.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:051417f74bcaaefa316276e0ff723f541616ca51043d070da00249d9bddd3e3c", size = 24813, upload-time = "2026-10-02T23:05:40.671Z" }, { url = "https://files.pythonhosted.org/packages/8f/db/d7282caf7ab03af44d5d6fdbaa019b35c7d7f1c90588b839c07cba640d6a/markupsafe-3.0.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8e9f292fcda89b324f2f5c91d13f1424a153e40fc2756f38ee23b15835ff300", size = 23049, upload-time = "2026-10-02T23:05:41.864Z" }, { url = "https://files.pythonhosted.org/packages/30/f3/b6a425206e6964efda6acee544d0eb01d1501784d0b8e2dcc74986f33b17/markupsafe-3.0.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:df1ae86ff54725a01fa1a0510b914ca53a161b7050be74f6204e24aded5971d0", size = 22088, upload-time = "2026-10-02T23:05:43.014Z" }, { url = "https://files.pythonhosted.org/packages/ea/8a/84d3582fc1f0d5bd466cdf2eebf175e172158a6e70701aacec1de1b35430/markupsafe-3.0.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8965520ac587c94a4ac48b729be3d8b8de00af39699b17585dfb599babe77977", size = 23846, upload-time = "2026-10-02T23:05:44.098Z" }, { url = "https://files.pythonhosted.org/packages/1c/65/db101cce51b7ba4864ac491a9859d297dd1adf0e55b103fee9db9c47c527/markupsafe-3.0.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:340cbb1957ba99929cbf19a75626d36ba1ae21d1730b287d1cf7f824a20c4fc7", size = 22674, upload-time = "2026-10-02T23:05:45.23Z" }, { url = "https://files.pythonhosted.org/packages/e0/49/ddee9813d71db0c7a5c9d97c832125e6758a0c844777f1cf076569bb0e22/markupsafe-3.0.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:3a93d9616ddecfb393727a0041a562cf0b15a244e20f2bd25efc7949be4c4f17", size = 24104, upload-time = "2026-10-02T23:05:46.398Z" }, { url = "https://files.pythonhosted.org/packages/aa/0e/7d8518d726726870a2399d69fd30d0fa36c5e57a2132c336b58d7c491073/markupsafe-3.0.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d2e56fd3b00222722abfb3f5f0759ddbae4b90811b5ad4343c64030ad1bde70c", size = 21637, upload-time = "2026-10-02T23:05:47.48Z" }, { url = "https://files.pythonhosted.org/packages/b4/b0/b505e8a361ba557dbf3b3aa7331ea39b00d2022a26e925ff8463b9714bb3/markupsafe-3.0.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0d9c47709875fdb321452056622e930c52afbc07a7d780762fbb8b4d91ce6fa4", size = 23081, upload-time = "2026-10-02T23:05:48.611Z" }, { url = "https://files.pythonhosted.org/packages/1c/ea/9cc3cea873f980c75cbdb6f4277ce30ee955de38be0b3d02f14c108e0698/markupsafe-3.0.4-cp314-cp314-win32.whl", hash = "sha256:38fc55594dab834470b6733dead2ee9e3f657fb0608c769dcafa0ba5ab52f45c", size = 14272, upload-time = "2026-10-02T23:05:49.707Z" }, { url = "https://files.pythonhosted.org/packages/80/f0/5792ff768a410f93ee3f84fc19345295ffc352d2c936b424cb37e514714c/markupsafe-3.0.4-cp314-cp314-win_amd64.whl", hash = "sha256:c1bc67752d5f21013cfe430df4062441714eab79f65a6a05e01505957e9c35fe", size = 14501, upload-time = "2026-10-02T23:05:50.788Z" }, { url = "https://files.pythonhosted.org/packages/5f/cf/3d074a8edffcc6899355232ff2543ae8d929733239596423b7db79698bc9/markupsafe-3.0.4-cp314-cp314-win_arm64.whl", hash = "sha256:7e1636da3d8dfc220b6dd10264db5f2b165e4888c4518594898fbe381049af8a", size = 14364, upload-time = "2026-10-02T23:05:51.857Z" }, { url = "https://files.pythonhosted.org/packages/d9/31/87ce42159aae2163cf3bbbd0c44bc87780510eecab1ea3859099aed95dcb/markupsafe-3.0.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:805c8b84534fa10891890f0e4be39f3a99e94615d93e8836bf9fa1fdca2feeb2", size = 11759, upload-time = "2026-10-02T23:05:52.951Z" }, { url = "https://files.pythonhosted.org/packages/5f/53/b047207eeb7752e960aca3eb1df5fb7eefa7dd4c62ac49bb156456c8a702/markupsafe-3.0.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fa95848c929b6a75f6848d3c9793e59db365ee436776e57db835cdbfa79ba977", size = 12096, upload-time = "2026-10-02T23:05:54.066Z" }, { url = "https://files.pythonhosted.org/packages/ee/51/4326c88a13c7b755657d44b4bb986f8c3d9843ecba7e22d98661d87f9a57/markupsafe-3.0.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e916035e3e9930cbdfdd10abf48861340221857f45509565898e012263f7b289", size = 25699, upload-time = "2026-10-02T23:05:55.15Z" }, { url = "https://files.pythonhosted.org/packages/f2/bb/990581b7474bfcf2cf34bed6ba5ea23bd87adb9d671213d68e88620e7a6b/markupsafe-3.0.4-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b4d12837e0203bbace818ff4a7461afdcd78bcd782351cea148139180d7bcffe", size = 27804, upload-time = "2026-10-02T23:05:56.29Z" }, { url = "https://files.pythonhosted.org/packages/6b/89/89491878c28e8291f5aa2fffe2c2d57230d10ae366d55dd810b840513d78/markupsafe-3.0.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5086f9975abb1ab531ee6afca1761e4b59a19b446f3f6522ed776963228cfe5a", size = 25912, upload-time = "2026-10-02T23:05:57.416Z" }, { url = "https://files.pythonhosted.org/packages/30/77/680998b54efdea06fc114565cd739b6d059f826a0279219b218dfa750d29/markupsafe-3.0.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b4a635a0487774f841cb1fb62e907e7195cc95bc761e053184b8acc3ceb20733", size = 23623, upload-time = "2026-10-02T23:05:58.557Z" }, { url = "https://files.pythonhosted.org/packages/ae/75/2709f5ac5de9467b40b10e2bb8f89cc63dfb74582e09aa734b1124a217de/markupsafe-3.0.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb96e6e088d6cf71c1ea977510948320234824cf226e32f6f6e044f7a9c82b34", size = 23301, upload-time = "2026-10-02T23:05:59.94Z" }, { url = "https://files.pythonhosted.org/packages/a0/c8/39eadc6c5b14c9c7679bfb98f4d4c6a97863b5beb91839aca4d2d6e16e55/markupsafe-3.0.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8b5d563170ff8ba3181caa967c99a3c804d1dedb702c7cb93a6a7c32247da978", size = 24950, upload-time = "2026-10-02T23:06:01.289Z" }, { url = "https://files.pythonhosted.org/packages/1a/5e/01037f8a43e8ccb0bffb4fbdc5212db05bf080fdd7286cd392332d58128a/markupsafe-3.0.4-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:396ec4e65cc889f69786b3b89478b471cee5a3bcf468b9d9bb03e1a30fb291fc", size = 23330, upload-time = "2026-10-02T23:06:02.441Z" }, { url = "https://files.pythonhosted.org/packages/d4/f4/23e83ce0596bb0cbe670502d31df8f757bbd01a392aa486fa3b40d1ed399/markupsafe-3.0.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:15ba9e28640feef770374b116a6f019c21f52404aeabe516aa7f800587b98cfc", size = 25239, upload-time = "2026-10-02T23:06:03.579Z" }, { url = "https://files.pythonhosted.org/packages/88/5b/3708897368073cc683d524750474f41a77d2986152c380dcc55b20fdf340/markupsafe-3.0.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d920abdfa61279ba1a2ef9484aab07bf03331f8c08a10120fa332353d06e6932", size = 22767, upload-time = "2026-10-02T23:06:04.699Z" }, { url = "https://files.pythonhosted.org/packages/c6/61/ebda1307864b409e6b3115757a3d4a09cca46cfb6cc65191b5de226b424b/markupsafe-3.0.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a9f54054101545a9a9cccefddf54316aa6e4491611fcbef9e91b3b6bebec04f6", size = 23668, upload-time = "2026-10-02T23:06:05.9Z" }, { url = "https://files.pythonhosted.org/packages/09/15/98075cceac3b5ba0dbb8e4762a847be967d2befc349a2cf2d0ac77f62c9d/markupsafe-3.0.4-cp314-cp314t-win32.whl", hash = "sha256:12a606a492de952afcb43b59a14aaaaad120e708d3663dd0fdf2d738d427a691", size = 14301, upload-time = "2026-10-02T23:06:07.109Z" }, { url = "https://files.pythonhosted.org/packages/0b/a3/768b560fcc4156685cb563d922b217810cfa7bc135773367f62f1f9d2078/markupsafe-3.0.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a18f38cafc329bac5e3c2b96c765b4c96d3d103421ed22ab7988c1e3fce27464", size = 14526, upload-time = "2026-10-02T23:06:08.276Z" }, { url = "https://files.pythonhosted.org/packages/93/63/da554b4c97a6b0ea3229ca7fe8cbfb620be81613d517f482e85958550537/markupsafe-3.0.4-cp314-cp314t-win_arm64.whl", hash = "sha256:eba154571c16e032112afac0dc2dfe9e63c2ceb7aedd07bb7eecf2ce26d4dd4c", size = 14421, upload-time = "2026-10-02T23:06:09.402Z" }, { url = "https://files.pythonhosted.org/packages/a9/30/54d11c8ca027114898cab97421fb39e4ffd9ddf47cdbc44df2ec76722da9/markupsafe-3.0.4-cp315-cp315-android_24_arm64_v8a.whl", hash = "sha256:737c9c3981998eba27f11786f84fddcbabc74068b72a4a1f454ea02094b57b65", size = 12791, upload-time = "2026-10-02T23:06:10.485Z" }, { url = "https://files.pythonhosted.org/packages/10/6d/97c913e253a14bd3cd0e15a5c56d13203b823fa7ee32498342896a072dc4/markupsafe-3.0.4-cp315-cp315-android_24_x86_64.whl", hash = "sha256:489505b03f692c3f376394e49194fa7a7f9e8558d6e293a7056a0032b0c38163", size = 12527, upload-time = "2026-10-02T23:06:11.834Z" }, { url = "https://files.pythonhosted.org/packages/26/f9/b86d032042a4d597d9e1997f0e5f63a3eedaf11258e0a05760b0a0a826ea/markupsafe-3.0.4-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:077293e425f28ec737dbcad442a71752e28f8ae27cde3d68acd1fb212091cd92", size = 11602, upload-time = "2026-10-02T23:06:13.122Z" }, { url = "https://files.pythonhosted.org/packages/f2/dc/73c14c1eedf0ac5fa3292ba43435e6c49d2c2050f33cebde541f8f4807f1/markupsafe-3.0.4-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9348cbb300d224fe3b89793262cb093504d4ae927004468463f745188a193e4a", size = 11817, upload-time = "2026-10-02T23:06:14.227Z" }, { url = "https://files.pythonhosted.org/packages/8f/69/2c2fcaa5fcee22d72c7819c0d536fd181c74a688e6143845419579cd2863/markupsafe-3.0.4-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:b807e598953730f82e4eae3bd30f6a122cf6b31c398c6b504c0e04c13c170429", size = 11446, upload-time = "2026-10-02T23:06:15.574Z" }, { url = "https://files.pythonhosted.org/packages/88/54/9e5ec76c62e6e2834d5a93623018c943e8b3bb41d663e3fd4c03303b9b85/markupsafe-3.0.4-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:799c39bdf5e2f1292fedd3009f7b3c9e760f10b2420cb9638d56920840ff6db8", size = 11719, upload-time = "2026-10-02T23:06:16.701Z" }, { url = "https://files.pythonhosted.org/packages/96/24/3ec292b44064c16229e064d770b2625bd8ea941aa61f44905a9fa44942c0/markupsafe-3.0.4-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:ae9dcb8fbe244cb82f8a6458b455b927a03685e383d9bacf1ea5ce180b96dc97", size = 12075, upload-time = "2026-10-02T23:06:17.855Z" }, { url = "https://files.pythonhosted.org/packages/aa/85/b64fdb1f304848518742136983c24e96d967bfb59a0ea160e92736901ab0/markupsafe-3.0.4-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bced6e2a6dba6a28f7dd3c6ce14df1b2dd495923f16ea484cad03decd463b2b", size = 24656, upload-time = "2026-10-02T23:06:18.963Z" }, { url = "https://files.pythonhosted.org/packages/9c/18/23997d4c65b355da6390d61cd56e0ab3befd6ba8dda25cb40c602bd0fa6b/markupsafe-3.0.4-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3882fb412298575bae3b9c46868251f15cc69307359f87bb1b382e53d6e5a2c9", size = 27737, upload-time = "2026-10-02T23:06:20.117Z" }, { url = "https://files.pythonhosted.org/packages/d4/36/35998dead3c6af88c38265a56e58100211f036234ab88eb2283fd4cbce44/markupsafe-3.0.4-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:04e7902ba80ee4bac1d50a549606527a1dcf0476cd81403db41099d3b60ec653", size = 25003, upload-time = "2026-10-02T23:06:21.284Z" }, { url = "https://files.pythonhosted.org/packages/82/96/ef49135ce260db4ca4a12b119ed468449cd248db6b1468e2112b546d7a2e/markupsafe-3.0.4-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:925f929d6b59a8b3f8b8c6ac363cd0af7eecc81efb3071770b3c6717c450a369", size = 23111, upload-time = "2026-10-02T23:06:22.524Z" }, { url = "https://files.pythonhosted.org/packages/50/7d/83126e338bd88c17a220668235368ad719fd4638e426739858cbb8508f77/markupsafe-3.0.4-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f68edfc67aabac33708941f26f22a7b8e9f81429bc0cf249fcf7d66b23af8d19", size = 22403, upload-time = "2026-10-02T23:06:23.785Z" }, { url = "https://files.pythonhosted.org/packages/83/dd/daf7e420de23c8206c365204e7b85e1251d8e19d34196a56336f316e5ed2/markupsafe-3.0.4-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:e5c802729725bd07e2bc3ab7b76dc7e0bbfc53129d8f1eb1c002c24cf774717e", size = 24083, upload-time = "2026-10-02T23:06:25.037Z" }, { url = "https://files.pythonhosted.org/packages/19/3c/11eecdc06bc44ad5570350085b572ebf049e8f9a38d1ece6d76640b739cd/markupsafe-3.0.4-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:55ffd6ce583d97dc71dc92e930324c8c0d25aea7e3ade6ae54ef77cedb096811", size = 22931, upload-time = "2026-10-02T23:06:26.328Z" }, { url = "https://files.pythonhosted.org/packages/0d/9e/ac0fd77f2a726e56ecc3ca0235d095feace1358d1b822406c2a2ef26a4dc/markupsafe-3.0.4-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:2cb3dd71fc6be918ad4264346a8ed69485f9b7ed7bf35495d8e22807cd6b8bea", size = 24299, upload-time = "2026-10-02T23:06:27.742Z" }, { url = "https://files.pythonhosted.org/packages/d7/09/c6bd842ad58ff5b3bc76eeed7e9a42a6f11adc5d090ec697b72c9672731e/markupsafe-3.0.4-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:94f5407f7bc64fa6463906b896f9904beeeb7dd8dc116ee8e9056c8714ff9916", size = 21948, upload-time = "2026-10-02T23:06:29.274Z" }, { url = "https://files.pythonhosted.org/packages/a3/46/82f586711fed61e86faa1ee1bc317d68cd45a10c8bdbe3f7d1fdf9026ad8/markupsafe-3.0.4-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:2dad610540cb2e6272855c178f08ae9a1c7ac258a7fb71660553a5f104b42741", size = 23150, upload-time = "2026-10-02T23:06:30.583Z" }, { url = "https://files.pythonhosted.org/packages/19/2d/2dfdce99318abbfa26925195fbc17db188c46a1ec6457be121b6f9cfeb42/markupsafe-3.0.4-cp315-cp315-win32.whl", hash = "sha256:03470d1a8268e692ecf79ecd565593e59d44219377a7ead61f1f1b94c1f7ff6b", size = 14269, upload-time = "2026-10-02T23:06:31.949Z" }, { url = "https://files.pythonhosted.org/packages/5b/ec/6000fd82e8791e58fcd0456ec20f098957e2b03d5ed02eb73241a577c0ba/markupsafe-3.0.4-cp315-cp315-win_amd64.whl", hash = "sha256:d882a373d8093c2941e01291b7ced96e9cbe4781da9a7751ca7e6c70385e5214", size = 14496, upload-time = "2026-10-02T23:06:33.258Z" }, { url = "https://files.pythonhosted.org/packages/bc/66/e73bd5016421d5d6e2fb6de7dd609f9de020942ac8c626526bd8c6eeaf82/markupsafe-3.0.4-cp315-cp315-win_arm64.whl", hash = "sha256:353bd63081912ab8cfa6a0c7d185934cdf8426f04c618bba6bc4b394f2069b67", size = 14361, upload-time = "2026-10-02T23:06:34.539Z" }, { url = "https://files.pythonhosted.org/packages/90/df/cb8c3dc98d313a951df2f8968f44e4cb5643df6d3cab749a530ce2f7d972/markupsafe-3.0.4-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c61750fadcd119d0825bcb7d7d675dd264dcc89cc05292aab5be68ebdbb374ad", size = 11760, upload-time = "2026-10-02T23:06:35.807Z" }, { url = "https://files.pythonhosted.org/packages/d6/bb/4af9b3ca0753d654ac75f9531d5bd741bb77ca6e696f36807c475ffc099a/markupsafe-3.0.4-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:1c0df495a977d10460a94941799c72d5b5ab03d3858d949b55b5a66c8f371c99", size = 12108, upload-time = "2026-10-02T23:06:37.089Z" }, { url = "https://files.pythonhosted.org/packages/3f/d4/b56429313aee5fd59b079c3df5615299959e25e7113eb6d8caadbdd7d38a/markupsafe-3.0.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02fa4acbc6a3fc5c693c34d4dd8c1130b7fe99cc915181b0ddd6f72aeb296002", size = 25762, upload-time = "2026-10-02T23:06:38.419Z" }, { url = "https://files.pythonhosted.org/packages/65/f5/34c181e891aa4f7d59c918584672e0c5eb7fffe76c1387d1246008bf4081/markupsafe-3.0.4-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:05295589e619b9bed252a86b532b8e27350abc372d18ba89b59375325e91ec1e", size = 28400, upload-time = "2026-10-02T23:06:39.819Z" }, { url = "https://files.pythonhosted.org/packages/ce/b5/ad14694fd0ac9a5ce30bc6498f2999378f418583dd1679cca5a1b512957e/markupsafe-3.0.4-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:be6cb0c799abb0e2ba3e618e6d28ddddf7e485f6c2ce938dfa237daf3905072c", size = 25946, upload-time = "2026-10-02T23:06:41.381Z" }, { url = "https://files.pythonhosted.org/packages/d6/a8/26b606445387d0ceb1eb1f21840094b84e4e3c3c3983d80d10b89823b490/markupsafe-3.0.4-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26e9867520db70d37f7fb421a7f0d8adb40171011fb84ce869afa1a83370dfa8", size = 23634, upload-time = "2026-10-02T23:06:42.748Z" }, { url = "https://files.pythonhosted.org/packages/39/a2/b8814de672f1f0094d498bf646f2fec9d6356b503d28ef500b71c5095377/markupsafe-3.0.4-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f03460ff076f70ab595bb45a0205ccea1971443575b6920c52e755dec2b3fbfe", size = 23488, upload-time = "2026-10-02T23:06:44.176Z" }, { url = "https://files.pythonhosted.org/packages/db/c7/287223376fb73335a3cc5d6eb22c6ab01358cf33945a9c39c06b9dac3f4b/markupsafe-3.0.4-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:436e3ffc6310d3c41878c601db29098102fe5d8a467c49da4a4125254e0980f2", size = 25037, upload-time = "2026-10-02T23:06:45.646Z" }, { url = "https://files.pythonhosted.org/packages/f9/29/4df8355e313426d19e62ba33e0253c009ca12a0894ee77d67fa67255361c/markupsafe-3.0.4-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:4e2c4809c14559aa7ef426f27fb35afbb38104c349a903bf8f3600456764bb38", size = 23543, upload-time = "2026-10-02T23:06:47.264Z" }, { url = "https://files.pythonhosted.org/packages/71/e5/8377731e8495668dcc768f645e717df18318c841edaf023a99395f6da9b4/markupsafe-3.0.4-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:da2af0d7aebfc2074080d72efa6ab8317c62481ef1f896f65d9999c1c01f4494", size = 25282, upload-time = "2026-10-02T23:06:48.795Z" }, { url = "https://files.pythonhosted.org/packages/ed/5f/373456e37ceb1478d657d6fe769cbe0a39f0a8dfc1548eeb19c471eefdd9/markupsafe-3.0.4-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:aa2c838cc024642cc04c6854232f32b43e5e22833dd11119c1766c7873b8370d", size = 22993, upload-time = "2026-10-02T23:06:50.31Z" }, { url = "https://files.pythonhosted.org/packages/d7/93/2cbd5628435afb6f541bbaced4bce0c2edac4b09a142e6e928b8b0da9858/markupsafe-3.0.4-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:b91cc9d336957239ff200f30097e6fea2dc6d6fb3c81e853eaa09eac904fd894", size = 23712, upload-time = "2026-10-02T23:06:51.759Z" }, { url = "https://files.pythonhosted.org/packages/81/99/157e10966b033b363aeda5263e82596ee232a0b1d082fdbf90aa417ff083/markupsafe-3.0.4-cp315-cp315t-win32.whl", hash = "sha256:e49fb0d1ce92cfa0cb198cc5b1b11cdf9d0638658e2a2db2687e39db7c87fc78", size = 14300, upload-time = "2026-10-02T23:06:53.241Z" }, { url = "https://files.pythonhosted.org/packages/33/05/55884815414c9706a23deca150b72c25a62109e65b0b6ce232077802c719/markupsafe-3.0.4-cp315-cp315t-win_amd64.whl", hash = "sha256:4f6e0852a0283b1b1fd776eeb7b766a5f440b3e2bd31ab51af3b400585f3965c", size = 14522, upload-time = "2026-10-02T23:06:54.729Z" }, { url = "https://files.pythonhosted.org/packages/92/f9/ecbde7149e95b8a0f18e16d5d747f7dc06049d5da2e4f77f6f5e4a1f46a8/markupsafe-3.0.4-cp315-cp315t-win_arm64.whl", hash = "sha256:39dbacefc411633db5b4378b066a9aca70a3d7e2922c9e578d825f844026eeba", size = 14417, upload-time = "2026-10-02T23:06:56.246Z" }, ] [[package]] name = "mypy" version = "2.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ast-serialize" }, { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, { name = "mypy-extensions" }, { name = "pathspec" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/34/4e/64300736cf0a0373a27b94a91b664ee7382e36f77b0621bae6381da3e180/mypy-2.4.0.tar.gz", hash = "sha256:77bdaebd452f43fcfc4cc3ba94352a3ea537cd01e3f2d0879f48673d2ec00d6e", size = 4064425, upload-time = "2026-10-01T20:40:39.229Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/26/67/e53965e67d23d48e78dd603aa7525a8d77e7818c23954cc217ccde5cd5c0/mypy-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d20e6c7c35fcbf2a0ebdd0eaeacfbc243009dfd33ab7822d54e213912e6dbbd", size = 14315745, upload-time = "2026-10-01T20:39:25.03Z" }, { url = "https://files.pythonhosted.org/packages/b1/5d/a588ccd57625822d8484d7aff4e9c70f88d042a91c2ec84324a2bc14b3f3/mypy-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3011537be6cf1de4511c0255a324362a812b58184bbe61e15f59c8b31033bd74", size = 14465652, upload-time = "2026-10-01T20:38:57.19Z" }, { url = "https://files.pythonhosted.org/packages/05/af/b4978a5566cb829ca563dc08e3ad8d944f116078786ad54ba3dff2bcb64d/mypy-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a96b07a49b7b1d025ce59c1b3acbcf24bead9a83da4523c4a6bde1bb94e7a0e1", size = 15419180, upload-time = "2026-10-01T20:40:27.808Z" }, { url = "https://files.pythonhosted.org/packages/b2/8c/52c71f31c54d0a749d832cc73b933c6e38c52d9b270d5503e031c73723dc/mypy-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7c4f8f8d1d1c0e2832d8ee7113dd08f6df6c7aad9e863fcbed9f25832be0b8c4", size = 15669212, upload-time = "2026-10-01T20:39:20.443Z" }, { url = "https://files.pythonhosted.org/packages/e8/55/ba63121494404fd7d3787ec176ccd02820d6ec125ac4e7c4c0b79f2cc6c7/mypy-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba05652540bf12828e52abae807b024b09ca144ff4f75e2450a81d69c376425b", size = 11299572, upload-time = "2026-10-01T20:40:03.627Z" }, { url = "https://files.pythonhosted.org/packages/9c/9c/385c81b5c0d3a2917f077c4da660d0493f9521ccfd4b058e33b860f72d02/mypy-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:6306086b87cf7f8a29aa618d9fd9bffb56c59247166b9660fdb54d86d7714ecd", size = 10869751, upload-time = "2026-10-01T20:40:25.483Z" }, { url = "https://files.pythonhosted.org/packages/68/ed/e5d7cf4017e74a1c1e1c4058ce8f614fc1e3e7606564f47166e22bfc9f95/mypy-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e05ff2925d8b37ad26c80c1b9dc43ae5d455da2df1e23c24c095a6425917c57e", size = 14378593, upload-time = "2026-10-01T20:38:48.222Z" }, { url = "https://files.pythonhosted.org/packages/30/7d/12d994886a922f0f1997becc9c6625198d61eeb5962558a886af7dd38d54/mypy-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29243242cf72582b65f9582ad9e56e8cb281566ed3519f4cd70bb8b9f2977e90", size = 14464697, upload-time = "2026-10-01T20:39:11.059Z" }, { url = "https://files.pythonhosted.org/packages/f3/9e/bcc9af755425ad17790bf11d73c2ea7592914cf309ee1340997670f9d57a/mypy-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29eb0b9427a6b11b992e452f6cceb8af724f4dceb47e779d0b35e405e996ea5e", size = 15552257, upload-time = "2026-10-01T20:39:56.269Z" }, { url = "https://files.pythonhosted.org/packages/af/0c/3343fc4525d6f00d75ad17a93a9f052d5163641cb8911840d4a12cb59ff2/mypy-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e3ebe2f72a2a1156065a9851570ffbf50c0a93cdccadef9c6e05c508a4fd10b1", size = 15800443, upload-time = "2026-10-01T20:38:54.815Z" }, { url = "https://files.pythonhosted.org/packages/8f/0e/69aac6b8159da7c53e6115a2be1bf48e85503402cadbf506dd708e8b2ad7/mypy-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:236e0d68f6941992b0811128e652590f590db444ab29ad8f1324765b9298b946", size = 11381574, upload-time = "2026-10-01T20:39:49.406Z" }, { url = "https://files.pythonhosted.org/packages/6e/d3/d32ce4feb5993eec09d2024bef16cedc9b93701b1446b86092f08b24491b/mypy-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:82d0f94c8587ccb472622ee7795280aaa38a06640d5f45b3f16909d6dd86a989", size = 10944729, upload-time = "2026-10-01T20:40:15.203Z" }, { url = "https://files.pythonhosted.org/packages/44/f2/eb15183c97c69d7cbfac990a6efd33a19ecfd97dab9e714c742fa78a784f/mypy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7da85fbcff6dac1abcc636707bed38b45598131fb7a605d9719c70b5cc733af8", size = 14213395, upload-time = "2026-10-01T20:40:21.178Z" }, { url = "https://files.pythonhosted.org/packages/8c/b5/ba91b6ff65e4d6b6ff53b2b3b3ac5f1babf0c7c27d0b43a0196b1c967926/mypy-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4209da39d85cf240f762af622d8180fcdfcb4727d021f44ade62d613a1a43324", size = 14373009, upload-time = "2026-10-01T20:39:58.86Z" }, { url = "https://files.pythonhosted.org/packages/d5/c4/484275efc935c0003e55e4e8a33e4b8e99528ee956c12256ece4708f903f/mypy-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be721bd4bd57576193653b75b4af3461c9d0bf7dd8b528f782e9be210dc75bb", size = 15465557, upload-time = "2026-10-01T20:39:01.794Z" }, { url = "https://files.pythonhosted.org/packages/50/30/66eb6fdd0875e3c9025a02f0bb0ea2e524b74274b658c37fde0068c4939d/mypy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1fde197ae65be856a034a91b70ed747a16562ca69577785f06c661548424bf1", size = 15728673, upload-time = "2026-10-01T20:38:43.724Z" }, { url = "https://files.pythonhosted.org/packages/58/bc/2aa98fd7f49c42dba8e9c065886fadffdd00f3c654cff3f2a7103a797ac8/mypy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:295ecf2e57542cd836ca537486951289678c8c7d1ee6ad74ebe29b2168a003cf", size = 11389803, upload-time = "2026-10-01T20:39:37.547Z" }, { url = "https://files.pythonhosted.org/packages/49/41/17b60df2d946792ef6af43b89351f5c9ddabc69053206b2304945572a744/mypy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:bc378bdad4e9f12b5bd96466083d1e71acf00594ec9c7b2bdb5e02816f77f303", size = 10951060, upload-time = "2026-10-01T20:39:04.015Z" }, { url = "https://files.pythonhosted.org/packages/e0/66/924be0b653372ed31ad5c48e26044cc00840e591943a56e61621cf05b60e/mypy-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:058165f564ccf559c68c70fec2091fca5891110480210c22594635e3f6683437", size = 14234230, upload-time = "2026-10-01T20:39:44.535Z" }, { url = "https://files.pythonhosted.org/packages/56/39/c4f176880a4177123576de6cec6309feea8f42fca2bf2f6584e88054f656/mypy-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9fa247e02b505a45a2775f69df38d360d197e3790bc60f717595db9eda358b6e", size = 14392944, upload-time = "2026-10-01T20:40:05.78Z" }, { url = "https://files.pythonhosted.org/packages/bc/1c/26e16977e25ef2494a74f8ffc872a76ec2c3aa43c3156057cbdf88f352c5/mypy-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20e9a5cd875837520c43db98dea0b6d0c2197833d95c30127d8f570fb9b1f00b", size = 15441463, upload-time = "2026-10-01T20:40:32.412Z" }, { url = "https://files.pythonhosted.org/packages/31/9c/9e4b049f0ecefbfd6817ca2a16eea55dd74a07950268edc6cffd29ccfe98/mypy-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9f03a7828cca2b0adcd6662aee8f2711ff8830e1027641fdea3ab0b787483566", size = 15705406, upload-time = "2026-10-01T20:40:34.844Z" }, { url = "https://files.pythonhosted.org/packages/4a/5e/e861b5f6c5ef9ee6cd24683aed1edecf82a26dbd536049f9b7850b586267/mypy-2.4.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:9279488933040b638c0ab739084c0ca100efeea6db581bf5d7628d8e89de53fe", size = 7897523, upload-time = "2026-10-01T20:39:39.861Z" }, { url = "https://files.pythonhosted.org/packages/3a/87/61ffee58b25a956532a6006fae84918a2de849ed25f397492b2e815fe7b3/mypy-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:2106b55105ba5ea9be4f53a24517fc5fa927ff1585edc9bc1a975abb72caef89", size = 11576345, upload-time = "2026-10-01T20:39:41.553Z" }, { url = "https://files.pythonhosted.org/packages/a1/88/a331c20698971c2ce8d1c30f317fd61b5be13a85b1f053e12dfa22ac6568/mypy-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:528c8744b8b5e3ecb8774f86af38d2376216816e9908317ad055f3c9c2d74799", size = 11172062, upload-time = "2026-10-01T20:38:59.534Z" }, { url = "https://files.pythonhosted.org/packages/47/c0/4f7daa73270dced8e86c6f4a911c68082d03a84e6c1ec9bd916028d66131/mypy-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0bb95cf34899e4619c61ab0a8667804e139e580b30d5df12af2102dfe44d0c97", size = 15711208, upload-time = "2026-10-01T20:39:30.597Z" }, { url = "https://files.pythonhosted.org/packages/2f/05/f1afa303c678be24cf7a266d38fb24b3de4599a024c2f9ba0d5905a3efa3/mypy-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:86d616fe84c6eab8026f8c50ab5bcb90db780d2ccd233d971e34e92bede9b359", size = 15935442, upload-time = "2026-10-01T20:39:22.781Z" }, { url = "https://files.pythonhosted.org/packages/9d/d6/6a1a45459b63716e0d035f4892a926d3054f0a8cbfa02551d228a9946083/mypy-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3f86fd1313dd69d013e265f1fdcd12ea7a9d606f9875b2a3db946cd334555f3", size = 17240044, upload-time = "2026-10-01T20:39:32.95Z" }, { url = "https://files.pythonhosted.org/packages/87/85/ae33bee66c13f98d421964d87bf0888be941063bc75c1204a4cf142cf1cc/mypy-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:720434d48542ecfe84d32d287b727569d3fc8f5769acd39051130e490a5c295c", size = 17545856, upload-time = "2026-10-01T20:39:08.827Z" }, { url = "https://files.pythonhosted.org/packages/df/de/eeff209b65c3e267818d79333bb9f058da6e4e73761461bd94748a2eb628/mypy-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:a6e851b82c0661f69f1630fc16172c68787a6a9cf0991e7c6437d60976cdcd76", size = 12369342, upload-time = "2026-10-01T20:40:10.516Z" }, { url = "https://files.pythonhosted.org/packages/2b/43/e62d8d5c1dd737aa248968302ff7d6eabf997c3301773ed8bcb64932ca77/mypy-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:3bd0e340f0ebe65c548210f53be3fd8192e83964760caf0c28bef368e68b0d37", size = 11849099, upload-time = "2026-10-01T20:39:51.834Z" }, { url = "https://files.pythonhosted.org/packages/2e/5f/335b8980055118dc131355155883fb676bb2161a0d97e08658e479c776fb/mypy-2.4.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:afa89837d9be67e0cadfa33bca3bb7efdda98c3b07e74dc3b635ebfb1c8a926a", size = 14241302, upload-time = "2026-10-01T20:39:13.227Z" }, { url = "https://files.pythonhosted.org/packages/18/37/1482fdc49332b145828912b15f16eee0c4ca70a8bce0f6514ece79b14680/mypy-2.4.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb443e81057896132d3642d6be219e6efd158691ac7883e3ba8fcb469865f05d", size = 14408200, upload-time = "2026-10-01T20:38:52.576Z" }, { url = "https://files.pythonhosted.org/packages/04/09/dce2e8f6c1b31053c430ef6963f6f7a38ccb49b90c5e01e37ed0129b7d5a/mypy-2.4.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7f38f57d344f8b6accb40e01c3d83cfc590498231724d16c07ffb7940f157818", size = 15444409, upload-time = "2026-10-01T20:39:18.1Z" }, { url = "https://files.pythonhosted.org/packages/43/c5/91b68306da4cd280cb15be35dbb5ffc343cabd67c4b121b6625bf2d13177/mypy-2.4.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e76172710bd4e5eeae061abfd68347e5264632e02778be61784671ae3a2132f5", size = 15731186, upload-time = "2026-10-01T20:40:23.426Z" }, { url = "https://files.pythonhosted.org/packages/64/71/2d0340182a8f27352fb1e25531355951108b506097c433937e9eec452ffd/mypy-2.4.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:f83353e47ab520bf6fd4df8f5897d9fe081211f2fbc4b7d37736a3e3c166cbcf", size = 7897838, upload-time = "2026-10-01T20:38:50.779Z" }, { url = "https://files.pythonhosted.org/packages/3e/08/32703c117e134c02efa2a82705bb40cee91eaedea10b6530e20eba651b1f/mypy-2.4.0-cp315-cp315-win_amd64.whl", hash = "sha256:970b221ed5842213d98e3c480c08f795ace4b1f81fb21e1b126bd0476bce1c34", size = 11575700, upload-time = "2026-10-01T20:39:53.982Z" }, { url = "https://files.pythonhosted.org/packages/ab/08/08bb269feafdaad031046ee2d771528a64467e6a180f962afc28c4a3ccd8/mypy-2.4.0-cp315-cp315-win_arm64.whl", hash = "sha256:502b94b0b331f7dafe32fd6b151797ddbb4f32385b362e722c783a025e5954a3", size = 11172908, upload-time = "2026-10-01T20:40:12.91Z" }, { url = "https://files.pythonhosted.org/packages/fb/3f/c5c92626006ca92c7686adfbece47fc6a0daa0e54753952a9ad13ce0561c/mypy-2.4.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:c9de622fd397495695d0598ddc789222bfcfec9d7c9ec3a1e385c855e3bc5e01", size = 15705970, upload-time = "2026-10-01T20:40:17.79Z" }, { url = "https://files.pythonhosted.org/packages/10/f3/863365f7997a76a5a1dd42d7902ab05afa4124e8419089cbca1ce2554db1/mypy-2.4.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f459f0b4f0596d9d51fe7716b404b35287b99e77da98a7af90a65dd5fd61141", size = 15942234, upload-time = "2026-10-01T20:40:37.243Z" }, { url = "https://files.pythonhosted.org/packages/f6/30/2f45b1f425a2c95dbe1a3f4d076bfd42b76e9615dba5906230703b14e4eb/mypy-2.4.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9b028548b3af480e2b1ed8df14ccaac86f99c9f600d1580770ab7ba3dcd40f0", size = 17218364, upload-time = "2026-10-01T20:39:06.497Z" }, { url = "https://files.pythonhosted.org/packages/43/8b/5b2bbfc69e84800b78fa2dba16d995b003f93b573558e412c5490d6e6c37/mypy-2.4.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:cb734b2668c1f40d07ce093bbeb4407e9527c67901627b0e1679825be3f09975", size = 17557934, upload-time = "2026-10-01T20:38:46.077Z" }, { url = "https://files.pythonhosted.org/packages/df/c0/1a5dc601c22041a7bbfe1ff71cf097fbbd4fb49930867c6789baf5102106/mypy-2.4.0-cp315-cp315t-win_amd64.whl", hash = "sha256:172e30b8fea631fe310f0c665477f52d9ea40bb4e99e0c81dc30118563b13710", size = 12350955, upload-time = "2026-10-01T20:40:01.52Z" }, { url = "https://files.pythonhosted.org/packages/1c/bc/697e9e26fc2a86c094ad67ee1e419971b7f01ded66ee66231b09e9f3e12e/mypy-2.4.0-cp315-cp315t-win_arm64.whl", hash = "sha256:5786ef987b3767e51aaa53f20aec104c0252b42ecda7aef8e8b4cbae279b05c5", size = 11842738, upload-time = "2026-10-01T20:40:30.026Z" }, { url = "https://files.pythonhosted.org/packages/81/12/46ae8670c98a3cd0286ca5645c2f918f8f6be65edfed81b916010619f668/mypy-2.4.0-py3-none-any.whl", hash = "sha256:d01c5d26a352acc6d5cf3128225477e1e8465e8d3029d4c345807fbf7f3cf093", size = 2800734, upload-time = "2026-10-01T20:39:26.837Z" }, ] [[package]] name = "mypy-extensions" version = "1.1.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] [[package]] name = "mysqlclient" version = "2.3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ef/8f/b9488795d21a76c1520905feba5afb6233f16510797a28b51f2b2688c93e/mysqlclient-2.3.0.tar.gz", hash = "sha256:bea8294964266f6486f1ca514ccfcdbc54d4fe0d32882b38c1d4594df870be8b", size = 102185, upload-time = "2026-09-14T15:38:30.784Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/bd/9a/49c257f71e187f37ec24cc4a7c071b1788a819054ee3b3133332c074b2cb/mysqlclient-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6a691aab1a6d22fb04aa08977ced9ecf0c1c781d0d985f7814972c3626db9390", size = 217316, upload-time = "2026-09-14T15:38:15.847Z" }, { url = "https://files.pythonhosted.org/packages/87/91/cdf42e08f3188ec4efb5e89883afb78cda3db50cd68616bce5814a27b769/mysqlclient-2.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:8b3a5ebc0a2983bc252116dd132ab4c746085fa727b5c98c09edcda09dc09d0f", size = 208447, upload-time = "2026-09-14T15:38:16.867Z" }, { url = "https://files.pythonhosted.org/packages/61/48/5474ffb47d1f27600737ae6b4860fc4bbc17b7e7f1dec9b8b765a75d66e5/mysqlclient-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:effb81eb6d1f1df6c1d95f63f117bec5007e9c64487e9fa17d5696f2a5338358", size = 217531, upload-time = "2026-09-14T15:38:17.871Z" }, { url = "https://files.pythonhosted.org/packages/a3/37/9205f687a60196e77d9bc4dd94fdb3c88a24b5cb920fdaf1acf363791bdd/mysqlclient-2.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:7c3c4b3edcc7dc50d23fb5634e0e82bce8ab7de5b83d03fddc1c9979c18607a4", size = 208548, upload-time = "2026-09-14T15:38:18.884Z" }, { url = "https://files.pythonhosted.org/packages/1d/12/cf11b4df3ee7ca9957487a5e4c99f33611119b086b1d94e14a2ceb21797e/mysqlclient-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:60365cce6765b94eeb621aa0f9505044ec9b4ea191cd68500f0a35b2d6d2758b", size = 217521, upload-time = "2026-09-14T15:38:19.87Z" }, { url = "https://files.pythonhosted.org/packages/6c/ed/4ef9c56dd78a5b6f4ede1574629e532e3f2b97bdd764a6d172fb7ed20fc4/mysqlclient-2.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:a6beb9ca67a9224ff4b45f7f9118f0932038fa38d59ca2e38ae35b5225984d7d", size = 208546, upload-time = "2026-09-14T15:38:21.073Z" }, { url = "https://files.pythonhosted.org/packages/6e/5f/f62d1263a942e97ca34ea8bf151c13a638fea7a5a544aa9db3d6dad7671d/mysqlclient-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:5d4c53eb9c5625dd68b6fed32c8cf00ba19cd1c3073645dec309a9d16bd029e2", size = 222543, upload-time = "2026-09-14T15:38:22.036Z" }, { url = "https://files.pythonhosted.org/packages/9d/e5/1de3e1fc27009a6da30a52167e98f52ab4277d089eaff7152f6156745af9/mysqlclient-2.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:cfe14103280d5a4968fe8a3ace2a8939ef68a1d881aec9872d06746106b49f7f", size = 213120, upload-time = "2026-09-14T15:38:23.063Z" }, { url = "https://files.pythonhosted.org/packages/b3/ea/d7ebc53af9d3341e5c049795ec5e88946d83cbd26ee468475ae0c3b21d7f/mysqlclient-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:673891700dafbc66a6a8df12059b53a65905ec6e8dec615392fb984299880c0d", size = 222969, upload-time = "2026-09-14T15:38:24.168Z" }, { url = "https://files.pythonhosted.org/packages/4b/42/9ff798c066e33df9f7b58822a3eaf26185c3cb7e61a8186a56243b006066/mysqlclient-2.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:fe27c63ba9088b28467bf276f93f0b4a9062beabaeeb9692593e774d1146cce2", size = 213680, upload-time = "2026-09-14T15:38:25.259Z" }, { url = "https://files.pythonhosted.org/packages/d2/0f/29185111b7c0dd264e910c1250f2fd9a452ebad7fb272e750d8ffb18e67c/mysqlclient-2.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:3c601984c286c51080e0d3e9a857bc014713e6338b5f9c0a5df453a341b14022", size = 222537, upload-time = "2026-09-14T15:38:26.308Z" }, { url = "https://files.pythonhosted.org/packages/32/7b/4a050453adb5d07ee5f979f17409f93be545baae786dd58698f82b08a3e1/mysqlclient-2.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:3d39527a5525b4ebff99721d063f4fe9e459b9e437c7b7698374966d92d4355d", size = 213112, upload-time = "2026-09-14T15:38:27.329Z" }, { url = "https://files.pythonhosted.org/packages/a2/13/a046e9df6d69778b7de66f3d2ad83e563045992959efafb7b2ef62af0560/mysqlclient-2.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:24164ba592065ae5ff0149bb5707d05772335935059474fb75d864e5d0f94d63", size = 222969, upload-time = "2026-09-14T15:38:28.468Z" }, { url = "https://files.pythonhosted.org/packages/f8/13/cf40c2957bebe95fa109feb8a28fe0871ba4bd5e37c77b6128114ec20712/mysqlclient-2.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:f1ec49f73dad7df8f2da4d9de0f875f03c8bd44fbe77878522204c0646822f63", size = 213723, upload-time = "2026-09-14T15:38:29.69Z" }, ] [[package]] name = "nodeenv" version = "1.11.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/105de02c1322cfada6d9710d9146ef8026419d433c9d08359a2d35805811/nodeenv-1.11.0.tar.gz", hash = "sha256:3ce8fe5b71d16e8af7039ca65257354100bc772965d6bc549070649e53b1b146", size = 99301, upload-time = "2026-09-26T11:29:21.367Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/54/c8/12811c9b48fde162bb72b6f2e78fada9a247a09d7bb5be2050a5d099c77b/nodeenv-1.11.0-py2.py3-none-any.whl", hash = "sha256:edaa16e6c14d7cf395d75d4bbd5a26390f4dc06501a33b4e76282b02cc688a25", size = 34277, upload-time = "2026-09-26T11:29:19.933Z" }, ] [[package]] name = "oracledb" version = "26.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8c/f3/22113415f48b6608ada31ebb46047b3b8ac361dba393d1b5ed1f768d8f6a/oracledb-26.0.1.tar.gz", hash = "sha256:786397a6b37e94ebfa6c1c6cd026755eb8fccfd39e15bcb64cb5879491882aef", size = 910463, upload-time = "2026-09-22T21:23:20.378Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ce/91/e63f777028a560908bc3662b1cbbaf8aba3a27dd57304655349fcbd128fe/oracledb-26.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c8635ed9f8d659421679e16d7da56a0d50078d91b40782fb9c27c85f8d6c3075", size = 4806896, upload-time = "2026-09-22T21:23:36.916Z" }, { url = "https://files.pythonhosted.org/packages/0e/59/149845af7f23cac1138f76ff1f68d0e6e03fe65e67da8084251c98bc4fa7/oracledb-26.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1872361b806678c8865e375b8a46b59e2b4923191fb49af37d1dabc9438189f", size = 2633349, upload-time = "2026-09-22T21:23:38.505Z" }, { url = "https://files.pythonhosted.org/packages/e4/58/caf7db67e8c66e0e099c30b58d257e3a60b1b33c88b331dd2802c9e356df/oracledb-26.0.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b6949975dcd283dd4904c79c2263bbb32843116eb07f16b266b07b069ca2593", size = 2829714, upload-time = "2026-09-22T21:23:39.971Z" }, { url = "https://files.pythonhosted.org/packages/2b/e8/979beffc989f146ae5e37cd5b53ebe08231306afcd5ffe245368a2710a39/oracledb-26.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7d1fecfa6e7c39a3ee8aedeca7be2e48f4008d90cdcfa1b49ae9f825827b8156", size = 2685600, upload-time = "2026-09-22T21:23:41.73Z" }, { url = "https://files.pythonhosted.org/packages/29/57/5eb64f683afa2b56ece4f8d81bd09d60db19ff487c9a92911bff2be6c795/oracledb-26.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7d407685928a87240c54d2ca8cc5e0a89fa44639b459030519f120db461004a0", size = 2856509, upload-time = "2026-09-22T21:23:43.229Z" }, { url = "https://files.pythonhosted.org/packages/c5/c9/49e89422cfbc04fb93aabaca1008892322ea8c177136e14e86c50131270f/oracledb-26.0.1-cp311-cp311-win32.whl", hash = "sha256:391b61d248ade2f988581a2acadce20f3b3b21886481fc1e5bc57aceab7ab376", size = 1608982, upload-time = "2026-09-22T21:23:44.594Z" }, { url = "https://files.pythonhosted.org/packages/a3/2d/12b184980a87ed89cf6b23816b3aa6e4ed720a5708ee7af5960f56eee9c6/oracledb-26.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:582d629ca1282653f575a74b57e3c146175a55ea43c1470ddca44c3eef04dddc", size = 2068149, upload-time = "2026-09-22T21:23:46.024Z" }, { url = "https://files.pythonhosted.org/packages/47/f2/61869d47cf3d74099d9398c56c839a21394b35dd19d05e91a60abb6e7881/oracledb-26.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:b857ecc33ed1ec8141f4e45a7420a4df4fc625dcaa35e32b01dca62400376d5d", size = 1709535, upload-time = "2026-09-22T21:23:47.737Z" }, { url = "https://files.pythonhosted.org/packages/83/fa/349ee179b3e106f210ac070d199dd341f37e2af9f5faf2563b80d8aa6ab1/oracledb-26.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eea4d0824fa82b03c0d90aad81f10dbbacdaf351979c0130190a362a539e63ae", size = 4908265, upload-time = "2026-09-22T21:23:49.524Z" }, { url = "https://files.pythonhosted.org/packages/60/68/2dc6a99d385835290825c0d6689097af29637db8754197040b95814bb5cd/oracledb-26.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c05707b2ba57d8210bdf062ba3419900591f3369d1532fb116af51445c2993d", size = 2448388, upload-time = "2026-09-22T21:23:50.993Z" }, { url = "https://files.pythonhosted.org/packages/d5/4b/ce48ed072c2328b429a6bc87a35ddd735945151145d9fe49c1e177b0da83/oracledb-26.0.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36cbf2be185412fee95be96aa6f187a73fd5181bb03186b53d5b70ac18fa354b", size = 2663296, upload-time = "2026-09-22T21:23:52.426Z" }, { url = "https://files.pythonhosted.org/packages/f2/c8/73166ff29389c5ce3272fcc534360ab65248f90fcdf175a99b5fa2bb8466/oracledb-26.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5ad1b6f4db3d8a43182e7734922342fac5901456b34acead92f6fc60cc59882", size = 2493289, upload-time = "2026-09-22T21:23:53.949Z" }, { url = "https://files.pythonhosted.org/packages/f4/c0/f6b4f82d6dc7f7d7654c0e4889caa1abbe019ec76daa1b4b4ee80859172b/oracledb-26.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aecc4cdd03cb5a5ad51f43680d16d74132ae7df65c991e7bd69bbe2ccc0fd209", size = 2694730, upload-time = "2026-09-22T21:23:55.609Z" }, { url = "https://files.pythonhosted.org/packages/9b/da/a3ad79e18c5b27b357de005ce9d79dff1ef1646b7c55b6e6557b238f03bd/oracledb-26.0.1-cp312-cp312-win32.whl", hash = "sha256:f55d6fd9ebc3e8bf3bf4828fcd6ae152b363859628d27f92a4764111adfb1001", size = 1578393, upload-time = "2026-09-22T21:23:56.975Z" }, { url = "https://files.pythonhosted.org/packages/06/c6/8e2ad66bda2cda6d085f3516ad8f7834b1d7d4c9da21f96834467525b551/oracledb-26.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c6f2f0d7290b15f1a166c0d24187e7746a6f08ea6e886e521110f1bf8d2002c", size = 1970972, upload-time = "2026-09-22T21:23:58.352Z" }, { url = "https://files.pythonhosted.org/packages/ba/ce/98c3a83142a562e40135abb8503b59eba7af1135c11c8077986a289f3a35/oracledb-26.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:c31b6f7440047c867a1b41cbaace7867db0750ecab4dc6454c9f501991152deb", size = 1622016, upload-time = "2026-09-22T21:23:59.996Z" }, { url = "https://files.pythonhosted.org/packages/f4/d7/2a911476339d9fa6eb83e6a4639b007c13af26d7261907ecc2d8722a6712/oracledb-26.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:339dd6c4f0d50dab4026a36ae89d902240b2a879a17cdf18e3feadc113957b4e", size = 4911060, upload-time = "2026-09-22T21:24:01.757Z" }, { url = "https://files.pythonhosted.org/packages/e9/e8/97e3b2c283ab996efe1d12b6afa86042c746b0ce4e408942bb4b7c35e39a/oracledb-26.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5907bb5c9df123e417ddf358f540554dfc6766064c2feb84121c099bc4e039a3", size = 2445641, upload-time = "2026-09-22T21:24:03.587Z" }, { url = "https://files.pythonhosted.org/packages/03/f7/bbf75b91248ea489e8393ae84e9985b37c895781c658b6d9e5d83d02c1c1/oracledb-26.0.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:16d08328bf9b02e980ad4d5f3e0e99596f9a42aaf6bd1e244ea85be753f2c292", size = 2646590, upload-time = "2026-09-22T21:24:05.22Z" }, { url = "https://files.pythonhosted.org/packages/3b/32/cbdacb302a2ca047e36e0f804c493391844aad83822d428184fa1d4203d5/oracledb-26.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:50e42111d5c620f60478e4571a5847c335286e8650e63a8789f8bd51035f90da", size = 2499129, upload-time = "2026-09-22T21:24:06.801Z" }, { url = "https://files.pythonhosted.org/packages/9a/1e/ce86b581a4f1c8d5844019f84eacc9f4084c882ba676a90c94d7eaeb749e/oracledb-26.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0453f8f1a6748c982dcdac8af09bcd81971979c7ec9d1d151e15595f58d9164b", size = 2675979, upload-time = "2026-09-22T21:24:08.153Z" }, { url = "https://files.pythonhosted.org/packages/82/7c/49e6af631b84db68d801b6d03ff58c4fa7b767ffa8a8402de643584e9d63/oracledb-26.0.1-cp313-cp313-win32.whl", hash = "sha256:93e6a7cda6ad7b14e2ce8689c9694872b3d69d57015aab070028c9a93faf3bf1", size = 1576622, upload-time = "2026-09-22T21:24:09.492Z" }, { url = "https://files.pythonhosted.org/packages/59/10/ba7a5ce82fda9bbfcf222930b9a6f9a967c2b3d49f787ba7f4f99b598c6f/oracledb-26.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:6cf0c4d8662072917e2f98598cb97a18e157785bd0f294fbcf770d822ca239a9", size = 1970210, upload-time = "2026-09-22T21:24:10.806Z" }, { url = "https://files.pythonhosted.org/packages/24/dc/96ce57dad3b1bb3d3c30be936d0f6daea0a02649d8936b878921004b15e1/oracledb-26.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:22bb1e47a01a5259eead9202be8f631682b69be08ee29d8e532ed9b9364bd7bd", size = 1621513, upload-time = "2026-09-22T21:24:12.246Z" }, { url = "https://files.pythonhosted.org/packages/3e/e6/7cf147ea1daf0c7c86fcd77acce1a09b0d4ab75539a4677a2034f112c860/oracledb-26.0.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c2201184b46bbec476a7ac29a72f14ee4ed75d692ade3b6c5d672fdbca71e6b2", size = 4961776, upload-time = "2026-09-22T21:24:13.967Z" }, { url = "https://files.pythonhosted.org/packages/2b/7e/1ada40fce6ec550718e6eb1b8be9bfcc6e9697f19b6244ed6e0b89aa8da8/oracledb-26.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8bddb6bd7156df750045b419ffc400cfe429276f1a17d83913f10adefd0baa9a", size = 2486660, upload-time = "2026-09-22T21:24:16.397Z" }, { url = "https://files.pythonhosted.org/packages/65/2a/a4cf6f8081b1ab3498c82e3917b2174843bf22e2fa4c41e98ad1e0b66d47/oracledb-26.0.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b33b22800a9b02ee0ead00e6f3073b810f7dc51c1e82fc9fc5475c09812420df", size = 2664849, upload-time = "2026-09-22T21:24:18.16Z" }, { url = "https://files.pythonhosted.org/packages/b2/f2/50a32fa2d8c6cbb0e5fb69c262b01e7412ad08e430192404af9d2b9f4bea/oracledb-26.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:124f0072e6c7df277c561ec3a4c42cb2c02c30e9ce15e75a460b4abcfee41046", size = 2544330, upload-time = "2026-09-22T21:24:19.627Z" }, { url = "https://files.pythonhosted.org/packages/b0/90/9b6dd9bbc1899ca3a982e9012f25be2a70e4795eacc6f8582c340c64fe1c/oracledb-26.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4c5094d5ba60b0f67ce7c74eb0fbc738d827103c0ba2db5f8483db405ab4e9c4", size = 2693190, upload-time = "2026-09-22T21:24:21.228Z" }, { url = "https://files.pythonhosted.org/packages/92/42/0df9265f2f562283c88590a6bcd442084cef80c832ff598bdbab994a3cb8/oracledb-26.0.1-cp314-cp314-win32.whl", hash = "sha256:03424ccfbd25c402133c2a23c5c1a630e57effda7b962085d91c41d765af1b25", size = 1602133, upload-time = "2026-09-22T21:24:22.733Z" }, { url = "https://files.pythonhosted.org/packages/db/d4/1b90c5e252a53dbc71833217746f2673e9e2ce0e06115bac1dc42ae347d0/oracledb-26.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:ee8f4736b72f38ade26f9770f7b40e8662bfa825ef48cefcc55cef0c30525d4b", size = 2027835, upload-time = "2026-09-22T21:24:24.105Z" }, { url = "https://files.pythonhosted.org/packages/d6/4e/9febea61cbf476c2ae5d290fb3f823f1e46668e3ac15b8af5307531e33ad/oracledb-26.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:13b0dfbbc503c6107d6c08b1658df260c2c077bc5574d9545159df0a0301fe7d", size = 1680743, upload-time = "2026-09-22T21:24:25.475Z" }, { url = "https://files.pythonhosted.org/packages/77/bb/71f7861bfbf586757873259a858f370030a137b4172865992c3cc9a462b1/oracledb-26.0.1-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:9e77a6b3b01a3a2f4b786939f59d862fbe73fbc4c68cdf87aa45a5398725a16c", size = 4960764, upload-time = "2026-09-22T21:24:27.244Z" }, { url = "https://files.pythonhosted.org/packages/14/c0/86aa68f08e5c1d25b864ac5777c559bf0bc8911e5d8262b70bec5e05cc21/oracledb-26.0.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d722f185f9c05ecccb2702a58a1e5ecfd309ae92cad0c38373e0969e83bf2bd", size = 2488466, upload-time = "2026-09-22T21:24:29.177Z" }, { url = "https://files.pythonhosted.org/packages/fc/f4/af94230a3c2c6679323f3578a0a5281cfd87f72994f66e6044b5ff6c95e9/oracledb-26.0.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfcf6382bc48e21e448ca2b71644cc75626056a638bca50181acdc8adc69dd3c", size = 2685915, upload-time = "2026-09-22T21:24:30.823Z" }, { url = "https://files.pythonhosted.org/packages/f5/a7/aa99f8e60961e80795ca926ead66c66d98c3aee78d970320eacdfa843614/oracledb-26.0.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:d42a2e0caea9bcf7d260d430b225d72cff6dffa0d6729be7a8823db2678e0b74", size = 2544920, upload-time = "2026-09-22T21:24:32.667Z" }, { url = "https://files.pythonhosted.org/packages/e2/65/b636a18a578cffd5819df08ae80deeb931f1215d2d2b18112a37e9d2bbea/oracledb-26.0.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:2a073cc8bd74a7ce32d12f4bc898dd143971981b52ecd2f72c37b4474bff76cb", size = 2713492, upload-time = "2026-09-22T21:24:34.22Z" }, { url = "https://files.pythonhosted.org/packages/0a/4a/e758838b14540a94599487d0d15ce4390edba5a257e53f2cea66f94bd138/oracledb-26.0.1-cp315-cp315-win32.whl", hash = "sha256:f4188bf8eedfc05ef266835e98ce304fda92d6bc87dd776d5f9a8b510d8b54ba", size = 1601872, upload-time = "2026-09-22T21:24:35.591Z" }, { url = "https://files.pythonhosted.org/packages/62/b1/51b2a51abd89ba43dc0f9ee14d456a9b002d0b9c31840c7de55387e555eb/oracledb-26.0.1-cp315-cp315-win_amd64.whl", hash = "sha256:9d508d2df7bb9a4802247ec95d06064e2babf8ae9e1f91d89c349bcd30df44ed", size = 2026829, upload-time = "2026-09-22T21:24:37.15Z" }, { url = "https://files.pythonhosted.org/packages/62/6b/b099ff2c51447cbf0d2f1c33ea7de1abf96d9bf4c3d93b2a5dff48728965/oracledb-26.0.1-cp315-cp315-win_arm64.whl", hash = "sha256:7c9541d7cf2d324e9516c955c033235bbf25b7d96ce41a856b3bff2eab3494ed", size = 1680535, upload-time = "2026-09-22T21:24:38.551Z" }, ] [[package]] name = "packaging" version = "26.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, ] [[package]] name = "pathspec" version = "1.1.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, ] [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] [[package]] name = "psycopg" version = "3.3.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.13'" }, { name = "tzdata", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/76/26/3ea4ca5eaea1c0debcdf7ee7c1613fbe721dc27a03c461c0817ffd8a0601/psycopg-3.3.6.tar.gz", hash = "sha256:c081f2250df751a943036e42db6df4571c66cd0aabe8291a7a506512b12007d2", size = 168171, upload-time = "2026-09-18T13:22:55.152Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/4e/de/748bd7609c71cae5d737f0ba9192f19329f70180ecda8fff3cac02c5abe3/psycopg-3.3.6-py3-none-any.whl", hash = "sha256:a1db9f7148b06a28606767efaca51fa6f9398c5c0a3810519be69d7000bdb631", size = 215490, upload-time = "2026-09-18T13:15:29.374Z" }, ] [package.optional-dependencies] binary = [ { name = "psycopg-binary", marker = "implementation_name != 'pypy'" }, ] [[package]] name = "psycopg-binary" version = "3.3.6" source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/70/86/b71166048974d49c6d136b2ed1c0e5bec0b974d8c4de5cbce7e86a9e412a/psycopg_binary-3.3.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:be4f9b3c9338ac5dd217c5847e21521b396c8117f78dc420d495a5c49bbef874", size = 4728002, upload-time = "2026-09-18T13:16:53.393Z" }, { url = "https://files.pythonhosted.org/packages/12/1d/1e06c0de7ed5aed898acb87544eac6ef0bc7d752a67ec6e5d6b835e9b40c/psycopg_binary-3.3.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f0535693ce476a722b718b002d5d2c27d47e71ca945276ac194409c98e74c492", size = 4775403, upload-time = "2026-09-18T13:16:58.939Z" }, { url = "https://files.pythonhosted.org/packages/84/02/2ffcbc43f8e4bbc38e5286a22013bcac01898d13cd38325f60dd5428a8af/psycopg_binary-3.3.6-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3c9e663b2e800e3218994cf948c11bcc2844e6491b34aa80d089baf6531827bf", size = 5594145, upload-time = "2026-09-18T13:17:08.515Z" }, { url = "https://files.pythonhosted.org/packages/e1/25/031dae2c7d2e7e77dcf5b1962c1e0684fa548d7af0ff6707b6b5e6054ca7/psycopg_binary-3.3.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a2e44a342d2aee40508e28a563d8961c39d9bbd8cae36d8578f0a3c6658aab0f", size = 5267985, upload-time = "2026-09-18T13:17:16.24Z" }, { url = "https://files.pythonhosted.org/packages/8c/e5/94c89ada3c003a4d858178f3bba49a35e0297ef2aad659b80eb5e380e690/psycopg_binary-3.3.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f598f19fa9a91540b5cee17932ffd227b7b53a481605bcc4573c0eafa647300", size = 6860986, upload-time = "2026-09-18T13:17:23.348Z" }, { url = "https://files.pythonhosted.org/packages/9d/a0/81bf499d095adee8413bd19822a6872fbfa21663ec78014a68d83a8db83c/psycopg_binary-3.3.6-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6ff05561e4a067d35507dc5c90f1deb2ec1c9703ac5cccc1bc26e08a197f9c5a", size = 5106702, upload-time = "2026-09-18T13:17:28.847Z" }, { url = "https://files.pythonhosted.org/packages/00/75/99d56da64c27bd985fd82c6ecbf7976b724ac638fdd1654ef995323a1a26/psycopg_binary-3.3.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:566dd827f17728efdf7d88a5b066f815170f6fdad13967ae952842d90e6aaa9f", size = 4627090, upload-time = "2026-09-18T13:17:36.668Z" }, { url = "https://files.pythonhosted.org/packages/3e/0c/0222171d11233332c6a24b1cef1578215f0ffddf3642eb8dd8c4448ad69f/psycopg_binary-3.3.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9b2f11794e017ce340934e35de46181c46ef71ec75ea3d85dd75cd836761c01e", size = 4320353, upload-time = "2026-09-18T13:17:42.526Z" }, { url = "https://files.pythonhosted.org/packages/62/6f/e1cc2a28dd1228c67c969ba6fd37cd8726b312e2ff51380f847ddb38ccde/psycopg_binary-3.3.6-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:910ace140e3e7b7596898d083f37a8fe90c5c40684252ad4e682364b2cd3deba", size = 4047253, upload-time = "2026-09-18T13:17:47.068Z" }, { url = "https://files.pythonhosted.org/packages/d8/fd/38b64790ce7a515b1dbd2bab3d119637a858aeb22c380cf4859bc4ce0e42/psycopg_binary-3.3.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37e517c146b185f9c0c6e8d0a0ebbdeeeb67896af28466e032bc810d0c7dc7a7", size = 4353208, upload-time = "2026-09-18T13:17:52.41Z" }, { url = "https://files.pythonhosted.org/packages/f7/dc/45386530ceb2a8c789a226de9b9b34eca8fccf1feba2e4ef68a6aca50c56/psycopg_binary-3.3.6-cp311-cp311-win_amd64.whl", hash = "sha256:c7f92daa0d2a1c76f07264abddf8cbabd30152a2f09c3270e50f0c7efdf5dcac", size = 3675638, upload-time = "2026-09-18T13:17:58.112Z" }, { url = "https://files.pythonhosted.org/packages/e6/01/2cdd1824e58b4467ee0b9498664cd28c42d8794db6b1e35b6bcb834f0044/psycopg_binary-3.3.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3f84dab25e0385692ee13274c68678377e0b1a70ab9d14e56264cbf61f60c62d", size = 4707086, upload-time = "2026-09-18T13:18:05.138Z" }, { url = "https://files.pythonhosted.org/packages/f6/76/de9948ac06895261c84d5b9fbe283d8f3c5bc9f070691b8d9eaa1b51e322/psycopg_binary-3.3.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:612382ac3ed13651c7fa44b5fee9fbf7baaa2ddbc6f500391672682c5f1df9e0", size = 4769607, upload-time = "2026-09-18T13:18:12.83Z" }, { url = "https://files.pythonhosted.org/packages/76/a9/72436c9915ee4905964689e7f0e182ce7767cc0a0390b3ce703be8177625/psycopg_binary-3.3.6-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:366db6e97e66b37211475f20c4c1324a2dc0dd825e46d4e87f9d599304d276f9", size = 5554134, upload-time = "2026-09-18T13:18:21.175Z" }, { url = "https://files.pythonhosted.org/packages/0a/42/948bb3d2617795093512613fd96ba380e922992c7908fbc073858147d196/psycopg_binary-3.3.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1679a1cb93fbe5a6d1fd58d82cbddcc6fcb8c61446ba7cae6eb2a7b19bc585de", size = 5235723, upload-time = "2026-09-18T13:18:27.071Z" }, { url = "https://files.pythonhosted.org/packages/99/47/93e823ff1b0088400703410939c9bda3e63ed9c850b3ee088e8769f4c10b/psycopg_binary-3.3.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37d40450659401600e6d043ff586c89a71a69f33cbb8bcdba6cdb2569beecdbe", size = 6833587, upload-time = "2026-09-18T13:18:33.794Z" }, { url = "https://files.pythonhosted.org/packages/5e/2d/ecc69c847795aa704041a9f5667a6b0938a088cf1853636d762a6938e493/psycopg_binary-3.3.6-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a5165300324efd5a772c48a88ab3a928513ab3979fca76553e62ee815f7b2b9c", size = 5070013, upload-time = "2026-09-18T13:18:39.628Z" }, { url = "https://files.pythonhosted.org/packages/92/36/6126f0dac21713dcae91404f2a76da18598a6252339a8c669c46370d43b2/psycopg_binary-3.3.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d636338c8f21b0df2f84657b00bc34f9313f826ef93f1155bc743607e4a0c5eb", size = 4597367, upload-time = "2026-09-18T13:18:45.023Z" }, { url = "https://files.pythonhosted.org/packages/4d/29/7ecfc04243b46c89ffd49924e9c5634ea904ef96c7d0f37e4073623584c1/psycopg_binary-3.3.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a4ee3bdd5468a725f2a4d9aab8a74b6d0279f768c8b5d3aeb102c5307ff3d59c", size = 4275419, upload-time = "2026-09-18T13:18:49.299Z" }, { url = "https://files.pythonhosted.org/packages/6e/90/2f46d2e0de79706ac170df0a3637fe63c4498fc04f131f6049520b78b806/psycopg_binary-3.3.6-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:289aadd6a00e151203c081f708348ec89f1e483c9b510ef4ac3981f847f01f79", size = 4007358, upload-time = "2026-09-18T13:18:53.944Z" }, { url = "https://files.pythonhosted.org/packages/03/48/6744e91291b751a8cf12d63d719977974bb94c84ceba913e7ddb2e478e51/psycopg_binary-3.3.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f21d057f3e5f5491067e5b292498073b73847d48799b099803fef100775fcc52", size = 4320156, upload-time = "2026-09-18T13:18:59.258Z" }, { url = "https://files.pythonhosted.org/packages/1a/9b/94ff7fce53a64d5b286e2ec454e0a025cf3d6e6b4a9189bef16aa5de98b2/psycopg_binary-3.3.6-cp312-cp312-win_amd64.whl", hash = "sha256:e23a66a763fbe83fcc210bc77c27e5a5ea380ebf091c06f34d8561b695e5a40f", size = 3658864, upload-time = "2026-09-18T13:19:06.503Z" }, { url = "https://files.pythonhosted.org/packages/b4/c3/c072584b69ad44a747b448cfc9766fecb8aae56e372a017e2ef668790057/psycopg_binary-3.3.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ad8f35e67cc16d1fad1fa8c88972dc9b3a3141ea67897399904edab96a301b6", size = 4712284, upload-time = "2026-09-18T13:19:13.451Z" }, { url = "https://files.pythonhosted.org/packages/0a/b9/4283b785339e8e2318d03048994b093d650ea6289fabaa806b765dc0d449/psycopg_binary-3.3.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:373704aea331d3f3e3402c125a1543f5875e2986ebb54f97d1647942161f803f", size = 4772031, upload-time = "2026-09-18T13:19:18.524Z" }, { url = "https://files.pythonhosted.org/packages/6f/72/7a1321d359246769fff1affffbd0132785a28f7f63c18524c15a502398f4/psycopg_binary-3.3.6-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b82491019b884d62318b5f30706c3d7e6d4e5a6cb7eabcb3edc0c1b0fdaceae9", size = 5556392, upload-time = "2026-09-18T13:19:24.418Z" }, { url = "https://files.pythonhosted.org/packages/de/b0/c6f8a0585a5dacbea74e130bcfc66629390e8f5bbc79d2a8e806e8952150/psycopg_binary-3.3.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cec5ea900390897d0b46130f60bc2883bf19c314f9044235217c8be88b0ef269", size = 5237855, upload-time = "2026-09-18T13:19:31.257Z" }, { url = "https://files.pythonhosted.org/packages/e2/fc/c3a7a8bbef7e945ec584ac61d460a612363ea398511cd0e220242b1d69f1/psycopg_binary-3.3.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98c02090d88f2ebc0ec1e8da538f77d225ce0fffecf372aa39262e62a1b054ef", size = 6833856, upload-time = "2026-09-18T13:19:43.622Z" }, { url = "https://files.pythonhosted.org/packages/a9/f2/8e80b921db728ebb68fc105bd7c4277f908210ad755bd6481d5ea7add740/psycopg_binary-3.3.6-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ee2c4728c691245e24501fcd7a97b5b381236b9985bc445bba88cdce7d1b5784", size = 5070730, upload-time = "2026-09-18T13:19:49.968Z" }, { url = "https://files.pythonhosted.org/packages/54/6a/5b313e0c5348244f0e973aff3258bf86766656256d5ece8d541a53e35b4a/psycopg_binary-3.3.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f19cc87343eaa55255e76b31259a570072ac95d6ae82c92dd34b97691f5e49dc", size = 4598089, upload-time = "2026-09-18T13:19:56.426Z" }, { url = "https://files.pythonhosted.org/packages/32/e9/db7f76ec24bf6699e92bf604e5c4bae10664a681a8999ef42aa0faf0f2c6/psycopg_binary-3.3.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdccb3a0e184b03e9baa673b15a809cf36c339c85dbda0ebc25a698846dfbee8", size = 4278481, upload-time = "2026-09-18T13:20:04.681Z" }, { url = "https://files.pythonhosted.org/packages/61/83/72c67013656f4d6b547caabffb193e91d57e63f90eefdcc6d045c400e97d/psycopg_binary-3.3.6-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9892188bb15e5803beb51afe8a25add6b56be391a53058e8bca03b74e1e6bf22", size = 4009229, upload-time = "2026-09-18T13:20:11.905Z" }, { url = "https://files.pythonhosted.org/packages/82/35/5e4500df2c999eb0faed8b184e6958b834172128274f06167a5deef4c19c/psycopg_binary-3.3.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3af90f92769d8cc10f94515ee7a0aef36ea85ca733a0ce22858f6e0953f41138", size = 4321467, upload-time = "2026-09-18T13:20:17.949Z" }, { url = "https://files.pythonhosted.org/packages/55/7f/e350e1cf498ba2565c3f87b12f429d2012eb86b76c2b3845a19ee5fbb4d6/psycopg_binary-3.3.6-cp313-cp313-win_amd64.whl", hash = "sha256:0ebfad5d131de9f892ae9e70cc7616207768b6714b66a52d4612b8ceaf78b372", size = 3658179, upload-time = "2026-09-18T13:20:22.691Z" }, { url = "https://files.pythonhosted.org/packages/6d/b9/60711317c284a442511644ea7185b56ebe627606d6741e732cd16108c47b/psycopg_binary-3.3.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:b3f75dee0f9afafabe4edc52c4842f1e1878ed2069bd05b22d6fe961e97e4dba", size = 4720512, upload-time = "2026-09-18T13:20:29.278Z" }, { url = "https://files.pythonhosted.org/packages/63/da/28befc84454cbc6374550de7746f591f8fe1b6165c1fce249652cc8291c4/psycopg_binary-3.3.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5927b7ba63153cd8e9862987290a2b783a5c590daf2a4ef981700cc3569166d4", size = 4782318, upload-time = "2026-09-18T13:20:35.401Z" }, { url = "https://files.pythonhosted.org/packages/a4/8a/0d21c2c833cdc0d4244c77e858e0ed37fa2abec2623be4fd686f617109ce/psycopg_binary-3.3.6-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0bf08b749cc144f33b44a91b78e3f71c60eb07963746a0df5a100b36ce3d7475", size = 5567460, upload-time = "2026-09-18T13:20:41.902Z" }, { url = "https://files.pythonhosted.org/packages/49/6d/7692d0d4e656b6cc9868d8acc2e3b42f17a0db4a625400a6d093cb0533a1/psycopg_binary-3.3.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:31cd942c23f613276b81a6e6598cefa12960058b0f46e1e874b540c793f6aca5", size = 5246902, upload-time = "2026-09-18T13:20:47.661Z" }, { url = "https://files.pythonhosted.org/packages/d4/c1/b8a1f18fb1b7558a17f57f7cb3fc8bc93189feea2958925950b3acb15743/psycopg_binary-3.3.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4690cf67738f0e0e49a32aeec99bf0e4595cc2b4f1af984a4345394b1dcff91a", size = 6847192, upload-time = "2026-09-18T13:20:56.874Z" }, { url = "https://files.pythonhosted.org/packages/a5/76/404f33519167c65cca88ec4998776f1dbebccc301ee977f0e62c47fb0826/psycopg_binary-3.3.6-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ad1c785e784cfd87e8436c6b7702f2d321fc39601bbaf29bc63a41a867091638", size = 5079573, upload-time = "2026-09-18T13:21:04.155Z" }, { url = "https://files.pythonhosted.org/packages/f0/d9/79e8fbc8f37262a415f3550f0bcc5f98037442bf3d12ef6cbae2056655ae/psycopg_binary-3.3.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:79a2a1c3449f6c3409427078ed1cec10de79f3023cb5f2504f0597d350ad46c7", size = 4613633, upload-time = "2026-09-18T13:21:10.664Z" }, { url = "https://files.pythonhosted.org/packages/d4/47/96225db74be7d2ce04b3a58678b53cda610225055edf5faa775c9f501d8b/psycopg_binary-3.3.6-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:86147cb5d140341c3363fb5bacce31f8d5543902a46699d3c536b101bbceaf9e", size = 4293375, upload-time = "2026-09-18T13:21:16.027Z" }, { url = "https://files.pythonhosted.org/packages/2a/d2/18e9c779a5efd565250329adaf529ecc2b8b2ed5be5cb0f6ccee208cbfd9/psycopg_binary-3.3.6-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:7308c93cf0b19bbaf8e6ff0a6ad50d3c442385739245fe15a8d593bf841734a6", size = 4019883, upload-time = "2026-09-18T13:21:21.587Z" }, { url = "https://files.pythonhosted.org/packages/ef/28/0cc654afc6c2cda982767f5679d3646b30b1ec86545bdaa9402202d6776c/psycopg_binary-3.3.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:05a83ac9fd52b9bca7cb5ab04b3691163170bd16f53defa27216ea3aa07ee781", size = 4332607, upload-time = "2026-09-18T13:21:27.63Z" }, { url = "https://files.pythonhosted.org/packages/f1/3e/0a753a74fbd7aef120f286c016e09d3cc3f1daf7688f4a145d27281260b2/psycopg_binary-3.3.6-cp314-cp314-win_amd64.whl", hash = "sha256:1fbd30e537dab22cafdf080608f10148fe2a5f3a61294ddb5113caac8a623840", size = 3755671, upload-time = "2026-09-18T13:21:33.855Z" }, { url = "https://files.pythonhosted.org/packages/0e/b1/a372b9c02aea50148e71c9853e19efca8fa5ae2010a8e27243b9b8f790c0/psycopg_binary-3.3.6-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:bf8c8481d026b85dd70c5fa7dde85b2333aed0b32a2602bcd38a900cbd78a49c", size = 4719571, upload-time = "2026-09-18T13:21:41.437Z" }, { url = "https://files.pythonhosted.org/packages/65/7c/811e3828c6b82e2f10c6c9cdd963cfc66f3e024026e5a69ac18530bad984/psycopg_binary-3.3.6-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:b599defe9190b17e9907c8b4d114c181e702c87efcd1b8a0ad40971cdcc4634a", size = 4781230, upload-time = "2026-09-18T13:21:49.516Z" }, { url = "https://files.pythonhosted.org/packages/3e/15/9a784eed813ea9e97c294af3ead63d02b7b203502c66380336c50065e441/psycopg_binary-3.3.6-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b8ece331509f7a975b90501f41e83ad905e4141753fedf3f2711b2bc70a8efbc", size = 5566111, upload-time = "2026-09-18T13:21:58.089Z" }, { url = "https://files.pythonhosted.org/packages/68/16/47194e002007c27337b11e49bf459c4b19727463f9aff2e1a90917bcc806/psycopg_binary-3.3.6-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c61617eaae0112ca154da87ffb99b73af2c74067acac28dfb9a4455b019dff2e", size = 5249963, upload-time = "2026-09-18T13:22:06.695Z" }, { url = "https://files.pythonhosted.org/packages/53/84/5dcf9f310b11f0675cd860c6b2c70f58ce61798a3ee3f6f962b53fa358ca/psycopg_binary-3.3.6-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c6d19cb4999d03231e8730a5f66c8f5068bc3b532677eb39dab0f600bff3e312", size = 6847925, upload-time = "2026-09-18T13:22:13.088Z" }, { url = "https://files.pythonhosted.org/packages/f3/06/1957a06dc22963c418c27b284929579de84f29c37ad1abe6dc6ee9e8cf25/psycopg_binary-3.3.6-cp315-cp315-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8cbb54454dbf1bbf2ff08dd7693e8d94ac94b1a20f70f4b3b813d52ecb5cbc1", size = 5087720, upload-time = "2026-09-18T13:22:17.959Z" }, { url = "https://files.pythonhosted.org/packages/21/43/ac07d042bae99b57bf123bb473632f29af544008094da0ffd285ab8011e2/psycopg_binary-3.3.6-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:dc75da5a20951049f7b773145f998f69d181adad9c58a0ff36e0cf1d73c10e10", size = 4613412, upload-time = "2026-09-18T13:22:26.719Z" }, { url = "https://files.pythonhosted.org/packages/aa/b1/019156fbeafcefb4cccc9d109de4699493bceb8313c7545c8349e089dfbc/psycopg_binary-3.3.6-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:955e3dd94da361e052d2e49acf591017158dc8f8ed2c8a42c2e3943403c39dc2", size = 4292618, upload-time = "2026-09-18T13:22:33.042Z" }, { url = "https://files.pythonhosted.org/packages/5d/0f/62113dc6b1df65983a1f2fc816c04b1edfa22f2ae9d4abee74ed267f4a96/psycopg_binary-3.3.6-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:c7753871eb57e6a5f4646f6168590c6653073dea5e9e720b201c8875332df4c8", size = 4027121, upload-time = "2026-09-18T13:22:38.334Z" }, { url = "https://files.pythonhosted.org/packages/5d/d5/cf0cbd1ea5a7d8167fe2c6953efde19101f7b193bd61a23e6d622ad6854c/psycopg_binary-3.3.6-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:303732e798fe6729f8e12021b9c96107df8e95ecec4dd487c67b98ec2a59435e", size = 4336388, upload-time = "2026-09-18T13:22:45.576Z" }, { url = "https://files.pythonhosted.org/packages/98/33/e2a5b36edf8aa422f6fa4b894756eb33dc93b36df5f65121280bb8b929c4/psycopg_binary-3.3.6-cp315-cp315-win_amd64.whl", hash = "sha256:2f122603f36050937982abf9668d8bc4769a79f7c93a65013b1c49f1cab7b56b", size = 3756154, upload-time = "2026-09-18T13:22:51.283Z" }, ] [[package]] name = "psycopg2-binary" version = "2.9.13" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ed/76/7b4383014be0fcc6c1c0e24292845a14e1672cf17fca62ca0a2bd5f4563d/psycopg2_binary-2.9.13.tar.gz", hash = "sha256:e324ecf60f952d21dd11413b8bbed0951bbd99579a06fd06f28bfc37737cd373", size = 378112, upload-time = "2026-09-10T00:06:12.199Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7b/03/639c96ff8ffb933868252308a9917ff4170d8c7f4bd16cd0ea2536814126/psycopg2_binary-2.9.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d19aec88857d2a52f99eefcefdbbb45921fb2f777bee5186a355a23d9cf8a0b9", size = 3725651, upload-time = "2026-09-09T23:54:29.277Z" }, { url = "https://files.pythonhosted.org/packages/53/5e/d50eb688e7e6dfd1499e68cf2d02f44a348b88f381cbc2bebeed15e345f4/psycopg2_binary-2.9.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:32cd049095135d2b69e824aea9056745a4aaaa9115a9febbc65584793665d0d0", size = 3817384, upload-time = "2026-09-09T23:54:31.118Z" }, { url = "https://files.pythonhosted.org/packages/6c/f3/4004cfbbfc52b9b13ffd499f2103eb05246e92828c7237d2c198e028b95c/psycopg2_binary-2.9.13-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e696297891b56ff0115f0665de6ad774e1e301e4f60745b8d5024001ae7c2f6", size = 4585497, upload-time = "2026-09-09T23:54:33.169Z" }, { url = "https://files.pythonhosted.org/packages/97/63/057c65532bd12cdf9d4f568e59c2a078a38e9ba8f7f251292968dc781905/psycopg2_binary-2.9.13-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:930e7e58b33a4f9c39e7532d7a40147925cf3372baed4229cbebe0cf3ba9ce6b", size = 4281172, upload-time = "2026-09-09T23:54:35.747Z" }, { url = "https://files.pythonhosted.org/packages/43/4b/9fd928eaea9ec1e8d74fed83c9e82826f830506ba0d8c58a8fd41ca93656/psycopg2_binary-2.9.13-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3aea95340825f5ff236e7b40f0b5602c2c77a1e95943f71fae34909834043d29", size = 5900973, upload-time = "2026-09-09T23:54:37.866Z" }, { url = "https://files.pythonhosted.org/packages/f8/2b/59e1519a22622169e2244f12227b3acde6114ea531a349292f455ab8503f/psycopg2_binary-2.9.13-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:27e539b4cafd5e03dcd32921db1b12dd72fe549dd06bae6d4d2a5b5838465f24", size = 4118611, upload-time = "2026-09-09T23:54:39.739Z" }, { url = "https://files.pythonhosted.org/packages/87/c7/c3d84e330d1584efa0560b756914f9128b1b6fa2aba93fde54bf101d4f65/psycopg2_binary-2.9.13-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6444ac48e2c04f691c2ddd542b38ba30c89463a2d446b3d74ec7d8fc90c964", size = 3659643, upload-time = "2026-09-09T23:54:41.882Z" }, { url = "https://files.pythonhosted.org/packages/af/fc/317d248503aa29a5051ee49a7253daffe1c57e43ba174020e00bbd87c479/psycopg2_binary-2.9.13-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8cb734989420c18ca1b71a82da880e11988f5ff3fcdaadd669161de3e98794ac", size = 3305145, upload-time = "2026-09-09T23:54:43.818Z" }, { url = "https://files.pythonhosted.org/packages/9d/d2/8b23c57591c6d29a463748ffc634401ce14719dba7e78ab91bcbeac70934/psycopg2_binary-2.9.13-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f47f23db2d70db39cfb714b64fd5df76595b51b2ec0a669710a78f2dceb0c3f8", size = 3051614, upload-time = "2026-09-09T23:54:45.548Z" }, { url = "https://files.pythonhosted.org/packages/4f/f2/b10a046cc19ab1e01b92226eeb6e8653be7e6691939991b2f347995831b1/psycopg2_binary-2.9.13-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f28b5f2fa8154d0d97e97a664136f58d1639ca008d45d6e09e69fff24826abee", size = 3353133, upload-time = "2026-09-09T23:54:47.285Z" }, { url = "https://files.pythonhosted.org/packages/40/2c/dd379facaa4bd41d7b04711ff30931ca62981c00a91502250ffb49da08a7/psycopg2_binary-2.9.13-cp311-cp311-win_amd64.whl", hash = "sha256:70d091f5c3a6177fac50c0da20181ce0e0c053f1e43c872d5f75bd6d9429c020", size = 2771441, upload-time = "2026-09-09T23:54:49.016Z" }, { url = "https://files.pythonhosted.org/packages/fb/d1/d0125c56b865e3bc9f318d84930b2df71a729229dbb0ce12de748a82a6d7/psycopg2_binary-2.9.13-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2bf9f97a6df69a5d89d054b8cf5257a0916096c479800715fbfe7974dbcb3a26", size = 3725735, upload-time = "2026-09-09T23:54:51.182Z" }, { url = "https://files.pythonhosted.org/packages/54/a5/b5a73d0910555e38ee12c49c1740855f8a1e9776e87d65f0c51e1bab762a/psycopg2_binary-2.9.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:07b7bd9f410650c34c3532162cc329f112368d78a3fc8668cb1ea9df61bc11bf", size = 3818000, upload-time = "2026-09-09T23:54:53.229Z" }, { url = "https://files.pythonhosted.org/packages/3d/43/3e4783f62ae3f4fc19a5acf8d1c394df54458f1336febe188f317556d2a7/psycopg2_binary-2.9.13-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0463c00f946517f3e69192a59e6601e023ff9de45ad0a875eda3d6b1bebeb7ce", size = 4585760, upload-time = "2026-09-09T23:54:55.313Z" }, { url = "https://files.pythonhosted.org/packages/8d/c4/a9a67ae65ad3d567eb0fc9cdf9a5a2783b779aecdcdc8945f1807b13d99e/psycopg2_binary-2.9.13-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e3861eba31f8ea8663fd876166b032fd89179e42aa63764d6feb281f13f9eb60", size = 4282380, upload-time = "2026-09-09T23:54:57.362Z" }, { url = "https://files.pythonhosted.org/packages/b3/db/9d459d3da12e0b841cf1596579455aaa27e9e593e3e9a5a4ded5a55a7c15/psycopg2_binary-2.9.13-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3dc3372b3731b3ef23407fe06b94f640ef87a2bda242fa386033d5589c87514a", size = 5902039, upload-time = "2026-09-09T23:55:01.955Z" }, { url = "https://files.pythonhosted.org/packages/d6/53/21079c10a581c50b6817498eda7c3481c1b3cdb41482bd08ebfccd3664c4/psycopg2_binary-2.9.13-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0405dd4d97720e7ab177aa02e493f524907c4cb3c445ac173e2627948d3d0528", size = 4119840, upload-time = "2026-09-09T23:55:04.336Z" }, { url = "https://files.pythonhosted.org/packages/c4/ce/71e8d9e1b4f3e78157b49a5abdff50d915e95f2812550f6c9b4f2e4d5e94/psycopg2_binary-2.9.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b6ae51708201f501a171b02419d0c30878a743c369c9054eb1289f0f8d5979e2", size = 3661077, upload-time = "2026-09-09T23:55:06.118Z" }, { url = "https://files.pythonhosted.org/packages/d9/54/b17616472f09a0fae96f8852692948b7eaa7c971d7629696da0e5932d996/psycopg2_binary-2.9.13-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:81682c227cc1849c4a6adf7b85274229073bb4c9d6ad5697222c695dcea5a8a7", size = 3307202, upload-time = "2026-09-09T23:55:08.061Z" }, { url = "https://files.pythonhosted.org/packages/77/c7/d9737e222a377dac67a0ce0a2c73e7231a57f5cf18bb35a65d5c8d45d5d2/psycopg2_binary-2.9.13-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:13d955f6054a705a19554364fe9888d0a6e8b0746dc7ebc08a447c7b4fd4145c", size = 3052893, upload-time = "2026-09-09T23:55:10.209Z" }, { url = "https://files.pythonhosted.org/packages/7d/3d/c406c9f698f518c264381192c2bdf8952ee84e469ffa9f82db1411f57385/psycopg2_binary-2.9.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e2405196a8cfe6cd3e54172a54452dcf85c241eaf2e9dde7190d7469f7f5ef7", size = 3355210, upload-time = "2026-09-09T23:55:11.883Z" }, { url = "https://files.pythonhosted.org/packages/27/64/6e3a96699770af2d0d49a2002f722c69b656fc27623ff89281cf2b109644/psycopg2_binary-2.9.13-cp312-cp312-win_amd64.whl", hash = "sha256:376ebf7d8aee4b7386b2bac31fdc27911e7e57cd0a88f1e038b8b149398ac008", size = 2767784, upload-time = "2026-09-09T23:55:13.823Z" }, { url = "https://files.pythonhosted.org/packages/82/0a/795f2869788373cf7d08410341a444196e8ccebbac07a70a8f9a1f60e72f/psycopg2_binary-2.9.13-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4d66bfd44a46eb88cff0287929a4193fb45166b6c1f84bb1b233cc17ece0813c", size = 3725723, upload-time = "2026-09-09T23:55:15.887Z" }, { url = "https://files.pythonhosted.org/packages/b5/63/5a9633f4563a73beba69b20a846ddd14c1c6ac072f5e8aab0da97ffabc2a/psycopg2_binary-2.9.13-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f818161d2302b3b3e9c75d5a1d0a5c5679e92e45cfec6432b9d5432dde5ff1f1", size = 3817976, upload-time = "2026-09-09T23:55:18.025Z" }, { url = "https://files.pythonhosted.org/packages/6c/e2/b2e3b3a4331dc8b58e328cda30f3d0cc43a94b7aaf0c8383efd53dd10e95/psycopg2_binary-2.9.13-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:31db6cba66df5231dfd91d9f69188bec3fe6c8baae384e93a0ce792067ee2d98", size = 4585813, upload-time = "2026-09-09T23:55:20.112Z" }, { url = "https://files.pythonhosted.org/packages/56/5c/87daea77c4132114d1a5da3a4928dd59446c3b3cc73d288cae08cf0b91a6/psycopg2_binary-2.9.13-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f04ada42bcd537adbaf8b7f3140237a204e452a88d0c1831cfce69f7d2e59f4e", size = 4282438, upload-time = "2026-09-09T23:55:22.329Z" }, { url = "https://files.pythonhosted.org/packages/91/e5/56f9efdc9337acbd1a75798d97163183b63a1babc17602f7163009506c96/psycopg2_binary-2.9.13-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa37089795bd9701576edc2eb5849ce77a439eda9dfdfa47857449332cfa5292", size = 5902064, upload-time = "2026-09-09T23:55:24.37Z" }, { url = "https://files.pythonhosted.org/packages/e4/15/f7ed0b90b47b73a9087306b42267eccfd919f92c0fb057e46bd2fa2efa4d/psycopg2_binary-2.9.13-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:41c2eb569ebd0e1b02d30d361a46932923b193fe1b5e641fb4d547c75e218955", size = 4119848, upload-time = "2026-09-09T23:55:26.433Z" }, { url = "https://files.pythonhosted.org/packages/42/08/3091347b9fc5766e979aba6b0756ad14ce867a6bb245f3d69ac71fb768c6/psycopg2_binary-2.9.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3f699a5225094a5c61402984e2fc1eca20e940223e76767c88189efb0c313f69", size = 3661129, upload-time = "2026-09-09T23:55:28.449Z" }, { url = "https://files.pythonhosted.org/packages/34/c4/4f9a84d55484c9794b364548eb6e1fe10a57f123afd19729e5a1cc8ad7fc/psycopg2_binary-2.9.13-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5f04ae99c9fbb94c3197ec88599ed7db921f6adcddfe83687a74c7ead4037c22", size = 3307262, upload-time = "2026-09-09T23:55:30.384Z" }, { url = "https://files.pythonhosted.org/packages/83/42/6eba8306a61dc890805ae475a9e71790a1c5461ccacbd4f0a1f3f57b40f0/psycopg2_binary-2.9.13-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:81404c37e0344ebcf10aac127d33d35137e5dbab1daf9f3deee46188fd5879c2", size = 3052898, upload-time = "2026-09-09T23:55:32.961Z" }, { url = "https://files.pythonhosted.org/packages/b3/5d/42a8935ab280e8dcd7c07a655c0c3d25d62e9e242be1961ac14630f1294a/psycopg2_binary-2.9.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:feb7b1856f6ca805cc0e08739858f6cdfed8ce903390126af30343c62899a389", size = 3355265, upload-time = "2026-09-09T23:55:35.071Z" }, { url = "https://files.pythonhosted.org/packages/87/c2/0e0ffb4caeb651631cbc6c8ead83e2a16457750b1d2eb7f5ef111c1f4d36/psycopg2_binary-2.9.13-cp313-cp313-win_amd64.whl", hash = "sha256:691da68ae5dd7c3ac77514357d35ece7b1ba8b5f3e6c92735198aa6159c355c8", size = 2767914, upload-time = "2026-09-09T23:55:37.14Z" }, { url = "https://files.pythonhosted.org/packages/5f/32/897c074cb99fbdda7d34b0a2546097a59162bb3d04c0d546ae4ec82345e3/psycopg2_binary-2.9.13-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2ca263643ae37998ae04d18e431df34d0d61f12b47640dab585f14b6dbe00798", size = 3725788, upload-time = "2026-09-09T23:55:39.04Z" }, { url = "https://files.pythonhosted.org/packages/0f/f4/e3a789de34c9ac25d20b25c2be583da16394a2ba0926da1c863653831f41/psycopg2_binary-2.9.13-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c0214c7da18a28d108aa7108c8a3cca8035c7911ec97ef9ec0827569c9a2720", size = 3818111, upload-time = "2026-09-09T23:55:40.979Z" }, { url = "https://files.pythonhosted.org/packages/72/29/647724c43ac510dbc59b80e20e85d439deb94f5d5a024153c32330fa041d/psycopg2_binary-2.9.13-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5d89e064bb12b40cad696cf4975e6da86f8c60f14cd06cb6c1bc0a7f5d01761f", size = 4586235, upload-time = "2026-09-09T23:55:43.012Z" }, { url = "https://files.pythonhosted.org/packages/91/ad/7f52f92cc65c23778daff7eec4ee2099236694a0a4723a5f180d0708b607/psycopg2_binary-2.9.13-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:190c18b97d9ef72f2e88c451b6588af90d6bd7bf54cb94b963280dc86a2c7076", size = 4282424, upload-time = "2026-09-09T23:55:44.843Z" }, { url = "https://files.pythonhosted.org/packages/3d/2a/1a472059b198942d99651656e2bc610575584478bfe68d297ecabbd4887f/psycopg2_binary-2.9.13-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c00ebe9a2f31151aade0db233dc1446513a95e92c39ce055ee097af0ae86be1c", size = 5902365, upload-time = "2026-09-09T23:55:46.619Z" }, { url = "https://files.pythonhosted.org/packages/91/1a/171ea5dac7b3a0fa57b3cb59c2ad6d7b8bc60732368fecfd2ed1f1288392/psycopg2_binary-2.9.13-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5085f7ff7b1e890f279577cedeb8c628957869a340fa34a39f7f406500b3c916", size = 4119938, upload-time = "2026-09-09T23:55:49.381Z" }, { url = "https://files.pythonhosted.org/packages/41/ce/3c6d4ad71853a59eee6a575fe36df4bb40752a9735a27bd62af66b454ed5/psycopg2_binary-2.9.13-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4e55357d1943673d491bbabb171c891704fc6a22441fea539e05a5c27a79ea3c", size = 3661557, upload-time = "2026-09-09T23:55:51.269Z" }, { url = "https://files.pythonhosted.org/packages/10/a3/1819a01bf951eab2afb5ca2a3d11f50500bf536fecff088154372a8d1985/psycopg2_binary-2.9.13-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:3e60b06ec7f9dc3e5f1106d12706514b6d6b92c3dc438fcdf4e43e65cc660d1b", size = 3307770, upload-time = "2026-09-09T23:55:53.196Z" }, { url = "https://files.pythonhosted.org/packages/4e/df/22f4aec952cd5b2dd02f438399583ed69f7d04b90e7c31659d9571bbe188/psycopg2_binary-2.9.13-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:dde942b46ce20f6c4464cdf551f3293207f803f4e4354454eb1f5599c3eb1fa1", size = 3052935, upload-time = "2026-09-09T23:55:55.117Z" }, { url = "https://files.pythonhosted.org/packages/95/42/aab651bc22bafa961806ca3b21027bb0739a2730b0e6f7f0778baeb95e67/psycopg2_binary-2.9.13-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:215777c62ce81c3b487cefdb6a41969944eb982309f91349ff3ca0323d6f17ed", size = 3355387, upload-time = "2026-09-09T23:55:57.366Z" }, { url = "https://files.pythonhosted.org/packages/bc/af/3b8220633eaf955e95ea7be67d76e81a0d1cd3c76362ea504b91ffa079db/psycopg2_binary-2.9.13-cp314-cp314-win_amd64.whl", hash = "sha256:f3088eb80f58ed933c62d87128741d31e786edc862e23266d3c286763d646de0", size = 2863890, upload-time = "2026-09-09T23:55:59.056Z" }, { url = "https://files.pythonhosted.org/packages/6e/f1/377d17fc8425220d17552691cd2b97aa232da92173f5dead71278b83f8ab/psycopg2_binary-2.9.13-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:38397def2d794ffde9db80f63d6820253e61b17483112652a318355f51a56f50", size = 3725913, upload-time = "2026-09-09T23:56:00.736Z" }, { url = "https://files.pythonhosted.org/packages/67/64/27208e67cd6e663f69bf7bf905cf69db066a015c90ac9ca948a56a8e9d78/psycopg2_binary-2.9.13-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:dff5c70ed9789ccb0d97ff4a7da51dc523a255c4ec95df188fa5d44adcae4ea8", size = 3818303, upload-time = "2026-09-09T23:56:02.551Z" }, { url = "https://files.pythonhosted.org/packages/6b/98/67d2f34a1d18367b5f655bdd101759f8474286c74ffe701b7d6e3abd7fda/psycopg2_binary-2.9.13-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:08d3b81a6a91775c937abf97d4c58fc9142e8e35fb91c387d24f81d15c98e6cf", size = 4586508, upload-time = "2026-09-09T23:56:04.706Z" }, { url = "https://files.pythonhosted.org/packages/bb/47/46c227deaf322dceafa0b7b321b4e5de9cc797014b7a353349b2e09b1118/psycopg2_binary-2.9.13-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:541a487a9ccd72b5e38f37f27b0ce78cb7eb3e336e7b5277d45463010c03a7a8", size = 4282383, upload-time = "2026-09-09T23:56:06.678Z" }, { url = "https://files.pythonhosted.org/packages/f4/3c/e8705ffa381160d842eaf06a8446e8416f1a2497dd70a7e62277f3be6e7a/psycopg2_binary-2.9.13-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:562fe2a43b30e781848dce63d9080c15414c777c96df348c4342558338cc7bf3", size = 5902765, upload-time = "2026-09-09T23:56:08.634Z" }, { url = "https://files.pythonhosted.org/packages/53/cc/359821c18317228b8032456a3740c98045b719ed003a594b9ebac9330b86/psycopg2_binary-2.9.13-cp315-cp315-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dddfe650e7dda464d676c27fbedb5061f1ad05e1604627f54c770d7f799d36e9", size = 4122849, upload-time = "2026-09-09T23:56:10.671Z" }, { url = "https://files.pythonhosted.org/packages/17/e5/4d935acb6d3258c7a767b3d527e54c0b537649101b55002a5dbcfe747e2a/psycopg2_binary-2.9.13-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:4ff0f575cbb14f30445858dcfdd751e043486f5290915df78a9818bc74042eff", size = 3662084, upload-time = "2026-09-09T23:56:12.316Z" }, { url = "https://files.pythonhosted.org/packages/89/56/9e9bbc7c773c5de7bb25dd35d7f041c2a6f0fcfa9207a1ceaf01a1bc687c/psycopg2_binary-2.9.13-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:d79530b4c1af657d5620a1d21b8e39f2996aa06821d5564d05b22d6b8cd413d0", size = 3308077, upload-time = "2026-09-09T23:56:15.262Z" }, { url = "https://files.pythonhosted.org/packages/36/fa/ed742cd4e5dbddcb44702f9c4a97f7f5b62d97e3d9d00907ecc8ac750ef4/psycopg2_binary-2.9.13-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:6ede8595767e19d30a7e8a84a7d47bfde6176d45d194fed08dbb68d1584a780b", size = 3055143, upload-time = "2026-09-09T23:56:17.168Z" }, { url = "https://files.pythonhosted.org/packages/d5/3a/5c2cb71a844ee236be2ce91b286d797e34a21489909357c7cfba0f5c0197/psycopg2_binary-2.9.13-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:0ebcf3c4266a695df9d0ef51296155f60c86ac51cf82f0d0dd2e827255a891c5", size = 3355374, upload-time = "2026-09-09T23:56:18.793Z" }, { url = "https://files.pythonhosted.org/packages/e8/30/3991c9fdcca90a5a1e55435292f4d74d176da2be15f3998f6858da3658cc/psycopg2_binary-2.9.13-cp315-cp315-win_amd64.whl", hash = "sha256:1752b9821f1377404d65ac43af03d59a1eccc57fb2c1eb8305f9a3fe8eb7a8ba", size = 2867246, upload-time = "2026-09-09T23:56:20.501Z" }, ] [[package]] name = "pycparser" version = "3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, ] [[package]] name = "pygments" version = "2.21.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, ] [[package]] name = "pyrefly" version = "1.3.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/4d/78/b6ec12acb586606618c71ebe1008af59e1ca50e667895f1946fa7b656619/pyrefly-1.3.2.tar.gz", hash = "sha256:30a68ff5429a1546ec08a2d913dfe442c9553a2940d274de18833d8eda939b5e", size = 6679591, upload-time = "2026-09-28T22:10:06.292Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/24/01/144a78839822abad55628881bcb45f8173e6d8b87976897c9105884b5a6b/pyrefly-1.3.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:626dbaee16ae1169a10a4ba3293583b5ab0320102f35efaad9e03457a2fc646c", size = 15088488, upload-time = "2026-09-28T22:09:40.743Z" }, { url = "https://files.pythonhosted.org/packages/23/aa/599756bd42e6533ee9261ebd288f846ab453b00debaef2b4789893967809/pyrefly-1.3.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2d5fc704dbf0e990dc4f15cb1ead64f1a325ae27383a50c76cfcaf0387f926bb", size = 14429996, upload-time = "2026-09-28T22:09:43.316Z" }, { url = "https://files.pythonhosted.org/packages/90/0c/4b0678889136b1514ecd25cec11974d5bfdaeaaf9f5fe8a766ca45ec4ab5/pyrefly-1.3.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89dbe8a33e735fa96023c33ce5dfd81af9b0bdd2ee771e8d69b2ebffc7e0fbc7", size = 14871810, upload-time = "2026-09-28T22:09:45.42Z" }, { url = "https://files.pythonhosted.org/packages/a6/4e/a96236391c6bb0d8b50af85e0ea6c0c56206f739931ac3031f9e000325ee/pyrefly-1.3.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ec0c31715d48bff279f548b85a93b5bc43d2c7bd1492a8cd703a9185cb089e5", size = 16113462, upload-time = "2026-09-28T22:09:47.619Z" }, { url = "https://files.pythonhosted.org/packages/ad/c3/d4d0966aa7008ebd8481a6d05aa53202ad40c9597705eeee87ba6e0e2025/pyrefly-1.3.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b3de468bed691e40dc6271284c8dcc05e649d7ed45280ef3d07332741efe34c", size = 16043341, upload-time = "2026-09-28T22:09:50.083Z" }, { url = "https://files.pythonhosted.org/packages/4f/d1/52d9ea1b7048c7316d9ff7594c170b1c06d37547a75d140c8deea7b9ddfd/pyrefly-1.3.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb94365fe5f854cb4fe82f600c4e2453160d328610b12981004851ee0b6e8aeb", size = 15437183, upload-time = "2026-09-28T22:09:52.56Z" }, { url = "https://files.pythonhosted.org/packages/08/ec/24f83e4a397fa9d5c416bb4d378ee1bb18fe48bdd5698fe541636f5352f3/pyrefly-1.3.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4f730d2e515ac25827fc68f343a7aa02b1072e0062df6a430346a4ffdfb5db2f", size = 14892976, upload-time = "2026-09-28T22:09:54.916Z" }, { url = "https://files.pythonhosted.org/packages/29/c7/a473f8e9ec31ba0682ebe44f4e51167a22a4cbdc8bfd87365b9aca23be20/pyrefly-1.3.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:60f440e1626bd5cc4a41ee90cecba80796ed01ebd6c15d9f933efb8d07ffe2b8", size = 15469689, upload-time = "2026-09-28T22:09:57.541Z" }, { url = "https://files.pythonhosted.org/packages/d0/df/779092365e8e469fc8e7349e1c26c35b8a73df9e6be80a00265fc26a2b2b/pyrefly-1.3.2-py3-none-win32.whl", hash = "sha256:b31684189de44a25a5bf00bdf3ad16be44a7b14654702d6018bce1043357202c", size = 14135550, upload-time = "2026-09-28T22:09:59.757Z" }, { url = "https://files.pythonhosted.org/packages/9d/20/466333e7f2891f8c357b5c226559c39ba8dde4f90be09189ecc771a086f5/pyrefly-1.3.2-py3-none-win_amd64.whl", hash = "sha256:693960cdb247d1f76b9e09b3f2554dae20034f7d442ccd4e9b3e8962a3622363", size = 15067523, upload-time = "2026-09-28T22:10:02.099Z" }, { url = "https://files.pythonhosted.org/packages/18/32/ee66df92c692c0686d82c9ecef3876ccb0386aa318bf507016f0121a8f78/pyrefly-1.3.2-py3-none-win_arm64.whl", hash = "sha256:f7424b21331670522980ff13e08bd143659879a4d92f4832282c7d7c41a9b5d6", size = 14348271, upload-time = "2026-09-28T22:10:04.253Z" }, ] [[package]] name = "pyright" version = "1.1.414" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nodeenv" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e1/1b/244c7b710031ada80f27e579ec20d28a2285dfc318fed0339866b1047f12/pyright-1.1.414.tar.gz", hash = "sha256:523c0a97c60da6333234955c277730c9cf4f5bd6d5399e7b7d2b0fc5d3599524", size = 4154638, upload-time = "2026-09-10T12:26:53.181Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d7/ba/18b6e682ead424ad24bcc134339ae5d1b931cd9ae260540592a058a91279/pyright-1.1.414-py3-none-any.whl", hash = "sha256:2a6b4b3298c9eec174c5ed83bd338de6eee82df2992f3e1930e6199d381be36f", size = 6225049, upload-time = "2026-09-10T12:26:51.427Z" }, ] [[package]] name = "pytest" version = "9.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "pygments" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, ] [[package]] name = "pytest-mypy-plugins" version = "4.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "decorator" }, { name = "jinja2" }, { name = "jsonschema" }, { name = "mypy" }, { name = "packaging" }, { name = "pytest" }, { name = "pyyaml" }, { name = "regex" }, { name = "tomlkit" }, ] sdist = { url = "https://files.pythonhosted.org/packages/41/38/519349835619e0441c12f37e000e999adc7d57c50e7745d432ed5b4548d4/pytest_mypy_plugins-4.0.3.tar.gz", hash = "sha256:bfe491a363dfa7d183e1a9d19615d8aaff79262eea2bc3dca87b4f8223cfe7e8", size = 30583, upload-time = "2026-05-14T07:43:23.834Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/6d/d3/f918e0fd29f27fcec312a313fd0d1d49c7636ba1d6cc558b1364984a4ef7/pytest_mypy_plugins-4.0.3-py3-none-any.whl", hash = "sha256:0494fbd3c0332026eee191f96f0b3e2aa3edfb0cc31bd6989607923bb52343ad", size = 21491, upload-time = "2026-05-14T07:43:22.174Z" }, ] [[package]] name = "pytest-shard" version = "0.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c6/ca/3efa6f3b84dab83220db45997e785be726684c2c2c4267bffb7d80101c7f/pytest-shard-0.1.2.tar.gz", hash = "sha256:b86a967fbfd1c8e50295095ccda031b7e890862ee06531d5142844f4c1d1cd67", size = 3579, upload-time = "2020-12-11T19:52:55.083Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/65/7a/dbeb4c54e9fc3b59622f410091365f354a69cda1af10c3b83ac0ca6e6f4f/pytest_shard-0.1.2-py3-none-any.whl", hash = "sha256:407a1df385cebe1feb9b4d2e7eeee8b044f8a24f0919421233159a17c59be2b9", size = 4608, upload-time = "2020-12-11T19:52:54.226Z" }, ] [[package]] name = "pytest-xdist" version = "3.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "execnet" }, { name = "pytest" }, ] sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload-time = "2025-07-01T13:30:59.346Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" }, ] [[package]] name = "pyyaml" version = "6.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] [[package]] name = "redis" version = "8.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "async-timeout", marker = "python_full_version < '3.11.3'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a8/99/604f0b666d4c616d891cf77ebb9db6bb21601344c051aebf1b72b9ff915f/redis-8.1.0.tar.gz", hash = "sha256:6e1a19beef9225c83efd689c7e6b7da2d5215b1f42cd13b7fc3714d0a09c7b25", size = 5254356, upload-time = "2026-07-30T08:51:00.269Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/66/9d/c5731f6e3608663d4d3656fd8d3aecee8b509c3082818f5a13eae925baea/redis-8.1.0-py3-none-any.whl", hash = "sha256:a4fe1aac3d3b3cc791d4b3d5931c5a956045dc951ee74d1c913ee3ac4d2ee9fb", size = 560618, upload-time = "2026-07-30T08:50:58.497Z" }, ] [[package]] name = "referencing" version = "0.37.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, ] [[package]] name = "regex" version = "2026.9.29" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/fc/f2/af1da9d3ceed77bfcdce40427d49ba0be94e4fe84245e3bfef68c10e75b6/regex-2026.9.29.tar.gz", hash = "sha256:8b5fcc4771732191b2b7d1dd68d8f0353f47f8d90b6150f6dce58bf1112442cb", size = 419199, upload-time = "2026-09-29T00:49:58.298Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e8/6b/6dea87689c3a06a6e79d254bf824e6f3e3d724b5ba027c6112559aa6cd2c/regex-2026.9.29-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6abb75ab16bc3281714a5b99548a2225db70dba1f995f6d7f7419b76eb5a8fbe", size = 495413, upload-time = "2026-09-29T00:46:14.51Z" }, { url = "https://files.pythonhosted.org/packages/3a/a5/0c791a0e83ad1013d262c13247c4c77e0f4a8d05bdc167df96aba6681c0d/regex-2026.9.29-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b7b893976e7fe42053da64f2aa27239c24252fd2ec6df471e1be197c0addc3b1", size = 295145, upload-time = "2026-09-29T00:46:16.292Z" }, { url = "https://files.pythonhosted.org/packages/b1/07/9bf3607d8d13a12e436ab9d63f9791e10706827d535695b23964ad79fd79/regex-2026.9.29-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:066d0e3dbfdd739bce2bf8c2a41dd16f73e3d8adc2eb06dd803a36a307f56075", size = 292123, upload-time = "2026-09-29T00:46:17.646Z" }, { url = "https://files.pythonhosted.org/packages/64/6b/32c2e6fc617e1d3f247e250fea31a9a35b1265bd32f585968aa13b9999b9/regex-2026.9.29-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7020ed44df30b3aa492c00ee3b52d0548c1f30c2c6c5bb13ae897680900d3413", size = 799537, upload-time = "2026-09-29T00:46:18.976Z" }, { url = "https://files.pythonhosted.org/packages/bf/72/f041177f3c7a4606f7c81a95fe7eea03e2a0c4e8bff9e439a01432cbc9f2/regex-2026.9.29-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ae4613d7d9dda60fcba95f846cc6f808017f1843f392cf9daad14a6534493d71", size = 873255, upload-time = "2026-09-29T00:46:20.684Z" }, { url = "https://files.pythonhosted.org/packages/d0/4e/a78948e11dd715e0e46716c2e0f3404b3fe6a44e2a2e9abdc7d965cab2b3/regex-2026.9.29-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bec37990e3d6121f29ecfb594bd8f1bf009e9f7926daba2e50e3b27d3892a783", size = 914570, upload-time = "2026-09-29T00:46:22.599Z" }, { url = "https://files.pythonhosted.org/packages/8a/70/aa08d1d2b294894b365e5f8ba5380fe3f8546acdb81f10639dfd74209c37/regex-2026.9.29-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:612b709381c0355b70d89cdb51b7f670591ed5cbbc0e3b5337488019dc667b65", size = 804978, upload-time = "2026-09-29T00:46:23.981Z" }, { url = "https://files.pythonhosted.org/packages/21/32/1b03534c4715aca3b564416d28d518083ed4dab3bc913267600d2256140d/regex-2026.9.29-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a760da040b47767b4b873adfb7c3b691e9ba2fc60f113f9d0b88f1a62f323e85", size = 779297, upload-time = "2026-09-29T00:46:25.318Z" }, { url = "https://files.pythonhosted.org/packages/76/a7/378f6f558d9e4444af315a307c5953565a511d1e3666f1bb7bdc82012b6b/regex-2026.9.29-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ee178ca31c94621294bf9b8b676a92a2e6bba8af0529591753719e57edb621", size = 786961, upload-time = "2026-09-29T00:46:26.963Z" }, { url = "https://files.pythonhosted.org/packages/59/13/79f0b1846f5f342f92ddbd4b27b18bcb86da96d902c1a0be26520bde98d7/regex-2026.9.29-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5eeb8edc6110d9194a4d0d54610f64c37a31c605b5dbb7e407fc6ec7fa34a4a1", size = 863234, upload-time = "2026-09-29T00:46:28.58Z" }, { url = "https://files.pythonhosted.org/packages/97/19/05af70dec9f2eed6ba34e08d2dcc6a48e7ae5e307659d5fe4201a5d7bbee/regex-2026.9.29-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ccb64d887a9db1cd76dbc0f92051a1a478a2a67e7f56c62d915cb881d7734704", size = 766487, upload-time = "2026-09-29T00:46:29.941Z" }, { url = "https://files.pythonhosted.org/packages/01/e1/9c7486d4afe8fdd1fe0ad60139f8aa91427381f409af6a29b609d8fdcb3a/regex-2026.9.29-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9e4482589065c8ecd761cff522dcd85f2d39e62f551e37e025d1c7d54772def3", size = 854792, upload-time = "2026-09-29T00:46:31.358Z" }, { url = "https://files.pythonhosted.org/packages/26/c7/49d008ff5f741d9a9799d7315556f3a12b983ff0fcd2cdfb62904bedafbf/regex-2026.9.29-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d60030baaa7bfbb02d650c126cdcddcb6e33dbff14d819434c8fa2fdcaeeeba5", size = 793050, upload-time = "2026-09-29T00:46:32.775Z" }, { url = "https://files.pythonhosted.org/packages/cb/a1/46ba549e65562ca04608b24179b8a7bb6f146ae0e7c6d7f5e70f3339c8ba/regex-2026.9.29-cp311-cp311-win32.whl", hash = "sha256:18ae8eed4526e35bdb754d61562b90bf5c00a67fdcf3cc1380dd59597486631b", size = 268940, upload-time = "2026-09-29T00:46:34.179Z" }, { url = "https://files.pythonhosted.org/packages/4d/4a/aab232183c70fdcf77bcf0c51819da02ec522e393e6a0bf00bcf2142e21f/regex-2026.9.29-cp311-cp311-win_amd64.whl", hash = "sha256:1043aedf5917caa861bcb25a9c11460049656bdf0017a90a309fa8f255467725", size = 280641, upload-time = "2026-09-29T00:46:35.484Z" }, { url = "https://files.pythonhosted.org/packages/33/b1/7c05954af0f51de376df2ba97f7f78a8b79334c7e5b3d2d9f2aead1f4d3d/regex-2026.9.29-cp311-cp311-win_arm64.whl", hash = "sha256:352cf115a810b357caa35193ab656ecf5ef41056855e82f292c99e8514f8d954", size = 279411, upload-time = "2026-09-29T00:46:37.193Z" }, { url = "https://files.pythonhosted.org/packages/84/48/3fdcde9a0baa84d7d25571223265d6e434e114763b438601d54a8028bf3e/regex-2026.9.29-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dc79d36d0618752265f0d575915bdc5c5130ecb9c9f6b3bcefeae32e4bdfafcf", size = 497903, upload-time = "2026-09-29T00:46:38.938Z" }, { url = "https://files.pythonhosted.org/packages/2e/1c/4ee3e97c76f53940488dfe7a7e18705e78daac8cd7fb161d246b9e328449/regex-2026.9.29-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3a21a9509d0ee88e7a70e1ad228cd2f0e0fd1e187458db132e8a8d18c97daf9d", size = 296416, upload-time = "2026-09-29T00:46:40.406Z" }, { url = "https://files.pythonhosted.org/packages/37/14/f3f0ba083d2094392d5eabf56db5ea6ba469fd6e927afd187042054ea68a/regex-2026.9.29-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f57dc6b8fef170f105d2cf5cdce254f47b137d7755086cf7050f47e16582abba", size = 293633, upload-time = "2026-09-29T00:46:41.959Z" }, { url = "https://files.pythonhosted.org/packages/c9/72/67e7a8ce17f1aea49df215564048efb49cc8c2b31a0e0fc30f36838f8516/regex-2026.9.29-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f93bc1c3486ef3747e07c9d7c1d0a147b8fbaab975f80e348aed6f71309dfaca", size = 805885, upload-time = "2026-09-29T00:46:43.373Z" }, { url = "https://files.pythonhosted.org/packages/f6/78/25436bcfd4d2260b4b4090094d55d7ab53ec8a1ab4865a0b8bcb33c7d5c0/regex-2026.9.29-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e1d3a4cb7993b708f0ada8d0c84590efd853f169e7147d2202c9da503180242", size = 878344, upload-time = "2026-09-29T00:46:45.328Z" }, { url = "https://files.pythonhosted.org/packages/97/e6/a09ec3a23ae41d6179880e67f0aace9284b2d95f2d7b326eff203f8eec5e/regex-2026.9.29-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dabee8f4935e731fb46b2a3091bdda0d3d94b3bbfb907d2b4f12eefce4009619", size = 919181, upload-time = "2026-09-29T00:46:47.041Z" }, { url = "https://files.pythonhosted.org/packages/26/83/d2fbd2e4e3afb1167daa825187d196f313cbaa1a4768f311fb041bb0e3d2/regex-2026.9.29-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:39ab5894d971f9ac68baa6eca5c50387db579cfcacf36ae8df3feceb1815e6d0", size = 807783, upload-time = "2026-09-29T00:46:48.894Z" }, { url = "https://files.pythonhosted.org/packages/46/0b/eb429a7016610d44fc89a597163f8c9127505f0d7dc724dc9effbb6a3ac0/regex-2026.9.29-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c1a9a6651197fbed6f0212591418b9def774fc3f8324f78d1bf0e6a63e5f8aa1", size = 783465, upload-time = "2026-09-29T00:46:50.64Z" }, { url = "https://files.pythonhosted.org/packages/1b/07/58a3c0153c7476898430f6a7cf3d9062a1d17fbea4f43399ecaf411c7b4c/regex-2026.9.29-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87fb80cbe3557e27e7b28b995c2b2eedf689b8886f941ab93e0e288f0976518a", size = 793519, upload-time = "2026-09-29T00:46:52.396Z" }, { url = "https://files.pythonhosted.org/packages/2a/e8/161b94d39164520e21a7befe0245569bf7fda4c7cf1fc4e2df2b5def49da/regex-2026.9.29-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3c5c2ef13797466aa64170cbb66ad98a32351dd4127694cea7199f80f213750d", size = 869293, upload-time = "2026-09-29T00:46:54.128Z" }, { url = "https://files.pythonhosted.org/packages/8f/07/3b02ed829aa2decdc1955d222bd1e2f99d1c8bb4873bbb9a66b2f0a36bff/regex-2026.9.29-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:59b49507f47479e299a9e1bc41b5cb83a7afda0540625f1dbae886615978acbf", size = 770239, upload-time = "2026-09-29T00:46:56.106Z" }, { url = "https://files.pythonhosted.org/packages/42/5b/ba61f6fe062eb8562e742367d177bb75370434138ef6c9d2a27114f8d613/regex-2026.9.29-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0dd8af32e9f7b56b7f95cc1fd79b23054c3bdc172392ae560acc24d57b7ffe71", size = 861973, upload-time = "2026-09-29T00:46:57.665Z" }, { url = "https://files.pythonhosted.org/packages/cc/27/767259b20e8a842948990f5e99138d6c077248fd42f8b5468b1d9ca4b814/regex-2026.9.29-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db5e82ba15c142425b8406690032df89e39cca4a2e8afbbb9a3d84edc2373ac3", size = 796470, upload-time = "2026-09-29T00:46:59.236Z" }, { url = "https://files.pythonhosted.org/packages/a0/05/2566c4ba849b68a8ab81a6bf428fa79d20aae7ddee83979103c0381df254/regex-2026.9.29-cp312-cp312-win32.whl", hash = "sha256:d0c3082bf79bcd6a614d55916590ad4b8f93200e10b97f463ea5d9d07c9b5f23", size = 269327, upload-time = "2026-09-29T00:47:01.135Z" }, { url = "https://files.pythonhosted.org/packages/93/19/489bc8db91196381c935752df01ba3f607140daece33b78d88573f028e64/regex-2026.9.29-cp312-cp312-win_amd64.whl", hash = "sha256:fdd88ed5e20b1bcdd234421e454962c971aa44b653bdb7f1ea9ef683e90fb649", size = 280334, upload-time = "2026-09-29T00:47:04.436Z" }, { url = "https://files.pythonhosted.org/packages/0b/47/fb88ba779d0e5e7d4b0ec1aceeb13845948a2cb876bd572a2d1dfdba090b/regex-2026.9.29-cp312-cp312-win_arm64.whl", hash = "sha256:4fe97894d1b306c919b4e50def1e6f6c522f4d03a7283811f4d108f1ce5d3ac2", size = 279614, upload-time = "2026-09-29T00:47:06.541Z" }, { url = "https://files.pythonhosted.org/packages/79/d5/6080f7d1a6e7e36aa720f806ac93c035ba39c209ae6cc510e8ef4c0279c6/regex-2026.9.29-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1a0d5117230dd46b399a30a38afa44f79c99f3168988fdc4f425c3f928b39df", size = 497622, upload-time = "2026-09-29T00:47:08.251Z" }, { url = "https://files.pythonhosted.org/packages/00/71/c87fc7a2e21a42f9d57489db32951c37eef56d153840459a80d464f0321d/regex-2026.9.29-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f0fe9834e5aeccaf19a0d8feb296d66a24be1a7c9922002f842a682cd5abb787", size = 296281, upload-time = "2026-09-29T00:47:09.764Z" }, { url = "https://files.pythonhosted.org/packages/11/9e/aa0f4cde3bc4688c1d58b0cd8415edd708339bc0bc401a195b0b1e8c8f0c/regex-2026.9.29-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c90fcf7804ea0a54b896ce0f2b9565350220b8d4890fd0db461a476a4c687963", size = 293472, upload-time = "2026-09-29T00:47:11.723Z" }, { url = "https://files.pythonhosted.org/packages/90/d4/e835c487850ed922a8d6074f953b888c8ea99775c76b9ed5f8a4d72eab92/regex-2026.9.29-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e11edba5bc344a32b029a7af9d4b3173982dd79eeafa0b9dbd787364414b0509", size = 805966, upload-time = "2026-09-29T00:47:13.235Z" }, { url = "https://files.pythonhosted.org/packages/2c/57/ba8809847fbae8d2cbc71367c6ded510a7ec88bf52493c65efc1acf4effb/regex-2026.9.29-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bb90e7177944b6684738c1fc36aabd2dd00d1de3be7dbe09f91e196f1bc0dc81", size = 878346, upload-time = "2026-09-29T00:47:14.877Z" }, { url = "https://files.pythonhosted.org/packages/1a/52/e3da19fc3cc15ef67ab67e121e87887c3bccfdb683a7a9ec557c460ca5b7/regex-2026.9.29-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d06fcdecc10fc7954d7c8f27a03c96055fe525274dc84a7b0dbdc3d6b9e03dab", size = 919250, upload-time = "2026-09-29T00:47:16.622Z" }, { url = "https://files.pythonhosted.org/packages/9a/8e/c1ed81f55f992f6aa0b699a592a50c1ce9e6d44ff1aee2c14c0537dcef9c/regex-2026.9.29-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d49c18f1ea294cf4adde2e5ac256e98c82ea9d708462ce4bf799dffa7cfe8a2c", size = 807902, upload-time = "2026-09-29T00:47:18.268Z" }, { url = "https://files.pythonhosted.org/packages/ad/bc/5a6886eb470e41040e21e05b75024a18b6ebfe7ea400b72094a60f949101/regex-2026.9.29-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3e778bfccd63075167709136afbc251c1f683758d5bf49c803c60ac3f894ce6b", size = 783514, upload-time = "2026-09-29T00:47:19.921Z" }, { url = "https://files.pythonhosted.org/packages/cb/52/6d951d453b023c6edb880f1ba474291b53b8ce1cc438b96a9db6d791d991/regex-2026.9.29-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:686ac5350fceae63830bb98805fcb8039325bf4c06d9f6f048ff65229d5bffa5", size = 793466, upload-time = "2026-09-29T00:47:21.552Z" }, { url = "https://files.pythonhosted.org/packages/99/b9/d5a41adc08360f5eee0dc4846c578f002366947211fc8af5a69a64ee7b9f/regex-2026.9.29-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:26ec4ccce55aa533fbd603d08911b01101a8fcfec987845ac3ae2c7087b2bde3", size = 869464, upload-time = "2026-09-29T00:47:23.276Z" }, { url = "https://files.pythonhosted.org/packages/4b/32/d76c9d91f5d798e2e9e67f6f85ec4ae35445ac425f7454797311cecb80ca/regex-2026.9.29-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:a655d34b2a6943af32401f3d94f72e9d731f6ad16285815550bf2b4ee69d420a", size = 770278, upload-time = "2026-09-29T00:47:25.193Z" }, { url = "https://files.pythonhosted.org/packages/24/00/aeebdb540c620a0f7317f6d6fad80a47729ecf0599a24b5c34ec155351f5/regex-2026.9.29-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0c992c19cd45058a4b92f68f139c93db168b48fb1f322c9a7cd620806afb6b51", size = 861949, upload-time = "2026-09-29T00:47:27.005Z" }, { url = "https://files.pythonhosted.org/packages/12/62/d0314bcedfd3586197e4596931fa220260eb2385bf53184e5b9ae67db24b/regex-2026.9.29-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ebb8912f565b8cdbbf27debfe00df04202c20e2f651b9e32767930c5eace3621", size = 796602, upload-time = "2026-09-29T00:47:29.233Z" }, { url = "https://files.pythonhosted.org/packages/ae/c7/d5a8c13a613facb03e0fb55c1ebaaf7bb35d8e2c1abe8bef8dca809fc1d9/regex-2026.9.29-cp313-cp313-win32.whl", hash = "sha256:4d7d93613b01b0199961330e49cfc52d479b3d5776c56c691db31130c0a07d91", size = 269306, upload-time = "2026-09-29T00:47:31.14Z" }, { url = "https://files.pythonhosted.org/packages/80/a7/bf93a3a6afa5f7bc16b7afb94ae581b01cae620b8ad56bd8f9572a985959/regex-2026.9.29-cp313-cp313-win_amd64.whl", hash = "sha256:61956f074ecd123f55adca68ee3eab46e6a07ad3f8e64e6db95dfacb444f55c4", size = 280307, upload-time = "2026-09-29T00:47:32.709Z" }, { url = "https://files.pythonhosted.org/packages/b2/7d/388274e53605a86297f433a08102a7bbdcf9379d47683d307ccaefd88e2c/regex-2026.9.29-cp313-cp313-win_arm64.whl", hash = "sha256:bfc71e6d970419c1309b3640305298643e2a734cad3f7cfb6d2ddee4175ab53d", size = 279599, upload-time = "2026-09-29T00:47:34.674Z" }, { url = "https://files.pythonhosted.org/packages/93/1f/d9dc6f02f569625faf67a4daec926cd5023472dcd69bb44286dccd5a5ab3/regex-2026.9.29-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:957bb708e8057ab1649ba566456429d691ec9b90d1c9ad1af1ba7ffbbeaf05f2", size = 497598, upload-time = "2026-09-29T00:47:36.541Z" }, { url = "https://files.pythonhosted.org/packages/9c/83/9b693a3fd1451381e812031a8961ec5b3b8f0c8cc6871f14c5223642804d/regex-2026.9.29-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c9b602fae1e00b7c035d661ce85575365719192a7b46784bd71cf64c68053aa0", size = 296250, upload-time = "2026-09-29T00:47:38.233Z" }, { url = "https://files.pythonhosted.org/packages/dd/5f/52bc2abc3fef040cd9de76ab29c918d6a717a454ae2b9dd7938b0c95656d/regex-2026.9.29-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0166844493626c5015c6088ee15c9ca2fd060ca15b7641d1657da6a58432ae33", size = 293518, upload-time = "2026-09-29T00:47:39.957Z" }, { url = "https://files.pythonhosted.org/packages/dc/fc/cf50671215ee0057046980b4571ef8646a005819bb67f0957e779ed107a5/regex-2026.9.29-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b97a38fb4c732b6832db6bf108963adbcd82ef1268ba2025dce390f45af75efa", size = 806037, upload-time = "2026-09-29T00:47:41.676Z" }, { url = "https://files.pythonhosted.org/packages/14/4b/dddef8fc15c63e4347cc9efb138d0cd306f30e6c98acbcc81a8f780083b9/regex-2026.9.29-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a540abfab208e1b7ef2df231c40ef3b6cbb30a0aad6204e9b6a81c10a6794628", size = 878881, upload-time = "2026-09-29T00:47:43.755Z" }, { url = "https://files.pythonhosted.org/packages/9f/cb/38daabed32d28f7e58a06e9344ce00dc67952e9996bc578ed6a29fe1240e/regex-2026.9.29-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ddfa987262763c3c22a8367d2a49c244b018a74c3a8e3ab1a864119ad45c5633", size = 918684, upload-time = "2026-09-29T00:47:45.594Z" }, { url = "https://files.pythonhosted.org/packages/a9/4d/041d9458a645fee4fce4d642a89d27271a3cfcd91095104f6dde44da70bf/regex-2026.9.29-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f7f7aa47b229f2b39a2ae2596d2ad5625d77b5eb9856fac2dab3eb506cdd0a0", size = 807176, upload-time = "2026-09-29T00:47:47.372Z" }, { url = "https://files.pythonhosted.org/packages/bf/c4/4383eed7aa5aef67616cb1b3f3ad06b7c624c4e6cced48630cd5ce133d85/regex-2026.9.29-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d9b77b25b4f395f92de6099ab08e8ae2bc7e51dfe157f22900902243a5cc90c7", size = 784315, upload-time = "2026-09-29T00:47:49.518Z" }, { url = "https://files.pythonhosted.org/packages/5c/a6/0086ad31cebb183c637d3198547075aa493afde308e1ff61fccccb29ba6e/regex-2026.9.29-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:34b6925af9853bf461950e6508910f179fd6e9b1a7ec8548e069606b7e51a26b", size = 793748, upload-time = "2026-09-29T00:47:51.279Z" }, { url = "https://files.pythonhosted.org/packages/d5/a0/f9005cba3f629a859573fc5d1224ea4e1f97919ec8581d018e03a351a604/regex-2026.9.29-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:addd736a0547d553283adaf4e05d7104e7f2c7b0b092e9b4d28756825f14531f", size = 870302, upload-time = "2026-09-29T00:47:53.368Z" }, { url = "https://files.pythonhosted.org/packages/01/4f/e1a3e46bb5315a4e18b01a990e7a28e2a16595609d50c442baf2815a3c65/regex-2026.9.29-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fe3fa1dd453ed5c7f5ea23a26218329790ed7197a99b90e94330e313959a7f52", size = 770299, upload-time = "2026-09-29T00:47:55.606Z" }, { url = "https://files.pythonhosted.org/packages/2c/fe/f303b4acfda44e1ff1379368748c1ef2dad04a6a8e9c0ecbc970b19d97ca/regex-2026.9.29-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:0cc63b5e47c12a48d90c7e9d7de6a035dd14f62868aaedbb4e0ff8ba2b8bfe7b", size = 861570, upload-time = "2026-09-29T00:47:57.617Z" }, { url = "https://files.pythonhosted.org/packages/60/b6/b4f7e99249f596017c60ccad5faf9310fc8e3e59bb2244940a90a1b0bdff/regex-2026.9.29-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:724184b4aafed865e4f13ca313fdcb43024300c028ec67319cfa16847d84685e", size = 795967, upload-time = "2026-09-29T00:47:59.922Z" }, { url = "https://files.pythonhosted.org/packages/fb/d3/fc865a4638d9f6762192b6bab5b7aa1f33a90e9e99578c2e111e2a63c8c3/regex-2026.9.29-cp314-cp314-win32.whl", hash = "sha256:c6c8fabf1dafc1f1ddcbb67896d3f93efb092e8c4b6322d7389b944e76a484e5", size = 274758, upload-time = "2026-09-29T00:48:01.8Z" }, { url = "https://files.pythonhosted.org/packages/31/e2/c2b466924ccbeb874862968ca638051b15a8fd29d994a0e99004a5cbf78e/regex-2026.9.29-cp314-cp314-win_amd64.whl", hash = "sha256:1c2a0026062abcc321a53db4a185ceba0b59a66b5d37b0808917a88b55a5257f", size = 283817, upload-time = "2026-09-29T00:48:03.614Z" }, { url = "https://files.pythonhosted.org/packages/c6/42/ea0f8dbaa924fa75c6338935eaee2f44dab369b27f02db1e03d74344b049/regex-2026.9.29-cp314-cp314-win_arm64.whl", hash = "sha256:121a76a0985db80ceae9e171c337f8c927868e37d01b54e3ce87bc87f9c6a208", size = 283663, upload-time = "2026-09-29T00:48:05.624Z" }, { url = "https://files.pythonhosted.org/packages/44/48/d58e5081119f5c223bbb37d2340acde3d069e1df8e8cd166c37502eee4da/regex-2026.9.29-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e31f72490b7c12f7790e1e25c3afffd20503ee1bfb43461d7838b871ff244b19", size = 501393, upload-time = "2026-09-29T00:48:07.833Z" }, { url = "https://files.pythonhosted.org/packages/72/3c/c49945287d4f9efee7d41f98072f8ad880efb8f430595a612fbdea996a4e/regex-2026.9.29-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:80ea96f5c1a30bf09007d48466521d9c294bebe197c708c3359096e3e3691632", size = 298237, upload-time = "2026-09-29T00:48:09.684Z" }, { url = "https://files.pythonhosted.org/packages/f9/1f/688cb61c3d4cf7bcc1ed444b5cc49399eba3e51c469ae285cf87fea3022e/regex-2026.9.29-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:554bffadcbcb6d5f4e5fb10a61cc52084b9a63d1dab5f10bcd2c4343972e8e2c", size = 295936, upload-time = "2026-09-29T00:48:11.454Z" }, { url = "https://files.pythonhosted.org/packages/26/a3/de43ac6b877b7d09c19a3a426b1bd5acdd209eaaf68f406466f80439ccf6/regex-2026.9.29-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:864e9b87ac33c3fb9fb4ad48166d4fdb579c351d5c77deb0d34bccb36a775cd9", size = 816905, upload-time = "2026-09-29T00:48:13.321Z" }, { url = "https://files.pythonhosted.org/packages/62/14/9940763201c51d537786304984c67d0fc3d2ed18837ffb6f09a869f6b6c9/regex-2026.9.29-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:044265d77d94f5e3cb2fd72c76723807c429cb8c533e9d4672d0334a6f14f588", size = 881527, upload-time = "2026-09-29T00:48:15.313Z" }, { url = "https://files.pythonhosted.org/packages/d3/e1/c842d8df0b23245ebf202f8ab9c39fd48e2db39959454ec39a41c8c72082/regex-2026.9.29-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2089fe39c406784d90101c726755ffa1497bb74638fd434300d2b88006186de8", size = 923115, upload-time = "2026-09-29T00:48:17.328Z" }, { url = "https://files.pythonhosted.org/packages/d8/c1/98622479e3c354a446a75232e522d747d2b3df23092dcd8a5309380a2020/regex-2026.9.29-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0def9fb6abac55492d6d51cddb7225d07d6f279e774e0adc08569a54a5fc8d46", size = 820674, upload-time = "2026-09-29T00:48:19.32Z" }, { url = "https://files.pythonhosted.org/packages/6c/d0/5808c95f9c79ed27b5eedaafc3df6239ec56a49f2e23ea8f831b18427c82/regex-2026.9.29-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:888d60953908dcf761aa320c3e390ab8556efbdb551ace63921de90f6ae0848d", size = 793306, upload-time = "2026-09-29T00:48:21.615Z" }, { url = "https://files.pythonhosted.org/packages/bf/d3/021ca2638671ad20603bcd9b4d5bfa35d2610cd216a043ea7f0b44ea39f6/regex-2026.9.29-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ed511a0708e2297e1d6431e7fb217e3402791e491e02da800658ace4973df1bb", size = 803103, upload-time = "2026-09-29T00:48:23.871Z" }, { url = "https://files.pythonhosted.org/packages/6b/2d/755c6d13ef9c657378013676c391c7a402166b3f419a464a3e058dcbe533/regex-2026.9.29-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e1172147d28d8fbcf8cb8d26c41506169f5ad8fe9ec969cb116835a19d4d8eca", size = 872175, upload-time = "2026-09-29T00:48:26.255Z" }, { url = "https://files.pythonhosted.org/packages/6c/fc/e1cab183b9dafe8597f58c1c766da9bf96204d3b2f232bcf3eeb75ff7b6c/regex-2026.9.29-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:92f05c9c42bde5785dc48770bc2194d9f7442544156f951e19cd31b096cec562", size = 777362, upload-time = "2026-09-29T00:48:28.389Z" }, { url = "https://files.pythonhosted.org/packages/06/7c/e10ea17fba31fb4a1f9d13ed53a2d2a9066a2aea58d7557e263f6d99e7b0/regex-2026.9.29-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:f37964e4a5e993d2fd45147741e9dff7f34a2d8c00ab94c4ea0514a4677f959e", size = 865606, upload-time = "2026-09-29T00:48:30.4Z" }, { url = "https://files.pythonhosted.org/packages/8e/6e/69824d9aee1fd41c54ea7264654a47c8d9d84d8a228e11c2bcf4c201ed81/regex-2026.9.29-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:951733b1bbdb71e377cec567b409f1a7881b47cfcad84121aa74cb575fa425ea", size = 807945, upload-time = "2026-09-29T00:48:32.375Z" }, { url = "https://files.pythonhosted.org/packages/89/22/857050a86e21ce60193e02a8ef662521f2e263a645c8b1b905fc136b61a7/regex-2026.9.29-cp314-cp314t-win32.whl", hash = "sha256:65b408d8fcb273e3499e7ef2ce796810da1becd208c7fb4373692a242d79d461", size = 276758, upload-time = "2026-09-29T00:48:34.72Z" }, { url = "https://files.pythonhosted.org/packages/4d/96/56808fe029553d7d4c703414f2a527faad2ea2bfa9ca094a2e7f8762b530/regex-2026.9.29-cp314-cp314t-win_amd64.whl", hash = "sha256:bf48516e35cf848390ea68850aba53e7c333720d2945b4d2c25b69fc5171723f", size = 286527, upload-time = "2026-09-29T00:48:36.864Z" }, { url = "https://files.pythonhosted.org/packages/01/aa/074e2cfb3d8101a6a764aba5f7c5d1e21de087483e35bdc0c4ce2eb60364/regex-2026.9.29-cp314-cp314t-win_arm64.whl", hash = "sha256:9173db3be74a35cb6731701094b98120f7ee4876a287882a59cdea1fa7da342f", size = 285954, upload-time = "2026-09-29T00:48:38.901Z" }, { url = "https://files.pythonhosted.org/packages/a7/dc/d84990386c9dfdf8c377f00f371b241fdc9a2c8aea0e3d66941b2e51be0b/regex-2026.9.29-cp315-cp315-macosx_10_15_universal2.whl", hash = "sha256:c3589f40749acce747510bf5d589d54e376cb0930ea58b35effac97e5312b0c1", size = 497836, upload-time = "2026-09-29T00:48:40.858Z" }, { url = "https://files.pythonhosted.org/packages/c2/ab/a569ebde875fa12ff8c6c9a30e07503620f195e4be4d54c3d3ee8eecc283/regex-2026.9.29-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:32ab11df9677ca80bcbb5fe4eb1da9109a5019239a054836efc6fa1c64e683cf", size = 296244, upload-time = "2026-09-29T00:48:42.952Z" }, { url = "https://files.pythonhosted.org/packages/f3/3e/7d548e82a108e7c8b2d5246650e397a2f8db599f9b2e975466939c5b4e70/regex-2026.9.29-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:7c03031610e3e6ed1768a2b7a8fc84637c1257b50c5eacaf094c6e17a84fc563", size = 293748, upload-time = "2026-09-29T00:48:44.985Z" }, { url = "https://files.pythonhosted.org/packages/40/34/a8e19a52f452bbb07b32a2bef70dcdf90c2737049749f74cc12d7486fb4f/regex-2026.9.29-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:42e82e578c904445d4c8a35b8f28052cf567593215fa5db06266fbc6f77aaa2e", size = 807840, upload-time = "2026-09-29T00:48:46.948Z" }, { url = "https://files.pythonhosted.org/packages/88/7b/11fbd4640b3bb82b72822a63c20ade4013d562d291703a9debeedc24e682/regex-2026.9.29-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0b65c72739f981377c9c22e0c5c3cd7f42da7bd8a3c9209330fac772c7d893ed", size = 879330, upload-time = "2026-09-29T00:48:49.168Z" }, { url = "https://files.pythonhosted.org/packages/f3/55/de58c74f1f4e31586d83eb39c56872d686c4e0d0966d151884c833b94ced/regex-2026.9.29-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4408b2b27a95ca8cc48b7411945753773353b5c93b307754781086c99d3a576f", size = 919251, upload-time = "2026-09-29T00:48:51.322Z" }, { url = "https://files.pythonhosted.org/packages/81/42/a8c480f6dd5ac59fa28ddae79afd9d7ac7e596fdb61813adc65bb6e674b8/regex-2026.9.29-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a714befaacbd10092ffe4cea0d3c5f008fb9efe9bc322c715bcdfdee414b9a3d", size = 808808, upload-time = "2026-09-29T00:48:53.529Z" }, { url = "https://files.pythonhosted.org/packages/68/60/0bc0d1ec8b37ad64be6fa30e035251f11de9667a0fac9e82ee74517d81be/regex-2026.9.29-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:33026515aebc0e70d1c89978e53e8d695d35d9e472f8d5b34465ba3c74028650", size = 789907, upload-time = "2026-09-29T00:48:56.036Z" }, { url = "https://files.pythonhosted.org/packages/da/84/116a3ef19b3acfe81077f0bf2cbc7714a5e94bc8935b7243ab61cb0f1c3c/regex-2026.9.29-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:31b003f9a070335e2a8233ee9b14a3ca8e6d792012ae011f741bf0aaf11744c5", size = 795770, upload-time = "2026-09-29T00:48:58.284Z" }, { url = "https://files.pythonhosted.org/packages/96/ba/e38c3f203e7e7e18c957d48e6cb6dbf96c11e95a44efa4a480522afc5d6d/regex-2026.9.29-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:c03c6eb6ece86dfdcbb34799efaa339b093132e1aceed491ba5e08fe06cdf699", size = 870671, upload-time = "2026-09-29T00:49:00.506Z" }, { url = "https://files.pythonhosted.org/packages/2f/0f/9ee0b0cb76c55f63684bd7fff554978e8773b4fc86e2bcb2d50772dc1086/regex-2026.9.29-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:a5300757f8a68f5b6cc33f57338d72a0e3589c5cc9ad5f8504ea06f028be582a", size = 778631, upload-time = "2026-09-29T00:49:02.984Z" }, { url = "https://files.pythonhosted.org/packages/b6/19/e6e3eeb226af5872c4958002f6edef4e4f40ea4cc5f5665023f2019eb045/regex-2026.9.29-cp315-cp315-musllinux_1_2_s390x.whl", hash = "sha256:80c7cadd3fd2bfde5df8aa0787e315812cad0c313a753095d02f4c2b6c01677b", size = 862187, upload-time = "2026-09-29T00:49:05.264Z" }, { url = "https://files.pythonhosted.org/packages/5b/62/823c102e106bb2711d6b7dfe5981552fe4467b2969c46a20c5c383cf498c/regex-2026.9.29-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:3f1e6cb402a89457582cd696f982559217d13484a193202c394015297968c86d", size = 798423, upload-time = "2026-09-29T00:49:07.644Z" }, { url = "https://files.pythonhosted.org/packages/37/e0/e927776258fa70b2f6feffc3be584ffc85ba4c1e20a320f0aee9a632fc7d/regex-2026.9.29-cp315-cp315-win32.whl", hash = "sha256:a64b85a4760337cfefdb27d42da6ed8b58e8cde3f2d57b6ef43e76ef6ea9ef47", size = 274757, upload-time = "2026-09-29T00:49:10.513Z" }, { url = "https://files.pythonhosted.org/packages/77/04/358de85d1860238e1b4fa98fc2c80c990124a25d2e14739e28cc02c25562/regex-2026.9.29-cp315-cp315-win_amd64.whl", hash = "sha256:b3e445b66c80b4eb4234e855ce94d9adc183eedbd632816228d89930b91b2c5b", size = 283824, upload-time = "2026-09-29T00:49:12.849Z" }, { url = "https://files.pythonhosted.org/packages/92/d3/d5c5b264784a5ab2b0f8cf620c1eeb4dbf3440d306761905e7d99345bef5/regex-2026.9.29-cp315-cp315-win_arm64.whl", hash = "sha256:8f39588af4731c8923c26810eb3b33f76f17633985e40f59c3cd45a33805a895", size = 283664, upload-time = "2026-09-29T00:49:15.331Z" }, { url = "https://files.pythonhosted.org/packages/02/dc/f63ec2c201445ce1150fe780f5c56f16a10124d9a9da3a93161dbb0d8892/regex-2026.9.29-cp315-cp315t-macosx_10_15_universal2.whl", hash = "sha256:fb99cc9d45f48895d9d67f6a0b8a57f08d39c174d9f25ad97a313e0470267b1c", size = 501549, upload-time = "2026-09-29T00:49:17.705Z" }, { url = "https://files.pythonhosted.org/packages/9a/5c/d2a698dc6bfc11fbce03f1cb0249c13284e93b79ed11f893edf6fac431c9/regex-2026.9.29-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:720537c7ea6f80dc61913184edb0ce2497a306b39ef19f28505b322553d52bdb", size = 298187, upload-time = "2026-09-29T00:49:20.171Z" }, { url = "https://files.pythonhosted.org/packages/85/b7/88dcdb38cd3935d4ee9e9ce9b8e56cb3b3518d1f020acfa7dd62ad289bf8/regex-2026.9.29-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:0fd2c901cc307a745ad4bc87f20060d7a0825a3371d1e93488af22e7a387f78f", size = 296157, upload-time = "2026-09-29T00:49:22.342Z" }, { url = "https://files.pythonhosted.org/packages/d3/8e/ba6c01dde33a69fc294b38b43f6677baaa5735a6248f39708031a738158a/regex-2026.9.29-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b11b589e00095ec69cf79841a76360f9b079e95b0368a25b5ebb951ab0c157ff", size = 818468, upload-time = "2026-09-29T00:49:24.612Z" }, { url = "https://files.pythonhosted.org/packages/2a/f1/2586693e3a2d6b1247852593d37a6c17b42a92ee44f7cdcb9a0c1494e64a/regex-2026.9.29-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d7cab119d0df0b9413f106b4d7fc34f2872d3574ed3806fb48959c830b1537da", size = 882825, upload-time = "2026-09-29T00:49:26.996Z" }, { url = "https://files.pythonhosted.org/packages/30/51/084f3e7bdcd0e9c33665c938cf5d134dc3548cbb4a75f0197ec7bfd754b1/regex-2026.9.29-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b89efc38431793d28b7cd91227e2f952ad7c48df19132b17f43a5fec3c14143b", size = 923314, upload-time = "2026-09-29T00:49:29.822Z" }, { url = "https://files.pythonhosted.org/packages/5a/f1/066c6fc23b7dc229789c21c880b5ba5ad689fb95fed12e078266f55a1f9b/regex-2026.9.29-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80a5ea3b4fd9d6a5b9a44f7976a9acaaab35aa3c1f6b29e5bd857dfabaded223", size = 822222, upload-time = "2026-09-29T00:49:32.404Z" }, { url = "https://files.pythonhosted.org/packages/0a/56/592cd46fdb8f2f8682a1d7fd1310e4d0bcb93fbd0e6bbe4141ac28240227/regex-2026.9.29-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:19959129885356df0e97556856f77eb2888380dac18bed075a7c05c5128c618d", size = 794882, upload-time = "2026-09-29T00:49:35.076Z" }, { url = "https://files.pythonhosted.org/packages/ee/4d/d65384bb071c864b01aa8314e3a6a687845ebd57588390976edc960c218b/regex-2026.9.29-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:6a1a824fbed817e0a891103886b68f063b1e83cc51bc97192a90a60195a9291f", size = 805887, upload-time = "2026-09-29T00:49:37.395Z" }, { url = "https://files.pythonhosted.org/packages/65/b6/358de0d8f40d5178e4f7e7e121cfd5b961c812b77a055d11f5079e3f8fd7/regex-2026.9.29-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:1ba8c6a416569ce0d37e83e28a254a61dc99a419084dfb6476cea02d997f74fa", size = 872901, upload-time = "2026-09-29T00:49:39.927Z" }, { url = "https://files.pythonhosted.org/packages/00/06/6bfded72d043240c6b52bbb5e16f639d81affbf7484b4fe2ec45f3d4afc9/regex-2026.9.29-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:446654b29bfaa30500d80947eda42cef1449dc8a87f4e3cf061cc8485d3a1f0b", size = 782970, upload-time = "2026-09-29T00:49:42.581Z" }, { url = "https://files.pythonhosted.org/packages/5a/20/9f418a50baa78b3ed8308fcb0cc49e472dd000b7ef935a7295af202ea744/regex-2026.9.29-cp315-cp315t-musllinux_1_2_s390x.whl", hash = "sha256:bf3c49863c23a1ad6da9c30351aed6cff8d5ddbeb63c5c8420ae54e98c7d0138", size = 865441, upload-time = "2026-09-29T00:49:45.238Z" }, { url = "https://files.pythonhosted.org/packages/2c/29/817c7eacdeaf8463123e949bd394c39ad024eea1ec38ddf5ad141da2f3bd/regex-2026.9.29-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:01000ddf0e3ffef97f2413ceb514f6313040106b6d18a03ee00a4fe35c1eb1db", size = 809431, upload-time = "2026-09-29T00:49:47.878Z" }, { url = "https://files.pythonhosted.org/packages/63/0b/83aab3b5b739947f744135a7a3a446e25433ebc92b05e01aae197ccbfdda/regex-2026.9.29-cp315-cp315t-win32.whl", hash = "sha256:c4e38dd8f39c43a91d2410ad2b85610701b0979342c3df1d69eaf8e838c757d8", size = 276964, upload-time = "2026-09-29T00:49:50.524Z" }, { url = "https://files.pythonhosted.org/packages/72/f2/6314b5fc68789b5dcc38885bc6e3d6986b34fb3372b7231088ee5cecaa05/regex-2026.9.29-cp315-cp315t-win_amd64.whl", hash = "sha256:e2c89e9b762c57f59d5e99ee8b20202adb892e35f8d3485741340999ca55058e", size = 286487, upload-time = "2026-09-29T00:49:53.224Z" }, { url = "https://files.pythonhosted.org/packages/56/bc/97b2245c8c7b2dd01f2db74f2bea003cd33c15009b4996a2447f46b5325c/regex-2026.9.29-cp315-cp315t-win_arm64.whl", hash = "sha256:e8c65ef3862a8ad6e86492b6ed9327805dd66904c012bd3649dc67d822ed6c34", size = 285955, upload-time = "2026-09-29T00:49:55.655Z" }, ] [[package]] name = "rpds-py" version = "2026.9.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/42/68/3bd46b8a5e01d3c2ebdf9c5e9497912e3fe0cde02bac21a7130ca866e403/rpds_py-2026.9.1.tar.gz", hash = "sha256:4793ef7f78268b124b73fa933440f01d258bbae01de9fa53e9080c9ab0425a12", size = 63948, upload-time = "2026-10-04T16:32:36.469Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f5/6d/ddb8dfcf41892ba9c672d27988592c038d30db61708230313831b6780a1b/rpds_py-2026.9.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2711d29b653b3bce48a63d18b9c6b53274669e6d6c4094dddeb4d9a0e45128b2", size = 344947, upload-time = "2026-10-04T16:28:55.207Z" }, { url = "https://files.pythonhosted.org/packages/9e/b2/632c3d034961149eff606e3e357547620a9ab37b849ae5815f67838753fd/rpds_py-2026.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3231c4c0e521dafa5be0c9f114ee2c2ad46650836f2d72caa86801950c3e7044", size = 346770, upload-time = "2026-10-04T16:28:56.884Z" }, { url = "https://files.pythonhosted.org/packages/6d/45/4df346410bb873d03ec60c3b891d1fceb8cabde1971d29844bbb625cc296/rpds_py-2026.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e01b3c878c8641913e688edd1b3f08658c6783d29cf6b826bd3c0d1ae7a1ffaa", size = 377795, upload-time = "2026-10-04T16:28:58.193Z" }, { url = "https://files.pythonhosted.org/packages/ba/b8/a70f302207e4f29f873c01a986fcac5def49b9c8224328cef1ad7da6b7a9/rpds_py-2026.9.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e524c7874ac72884d28e16dd5b8d839fd09e0fe76b020d3fbca23212a7b8c52", size = 383137, upload-time = "2026-10-04T16:28:59.411Z" }, { url = "https://files.pythonhosted.org/packages/13/e3/3aa28a48a01169d0e20728bf0e5ebbea3ae2774285b40853ae49b3ef332a/rpds_py-2026.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:761fdae6728ceb99ab182fad2f0cc1e262f610834dc891aea1d1a2a2e634776f", size = 496789, upload-time = "2026-10-04T16:29:01.011Z" }, { url = "https://files.pythonhosted.org/packages/3e/a7/414e8d088602d66ad6f47c65bf07fe5090992a8574cdd4571c1a83b647ed/rpds_py-2026.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b723eb406dec5bc9ec516c73ab9c3239a3284e017f7eb89ee2b3258bd504fb7", size = 395929, upload-time = "2026-10-04T16:29:02.465Z" }, { url = "https://files.pythonhosted.org/packages/2d/5c/aac3b960fd55d37b49f77c0eebbe043eaf36762ebd48e7b46951e59c1c05/rpds_py-2026.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:136a1c3fe4402b7008bc81cb62ee538481795b61a7e83df88dff3b3f02b726ff", size = 375426, upload-time = "2026-10-04T16:29:03.944Z" }, { url = "https://files.pythonhosted.org/packages/d3/80/77987a41c40be7202a78d9aed4a650bfb05792237cfd3b9e22638d990fe5/rpds_py-2026.9.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:839dde845559254f34885267c6878f60d61d5205180226d976fe488d45fa128e", size = 381497, upload-time = "2026-10-04T16:29:05.308Z" }, { url = "https://files.pythonhosted.org/packages/b8/d0/640b02eb1ecd71a913c1178b6235287b31006266bca9a26862e80e497b54/rpds_py-2026.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56cd8b3f77d7b6812f533b662186a1f28316931166ddc00fb893b1b0db7e9888", size = 405740, upload-time = "2026-10-04T16:29:06.578Z" }, { url = "https://files.pythonhosted.org/packages/3e/8c/d034195d45d215625a23f2ae85dbbdb86a49a93a51272061c97c80b9d316/rpds_py-2026.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:074a4d198bc34d9a8ea425114fc3ded6d11ec01f6a314a8db67454a5152d8834", size = 555850, upload-time = "2026-10-04T16:29:08.115Z" }, { url = "https://files.pythonhosted.org/packages/de/f8/532f1addfc86207bc3cf23749638bb0d457bce891595012ed8a08d0543b8/rpds_py-2026.9.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6beb738155fe8ab8091afdfa5a3226b21c2b1593f1e50ebb90eb25b44dbc0391", size = 618661, upload-time = "2026-10-04T16:29:09.554Z" }, { url = "https://files.pythonhosted.org/packages/50/5b/b0f2c9833a36a5b1f6ac5cb0e635fabacf713266f46ceefba2102da0bf51/rpds_py-2026.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57492a550a1d88d29d003247e5f78dd8cf04a701fac0e4c8db8745a6d2504e0a", size = 583530, upload-time = "2026-10-04T16:29:11.072Z" }, { url = "https://files.pythonhosted.org/packages/bf/20/464ed4b98d3c8c6a334f3b5e24d3886de04b05658a95fc40a37e0e6e4775/rpds_py-2026.9.1-cp311-cp311-win32.whl", hash = "sha256:d95a354e02393eada6d7351184671aced9d4cce109dabf927cb7aa99624352a1", size = 208125, upload-time = "2026-10-04T16:29:12.408Z" }, { url = "https://files.pythonhosted.org/packages/df/c9/384a9b62f8cd89c8e3e609b8c9052c140e8c01d807261e0517c904b8bf29/rpds_py-2026.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:ce4d4f52e2a4324396caddbd45a97d8d7be5f42edd25d2355282a9c34f9b2f7f", size = 226045, upload-time = "2026-10-04T16:29:13.751Z" }, { url = "https://files.pythonhosted.org/packages/4f/3b/0a691f0dcb2301fa9c736346da2d0d4991778373283301c5c12b8f952f3d/rpds_py-2026.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:fdcd198979b4ecffcc1beba366a7fbcf4eb41243691a82fe52ceb0b902f09c12", size = 222636, upload-time = "2026-10-04T16:29:14.989Z" }, { url = "https://files.pythonhosted.org/packages/5d/34/a828586ea3329fbb50895b50e9cf98ca3d924a9f41a0b26d443bff1b3794/rpds_py-2026.9.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:50906f5aea24b5a865cbd0a589698288631d9f3a54c3a937c83aefa95a0d14af", size = 346822, upload-time = "2026-10-04T16:29:16.258Z" }, { url = "https://files.pythonhosted.org/packages/90/81/ac6a0d064982251856ce009c9e1dd51a34110b3c055aa7d1aad18b4899a3/rpds_py-2026.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e21c1429e205828ea886a2293a4a2c8e01f4c25d9893ca330e97a6cf73f52e7b", size = 341380, upload-time = "2026-10-04T16:29:17.706Z" }, { url = "https://files.pythonhosted.org/packages/42/ff/bf7d54f362748fd6a49277b9d6531c394074110fedf50ad791ec59133fbb/rpds_py-2026.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693b2728bbcc48d09a981a356954b0c47c53ff25b545856f28a889ea619f69a", size = 373053, upload-time = "2026-10-04T16:29:19.063Z" }, { url = "https://files.pythonhosted.org/packages/60/de/74b0ccdbbd28687b9b5fdb34c1cabed88352182facaced9d6f5486b8b9ed/rpds_py-2026.9.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8601470267d938bcb7f3ab1a336100af51a4fd5b6ed030ef52461bb3ef5e7e07", size = 377742, upload-time = "2026-10-04T16:29:20.543Z" }, { url = "https://files.pythonhosted.org/packages/c2/6d/b979775a3057b2a5c26d75ecbff60a20a24ef081db6dd76836fca3f20247/rpds_py-2026.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3890a6aa36e6baa53d5258a2a25d3ef8b37ad165a6ab27a892d7c3e3a432cd69", size = 487289, upload-time = "2026-10-04T16:29:21.958Z" }, { url = "https://files.pythonhosted.org/packages/1d/5d/7c34734ce3ece943d9d6ee0122a74a21bbc75b47acb5b7053c83f6efb1ed/rpds_py-2026.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b5b393eda5ea42cca1c1a6665f2a4882b4fd5d1777e41ce0545a107fb008c9d", size = 390710, upload-time = "2026-10-04T16:29:23.378Z" }, { url = "https://files.pythonhosted.org/packages/1d/6d/b26eb1e75395925b3a142ed351cbed2ec8212f5c9d937aee3df32c701baa/rpds_py-2026.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:addeda51556dac7c1a2f14cda62db8b621cd12afba3091d03a96c72932387eab", size = 371261, upload-time = "2026-10-04T16:29:25.1Z" }, { url = "https://files.pythonhosted.org/packages/7c/98/b2fdfe10301a9e27af21e634337fbba7baac0bc17fe44619a17c26bba2cb/rpds_py-2026.9.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:d9edf30457d74eebfd76b045535e36f1cd89062566a128a0db2145ca042d787e", size = 376075, upload-time = "2026-10-04T16:29:26.748Z" }, { url = "https://files.pythonhosted.org/packages/c5/b1/c4b8d954e49c3c69cf8063c0c9e0919c99f3d2cecc46311606a1cbe835dc/rpds_py-2026.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:815d26356930846a40c7bc1366e7b1b0320ab8a063e66c11298a208bed0fd237", size = 399358, upload-time = "2026-10-04T16:29:28.282Z" }, { url = "https://files.pythonhosted.org/packages/b3/59/9559a7293c97dff0cbb293efffbd36644103883ecc27741af8ef90c84ca8/rpds_py-2026.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3b5a6f40f0a1486b4b36c888123afc67acdbd9f33235927acf5ff295429a0ba3", size = 550267, upload-time = "2026-10-04T16:29:29.851Z" }, { url = "https://files.pythonhosted.org/packages/6c/9d/6dc60e49511de4c8b00e74f9c1d43aed4d27f712cdb1ade92f2c199cbf64/rpds_py-2026.9.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b5b8b0753718d258fd454283fbd57e14545d3b40583fa672e27cb4f987626bcc", size = 614018, upload-time = "2026-10-04T16:29:31.54Z" }, { url = "https://files.pythonhosted.org/packages/fb/bc/92a4ecf27301b886232a413360f6b348a81d55ffef654f2ebda5970ebc3d/rpds_py-2026.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:46d80bc76b51a6c24f9944368c28d38b8bcbcea1da4f2f8d3ebc31a67e8c6ec6", size = 578509, upload-time = "2026-10-04T16:29:33.01Z" }, { url = "https://files.pythonhosted.org/packages/08/53/efb97f2e6589b7ab8394385a73870e0b2ab2a195281c117b21fd6d7d4855/rpds_py-2026.9.1-cp312-cp312-win32.whl", hash = "sha256:befc2d6a953e563f8a7bfd87a42c22ebf8a3e980dcb7b6a4d17b70b0e914e8a3", size = 205401, upload-time = "2026-10-04T16:29:34.451Z" }, { url = "https://files.pythonhosted.org/packages/1c/84/1700cc748d0eaa747486e4e82882d2575224e6e9a3148df583058850c629/rpds_py-2026.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ce8943f79c2210f7abcc28e86367b03b28d95027fd01c46d2472373ae70c86f", size = 222923, upload-time = "2026-10-04T16:29:35.709Z" }, { url = "https://files.pythonhosted.org/packages/c3/89/0302215373c2f8b4408b0fdfee955368cc378a98ff59508d47a7e0dc2dbf/rpds_py-2026.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:501909f2e4a1e2dee528ef766fe3c469060ebc17e54a8383d404ba07a81a6f02", size = 218415, upload-time = "2026-10-04T16:29:37.263Z" }, { url = "https://files.pythonhosted.org/packages/83/ea/ee88fd9e756ff93fb6b1182a47ec09504a242620e33ce1d20679efefe841/rpds_py-2026.9.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:a36b70596407634ca82d4b989a3729074a008537a0522e4c8046a67c729103e9", size = 346229, upload-time = "2026-10-04T16:29:38.82Z" }, { url = "https://files.pythonhosted.org/packages/57/71/a097d6552f837500fc36e6b23d09cfb9890c3cc47531f9ca64e149799615/rpds_py-2026.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eba5d173f7d5708b22a93815017a4611873ed54db9f268077c0dd1ed99cfc858", size = 340514, upload-time = "2026-10-04T16:29:40.405Z" }, { url = "https://files.pythonhosted.org/packages/bd/b7/497e85768bf4e0d8ddbaa096a4cac31d1509251dee2728a8490aa367e0b5/rpds_py-2026.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:457866b85daf5034296666168b84a69e0b2e89dc4f1af102b46f6448a60b9063", size = 372611, upload-time = "2026-10-04T16:29:41.778Z" }, { url = "https://files.pythonhosted.org/packages/52/4b/74ab4108916250b6e198e0d3af05bc6835eb046315f22f7a0ceb49667c5a/rpds_py-2026.9.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a3a52a3ba86436ab3aef510fbe21512abc2ddd1993005dfe50514bd2284ef025", size = 377712, upload-time = "2026-10-04T16:29:43.242Z" }, { url = "https://files.pythonhosted.org/packages/0c/8e/067e77d9d7b3cc793c9d909b7e97e7aadbbb1fb094093b6876902cc96d38/rpds_py-2026.9.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7841166b7fa64c9c56404617ae4341448847482d45933b13135d26c130519e5", size = 488106, upload-time = "2026-10-04T16:29:44.692Z" }, { url = "https://files.pythonhosted.org/packages/3c/b4/c5aae6c2dde269bf955f6b7d35065c655a57e47750d9668052ad67e74dda/rpds_py-2026.9.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:926bdd3e3b5998ddf70cc64bc8cf57209571f9044542913afb673799fec77dd0", size = 390795, upload-time = "2026-10-04T16:29:46.129Z" }, { url = "https://files.pythonhosted.org/packages/a0/36/76fab39973ee11e7f9f357c55138197bb01c86f6502cb76487e3b4f42db0/rpds_py-2026.9.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7868b85224291c6cb6759f9b5adb9745f486d226f62b16a614dd5a2a5ab2b35b", size = 370794, upload-time = "2026-10-04T16:29:47.603Z" }, { url = "https://files.pythonhosted.org/packages/3d/fe/cd2a80e6d7b871937a60e935c5d507aa390d143f4ff3636f640b9733d5df/rpds_py-2026.9.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:3cd182d7291d29b92c521a0069d9c01ba6193628a9a105531d11b40a6d731a33", size = 375673, upload-time = "2026-10-04T16:29:49.223Z" }, { url = "https://files.pythonhosted.org/packages/6c/18/7464a9953724e55a3b3206062fa0ffdeaa519584c6aabf65d3956d94f131/rpds_py-2026.9.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e6ea1cda8d8c688278430e4268a42f5e5da3bdd74578dfadc0820c3f1766ce83", size = 398758, upload-time = "2026-10-04T16:29:50.601Z" }, { url = "https://files.pythonhosted.org/packages/c0/86/1534b436700fd49ff411063b7c4d7e938adfabf90895b6cf1622d5a7d1f6/rpds_py-2026.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5943980471829f6de242a20b109de3111ba6b77e3af0ffc587028ac854b05e6c", size = 550370, upload-time = "2026-10-04T16:29:52.002Z" }, { url = "https://files.pythonhosted.org/packages/57/1c/e1fa82a8a01e3c5820f3ba98a8b2673f642128eb368fa88871b01dd2c909/rpds_py-2026.9.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:76d3af9732d2dab69f28179b40ba2d87e2f1d5824b4a694780aa787d685e8f36", size = 613106, upload-time = "2026-10-04T16:29:53.655Z" }, { url = "https://files.pythonhosted.org/packages/29/55/b20b8c4c3dde8755bfcd5b08492a02d0cd2e26929aedf6199ca2a377d42a/rpds_py-2026.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:78326f4cb4427a56ba4996c0762b63be45f06b85f086526420d2b3a66e40f84d", size = 578235, upload-time = "2026-10-04T16:29:55.157Z" }, { url = "https://files.pythonhosted.org/packages/55/42/df3f7bbc3f7ab37a8a9db8d6c2ff2c985422899f1f7926afbf7ec3c0b8b4/rpds_py-2026.9.1-cp313-cp313-win32.whl", hash = "sha256:172e47169583f46ce118cbec68e6795d0da0f4606b488b6434f8276bca0a058c", size = 205293, upload-time = "2026-10-04T16:29:56.669Z" }, { url = "https://files.pythonhosted.org/packages/31/9c/ba5a9569d719bfdd6ce863df4133ac6a1658cf1b07cc3534c31db729fbbc/rpds_py-2026.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:3e93b2cd69a9830be33e03945cd7cda940a0a8bfcfbff41d6144f0cb0d3d8bd9", size = 222409, upload-time = "2026-10-04T16:29:58.049Z" }, { url = "https://files.pythonhosted.org/packages/35/72/f28ca566f6c23c35bbf7445f65eb0364577b25a026305995e24f78b83d94/rpds_py-2026.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:d151e148117294133bf8af7eeace085e7e87432db15ab6adf640330298a47f6f", size = 217681, upload-time = "2026-10-04T16:29:59.449Z" }, { url = "https://files.pythonhosted.org/packages/8a/f2/67b94be1532767803415c1c5a1fd88ea487643d74a673cec1ba140af77bb/rpds_py-2026.9.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c9d1aca01f49170fdcf5c92761b1fafe97f554b721ca4570c5949fff778f0d4b", size = 347178, upload-time = "2026-10-04T16:30:00.865Z" }, { url = "https://files.pythonhosted.org/packages/04/37/b751de2b59b0197a1d92a5dd491de88e8a5e928c2e6562581974f1e85263/rpds_py-2026.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3f0e9ac28fc067d4d34b88ae43c48e9489455c97fee9633d851f7eeed5a05d35", size = 341878, upload-time = "2026-10-04T16:30:02.564Z" }, { url = "https://files.pythonhosted.org/packages/72/e2/5873bc4643c250db9e05d48dc0c93763d4aa68bc3b81164cb1af3b45b284/rpds_py-2026.9.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07deecbfce94c78473018bc7d10b337cc651d12df87a1eb2cb3e4024bc9c33d0", size = 373963, upload-time = "2026-10-04T16:30:04.026Z" }, { url = "https://files.pythonhosted.org/packages/51/03/5acf7632158247f3f6386ff0af3a1ee48167d575037e8d0920594b76d92b/rpds_py-2026.9.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:821b2755db9194409254012f429c56643416fb96ef9be090be82ec8826b7f477", size = 377975, upload-time = "2026-10-04T16:30:05.555Z" }, { url = "https://files.pythonhosted.org/packages/e6/00/63fda451b8bffa5808fc8bb311ee7c073b340974b09f273c7b2a145d3d62/rpds_py-2026.9.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c91c210ae7645626c608400e3519b4a642f837cce09ca830db3beb2e9f274d4", size = 490347, upload-time = "2026-10-04T16:30:07.156Z" }, { url = "https://files.pythonhosted.org/packages/a1/ae/c093ffd070ba0fb02f76c565d06fecc65ad6e4afdbae78f7031076d3cdac/rpds_py-2026.9.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54ac2158a6f96cfbabff0b2eedaf94b90c5ec7ca8317fcadc61e1c2b2e0ff6ef", size = 392962, upload-time = "2026-10-04T16:30:08.77Z" }, { url = "https://files.pythonhosted.org/packages/22/9d/d08a1128ab199b2f0cf25bfeb0639bd05119fff4b7c47bec24ef9a8ec23f/rpds_py-2026.9.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eac2f5dbafd585dfe31f86a23ebf0d3ba480a9d49ebc87947267b5608d4ea0cd", size = 371623, upload-time = "2026-10-04T16:30:10.501Z" }, { url = "https://files.pythonhosted.org/packages/53/c7/4758ddcbb75609414bbccfcb11d612436f9b3ee821bd2f33f0f1604ee648/rpds_py-2026.9.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:8aa5dda18d39b6143eb24809d158f9252c88f402749b6f1b62a506cc7d96cc35", size = 376997, upload-time = "2026-10-04T16:30:12.124Z" }, { url = "https://files.pythonhosted.org/packages/87/e4/947bd7f608ff60faf46dc9d389c3dffd0e3d767d78a0be19978448ef0ce7/rpds_py-2026.9.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5c90e7fa02e8f5de0d10c17595c568ada48c5302e749462c0ea1a4c362111a86", size = 400169, upload-time = "2026-10-04T16:30:13.804Z" }, { url = "https://files.pythonhosted.org/packages/4b/35/fe93e020a0543b5670472c18d7e6af3197c08da571240ce1965c84f85c0f/rpds_py-2026.9.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e6d198bad4e49dd6732fbd636e2fc5c082f45c8cad0b4acb756b00c82c76072e", size = 551615, upload-time = "2026-10-04T16:30:15.332Z" }, { url = "https://files.pythonhosted.org/packages/0d/4f/5d2a0136bb03b2a56a39dc6ff92d58a6e3e53a2e17079238b86228882f16/rpds_py-2026.9.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:96beca19ec79de272e8668585380ff9092c47077c1d7a1e098e00bbd921f4785", size = 614655, upload-time = "2026-10-04T16:30:16.92Z" }, { url = "https://files.pythonhosted.org/packages/09/1c/3f1025aaf70d9bf7272cc41f8b64ee76b48bf01726248138430e16f23b38/rpds_py-2026.9.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5cf77eb04f20b720be95265a3e00eb2a14814074255cc27069c551b2db53118", size = 579602, upload-time = "2026-10-04T16:30:18.555Z" }, { url = "https://files.pythonhosted.org/packages/53/0d/5c72e6204f76610608706da32b6b7e11ef7e10317558a7bb15a122e008dc/rpds_py-2026.9.1-cp314-cp314-win32.whl", hash = "sha256:a03d57b86d2a51d0a66c92177e2be154ad015f357791d306e714569999cdb4cc", size = 206315, upload-time = "2026-10-04T16:30:20.05Z" }, { url = "https://files.pythonhosted.org/packages/a4/0b/489d48abbcc7d70cf3fbf662d9d22abf1f4650761c0a9ae05260800800d3/rpds_py-2026.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:837c6b305e26fe0f75b15c92cf3b2ba29e0ae19dc40b1c557b026cb426347d0c", size = 222852, upload-time = "2026-10-04T16:30:21.604Z" }, { url = "https://files.pythonhosted.org/packages/91/16/bbb05a7e6a10cf79ba639be7f799d770ee15f64175cc61d081b218dd402a/rpds_py-2026.9.1-cp314-cp314-win_arm64.whl", hash = "sha256:fce4b85234a0cbad67bf8e6e1201ee815d172c9aebad75f25645bc4d834f8e31", size = 218709, upload-time = "2026-10-04T16:30:23.036Z" }, { url = "https://files.pythonhosted.org/packages/22/ac/ac507a0a4ec478ca470440a09583db4be5259ba7670aeba0620822f1e57a/rpds_py-2026.9.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:3a72c11530d71abfb66c8d7696a2f86c43e63fca8b948f1a784ac490f4ec688e", size = 349596, upload-time = "2026-10-04T16:30:24.558Z" }, { url = "https://files.pythonhosted.org/packages/e9/f2/817a46b658d5070f477f722c298ee9a24525b0e4017347964146ef5fdd0e/rpds_py-2026.9.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:068c37bba854ec2fe42f7365c640af11dd9895890ccbf2df5070d0c059bd7f96", size = 343114, upload-time = "2026-10-04T16:30:26.048Z" }, { url = "https://files.pythonhosted.org/packages/6c/42/6ade976b13ac1b4cb3bf2eb603f1be2fe74df19a29988d4c2b386be59d6f/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fca4eb6df565e2a928f1c7dad92d27db8f9df0f449e76423ed5d7e713ed445", size = 374197, upload-time = "2026-10-04T16:30:27.699Z" }, { url = "https://files.pythonhosted.org/packages/d9/70/77cdf1d3f1a07faabe936016ae623aec7981f73108a8fe7a203ed2e21998/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c933c6678c6f116ff8af47a4c6db0868b8ace74af0343016c0ef00f00272ea69", size = 378025, upload-time = "2026-10-04T16:30:29.451Z" }, { url = "https://files.pythonhosted.org/packages/3f/6b/18a44a3beaa9b7931acb04af7bd9539836477c630a794452d4826d6185d4/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:028ad274ea951dac64491b5d1e65712a4aeabfdbdb9fccf797b57bd899b0c495", size = 491969, upload-time = "2026-10-04T16:30:30.995Z" }, { url = "https://files.pythonhosted.org/packages/73/27/fb39cfd6bddaf741b024f813890374578ff8ac1f1adc473659c048b03b05/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:740d0a99cf9de0b17a3943388e9294a59becf75e7c43421f387bd3c7a9901f7c", size = 393905, upload-time = "2026-10-04T16:30:32.628Z" }, { url = "https://files.pythonhosted.org/packages/ed/71/0fa7bb77b57af0d710273964180d11b503f62b8a5c358eb2d8c3f62feff6/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0da298fb372dc192610a4b9ecbc68a0cd8b675bbbd1fc519d01b41cfd658333e", size = 374569, upload-time = "2026-10-04T16:30:34.257Z" }, { url = "https://files.pythonhosted.org/packages/54/22/f41cfac269af3b449513ef1bc3d7f32fde52abbbd2d01c7e76b47743acd9/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:eb61be926bb81567c1f48bdc8aa22b9855048dc2efd53871f9f7e6e9a5632346", size = 377482, upload-time = "2026-10-04T16:30:35.997Z" }, { url = "https://files.pythonhosted.org/packages/b4/fc/312b49006e7f8f9ca5f96647577b8aa6f3df30519c46bd448f5c425af0b2/rpds_py-2026.9.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:42e75466f83cd43f6026c81eab74246efb2bdadafb307b85700632d06c68f299", size = 400040, upload-time = "2026-10-04T16:30:37.76Z" }, { url = "https://files.pythonhosted.org/packages/cf/a6/18cca7a878dc7fa95165a83343fd4d7b65643fd22e54e47340a451121d5c/rpds_py-2026.9.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:617f59cde379b4f648a09797b7f683d04b90a46344cddab85639da5aff0f5531", size = 551849, upload-time = "2026-10-04T16:30:39.443Z" }, { url = "https://files.pythonhosted.org/packages/e4/6d/1f5685e20f39604691bdc3c05aaa6b8bd2f954e9e996477adf2376768e33/rpds_py-2026.9.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3edae8c5ddfdb6985d49ae9d150516e5076888879022f91a26c2de9276ce0bdb", size = 614842, upload-time = "2026-10-04T16:30:41.231Z" }, { url = "https://files.pythonhosted.org/packages/c6/25/98652109fd9f7e10268dd4571aa52b81987001b806f37ef1a18260de714a/rpds_py-2026.9.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0f045bb053c9057720d72c56dffe30dffdc05997b2897a827b9325f0ab6623fa", size = 582606, upload-time = "2026-10-04T16:30:43.345Z" }, { url = "https://files.pythonhosted.org/packages/19/03/11ca09099bab5f53373a80a334c424ec917c13d050760a59499d2af5171e/rpds_py-2026.9.1-cp314-cp314t-win32.whl", hash = "sha256:bf35d0568abda97233239ce32896d3ad53fccc537832c104e30c94aa5fb93569", size = 203341, upload-time = "2026-10-04T16:30:44.954Z" }, { url = "https://files.pythonhosted.org/packages/6f/8a/88909e3ffd9f47f5b58211473875d8c3c09079f0058c46fb72c55a702a26/rpds_py-2026.9.1-cp314-cp314t-win_amd64.whl", hash = "sha256:1e8d4d79d828299bf44a55db22a9388ab967b49d17132c88eab0f4360b48da8e", size = 222843, upload-time = "2026-10-04T16:30:46.486Z" }, { url = "https://files.pythonhosted.org/packages/f6/b7/a662f367d4896dd0a10cef2fc91f10b7f08af1c10858e287e019563f338d/rpds_py-2026.9.1-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:1d77b649e6f7cdf12ca5c2a98dad0ad37f9ea9b6f960408a92f0cb12bb3d04d9", size = 347463, upload-time = "2026-10-04T16:30:48.203Z" }, { url = "https://files.pythonhosted.org/packages/ae/3f/ad45d03df4f84ebae5439577ee81f3999d182711e82235c8037b6528890e/rpds_py-2026.9.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:00ba2d8c7dd4ee537978ddf4b3fbd712bef2d8751603f7f3146b3f4287768e25", size = 342051, upload-time = "2026-10-04T16:30:49.872Z" }, { url = "https://files.pythonhosted.org/packages/7e/31/3dcd68c13d4bcc59c1f7eb33ac8e80698f06f3eb0d8a1e06419836071c20/rpds_py-2026.9.1-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec450527cbf485e13c8d3602a54f428ab0432fdade0ede75efd74b735421c871", size = 374143, upload-time = "2026-10-04T16:30:51.508Z" }, { url = "https://files.pythonhosted.org/packages/cf/0d/68c1f058a250fbd1380ebda9fc227cbf50117adf8ffe8161ef383ea79f68/rpds_py-2026.9.1-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:306ee1850d8105b5baf977e78d45fcadd12c1a54678d614c9baf217708446e91", size = 378604, upload-time = "2026-10-04T16:30:53.206Z" }, { url = "https://files.pythonhosted.org/packages/d7/d6/2d4c59b85397cb4800594fadf692688ccf5ce556adc930e7a5bf21061a5e/rpds_py-2026.9.1-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ef6b65b03247c54692ad4fd9ee97cb772781927db72e3cb05e70b3db6d1ff14f", size = 490790, upload-time = "2026-10-04T16:30:54.925Z" }, { url = "https://files.pythonhosted.org/packages/da/04/7e05dc3aebaf52f4e026766bd668fdd09a9d0e23f64a14686b36b3501892/rpds_py-2026.9.1-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a575404ebc9cf2e91edd32eaf570ec1430eb900d4f56724ba7dd4bc1fc9c176d", size = 393146, upload-time = "2026-10-04T16:30:56.625Z" }, { url = "https://files.pythonhosted.org/packages/57/ca/e2e9a0a46a74ed51a0498ba1fe10f4ea6b2d9a155f372a2f91e51f18cf10/rpds_py-2026.9.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c16ab111bc27c646ba8aa005d0527754edc538ebb636f0b1bf8e244b48d1945", size = 372022, upload-time = "2026-10-04T16:30:58.295Z" }, { url = "https://files.pythonhosted.org/packages/ba/cb/8f8774df5134e23424372838bcc5c7ed4127d723e1ff52f7bebd4dcb2563/rpds_py-2026.9.1-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:7664419f27db41d4f1c43a78dccda7dd6e8ef2428df3ee01d0c2a07a6b071297", size = 377092, upload-time = "2026-10-04T16:30:59.984Z" }, { url = "https://files.pythonhosted.org/packages/90/02/8d7095d73bf9114219be40230baa5df00611e0a82ed9517779ff9c19f82b/rpds_py-2026.9.1-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4b26b03d9d2658ee2fa234f8f4f19f38a09773fe5261028025032e26d4d35af0", size = 400830, upload-time = "2026-10-04T16:31:01.721Z" }, { url = "https://files.pythonhosted.org/packages/ec/02/8206856f8f363cd042a8315dc86b3912f5dcb6d3c66bbb24b69c2bfb0775/rpds_py-2026.9.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:be3e47e2d91aa3942ff9bf4077a505226005abfc39b6f7554a91c1b9393986b9", size = 551478, upload-time = "2026-10-04T16:31:03.472Z" }, { url = "https://files.pythonhosted.org/packages/41/6b/36211f1bb1f0b0313f496d92f5905b74ea107f27cb16fa3355a82f04575e/rpds_py-2026.9.1-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:6307a0da524939decb8ca4a3933b8ab62525794411d6984fca6726e732804af6", size = 615173, upload-time = "2026-10-04T16:31:05.281Z" }, { url = "https://files.pythonhosted.org/packages/35/77/cda0c4a6f055446b692f0ed5692f73707cafd3dff82672ede31b1a9b59de/rpds_py-2026.9.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:159a7aab5c5e8b112c8830f54717ce56da1252ebdbb526f5be2df2309280b9e7", size = 579653, upload-time = "2026-10-04T16:31:07.065Z" }, { url = "https://files.pythonhosted.org/packages/74/ec/d8385f446240aed643b9e92a5055cff3015cc04a13c61f73b2883c478ed5/rpds_py-2026.9.1-cp315-cp315-win32.whl", hash = "sha256:dbc2673f9223d420c91145599b3ba45a8a50c207d1976908e5fb5ddb0c9b9429", size = 206498, upload-time = "2026-10-04T16:31:08.989Z" }, { url = "https://files.pythonhosted.org/packages/6d/a5/71b5cd00e0521e3b6b81828baea368c62b6b700ebdd9554cd7d41ddf12fa/rpds_py-2026.9.1-cp315-cp315-win_amd64.whl", hash = "sha256:75c38c50ab9aca840225d9a9a3810bf11d04bd5c1f186cabbb8aee56db3e9b15", size = 223121, upload-time = "2026-10-04T16:31:10.84Z" }, { url = "https://files.pythonhosted.org/packages/33/58/dba857c3bc8221b31b62eb170a3080f4f191de79f047200389b7ed1b06a7/rpds_py-2026.9.1-cp315-cp315-win_arm64.whl", hash = "sha256:a431156bb41865fc14cd5d79bb9d7bbed83110b0159e34e62ae30951f96c0009", size = 218741, upload-time = "2026-10-04T16:31:12.592Z" }, { url = "https://files.pythonhosted.org/packages/5b/d0/320ab28ccc1415eeb509d68682b0014fb74690cd49f1c2d29a232475af50/rpds_py-2026.9.1-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:ef0d8c843e2827d6c120ab4687e9423fb1d893db1df27b7c1506615bcb9734a0", size = 349719, upload-time = "2026-10-04T16:31:14.48Z" }, { url = "https://files.pythonhosted.org/packages/56/88/f5b12f1358f443c08b7ce3cc8391d82d335f4872580e2e097847fd36087a/rpds_py-2026.9.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:45bc6bccf78b20fd834237d18db64965d7ee68ba7f60440a26c7ab71e7b8d51a", size = 343267, upload-time = "2026-10-04T16:31:16.827Z" }, { url = "https://files.pythonhosted.org/packages/f7/0c/c765b0059d532acb3b9c45d781ccc22f15a96dbe443d00903f643ba9df10/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d55198263bb51f557550c6ed2e6d1cb6a6fed6eb5c9120b741c5926bef8a45d", size = 374555, upload-time = "2026-10-04T16:31:18.931Z" }, { url = "https://files.pythonhosted.org/packages/6b/8a/cafddfda77564a10cd21184640c3bffda6a2b8d20972fb5dedd5e0166328/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8763f20692da7df39b0afdd1ba3042b004c50a45994f76c2d9a25641f7673db", size = 378346, upload-time = "2026-10-04T16:31:20.75Z" }, { url = "https://files.pythonhosted.org/packages/b9/01/5e626016eff72c183bf6c96539240cace15d402468647a453ec08415b2fc/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e43d4a1f673e8a1cbd8533e809e02b4bf9d4f2280269bb640436556312121250", size = 492373, upload-time = "2026-10-04T16:31:22.614Z" }, { url = "https://files.pythonhosted.org/packages/3b/9c/15a2469e9389242f46896b3f0a01d68caea8a5a35c011fcb05ef333aae73/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea394a937f17a54c51239348bdbe2e3518124c8d4a8951ba04a311d3095bd18f", size = 394371, upload-time = "2026-10-04T16:31:24.768Z" }, { url = "https://files.pythonhosted.org/packages/63/f5/c100ff77e1e6366e947c75969c258fdfc4b7bc5bbfe7351e62ffbf2a1228/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdeaa99ce822dca76cfb1b993e9120c5ea212f2eb66d48950ad63c349668a018", size = 375132, upload-time = "2026-10-04T16:31:26.588Z" }, { url = "https://files.pythonhosted.org/packages/dd/f4/fe0269c9de253e99c81cabc12b8971a5feaa083debdaff1221e06264d9e3/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:b4f062343e7ad3fa94f2c66e5ae667dee47ee74dd41a9057c4fbe163236a123d", size = 377642, upload-time = "2026-10-04T16:31:28.677Z" }, { url = "https://files.pythonhosted.org/packages/05/65/b34a7b257baccff8f4a24a722933166d4941d5ebdc9c3f4bc4ffcd5ce4f4/rpds_py-2026.9.1-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:22ffd29a63d71fb1b81552c21f2c2b734949b7ac751a9be70675a939a900839b", size = 400855, upload-time = "2026-10-04T16:31:30.802Z" }, { url = "https://files.pythonhosted.org/packages/98/32/844e54176b6071b90b38a564e6940bc6eb8f97b2890dc709c19db9dec0f4/rpds_py-2026.9.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:08dae4a4095150a7c4545a1fb40b98e1ab1744fbc2770d92c977b9dadaa49ab6", size = 552573, upload-time = "2026-10-04T16:31:32.709Z" }, { url = "https://files.pythonhosted.org/packages/17/73/6041d20729dffbfdf155c02d65be58bc225a1c1fb548fd87c23ef306138f/rpds_py-2026.9.1-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:9a0460d43603d1fd9ef59c30278531e15d78581721ddb538fa560aa7817ea4ad", size = 615840, upload-time = "2026-10-04T16:31:34.565Z" }, { url = "https://files.pythonhosted.org/packages/af/9e/418094adaee6b056ce199051b255448ed872829051e341b2294c80da0977/rpds_py-2026.9.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:1c2d1f6da5128eabf34e963d7163a818846075a52568250d006c4c953b40f903", size = 582764, upload-time = "2026-10-04T16:31:36.665Z" }, { url = "https://files.pythonhosted.org/packages/3d/9b/1698ebf6b840ddfe8b472198abbed6ace35c6e398faeecd6c47dae742a4e/rpds_py-2026.9.1-cp315-cp315t-win32.whl", hash = "sha256:5c6ee90dee3e85e055ddfd502d611643d9b0fd94c818220bda84ec3dacd9b27b", size = 203795, upload-time = "2026-10-04T16:31:38.53Z" }, { url = "https://files.pythonhosted.org/packages/8a/e2/91f70d804c61f8eac39a417e82aa1024f655ab9e8bdd7393b196242bc41b/rpds_py-2026.9.1-cp315-cp315t-win_amd64.whl", hash = "sha256:fe5ad0664ec772b02c45859041aa17655709cced7a31005817fbbbd988c25567", size = 223037, upload-time = "2026-10-04T16:31:40.468Z" }, { url = "https://files.pythonhosted.org/packages/f3/ad/f0eba548e297987964ef8088403db875b333963bf8189f3f563b6936b20e/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c0d2cb595a420b34d5086db0add011e26e2c09d6a024afbac4228bf8f863a30", size = 384112, upload-time = "2026-10-04T16:31:42.643Z" }, { url = "https://files.pythonhosted.org/packages/33/89/891fa4d81f1eae7fe262ecd0aba2c51de94a116c7f3ccfb034fa75f4c537/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3d6ed6a98cfd19155996605474982cc470d7601746a6439078f1a5a3fa8b050", size = 389662, upload-time = "2026-10-04T16:31:44.642Z" }, { url = "https://files.pythonhosted.org/packages/4f/46/912cf623b2263f9c9c2d04e8508fc38dbe89983faeba5fb36ca4558ae550/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8171b44a054e5c67fd748ada04187f1250bf35b95f85e52ab64bcf3331a923bb", size = 504637, upload-time = "2026-10-04T16:31:46.667Z" }, { url = "https://files.pythonhosted.org/packages/9b/5c/7f3cfa7c5f01765c9f47c8398210ed0c1eb686c0e99c223cb1c6776d3fb9/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fda1d96e542c37b6c804547dbf489c129fe7c97183a76a5ec275909ba1a063df", size = 402607, upload-time = "2026-10-04T16:31:49.068Z" }, { url = "https://files.pythonhosted.org/packages/f0/76/2e915d4115ee453c33e6af17bc1df7e22ddc52974e178eeeb92a78c09983/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270bdcdaac5d5b6f73c5e22e7e135c7f2a50e789f71d9e241d5be8d90026e19a", size = 382762, upload-time = "2026-10-04T16:31:51.24Z" }, { url = "https://files.pythonhosted.org/packages/0d/e5/844382925d7b84a4074ad79fc2b9d05eb6231ea243b34f247e68e519b606/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:84a6ecc0c940169190d2c23bd969debd48c94dbc855acd60188a68d71d421608", size = 389563, upload-time = "2026-10-04T16:31:53.549Z" }, { url = "https://files.pythonhosted.org/packages/81/82/d6e3951602dc2e24790ef9d299aa24bf5e2493df5043f2c6da00480cc447/rpds_py-2026.9.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ab4b2fda7c2b542f7f9d886cc6a838c5079d2b76f72e6081411faba11adde2c9", size = 416842, upload-time = "2026-10-04T16:31:55.76Z" }, { url = "https://files.pythonhosted.org/packages/ea/1c/8d248e4ea671d525ab7daa0703ad81cc2175076fa0ccd7ef088facbd2b01/rpds_py-2026.9.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:44b32a7c4f0da3d28af31c259e38ddcff096f855e205ed0671d02fcf44f1ea1c", size = 562434, upload-time = "2026-10-04T16:31:57.874Z" }, { url = "https://files.pythonhosted.org/packages/ad/38/e7ac0db898120d15dea25e3661b1242a40cb3b23d1f4db86c15a01fe0ba1/rpds_py-2026.9.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:a3dbc5ed9514908d5046107d7b1346bde71eea61de6e0e4919c19354f97e769f", size = 627909, upload-time = "2026-10-04T16:31:59.977Z" }, { url = "https://files.pythonhosted.org/packages/03/c8/37e555514932cb1ee36c75349187aa882a98dee5d5654c761699ed8a0d27/rpds_py-2026.9.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6eae33003518fd4cb4f83a218d5371469dd3001aa3b87128c005b07762f7fe5e", size = 593658, upload-time = "2026-10-04T16:32:02.14Z" }, { url = "https://files.pythonhosted.org/packages/12/5c/5f69a91add94a8a33acea68a2b034a464946a654ff7296af9d957ef0d6a5/rpds_py-2026.9.1-pp311-pypy311_pp80-macosx_10_12_x86_64.whl", hash = "sha256:0483515261947e4e8b8e1375bf7463e7eb6ccfb3d86e7b554d90cd5285f20f32", size = 351769, upload-time = "2026-10-04T16:32:04.675Z" }, { url = "https://files.pythonhosted.org/packages/41/22/35ea8bf3b2682b90ab687c74e4828418ff12298a5b0b0a0c033f61c86a30/rpds_py-2026.9.1-pp311-pypy311_pp80-macosx_11_0_arm64.whl", hash = "sha256:4cfaf02209061880210819934de2f4f6aa83dc04dafe6770276acc240a56da31", size = 351719, upload-time = "2026-10-04T16:32:06.834Z" }, { url = "https://files.pythonhosted.org/packages/a3/90/a9ba81408369d34c1aca73319c15adc91ed45c1d21e9e8ee4832ffb7fe0b/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cdc537c8633d7fd92a82e2e0d2ab74320a3f63d5e59fb9cf08711e08fe151c4", size = 381109, upload-time = "2026-10-04T16:32:08.994Z" }, { url = "https://files.pythonhosted.org/packages/b3/44/5192a0bed94cec86bd2a5e1cc5a1bb8f7eec3aec907eacd2deb13e87e326/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:10e208f2425d973938afcd56e28a7c4be32e27b6a60b5d381f49fb9d8acf9759", size = 388222, upload-time = "2026-10-04T16:32:11.321Z" }, { url = "https://files.pythonhosted.org/packages/92/cd/5356549711448f18b52f7a11ffbe90f1228774996fbf3c6cd1b18d22abaf/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c0dbbcc19735fe5f8b0a54c07659d154a9e69f47e15d0a6ab7299215daf62cb", size = 500384, upload-time = "2026-10-04T16:32:13.478Z" }, { url = "https://files.pythonhosted.org/packages/7a/88/ddda9d28adfe33119c75b2e733d4ba7e326f41d7e1b1093951771768ca48/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:684fd492fff4fead00587544e059be2bbcb6f93454f21fa2a91b66fc7508be82", size = 401661, upload-time = "2026-10-04T16:32:15.653Z" }, { url = "https://files.pythonhosted.org/packages/32/c3/bb59ba16a6b4a57995d15b8c04c00f28df3b938c4dcdde48fbe0f73edb0c/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1028417bb44037eb3069c1009bd7b7277212876cda22fbe565b0bca9fab6d2c", size = 380748, upload-time = "2026-10-04T16:32:17.727Z" }, { url = "https://files.pythonhosted.org/packages/f5/b8/0580faa1c5a32ddc160130dd7ae54d2d007272a89a40a6b5db3e50f9f585/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:492e5e428cbe126221611f47e068f01660352feec4ad18bc0f5ea9b2ae88fb14", size = 385731, upload-time = "2026-10-04T16:32:19.855Z" }, { url = "https://files.pythonhosted.org/packages/bf/70/f73564642bbe3322c7eeef2c2f258cf040b71c41a430b532e59d04a1b838/rpds_py-2026.9.1-pp312-pypy312_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:88b5268892fde430d5531f95bc560b6efbbd67c929662c586afd729a96e7461c", size = 412131, upload-time = "2026-10-04T16:32:22.285Z" }, { url = "https://files.pythonhosted.org/packages/8c/5d/17fff2e1f8f68721a2afb5cb48f7e442c751bb6b4883157c5abaf618cd08/rpds_py-2026.9.1-pp312-pypy312_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:01445c8d194aa032a08e944f16567672da1c62dbdbefd8b6d0693032e290cf68", size = 558193, upload-time = "2026-10-04T16:32:24.4Z" }, { url = "https://files.pythonhosted.org/packages/2a/d0/869ab6fb08531f97aae4a780b4d61b4190d8aef48fe054ee28bcf7114466/rpds_py-2026.9.1-pp312-pypy312_pp73-musllinux_1_2_i686.whl", hash = "sha256:eef6a03b0b6d08d0835ccfa8ec8d1bc70525e3801387567137b50c557695e6da", size = 622448, upload-time = "2026-10-04T16:32:26.844Z" }, { url = "https://files.pythonhosted.org/packages/ba/a5/9672e532fe02cd3b92c78cfd8743abca939d96853006c63835009a1ecb6f/rpds_py-2026.9.1-pp312-pypy312_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6b9bf3135b4ad5981df9a73d71a35272d650a2985ae9c2746357b24d59de2448", size = 591126, upload-time = "2026-10-04T16:32:29.274Z" }, { url = "https://files.pythonhosted.org/packages/80/ef/3a9f8e4279c7920af561deed4cb7ebebed2794a8f608cf404d5eef14a105/rpds_py-2026.9.1-pp312-pypy312_pp80-macosx_10_12_x86_64.whl", hash = "sha256:56c6952a9b15047466d0c2347c446a761d4527f89976156341e68f0ce5cc08b0", size = 357108, upload-time = "2026-10-04T16:32:31.641Z" }, { url = "https://files.pythonhosted.org/packages/b7/55/4b2fa381a583760aea5c92841e4e928a358e1c6511b129219e9c2826a226/rpds_py-2026.9.1-pp312-pypy312_pp80-macosx_11_0_arm64.whl", hash = "sha256:b242c27c8f836305a4a72df9cdd564386ac57b807bd252a063223331c9316b37", size = 346877, upload-time = "2026-10-04T16:32:34.061Z" }, ] [[package]] name = "sqlparse" version = "0.6.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/5f/d3/3f06a1006f2261d1342aefb3c71eed02f5d4ca5bdbecd86ebc12ad38306e/sqlparse-0.6.0.tar.gz", hash = "sha256:113c35c75365ab9cc9c7231d68c6428fb11c085fc8e9eb1ad659b7ddbf6cd2b9", size = 178477, upload-time = "2026-08-13T19:16:06.396Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d9/50/f00935da0ec7cbf325f8dc4f772ae46fbc7b672dd62876e73f0a94adda57/sqlparse-0.6.0-py3-none-any.whl", hash = "sha256:b861c0288ce2fa56209a9a6412d2e066ac664b3873b89c26c9d8415e8e32996f", size = 50070, upload-time = "2026-08-13T19:16:04.062Z" }, ] [[package]] name = "tomlkit" version = "0.15.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/94/96/e07752635b98536177fa1f37671c8f3cdde2e724c6bcf6034b2cfb571565/tomlkit-0.15.1.tar.gz", hash = "sha256:e25bbf38843005246210a12982776f27f99cb9be67160e14434d0c0d21ee1e97", size = 180129, upload-time = "2026-07-17T01:48:04.562Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/13/bc/8c13eb66537dce1d2bd3a57132902f38d0e7f5bb46fa9f4daed9fe9d76ee/tomlkit-0.15.1-py3-none-any.whl", hash = "sha256:177a05aece5a8ca5266fd3c448abb47b8d352f09d477d3ca8332db4d89b24304", size = 49449, upload-time = "2026-07-17T01:48:05.728Z" }, ] [[package]] name = "ty" version = "0.0.83" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/3b/7d/2fd9575bce2d14e2281bec82d0713dee68329b0dc944e9c06c2e36b761fe/ty-0.0.83.tar.gz", hash = "sha256:db118de73c05ac476faceb4d42d59782feaeddfc4d721fd3ae8b807a0a2ae4e4", size = 7373076, upload-time = "2026-09-21T22:47:29.207Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/bf/85/7259431bade2317d8b82fa27220ae4618c21396acf0ca28a7bd75e92afd7/ty-0.0.83-py3-none-linux_armv6l.whl", hash = "sha256:836bc08bad96ecc7e38baf1a6ddaec15aa8c8b46ae99a96365397b5f6481b7a5", size = 13905669, upload-time = "2026-09-21T22:46:36.677Z" }, { url = "https://files.pythonhosted.org/packages/d2/30/9527386ade8dd71fc52f65cde3c094411af7ad0d505f9063ef0841998702/ty-0.0.83-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0f1fb029fe076c7dca404d98e38fdb5fdbc2038a09407f89d43be1fdd9b2c459", size = 13499505, upload-time = "2026-09-21T22:46:40.114Z" }, { url = "https://files.pythonhosted.org/packages/a0/54/63080d8cfd59a53810499a69a2ebc995724be27618b70d7f099e73ace317/ty-0.0.83-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3515776d01ee3b1be974dafa73d449d0bc711afbc12ba341f82f70bc641ff4ee", size = 13498980, upload-time = "2026-09-21T22:46:43.197Z" }, { url = "https://files.pythonhosted.org/packages/49/78/e647f190bd9513d09db30d45309e9b5df070b5caa44af2de3290fab59fbe/ty-0.0.83-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5b80d66c7f9c8d60f25ccfd40c6eaebe8fd7c9005074904e0e164dd89c13d03", size = 13494705, upload-time = "2026-09-21T22:46:46.106Z" }, { url = "https://files.pythonhosted.org/packages/2e/12/aef645b13c5bd15e3e5993537dbc23f7d65475f3cf1755d07b4d3e56850d/ty-0.0.83-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:57eae4aa55dab1af5d1423227c6517ccab1e658fe265c8e5a58caa584ca2876b", size = 13661466, upload-time = "2026-09-21T22:46:49.392Z" }, { url = "https://files.pythonhosted.org/packages/d4/c4/11872e823653c568468ef7f0c3b23aed7ad2d33652e20144d28d5bfad58a/ty-0.0.83-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dea3680911340ecf93dff5786dbeefd69c9399df685a22751e1fbd27e6007b50", size = 14479677, upload-time = "2026-09-21T22:46:52.277Z" }, { url = "https://files.pythonhosted.org/packages/8e/db/5b0d0d24d16d24d781f29ee842ee718903e453dc4068acb02bef860d5540/ty-0.0.83-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8453786c274f48e2a89b78e8a505a4f449323f357f2ce26a9b90a4bd68176f67", size = 14972208, upload-time = "2026-09-21T22:46:55.242Z" }, { url = "https://files.pythonhosted.org/packages/54/04/0077a53bcf6ceb41365a45d8091b52094c91a5f4b071c2a6d705ed8bb65b/ty-0.0.83-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7701bdae3b52271cf0835abe4202aa3b23b735425d8c5a3e6a8ca1c68d39ead8", size = 14660550, upload-time = "2026-09-21T22:46:58.256Z" }, { url = "https://files.pythonhosted.org/packages/d4/ff/b6c879f1c3121387edd19ebdb1fb02af30691f88f632278a5d467fb5f348/ty-0.0.83-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa95b4376447e5309fe3ccc98ee75916a9082714e6a029b99427ca62021dc94a", size = 14147376, upload-time = "2026-09-21T22:47:01.167Z" }, { url = "https://files.pythonhosted.org/packages/0d/bc/82e730247d53cb02acd5a91237c0c62f215b2e0379689a550176d307ed89/ty-0.0.83-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2a4550a08fc1899a33e4a08787a73ec9daa99d292268df4f0a5f1c24c63854c3", size = 14567502, upload-time = "2026-09-21T22:47:04.344Z" }, { url = "https://files.pythonhosted.org/packages/67/13/bb6f57923231f51b626931625ada71e219d64541f8fadf96065bc5034358/ty-0.0.83-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:feb72080f0835fa2b27485e3b11fa50dc57c30e0ba73808a3f7d64b56db83f6f", size = 13443051, upload-time = "2026-09-21T22:47:07.316Z" }, { url = "https://files.pythonhosted.org/packages/50/20/9862431662d4453527cd52cf0f30d5975cd1801aa39e570bf45fb299be77/ty-0.0.83-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:3e5206def2d6e1df93c75ed8dc763255233ccc3153647509d125bada10ad770a", size = 13678908, upload-time = "2026-09-21T22:47:10.714Z" }, { url = "https://files.pythonhosted.org/packages/d7/e3/94ebbe1573b76660fa09f2dbce96da6d0bb69a2d29c7b6ad538b452979d4/ty-0.0.83-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bdf5dfa157f5c127ba096fe0561b47877e6e79562c7fc2b35906ba5e9f6bb723", size = 13937248, upload-time = "2026-09-21T22:47:14.133Z" }, { url = "https://files.pythonhosted.org/packages/2f/c0/3ea45c2ec3a82fddb7137e457ccb2a452446905430d225adaa4990cdc338/ty-0.0.83-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:626d6ad00f05a5d9b7ea80de44b12931d0c0fb50e64eab20b7fcc13e9aff2a68", size = 14290826, upload-time = "2026-09-21T22:47:16.874Z" }, { url = "https://files.pythonhosted.org/packages/d8/b2/c941ce83a59e46ef31dd04bdf6067530e7ec77d5f0cdd1e223fbc6fc351b/ty-0.0.83-py3-none-win32.whl", hash = "sha256:0391017dac6ba3e452e0322301f50bba12fbccadac07d7fd888c46951ad37638", size = 13105291, upload-time = "2026-09-21T22:47:19.807Z" }, { url = "https://files.pythonhosted.org/packages/b2/8a/5eef9458505698b144643cbd2062f465c5d860d8cf86a8710d74505ad9a0/ty-0.0.83-py3-none-win_amd64.whl", hash = "sha256:1b67d86f5bbad4076ae1a2ff23a6a4493219885d72d4b148cb0193e090390060", size = 13901557, upload-time = "2026-09-21T22:47:23.429Z" }, { url = "https://files.pythonhosted.org/packages/9f/27/a06061513f1de25569c2e8898018bd552ab7b31afa7cfe818703269b3350/ty-0.0.83-py3-none-win_arm64.whl", hash = "sha256:a916a3d7d68fe30b7aacdb9fe16d461fa944d722e59e96ea0fa9d206a1b6625f", size = 13627960, upload-time = "2026-09-21T22:47:26.305Z" }, ] [[package]] name = "types-cffi" version = "2.1.0.20260827" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-setuptools" }, ] sdist = { url = "https://files.pythonhosted.org/packages/04/bb/dbb844365103e4dc6ea52cdae0946c3ca55a7b8587e6f351710d7ee5bb78/types_cffi-2.1.0.20260827.tar.gz", hash = "sha256:53d1604771ad4ff09a1a90d6f6980ab36bebb6c39476dcc5bbf4896fa510d736", size = 18150, upload-time = "2026-08-27T12:07:21.754Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0c/fc/690c243ddac627901f1448f5cb29ca3b5463774a00ac932862c60d7ce5cf/types_cffi-2.1.0.20260827-py3-none-any.whl", hash = "sha256:851b6ffa5b962c577a2330b98ac0b60c56c904d086726276946388f58a0cffaf", size = 20525, upload-time = "2026-08-27T12:07:20.836Z" }, ] [[package]] name = "types-pyopenssl" version = "24.1.0.20240722" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "types-cffi" }, ] sdist = { url = "https://files.pythonhosted.org/packages/93/29/47a346550fd2020dac9a7a6d033ea03fccb92fa47c726056618cc889745e/types-pyOpenSSL-24.1.0.20240722.tar.gz", hash = "sha256:47913b4678a01d879f503a12044468221ed8576263c1540dcb0484ca21b08c39", size = 8458, upload-time = "2024-07-22T02:32:22.558Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/98/05/c868a850b6fbb79c26f5f299b768ee0adc1f9816d3461dcf4287916f655b/types_pyOpenSSL-24.1.0.20240722-py3-none-any.whl", hash = "sha256:6a7a5d2ec042537934cfb4c9d4deb0e16c4c6250b09358df1f083682fe6fda54", size = 7499, upload-time = "2024-07-22T02:32:21.232Z" }, ] [[package]] name = "types-pyyaml" version = "6.0.12.20260906" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/90/6e/abec85b9013db5b934b0280a6dd104904d84f7bcbaab2e2f3def87ac7463/types_pyyaml-6.0.12.20260906.tar.gz", hash = "sha256:f59c1cc05010b833d2d72287bbaa72610106b28d42d89a907313117faba85212", size = 18649, upload-time = "2026-09-06T06:35:35.362Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/15/c0/fc0644b7ddcfb969e95845837143cb5173ddd6e06ee4ba5fc493cd9329b7/types_pyyaml-6.0.12.20260906-py3-none-any.whl", hash = "sha256:bca893ff0d51df5c9053137d5d0e6ccd36e939a196356f1d5c16372422f5137b", size = 21282, upload-time = "2026-09-06T06:35:34.372Z" }, ] [[package]] name = "types-redis" version = "4.6.0.20241004" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "types-pyopenssl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3a/95/c054d3ac940e8bac4ca216470c80c26688a0e79e09f520a942bb27da3386/types-redis-4.6.0.20241004.tar.gz", hash = "sha256:5f17d2b3f9091ab75384153bfa276619ffa1cf6a38da60e10d5e6749cc5b902e", size = 49679, upload-time = "2024-10-04T02:43:59.224Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/55/82/7d25dce10aad92d2226b269bce2f85cfd843b4477cd50245d7d40ecf8f89/types_redis-4.6.0.20241004-py3-none-any.whl", hash = "sha256:ef5da68cb827e5f606c8f9c0b49eeee4c2669d6d97122f301d3a55dc6a63f6ed", size = 58737, upload-time = "2024-10-04T02:43:57.968Z" }, ] [[package]] name = "types-setuptools" version = "84.0.0.20260812" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/4f/cd/3b2a3362a526f91c33f785a291462b2ec448ae531101c62372fc30a21f53/types_setuptools-84.0.0.20260812.tar.gz", hash = "sha256:09bedc248ebbb7a232c9419dfcdca329706e61bf2aa5743e9424d027f1d956b4", size = 46545, upload-time = "2026-08-12T03:52:42.316Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8a/e5/3a41cab4066465593facd660b2683c017f3d88d3297cdd26db0677b8e479/types_setuptools-84.0.0.20260812-py3-none-any.whl", hash = "sha256:799c08e4bc6a288e8a0b538afb5f5ff320a08927ba8dbedb30c74ee3ba5d867b", size = 70320, upload-time = "2026-08-12T03:52:41.154Z" }, ] [[package]] name = "typing-extensions" version = "4.16.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, ] [[package]] name = "tzdata" version = "2026.5" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d9/68/f1b440335057bfce71b6e50a9d09445aa2ecbd08359a337976627b8409e7/tzdata-2026.5.tar.gz", hash = "sha256:8cc73c0a0bfca7dbfa59235d60b2eff82231dee33f53d206db1acd9173cfc0a7", size = 200404, upload-time = "2026-10-03T09:23:14.143Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/94/21/1e5995a1c920cce14e4bffae20c665ec10e7ed03ab25e006cd741092b718/tzdata-2026.5-py2.py3-none-any.whl", hash = "sha256:b683bd1b6659ddcd810ff02ad09ba821d4bf1065072805063eb35c49617905ac", size = 347996, upload-time = "2026-10-03T09:23:12.535Z" }, ]