diff --git a/.deepsource.toml b/.deepsource.toml
new file mode 100644
index 0000000000..902f3dc289
--- /dev/null
+++ b/.deepsource.toml
@@ -0,0 +1,16 @@
+version = 1
+
+test_patterns = ["tests/**"]
+
+exclude_patterns = [
+ "examples/**",
+ "pipenv/vendor/**",
+ "pipenv/patched/**"
+]
+
+[[analyzers]]
+name = "python"
+enabled = true
+
+ [analyzers.meta]
+ runtime_version = "3.x.x"
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000..c3821e832e
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,26 @@
+root = true
+
+[*]
+indent_style = space
+indent_size = 4
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.toml]
+indent_size = 2
+
+[*.yaml]
+indent_size = 2
+
+# Makefiles always use tabs for indentation
+[Makefile]
+indent_style = tab
+
+# Batch files use tabs for indentation
+[*.bat]
+indent_style = tab
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000..d9b8c3d0ba
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,11 @@
+# Defaults people to autocrlf if they dont have it set
+*.py text working-tree-encoding=utf-8 eol=lf
+* text=auto
+# binaries
+*.png
+*.jpg
+*.tar.gz
+*.zip
+*.whl
+*.exe
+*.gif
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000000..22b45fbf69
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+github: [oz123,matteius]
diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md
new file mode 100644
index 0000000000..3d71eaf471
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/Bug_report.md
@@ -0,0 +1,43 @@
+---
+name: Bug report
+about: Create a report to help us improve
+---
+
+Be sure to check the existing issues (both open and closed!), and make sure you are running the latest version of Pipenv.
+
+Check the [diagnose documentation](https://pipenv.pypa.io/en/latest/diagnose.html) for common issues before posting! We may close your issue if it is very similar to one of them. Please be considerate, or be on your way.
+
+Make sure to mention your debugging experience if the documented solution failed.
+
+
+### Issue description
+
+Describe the issue briefly here.
+
+### Expected result
+
+Describe what you expected.
+
+### Actual result
+
+When possible, provide the verbose output (`--verbose`), especially for locking and dependencies resolving issues.
+
+### Steps to replicate
+
+Provide the steps to replicate (which usually at least includes the commands and the Pipfile).
+
+-------------------------------------------------------------------------------
+
+Please run `$ pipenv --support`, and paste the results here. Don't put backticks (`` ` ``) around it! The output already contains Markdown formatting.
+
+If you're on macOS, run the following:
+
+ $ pipenv --support | pbcopy
+
+If you're on Windows, run the following:
+
+ > pipenv --support | clip
+
+If you're on Linux, run the following:
+
+ $ pipenv --support | xclip
diff --git a/.github/ISSUE_TEMPLATE/Custom.md b/.github/ISSUE_TEMPLATE/Custom.md
new file mode 100644
index 0000000000..33839850e9
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/Custom.md
@@ -0,0 +1,26 @@
+---
+name: Usage / Requests for Help
+about: Requests for assistance or general usage guidance.
+---
+
+**AVOID POSTING ISSUES UNDER THIS CATEGORY.**
+
+If Pipenv is not functioning as you would like it to, consider filing either a bug report, or a feature request instead.
+
+Please refer to [StackOverflow tag](https://stackoverflow.com/questions/tagged/pipenv) for more information.
+
+-------------------------------------------------------------------------------
+
+Please run `$ pipenv --support`, and paste the results here. Don't put backticks (`` ` ``) around it! The output already contains Markdown formatting.
+
+If you're on macOS, run the following:
+
+ $ pipenv --support | pbcopy
+
+If you're on Windows, run the following:
+
+ > pipenv --support | clip
+
+If you're on Linux, run the following:
+
+ $ pipenv --support | xclip
diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md
new file mode 100644
index 0000000000..e8db8a47d3
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/Feature_request.md
@@ -0,0 +1,42 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+---
+
+Be sure to check the existing issues (both open and closed!), and make sure you are running the latest version of Pipenv.
+
+Check the [diagnose documentation](https://pipenv.pypa.io/en/latest/diagnose/) for common issues as well as the GitHub Issues page.
+
+Make sure to mention your debugging experience if the documented solution failed.
+
+### Is your feature request related to a problem? Please describe.
+
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+### Describe the solution you'd like
+
+A clear and concise description of what you want to happen.
+
+### Describe alternatives you've considered
+
+A clear and concise description of any alternative solutions or features you've considered.
+
+### Additional context
+
+Add any other context or screenshots about the feature request here. It may be a good idea to mention that platform and Python version you are on.
+
+-------------------------------------------------------------------------------
+
+Please run `$ pipenv --support`, and paste the results here. Don't put backticks (`` ` ``) around it! The output already contains Markdown formatting.
+
+If you're on macOS, run the following:
+
+ $ pipenv --support | pbcopy
+
+If you're on Windows, run the following:
+
+ > pipenv --support | clip
+
+If you're on Linux, run the following:
+
+ $ pipenv --support | xclip
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000000..b5a92992e9
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,30 @@
+Thank you for contributing to Pipenv!
+
+
+### The issue
+
+What is the thing you want to fix? Is it associated with an issue on GitHub? Please mention it.
+
+Always consider opening an issue first to describe your problem, so we can discuss what is the best way to amend it. Note that if you do not describe the goal of this change or link to a related issue, the maintainers may close the PR without further review.
+
+If your pull request makes a significant change to Pipenv, such as the user interface or intended functionality, please open a discussion or issue report first.
+
+### The fix
+
+How does this pull request fix your problem? Did you consider any alternatives? Why is this the *best* solution, in your opinion?
+
+
+### The checklist
+
+* [ ] Associated issue
+* [ ] A news fragment in the `news/` directory to describe this fix with the extension `.bugfix.rst`, `.feature.rst`, `.behavior.rst`, `.doc.rst`. `.vendor.rst`. or `.trivial.rst` (this will appear in the release changelog). Use semantic line breaks and name the file after the issue number or the PR #.
+
+
diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml
new file mode 100644
index 0000000000..22d474474d
--- /dev/null
+++ b/.github/workflows/changelog.yml
@@ -0,0 +1,47 @@
+name: Generate Changelog
+
+on:
+ push:
+ tags:
+ - 'v*'
+ - '*.*.*'
+
+permissions:
+ contents: write
+
+jobs:
+ changelog:
+ runs-on: ubuntu-latest
+ outputs:
+ changelog: ${{ steps.generate.outputs.result }}
+ from_tag: ${{ steps.generate.outputs.from_tag }}
+ to_tag: ${{ steps.generate.outputs.to_tag }}
+ steps:
+ - uses: actions/checkout@v6
+ with:
+ fetch-depth: 0
+ filter: blob:none
+
+ - name: Generate Changelog
+ id: generate
+ uses: mistricky/ccc@v0.2.6
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
+ model: claude-sonnet-4-6
+
+ - name: Create GitHub Release
+ uses: softprops/action-gh-release@v3
+ with:
+ tag_name: ${{ github.ref_name }}
+ name: Release ${{ github.ref_name }}
+ body: |
+ ## π€ AI-Generated Changelog
+
+ ${{ steps.generate.outputs.result }}
+
+ ---
+
+ π **Full Changelog**: https://github.com/${{ github.repository }}/compare/${{ steps.generate.outputs.from_tag }}...${{ steps.generate.outputs.to_tag }}
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
new file mode 100644
index 0000000000..d173078d5e
--- /dev/null
+++ b/.github/workflows/ci.yaml
@@ -0,0 +1,250 @@
+name: CI
+concurrency:
+ group: >-
+ ${{ github.workflow }}-
+ ${{ github.ref_type }}-
+ ${{ github.event.pull_request.number || github.sha }}
+ cancel-in-progress: true
+on:
+ workflow_dispatch:
+ inputs:
+ git-ref:
+ description: Git Ref (Optional)
+ required: false
+ push:
+ paths-ignore:
+ - ".editorconfig"
+ - ".gitattributes"
+ - ".gitignore"
+ - ".gitmodules"
+ - "*.ini"
+ - "*.md"
+ - "**/*.txt"
+ - "examples/**"
+ - "news/**"
+ branches:
+ - main
+ pull_request:
+ paths-ignore:
+ - ".editorconfig"
+ - ".gitattributes"
+ - ".gitignore"
+ - ".gitmodules"
+ - "*.ini"
+ - "*.md"
+ - "**/*.txt"
+ - "examples/**"
+ - "news/**"
+permissions:
+ contents: read # to fetch code (actions/checkout)
+jobs:
+ lint:
+ name: Check code linting
+ runs-on: ubuntu-latest
+ env:
+ PIPENV_DEFAULT_PYTHON_VERSION: ${{ matrix.python-version }}
+ PYTHONWARNINGS: ignore:DEPRECATION
+ PYTHONIOENCODING: "utf-8"
+ GIT_ASK_YESNO: "false"
+ steps:
+ - uses: actions/checkout@v6
+ - uses: actions/setup-python@v6
+ with:
+ python-version: 3.x
+ - run: |
+ python -m pip install pre-commit
+ pre-commit run --all-files --verbose --show-diff-on-failure
+ vendor:
+ name: Vendoring
+ needs: [lint]
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - uses: actions/setup-python@v6
+ with:
+ python-version: 3.x
+ - run: |
+ python -m pip install --upgrade wheel invoke parver beautifulsoup4 towncrier requests parse hatch-fancy-pypi-readme semver
+ python -m invoke vendoring.update
+ tests-smoke:
+ name: Smoke / ${{ matrix.os }} / 3.12
+ needs: [lint]
+ runs-on: ${{ matrix.os }}-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [MacOS, Ubuntu, Windows]
+ steps:
+ - uses: actions/checkout@v6
+ - name: Disable Windows Defender for Python paths
+ if: contains(matrix.os, 'Windows')
+ shell: powershell
+ run: |
+ Add-MpPreference -ExclusionPath "C:\hostedtoolcache\windows\Python"
+ Add-MpPreference -ExclusionPath "$env:GITHUB_WORKSPACE"
+ Add-MpPreference -ExclusionPath "$env:USERPROFILE\.virtualenvs"
+ Add-MpPreference -ExclusionPath "$env:LOCALAPPDATA\pip"
+ - name: Set up Python 3.12
+ uses: actions/setup-python@v6
+ with:
+ python-version: "3.12"
+ - name: Get python path
+ id: python-path
+ run: |
+ echo "path=$(python -c 'import sys; print(sys.executable)')" >> $GITHUB_OUTPUT
+ - name: Install latest pip, setuptools, wheel
+ run: |
+ python -m pip install --upgrade pip setuptools wheel
+ - name: Install dependencies
+ env:
+ PIPENV_DEFAULT_PYTHON_VERSION: "3.12"
+ PYTHONWARNINGS: ignore:DEPRECATION
+ PYTHONIOENCODING: "utf-8"
+ GIT_ASK_YESNO: "false"
+ run: |
+ git submodule sync
+ git submodule update --init --recursive
+ python -m pip install -e . --upgrade
+ pipenv install --deploy --dev --python=3.12
+ pipenv run python -m pip install -e ".[tests,dev]" --upgrade
+ - name: Run pypiserver with pipenv (Python 3.10+)
+ run: |
+ pipenv run pypi-server --version
+ pipenv run pypi-server run -v --host=0.0.0.0 --port=8080 --hash-algo=sha256 --disable-fallback --welcome /dev/null ./tests/pypi/ ./tests/fixtures &
+ if: (contains(matrix.os, 'Ubuntu') || contains(matrix.os, 'MacOS'))
+ - name: Run pypiserver with pipenv on Windows (Python 3.10+)
+ run: |
+ pipenv run pypi-server --version
+ cmd /c start pipenv run pypi-server run -v --host=0.0.0.0 --port=8080 --hash-algo=sha256 --disable-fallback --welcome NUL ./tests/pypi/ ./tests/fixtures
+ if: contains(matrix.os, 'Windows')
+ - name: Run tests
+ env:
+ PIPENV_DEFAULT_PYTHON_VERSION: "3.12"
+ PYTHONWARNINGS: ignore:DEPRECATION
+ PIPENV_NOSPIN: "1"
+ CI: "1"
+ GIT_ASK_YESNO: "false"
+ PYPI_VENDOR_DIR: "./tests/pypi/"
+ PYTHONIOENCODING: "utf-8"
+ GIT_SSH_COMMAND: ssh -o StrictHostKeyChecking=accept-new -o CheckHostIP=no
+ run: |
+ pipenv run pytest -ra -n auto -v --fulltrace tests
+
+ tests:
+ name: ${{matrix.os}} / ${{ matrix.python-version }}
+ needs: [tests-smoke]
+ runs-on: ${{ matrix.os }}-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ # Note: Python 3.15 removed until upstream pip supports it
+ # (pip's typing_extensions uses typing.no_type_check_decorator which was removed in 3.15)
+ python-version: ["3.10", 3.11, 3.13, 3.14]
+ os: [MacOS, Ubuntu, Windows]
+
+ steps:
+ - uses: actions/checkout@v6
+ - name: Disable Windows Defender for Python paths
+ if: contains(matrix.os, 'Windows')
+ shell: powershell
+ run: |
+ Add-MpPreference -ExclusionPath "C:\hostedtoolcache\windows\Python"
+ Add-MpPreference -ExclusionPath "$env:GITHUB_WORKSPACE"
+ Add-MpPreference -ExclusionPath "$env:USERPROFILE\.virtualenvs"
+ Add-MpPreference -ExclusionPath "$env:LOCALAPPDATA\pip"
+
+ - name: Set up Python ${{ matrix.python-version }}
+ uses: actions/setup-python@v6
+ with:
+ python-version: ${{ matrix.python-version }}
+ allow-prereleases: true
+ check-latest: true
+
+ - name: Get python path
+ id: python-path
+ run: |
+ echo "path=$(python -c 'import sys; print(sys.executable)')" >> $GITHUB_OUTPUT
+ - name: Install latest pip, setuptools, wheel
+ run: |
+ python -m pip install --upgrade pip setuptools wheel
+ - name: Install dependencies
+ env:
+ PIPENV_DEFAULT_PYTHON_VERSION: ${{ matrix.python-version }}
+ PYTHONWARNINGS: ignore:DEPRECATION
+ PYTHONIOENCODING: "utf-8"
+ GIT_ASK_YESNO: "false"
+ run: |
+ git submodule sync
+ git submodule update --init --recursive
+ python -m pip install -e . --upgrade
+ pipenv install --deploy --dev --python=${{ matrix.python-version }}
+ pipenv run python -m pip install -e ".[tests,dev]" --upgrade
+ - name: Run pypiserver with pipenv (Python 3.10+)
+ run: |
+ pipenv run pypi-server --version
+ pipenv run pypi-server run -v --host=0.0.0.0 --port=8080 --hash-algo=sha256 --disable-fallback --welcome /dev/null ./tests/pypi/ ./tests/fixtures &
+ if: (contains(matrix.os, 'Ubuntu') || contains(matrix.os, 'macOS'))
+ - name: Run pypiserver with pipenv on Windows (Python 3.10+)
+ run: |
+ pipenv run pypi-server --version
+ cmd /c start pipenv run pypi-server run -v --host=0.0.0.0 --port=8080 --hash-algo=sha256 --disable-fallback --welcome NUL ./tests/pypi/ ./tests/fixtures
+ if: contains(matrix.os, 'Windows')
+ - name: Run tests
+ env:
+ PIPENV_DEFAULT_PYTHON_VERSION: ${{ matrix.python-version }}
+ PYTHONWARNINGS: ignore:DEPRECATION
+ PIPENV_NOSPIN: "1"
+ CI: "1"
+ GIT_ASK_YESNO: "false"
+ PYPI_VENDOR_DIR: "./tests/pypi/"
+ PYTHONIOENCODING: "utf-8"
+ GIT_SSH_COMMAND: ssh -o StrictHostKeyChecking=accept-new -o CheckHostIP=no
+ run: |
+ pipenv run pytest -ra -n auto -v --fulltrace tests
+
+ benchmark:
+ name: Package Manager Benchmark
+ needs: [lint]
+ runs-on: ubuntu-latest
+ timeout-minutes: 30
+ steps:
+ - uses: actions/checkout@v6
+ - uses: actions/setup-python@v6
+ with:
+ python-version: "3.11"
+ - name: Install system dependencies
+ run: |
+ sudo apt-get update -qq
+ sudo apt-get install -y libxmlsec1-dev librdkafka-dev
+ - name: Install benchmark utilities
+ run: pip install csv2md
+ - name: Run benchmark suite
+ working-directory: benchmarks
+ run: python benchmark.py
+ - name: Display benchmark results
+ working-directory: benchmarks
+ run: |
+ if [ -f stats.csv ]; then
+ csv2md stats.csv >> $GITHUB_STEP_SUMMARY
+ fi
+ - uses: actions/upload-artifact@v7
+ with:
+ name: pipenv-benchmark-stats
+ path: |
+ benchmarks/stats.csv
+ benchmarks/benchmark-results.json
+ retention-days: 30
+
+ build:
+ name: Build Package
+ needs: [lint]
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v6
+ - uses: actions/setup-python@v6
+ with:
+ python-version: 3.x
+ - run: pip install -U build twine
+ - run: |
+ python -m build
+ twine check dist/*
diff --git a/.github/workflows/pypi_upload.yml b/.github/workflows/pypi_upload.yml
new file mode 100644
index 0000000000..72c4c386da
--- /dev/null
+++ b/.github/workflows/pypi_upload.yml
@@ -0,0 +1,67 @@
+name: Upload Python Package
+
+on:
+ push:
+ # Sequence of patterns matched against refs/tags
+ tags:
+ - v[0-9]+.[0-9]+.* # add .* to allow dev releases
+
+permissions:
+ id-token: write # Required for trusted publishing
+ contents: write # Required for release creation
+jobs:
+ deploy:
+
+ name: pipenv PyPI Upload
+ runs-on: ubuntu-latest
+ env:
+ CI: "1"
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Create Release
+ id: create_release
+ uses: ncipollo/release-action@v1
+ with:
+ tag: ${{ github.ref }}
+ name: Release ${{ github.ref_name }}
+ draft: false
+ prerelease: false
+ token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Set up Python 3.10
+ uses: actions/setup-python@v6
+ with:
+ python-version: "3.10"
+
+ - name: Install dependencies
+ run: |
+ python -m pip install --upgrade --upgrade-strategy=eager pip setuptools build wheel twine
+ python -m pip install -e . --upgrade
+ python -m pipenv install --dev
+ env:
+ PIPENV_DEFAULT_PYTHON_VERSION: "3.10"
+
+ - name: Build wheels
+ run: |
+ python -m build
+
+ # Publish to PyPI using token authentication
+ # Note: To use Trusted Publishers in the future, you need to set up a publisher on PyPI:
+ # Visit: https://pypi.org/manage/project/pipenv/settings/publishing/
+ # And add a publisher with:
+ # - Provider: GitHub
+ # - Owner: pypa
+ # - Repository: pipenv
+ # - Workflow filename: pypi_upload.yml
+ - name: Publish a Python distribution to PyPI
+ uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ user: __token__
+ password: ${{ secrets.PYPI_TOKEN }}
+ packages-dir: dist/
+ verbose: true
+ # Uncomment the following line to publish to Test PyPI instead
+ # repository-url: https://test.pypi.org/legacy/
diff --git a/.gitignore b/.gitignore
index 739fd3d3cd..73443fa55b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,15 +1,177 @@
-/.venv
-*.pyc
+# File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig
+
+# Created by https://www.gitignore.io/api/python,macos
+
+### macOS ###
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# PyCharm
+.idea/
+
+# VSCode
+.vscode
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### Python ###
+# Byte-compiled / optimized / DLL files
__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+/build/
+develop-eggs/
+/dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
.cache
-pipenv.egg-info/
-*.swp
-.sublime-text-git-autocommit
-docs/_build
-dist
-build
-.DS_Store
-test_project
-Pipfile.lock
-/.vscode/
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# PyCharm project settings
.idea
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+
+# Temporarily generating these with pytype locally for type safety
+typeshed/
+pytype.cfg
+
+### Python Patch ###
+.venv/
+
+
+# End of https://www.gitignore.io/api/python,macos
+
+# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option)
+.vs/slnx.sqlite
+
+# mypy/typing section
+typeshed/
+.dmypy.json
+mypyhtml/
+XDG_CACHE_HOME/
+snap/
+prime/
+stage/
+pip-wheel-metadata/
+.vim/
+
+# Vendoring Files that generate but we don't want
+pipenv/vendor/Misc/NEWS.d/next/Library/2021-05-14-16-06-02.bpo-44095.v_pLwY.rst
+pipenv/vendor/markupsafe/_speedups.c
+
+# ignore all vim files
+.sw[p,o]
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000..dbd2015896
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,24 @@
+[submodule "tests/test_artifacts/git/pinax"]
+ path = tests/test_artifacts/git/pinax
+ url = https://github.com/pinax/pinax.git
+[submodule "tests/test_artifacts/git/requests"]
+ path = tests/test_artifacts/git/requests
+ url = https://github.com/psf/requests.git
+[submodule "tests/test_artifacts/git/six"]
+ path = tests/test_artifacts/git/six
+ url = https://github.com/benjaminp/six.git
+[submodule "tests/test_artifacts/git/dateutil"]
+ path = tests/test_artifacts/git/dateutil
+ url = https://github.com/dateutil/dateutil
+[submodule "tests/test_artifacts/git/pyinstaller"]
+ path = tests/test_artifacts/git/pyinstaller
+ url = https://github.com/pyinstaller/pyinstaller.git
+[submodule "tests/test_artifacts/git/jinja2"]
+ path = tests/test_artifacts/git/jinja2
+ url = https://github.com/pallets/jinja.git
+[submodule "tests/test_artifacts/git/flask"]
+ path = tests/test_artifacts/git/flask
+ url = https://github.com/pallets/flask.git
+[submodule "tests/pypi"]
+ path = tests/pypi
+ url = https://github.com/sarugaku/pipenv-test-artifacts.git
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000000..45a992d393
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,57 @@
+exclude: '^(pipenv/patched/|pipenv/vendor/|tests/|pipenv/pipenv.1)'
+
+repos:
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.6.0
+ hooks:
+ - id: check-builtin-literals
+ - id: check-added-large-files
+ - id: check-case-conflict
+ - id: check-ast
+ - id: check-toml
+ - id: check-yaml
+ - id: debug-statements
+ - id: end-of-file-fixer
+ exclude: WHEEL|\.patch$
+ - id: forbid-new-submodules
+ - id: trailing-whitespace
+ exclude: .patch
+
+- repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: v0.9.3
+ hooks:
+ - id: ruff
+
+- repo: https://github.com/pre-commit/pygrep-hooks
+ rev: v1.10.0
+ hooks:
+ - id: python-no-log-warn
+ - id: python-no-eval
+ - id: rst-backticks
+ files: .*\.rst$
+ types: [file]
+
+- repo: local
+ hooks:
+ - id: news-fragment-filenames
+ name: NEWS fragment
+ language: fail
+ entry: NEWS fragment files must be named *.(feature|behavior|bugfix|vendor|doc|trivial|removal|process).rst
+ exclude: ^news/(towncrier_template.rst|.*\.(feature|behavior|bugfix|vendor|doc|trivial|removal|process).rst)
+ files: ^news/
+
+- repo: https://github.com/mgedmin/check-manifest
+ rev: '0.49'
+ hooks:
+ - id: check-manifest
+ stages: [manual]
+
+- repo: https://github.com/tox-dev/pyproject-fmt
+ rev: "2.4.3"
+ hooks:
+ - id: pyproject-fmt
+
+- repo: https://github.com/abravalheri/validate-pyproject
+ rev: v0.19
+ hooks:
+ - id: validate-pyproject
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 0000000000..83426bb26a
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,22 @@
+# .readthedocs.yaml
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+# Set the version of Python and other tools you might need
+build:
+ os: ubuntu-22.04
+ tools:
+ python: "3.11"
+
+# Build documentation in the docs/ directory with Sphinx
+sphinx:
+ configuration: docs/conf.py
+
+# We recommend specifying your dependencies to enable reproducible builds:
+# https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
+python:
+ install:
+ - requirements: docs/requirements.txt
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 1847cc3e54..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-language: python
-python:
- - "2.7"
- - "3.4"
- - "3.5"
- - "3.6"
- # - "pypy" # too many cache issues
- # - "3.7-dev" # no need, slows down builds
- # - "pypy3" # TODO: pkg_config issues
-
-# command to install dependencies
-install:
- - "pip install -e . --upgrade"
- - "pipenv install --dev"
-
-# command to run the dependencies
-script:
- - "pipenv run pytest -n 8 tests"
-
-# command to run tests
-# jobs:
- # include:
- # - stage: "β¨ Flake8 NitβPicking β¨"
- # python: "3.6"
- # script: "pipenv run flake8"
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000000..b6b187108d
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,2834 @@
+2026.6.2 (2026-06-02)
+=====================
+pipenv 2026.6.2 (2026-06-02)
+============================
+
+
+Features & Improvements
+-----------------------
+
+- Added support for ``cool-down-period`` in the ``[pipenv]`` section of the Pipfile.
+ Setting ``cool-down-period = "30d"`` instructs the resolver to only consider
+ package versions uploaded at least the specified number of days ago, via pip's
+ ``--uploaded-prior-to`` flag.
+
+Bug Fixes
+---------
+
+- Restored authentication to private indexes when ``[[source]]`` URLs use
+ environment-variable placeholders. The GHSA-8xgg-v3jj-95m2 fix moved
+ credentials off pip's argv onto a merged netrc, but
+ ``write_credentials_netrc`` wrote our Pipfile-derived ``machine`` blocks
+ BEFORE the appended user netrc β and ``netrc.authenticators()`` returns
+ the LAST matching entry, so a stale system entry for the same host
+ silently overrode the freshly-expanded creds. Our blocks now come AFTER
+ the user's existing content. Additionally, the ``pylock.toml`` reader
+ now runs ``expand_url_credentials`` over its sources so users with
+ ``[pipenv] use_pylock = true`` see the same env-var expansion that
+ ``Pipfile.lock`` reads have always had. `#6670 `_
+- Restored documented ``pipenv update`` (no args) semantics of ``lock + sync``.
+ Since 2026.0.0, ``pipenv update`` only re-resolved Pipfile entries whose
+ locked version no longer satisfied the Pipfile specifier, so relaxing a
+ pin (e.g. ``urllib3 = "<2.7.0"`` β ``urllib3 = "*"``) would not pick up
+ newer allowed releases β the lockfile silently stayed at the existing
+ pin. ``pipenv update`` now routes through ``do_lock`` when no packages
+ are given, re-resolving every Pipfile entry. The targeted
+ ``pipenv update `` path is unchanged. `#6672 `_
+
+Vendored Libraries
+------------------
+
+- Bump vendored ``plette`` to ``2.2.1``.
+
+2026.6.1 (2026-04-28)
+=====================
+pipenv 2026.6.1 (2026-04-28)
+============================
+
+
+Bug Fixes
+---------
+
+- Fix ``pipenv install`` corrupting existing inline-table or outline-table
+ Pipfile entries (``six = {version = "*"}``, ``[packages.requests]``). The
+ locker was popping ``version``/``ref`` keys directly off the cached
+ ``parsed_pipfile`` document, so subsequent writes emitted
+ ``six = {}`` and dropped the version specifier from sibling packages. `#6657 `_
+
+2026.6.0 (2026-04-27)
+=====================
+pipenv 2026.6.0 (2026-04-27)
+============================
+
+
+Bug Fixes
+---------
+
+- Fix ``pipenv shell`` breaking terminal input echo on Linux. The previous
+ implementation toggled ``setecho(True/False)`` on the spawned child around
+ its internal setup commands, which fought with the shell's own readline
+ termios management β producing permanently-disabled echo (GH-6572) or
+ double-echoed keystrokes (``1234`` β ``11223344``). ``fork_compat`` no
+ longer touches pty termios; instead it drains the synchronisation sentinel
+ from the pexpect buffer twice (once for the echoed command, once for its
+ output) so nothing leaks into ``interact()``. `#6633 `_
+- ``pipenv run -h `` now passes ``-h`` through to the command
+ instead of showing pipenv's help. All arguments following ``run_command`` are
+ captured verbatim via argparse ``REMAINDER``, so flags like ``-h`` that pipenv
+ itself also defines no longer collide with the wrapped command. `#6641 `_
+- Fix ``ValueError: invalid literal for int() with base 10`` when the Pipfile's
+ ``[requires]`` section uses a PEP 440 specifier (e.g. ``python_version = ">=3.9"``).
+ Specifier values no longer produce a Python-version override; the running
+ interpreter's actual version is used for marker evaluation instead. `#6645 `_
+- Install-time marker filtering now evaluates environment markers against the
+ target virtualenv's Python version rather than against the Python version
+ that pipenv itself is running under. This prevents spurious ``Ignoring β¦:
+ markers β¦ don't match your environment`` warnings (and the corresponding
+ missing installs) when ``pipenv sync --python X.Y`` is driven by a
+ different system Python. `#6647 `_
+- ``pipenv run`` now expands ``$PIPENV_PROJECT_DIR`` and other Pipenv-managed
+ environment variables inside Pipfile script arguments before direct command
+ execution, so project-relative script paths resolve correctly. `#6652 `_
+
+Improved Documentation
+----------------------
+
+- Pipfile documentation now includes git+ssh examples. `#6651 `_
+
+2026.5.2 (2026-04-03)
+=====================
+pipenv 2026.5.2 (2026-04-03)
+============================
+
+
+No significant changes.
+
+
+2026.5.1 (2026-04-01)
+=====================
+pipenv 2026.5.1 (2026-04-01)
+============================
+
+
+No significant changes.
+
+
+2026.5.0 (2026-03-30)
+=====================
+pipenv 2026.5.0 (2026-03-30)
+============================
+
+
+Features & Improvements
+-----------------------
+
+- Add optional shell completion via ``argcomplete``. Install with
+ ``pip install "pipenv[completion]"`` and activate once with
+ ``eval "$(register-python-argcomplete pipenv)"``.
+
+ Mistyped subcommand names now produce "Did you mean β¦?" suggestions using
+ ``difflib``, replacing the ``click_didyoumean`` vendor library. `#6619 `_
+
+Bug Fixes
+---------
+
+- Fix ``pylock.toml`` re-generation duplicating ``dependency_groups`` markers
+ for develop packages. Each run of ``pipenv pylock --generate`` (or any
+ command that rewrites the lock file) prepended the ``dependency_groups``
+ prefix even when it was already present, producing malformed markers like
+ ``('dev' in dependency_groups) and (('dev' in dependency_groups) and ...)``.
+ This caused ``pipenv install`` to crash with a ``KeyError: 'dependency_groups'``
+ when evaluating environment markers. `#6621 `_
+
+Vendored Libraries
+------------------
+
+- Remove vendored ``colorama``. Rich's ``Console`` supersedes colorama's Windows
+ ANSI escape code handling, and this was the last remaining usage in Pipenv. `#6621 `_
+
+Removals and Deprecations
+-------------------------
+
+- Remove the vendored ``click`` and ``click_didyoumean`` libraries. The CLI has
+ been rewritten to use Python's standard-library ``argparse``, eliminating
+ Pipenv's dependency on Click entirely. `#6619 `_
+- Remove the vendored ``importlib-metadata`` and ``zipp`` libraries. Python 3.9
+ is end-of-life and Pipenv requires Python 3.10+, where ``importlib.metadata``
+ is available in the standard library. `#6622 `_
+
+Relates to dev process changes
+------------------------------
+
+- Optimize CI pipeline: replace Black with ``ruff-format`` in pre-commit,
+ remove redundant standalone Ruff job, and add a ``tests-smoke`` gate that
+ runs Python 3.12 across all OSes before the full version matrix β cutting
+ wasted compute on version-agnostic failures.
+ Disable Windows Defender real-time scanning for Python toolcache,
+ workspace, virtualenvs, and pip cache on Windows runners
+ to reduce I/O overhead.
+
+2026.4.0 (2026-03-28)
+=====================
+pipenv 2026.4.0 (2026-03-28)
+============================
+
+
+No significant changes.
+
+
+2026.3.0 (2026-03-28)
+=====================
+pipenv 2026.3.0 (2026-03-28)
+============================
+
+
+Features & Improvements
+-----------------------
+
+- Support ``--system --python=/path/to/python`` to install packages to a specific
+ Python interpreter's site-packages. Previously ``--system`` always used the
+ default ``python3`` from PATH, ignoring the ``--python`` flag. `#3593 `_
+- Add ``--exclude-index`` flag to ``pipenv requirements`` command to allow users
+ to exclude index URLs (``-i`` and ``--extra-index-url``) from the generated output.
+ This is useful when the index is configured separately in the target environment. `#4398 `_
+- Add ``--system`` flag to ``pipenv update`` command, allowing system-level package
+ updates without creating a virtualenv. This is useful in Docker environments and
+ other contexts where packages are installed directly to the system Python. `#5584 `_
+
+Bug Fixes
+---------
+
+- ``pipenv shell`` now waits for the shell to finish its startup before sending the virtualenv activate script. Previously, interactive prompts during shell startup (e.g. oh-my-zsh's update dialogue) could consume the activate command, leaving the virtualenv unactivated. `#3615 `_
+- ``pipenv --where`` now exits with a non-zero exit code (1) when no Pipfile is
+ found, making it suitable for use in scripts and CI pipelines. `#4085 `_
+- Pass through ``PIP_IGNORE_INSTALLED`` and ``PIP_USER`` environment variables to
+ pip subprocess when using ``--system``. This fixes ``pipenv install --deploy --system``
+ not respecting these environment variables for Docker multi-stage builds.
+
+ Add ``PIPENV_BREAK_SYSTEM_PACKAGES`` environment variable to pass
+ ``--break-system-packages`` to pip when using ``--system`` on PEP 668
+ externally-managed environments (e.g. Ubuntu 23.04+, Debian 12+). `#4453 `_
+- Fix ``--system`` flag causing confusing errors when a stale virtualenv exists from
+ a previously deleted project, or when a virtualenv already exists. When ``--system``
+ is used, pipenv now correctly skips virtualenv creation instead of aborting with
+ "You are attempting to re-create a virtualenv that Pipenv did not create". `#5052 `_
+- Shorthand marker keys in Pipfile entries (e.g. ``sys_platform = "== 'linux'"``, ``platform_machine = "== 'arm64'"``) now behave identically to the equivalent ``markers`` syntax. Previously, using the shorthand form caused pip to resolve and download sub-dependencies on all platforms, even though the top-level package was correctly marked as platform-specific in the lock file. The shorthand keys are now translated to PEP 508 markers before building the pip requirement line, so the resolver skips resolution on non-matching platforms. `#5884 `_
+- Fix Windows py-launcher Python discovery for full version strings such as
+ ``python_full_version = "3.11.9"`` in Pipfile and ``pipenv --python 3.11.9``
+ on the CLI.
+
+ Two bugs were addressed:
+
+ 1. ``find_python_from_py_launcher`` incorrectly required three whitespace-separated
+ tokens on each ``py --list-paths`` output line, which caused every non-default
+ Python installation (lines without the ``*`` marker) to be silently skipped.
+ The parser now accepts both two-token (non-default) and three-token (default)
+ lines, using the last token as the executable path in both cases.
+
+ 2. ``PyLauncherFinder`` stored only the ``major.minor`` version reported by
+ ``py --list-paths`` (e.g. ``3.11``), so searches that required a specific
+ patch level (``patch=9``) never matched. The finder now queries each
+ discovered executable for its real version string (e.g. ``3.11.9``) so that
+ full-version lookups succeed. `#5893 `_
+- Security hardening: suppress ``pip.conf`` index configuration (``index-url`` and ``extra-index-url``) during ``pip install`` subprocess invocation. Previously, ``pip.conf`` could silently inject extra package indexes at install time, bypassing pipenv's explicit-index-per-package security model and causing hash-mismatch errors (e.g. piwheels on Raspberry Pi). Now pipenv sets ``PIP_CONFIG_FILE=/dev/null`` and explicitly passes only Pipfile ``[[source]]`` entries via ``PIP_INDEX_URL`` and ``PIP_EXTRA_INDEX_URL`` environment variables. Users who need custom indexes (e.g. piwheels) should declare them as ``[[source]]`` entries in their Pipfile. `#6066 `_
+
+Improved Documentation
+----------------------
+
+- Added a dedicated "Installing on Windows" section to the installation docs with the recommended pipx method and PATH setup guidance. `#4053 `_
+- Added a "Upgrading the Python Version" workflow section to docs/workflows.md with step-by-step instructions for moving a project to a new Python interpreter. `#4577 `_
+- Documented that ``python_version`` in the ``[requires]`` section only accepts an exact version string and not range specifiers such as ``>= 3.6``. `#4636 `_
+- Enhanced the "Moving or Renaming Projects" section in docs/virtualenv.md with a recovery workflow for users who already moved their project without running ``pipenv --rm`` first, and added a tip about ``PIPENV_VENV_IN_PROJECT``. `#5129 `_
+- Added a "Multi-Platform Considerations" section to docs/locking.md explaining that ``Pipfile.lock`` is platform-specific and documenting workarounds for cross-platform teams. `#5130 `_
+- Added a "News Fragments" section to docs/dev/contributing.md explaining towncrier fragment types, including why ``trivial`` fragments are intentionally omitted from the generated CHANGELOG. `#5324 `_
+- Documented the behavior when a package pinned in ``[dev-packages]`` conflicts with the version resolved via ``[packages]`` dependencies, and clarified how to enforce a specific version in that scenario. `#5528 `_
+- Added a "Platform Markers and Locking" note to docs/specifiers.md explaining why packages with ``sys_platform`` markers may still cause resolution failures on non-matching platforms and documenting workarounds. `#6028 `_
+
+Relates to dev process changes
+------------------------------
+
+- Update project metadata: replace defunct ``distutils-sig@python.org`` email with ``matteius@gmail.com`` and remove redundant ``.isort.cfg`` (Ruff's isort handles import sorting).
+
+2026.2.2 (2026-03-24)
+=====================
+pipenv 2026.2.2 (2026-03-24)
+============================
+
+
+Bug Fixes
+---------
+
+- ``pipenv upgrade`` now correctly removes transitive dependencies that are no longer needed after a package is upgraded (e.g. ``pytz`` is removed when upgrading Django from 3.2.x to 4.2+). A safety guard was also added to ``_clean_unused_dependencies`` to prevent incorrectly wiping all packages when a full resolution returns an empty result due to a subprocess failure. `#6002 `_
+- Run python -m virtualenv from empty directory to prevent PYTHONPATH pollution. Fixes #6568. `#6569 `_
+
+Improved Documentation
+----------------------
+
+- Fix broken changelog headers and update the auto-generated changelog template to avoid the issue in the future `#6564 `_
+
+2026.2.1 (2026-03-19)
+=====================
+pipenv 2026.2.1 (2026-03-19)
+============================
+
+
+No significant changes.
+
+
+2026.2.0 (2026-03-18)
+=====================
+pipenv 2026.2.0 (2026-03-18)
+============================
+
+
+No significant changes.
+
+
+2026.1.0 (2026-03-13)
+=====================
+pipenv 2026.1.0 (2026-03-13)
+============================
+
+
+No significant changes.
+
+
+2026.0.3 (2025-12-16)
+=====================
+pipenv 2026.0.3 (2025-12-16)
+============================
+
+
+No significant changes.
+
+
+2026.0.2 (2025-12-10)
+=====================
+pipenv 2026.0.2 (2025-12-10)
+============================
+
+
+No significant changes.
+
+
+2026.0.1 (2025-12-10)
+=====================
+pipenv 2026.0.1 (2025-12-10)
+============================
+
+
+Bug Fixes
+---------
+
+- Fix reading of ``index-url`` from pip configuration files (``/etc/pip.conf``, ``~/.pip/pip.conf``, etc.) which was broken after vendoring pip 25.3 due to a change in pip's Configuration.items() return format. `#6478 `_
+
+2026.0.0 (2025-12-10)
+=====================
+pipenv 2026.0.0 (2025-12-10)
+============================
+
+
+Features & Improvements
+-----------------------
+
+- Add ``--system`` flag to ``pipenv run`` command. This allows running scripts
+ defined in Pipfile's ``[scripts]`` section without creating a virtualenv,
+ which is useful in Docker environments where packages are installed with
+ ``pipenv install --system``. `#2692 `_
+- Allow ``pipenv install --system `` to install specific packages to the
+ system Python. Previously this was blocked with an error message. This enables
+ Docker workflows where users want to interactively add packages to a project
+ that uses system-level installation. `#4086 `_
+- Added support for PEP 751 pylock.toml files:
+
+ - Reading: When both a Pipfile.lock and a pylock.toml file exist, Pipenv will prioritize the pylock.toml file.
+ - Writing: Add ``use_pylock = true`` to the ``[pipenv]`` section of your Pipfile to generate pylock.toml files alongside Pipfile.lock.
+ - Customization: Use ``pylock_name = "name"`` in the ``[pipenv]`` section to generate named pylock files (e.g., pylock.name.toml). `#6391 `_
+- Add support for ``--dev`` flag in ``pipenv uninstall`` command to remove packages from ``dev-packages`` section directly. `#6392 `_
+- Add ``PIPENV_PYENV_AUTO_INSTALL`` environment variable to automatically install missing Python versions via pyenv or asdf without prompting the user. `#6408 `_
+
+Bug Fixes
+---------
+
+- Fix ``--system`` and ``--python`` flags to work together correctly. Previously,
+ using both flags would still create a virtualenv. Now when ``--system`` is used
+ with ``--python``, pipenv validates that the specified Python version exists
+ on the system and raises a clear error if not found. `#4973 `_
+- Make ``--quiet`` flag actually suppress output during ``pipenv install`` and ``pipenv sync``.
+ Previously, messages like "Installing dependencies from Pipfile.lock" and "All dependencies are now up-to-date!" were shown even with ``--quiet``. `#5037 `_
+- Fix SSH ``git`` username being incorrectly redacted to ``****`` when importing
+ from requirements.txt, which caused lockfile generation to fail. `#5599 `_
+- Fix malformed ``Pipfile.lock`` causing command to exit successfully with code 0.
+ Now raises ``LockfileCorruptException`` which properly propagates as an error. `#5622 `_
+- Fix VCS dependencies (git, etc.) not being reinstalled when the ref/commit changes in the lockfile.
+ Previously, ``pipenv update`` would update the lockfile with the new commit hash but the installed
+ package in the virtualenv would remain unchanged, requiring ``pipenv --rm`` to force a reinstall. `#5791 `_
+- Fix ``pipenv-resolver`` CLI not working. The command now properly handles
+ package arguments from the command line, sets a default category of "default",
+ and correctly loads the pipenv module with all submodules. `#5862 `_
+- Fix ``--lock-only`` flag for ``pipenv upgrade`` command to properly skip adding package specifiers to Pipfile when set. `#6131 `_
+- Improve error handling in ``do_lock`` by properly catching and handling exceptions from ``venv_resolve_deps``.
+ RuntimeError now exits cleanly, and other exceptions display a full traceback for debugging. `#6166 `_
+- Fixed ``pipenv install --index=xxx`` where ``xxx`` is not a valid URL or known index name now raises a clear error instead of creating a malformed source entry in the Pipfile. `#6168 `_
+- Fix ``PIPENV_ACTIVE`` environment variable not being unset when running ``deactivate`` in a pipenv shell, which caused "Shell for UNKNOWN_VIRTUAL_ENVIRONMENT already activated" errors on subsequent ``pipenv shell`` commands. `#6220 `_
+- Fix ``pipenv lock`` to properly apply default package version constraints when resolving dev-packages and other categories. When a package is constrained in the ``[packages]`` section (e.g., ``httpx = "==0.24.1"``), dev-packages that depend on it will now be constrained to compatible versions. `#6347 `_
+- Fix typo in ``get_constraints_from_deps`` where version string was incorrectly formatted using the entire dependency dict instead of the version string. `#6354 `_
+- Fix for PEP660 editable VCS dependencies not reinstalled correctly. `#6362 `_
+- Resolver errors now display clean, user-friendly messages instead of confusing stacktraces in non-verbose mode. `#6388 `_
+- Validate Python version when using ``--system`` flag.
+ Previously, ``pipenv install --system --deploy`` would silently proceed even if the system Python version didn't match the ``python_version`` specified in Pipfile/Pipfile.lock.
+ Now it properly raises a DeployException when the versions don't match. `#6403 `_
+- Fix editable package name being incorrectly parsed from test files in subdirectories.
+ Previously, when installing an editable local package, pipenv would recursively search
+ all subdirectories for ``setup.py`` files. This could cause a test file with a
+ ``setup(name='foo')`` call to be incorrectly used as the package name. Now, ``setup.py``,
+ ``setup.cfg``, and ``pyproject.toml`` are only checked in the root directory. Metadata
+ files (``PKG-INFO``, ``METADATA``) are still searched in ``.egg-info`` and ``.dist-info``
+ directories.
+
+ Fixes #6409 `#6409 `_
+- Fix ``pipenv check --quiet`` not working properly. The ``--quiet`` flag now
+ correctly suppresses informational output and forces JSON output format for
+ safety so that results can be parsed correctly.
+
+ Fixes #6414 `#6414 `_
+- Fix ``pipenv update --dev`` (and ``pipenv update --categories develop``) updating
+ transitive dependencies in the ``develop`` section independently from the ``default``
+ section. Now, any packages that appear in both ``default`` and ``develop`` will use
+ the version from ``default``, ensuring consistent dependency versions between
+ production and development environments.
+
+ Fixes #6420 `#6420 `_
+- Fix markers not being respected for file-based and VCS dependencies during resolution.
+ Markers are now correctly included in the pip install line, allowing pipenv to skip
+ resolution for dependencies whose markers don't match the current environment. `#6431 `_
+- Fix ``pipenv requirements --dev-only --from-pipfile`` to only include packages explicitly listed in ``dev-packages``, not packages from other categories that happen to also be transitive dependencies of dev packages. `#6440 `_
+- Fix ``pipenv update`` incorrectly marking all packages as modified when Pipfile contains version ranges (e.g., ``>=2.25.1``) instead of exact versions. The comparison now properly checks if the locked version satisfies the Pipfile specifier, rather than doing a string comparison. This significantly improves performance of ``pipenv update`` when no packages have actually been modified. `#6454 `_
+- Fix ``TypeError: cannot unpack non-iterable PermissionError object`` on Windows with Python 3.12+
+ when removing read-only files (e.g., git pack files). The ``handle_remove_readonly`` error handler
+ now properly handles both the deprecated ``onerror`` callback signature (tuple) and the new
+ ``onexc`` callback signature (exception instance) introduced in Python 3.12. `#6474 `_
+- Fix benchmark CI job hanging by adding timeout and ``PIPENV_YES=1`` environment variable to prevent interactive prompts. `#6477 `_
+- Fix subprocess deadlock in resolver that could cause ``pipenv lock`` to hang indefinitely when the resolver subprocess writes large amounts of data to stdout. The fix reads stdout and stderr concurrently using threads, preventing pipe buffer deadlocks. `#benchmark `_
+
+Improved Documentation
+----------------------
+
+- Fix documentation that incorrectly referenced ``pipenv scan`` as a standalone command. The correct usage is ``pipenv check --scan``. `#6396 `_
+
+2025.1.3 (2025-12-09)
+=====================
+pipenv 2025.1.3 (2025-12-09)
+============================
+
+
+Bug Fixes
+---------
+
+- Fix TypeError when using pipenv with Python 3.9 target environments
+ by adding ``from __future__ import annotations`` to files in
+ ``pipenv/patched/pip`` that use Python 3.10+ type annotation syntax. `#6448 `_
+
+2025.1.1 (2025-12-05)
+=====================
+pipenv 2025.1.1 (2025-12-05)
+============================
+
+
+No significant changes.
+
+
+2025.1.0 (2025-12-05)
+=====================
+pipenv 2025.1.0 (2025-12-05)
+============================
+
+
+Features & Improvements
+-----------------------
+
+- Vendor in pip 25.3 for dependency resolution. `#6445 `_
+
+2025.0.4 (2025-07-07)
+=====================
+Pipenv 2025.0.4 (2025-07-07)
+============================
+
+
+Bug Fixes
+---------
+
+- Significantly improved dependency resolution performance with ResolveLib 1.2.0 optimistic backjumping, intelligent caching system, and batch Pipfile operations. Added comprehensive benchmarking infrastructure to prevent performance regressions. Requirements imports are 60-80% faster for large files, complex resolutions are 10-30% faster, and repeated operations benefit from smart caching. `#6419 `_
+- Ensure the requested Python version is installed when it differs from the one used with Pipenv. `#6425 `_
+- Restored ignore compatibility finder patch to enable comprehensive cross-platform hash collection in lock files. `#6426 `_
+
+2025.0.3 (2025-05-29)
+=====================
+Pipenv 2025.0.3 (2025-05-29)
+============================
+
+
+Vendored Libraries
+------------------
+
+- Vendor in ``pip==25.1.1`` latest. `#6400 `_
+
+2025.0.2 (2025-05-02)
+=====================
+Pipenv 2025.0.2 (2025-05-02)
+============================
+
+
+Bug Fixes
+---------
+
+- Cleanup unused dependencies when upgrading packages. `#6386 `_
+- Fix for ``UnboundLocalError`` in ``ensure_python`` when ``SESSION_IS_INTERACTIVE=False``, using pyenv, and python version in Pipfile not available. `#6389 `_
+
+
+2025.0.1 (2025-04-24)
+=====================
+Pipenv 2025.0.1 (2025-04-24)
+============================
+
+
+Bug Fixes
+---------
+
+- Fix for broken import requirements in ``2025.0.0`` `#6385 `_
+
+
+
+2025.0.0 (2025-04-24)
+=====================
+Pipenv 2025.0.0 (2025-04-24)
+============================
+
+
+Features & Improvements
+-----------------------
+
+- # Refactor pythonfinder for improved efficiency and PEP 514 support
+
+ ## Summary
+ This PR completely refactors the pythonfinder module to improve efficiency, reduce logical errors, and fix support for PEP 514 (Python registration in the Windows registry). The refactoring replaces the complex object hierarchy with a more modular, composition-based approach that is easier to maintain and extend.
+
+ ## Motivation
+ The original pythonfinder implementation had several issues:
+ * Complex object wrapping with paths as objects, leading to excessive recursion
+ * Tight coupling between classes making the code difficult to follow and maintain
+ * Broken Windows registry support (PEP 514)
+ * Performance issues due to redundant path scanning and inefficient caching
+
+ ## Changes
+ * **Architecture**: Replaced inheritance-heavy design with a composition-based approach using specialized finders
+ * **Data Model**: Simplified the data model with a clean ``PythonInfo`` dataclass
+ * **Windows Support**: Implemented proper PEP 514 support for Windows registry
+ * **Performance**: Improved caching and reduced redundant operations
+ * **Error Handling**: Added more specific exceptions and better error handling
+
+ ## Features
+ The refactored implementation continues to support all required features:
+ * System and user PATH searches
+ * pyenv installations
+ * asdf installations
+ * Windows registry (PEP 514) - now working correctly `#6360 `_
+- Almost finished with conversion off click echo/secho to rich console outputs. `#6366 `_
+- Make safety an optional dependency via extras
+
+ - Removed vendored safety package from pipenv/patched
+ - Added safety as an optional dependency via pipenv[safety]
+ - Modified check.py to prompt for safety installation if not present
+ - Safety installation will not modify user's Pipfile or lockfile `#safety-extras `_
+
+Bug Fixes
+---------
+
+- Fix launching PowerShell on UNC paths `#6322 `_
+- Check if we need to upgrade a package in more than one category. `#6361 `_
+- Fix issue with default constraints not applying to other package categories. `#6364 `_
+- Fix for parsing and using the star specifier in install and update/upgrade commands. `#6378 `_
+- Fixed KeyError when installing packages with invalid Python version specifiers in their metadata. `#6380 `_
+- Fixed an issue with installing local packages that have spaces in their path names. `#6381 `_
+- # Improved virtualenv scripts path resolution
+
+ ## Summary
+
+ This PR refactors the logic for determining virtual environment script paths
+ by leveraging ``sysconfig``'s built-in mechanisms. By removing
+ platform-dependent logic, ``pipenv`` now offers enhanced compatibility with
+ POSIX-like environments, including Cygwin and MinGW. The fix also mitigates
+ execution inconsistencies in non-native Windows environments, improving
+ portability across platforms.
+
+ ## Motivation
+
+ The original logic for determining the scripts path was unable to handle the
+ deviations of MSYS2 MinGW CPython identifying as ``nt`` platform, yet using a
+ POSIX ``{base}/bin`` path, instead of ``{base}/Scripts``.
+
+ ## Changes
+
+ Removed custom logic for determining virtualenv scripts path in favor of
+ retrieving the basename of the path string returned by
+ ``sysconfig.get_path('scripts')```. `#6737 `_
+- Update ``check`` command to support the new ``scan`` functionality
+ ---------------------------------------------------------------
+
+ The ``check`` command has been deprecated and will be unsupported beyond June 1, 2025.
+ Instead of adding a separate ``scan`` command, we've updated the ``check`` command to include a ``--scan`` option.
+
+ Key changes:
+ - Added a ``--scan`` option to the ``check`` command to use the new scan functionality
+ - Added a deprecation warning explaining that in future versions, ``check`` will run the scan command by default
+ - Better temporary file handling using the ``tempfile`` module to ensure proper cleanup
+ - More robust error handling
+
+ Users are encouraged to start using the ``--scan`` option with the ``check`` command to prepare for the future change.
+ This option requires users to obtain and configure an API key from https://pyup.io. `#safety-command `_
+
+
+2024.4.0 (2025-01-22)
+=====================
+Pipenv 2024.4.0 (2025-01-22)
+============================
+
+
+Bug Fixes
+---------
+
+- Running "pipenv shell" on MacOS in Powershell (pwsh) references incorrect Activate.ps1 `#6318 `_
+- Fix repr(Shell) `#6321 `_
+- Fix incorrect path for 'pipenv shell' `#6327 `_
+- Fix license declaration for PyPI `#6329 `_
+
+Vendored Libraries
+------------------
+
+- Remove click.echo from exceptions.py `#6216 `_
+
+2024.4.0 (2024-11-05)
+=====================
+Pipenv 2024.4.0 (2024-11-05)
+============================
+
+
+Bug Fixes
+---------
+
+- Fix regression where ``--skip-lock --dev`` was incorrectly searching Lockfile categories ("default", "develop") instead of Pipfile categories ("packages", "dev-packages"), causing packages to not be found. `#6304 `_
+- Fix issue where pipenv install would unintentionally upgrade packages that had wildcard (*) specifiers in the Pipfile, even when locked versions existed and no upgrade was requested. `#6306 `_
+- Fix issue where modules could not be found `#6307 `_
+
+Vendored Libraries
+------------------
+
+- Vendor in ``pip==24.3.1``. `#6292 `_
+- Vendoring
+ ---------
+ * Update vendored dependencies:
+ - importlib-metadata from 8.4.0 to 8.5.0
+ - packaging from 24.0 to 24.1
+ - tomli from 2.0.1 to 2.0.2
+ - tomlkit from 0.12.4 to 0.13.2
+ - zipp from 3.18.1 to 3.20.2 `#6293 `_
+
+2024.3.1 (2024-10-30)
+=====================
+
+Bug Fixes
+---------
+
+- Fix the readthedocs.org build that has been failing and not updating our official docs at https://pipenv.pypa.io/en/latest/ `#6291 `_
+- Fix regression of ``2024.3.0`` when using the ``--system`` flag without ``--deploy`` flag. `#6295 `_
+- - **Bugfix:** Fixed Regression with the ``pipenv update`` routine to allow for package upgrades without requiring an existing lockfile. This change improves the flexibility of the update process by determining which packages require updating and handling cases where the lockfile is absent or partially defined.
+ - **Tests Added:** Comprehensive integration tests for the updated functionality, covering scenarios like updating packages without a lockfile, detecting modified entries, handling VCS changes, and verifying the correct application of extras during installation. `#6299 `_
+
+2024.3.0 (2024-10-29)
+=====================
+
+Bug Fixes
+---------
+
+- Fix dependency resolution edge cases and versioning constraints handling:
+ * Allow JSON format options for ``--reverse`` dependency graph output matching pipdeptree
+ * Improve installation and upgrade routines to better handle dependencies
+ * Add ability to specify json output as pipdeptree does
+ * Add more consistent handling of VCS dependencies and references
+ * Fix synchronization of development and default dependencies during updates
+ * Ensure proper propagation of version constraints during updates
+ * Fix handling of ``~=`` and other version specifiers during updates
+
+ Key Changes:
+ * Improved reverse dependency analysis to catch conflicts earlier in resolution
+ * Better handling of VCS package lock data, preserving refs and subdirectories
+ * Fixed issue where VCS references could be lost in lock file when installed via commit hash
+ * Better handling of pipfile categories during installation and updates
+ * Corrected logic for development dependency resolution and constraint propagation
+ * Improved validation and preservation of version specifiers during updates
+
+ This improves stability when working with complex dependency trees and version constraints. `#6281 `_
+- Fixes issue with --skip-lock not providing pip the proper package specifier when version was a string (issue did not impact dict with version key). `#6288 `_
+
+2024.2.0 (2024-10-22)
+=====================
+
+Bug Fixes
+---------
+
+- Features & Bug Fixes
+ -------------------
+ - Refactored and simplified install routines, improving maintainability and reliability (#6276)
+ - Split install logic into smaller, focused functions.
+ - Eliminated Pipfile caching for now to prevent bugs and reduce complexity.
+ - Fixed edge cases with package category selection.
+ - Improved handling of VCS dependencies during updates, fixing when ref is a revision and not a branch.
+
+ - Enhanced VCS URL handling with better environment variable support (#6276)
+ - More reliable expansion of environment variables in Git URLs.
+ - Better handling of authentication components in VCS URLs.
+ - Improved error messaging for missing environment variables.
+ - Fixed issue where Git reference could be dropped during relock. `#6276 `_
+
+Vendored Libraries
+------------------
+
+- Update pipdeptree to version 2.23.4 `#6275 `_
+
+2024.1.0 (2024-09-29)
+=====================
+
+Features & Improvements
+-----------------------
+
+- Upgrade from ``pip==24.0`` to ``pip==24.1.2``. `#6253 `_
+
+Bug Fixes
+---------
+
+- Fixes regression in lock file generation that caused environment variable references (e.g., ${GIT_PASSWORD}) in VCS URLs to be stripped out. This restores the ability to use credential placeholders in version control system URLs. `#6256 `_
+
+2024.0.3 (2024-09-22)
+=====================
+
+Bug Fixes
+---------
+
+- Disable ``ResourceWarning`` warning for temporary files that are cleaned on program exit. `#6151 `_
+- Fixed package sorting when installing a package with extras. `#6171 `_
+- Fixed ``pipenv uninstall --all`` failing when the virtual environment no longer exists. `#6185 `_
+- Fix issue where installing a vcs dependency using pipenv CLI yielded the wrong Pipfile entry such that it could not lock. `#6242 `_
+- Fix report that pipenv requires ``packaging>=22`` on some systems by setting it as a dependency. `#6243 `_
+
+2024.0.2 (2024-09-13)
+=====================
+
+Features & Improvements
+-----------------------
+
+- Initial support for python3.13 `#6240 `_
+
+Bug Fixes
+---------
+
+- Fix bump version in CI/CD pipeline `#6177 `_
+- Swap old_version and new_version in pipenv update --outdated output. `#6179 `_
+- Update shell detection to only check the end of the command used. `#6197 `_
+- Fix loading dot env twice #6198 `#6202 `_
+- Solve issue with quiet lock not writing the lock file #6207. `#6207 `_
+- Fix regression introduced with the "smarter uninstall" PR. Uninstall ``--all`` should not clear the Pipfile entries. `#6209 `_
+- Fixed regression where all local file installations were incorrectly treated as editable. Ensure that local file installations are explicitly marked as editable in both Pipfile and Pipfile.lock entries if editable installation is desired. `#6222 `_
+- Corrected behavior of ``pipenv install --skip-lock`` after behavioral install refactor introduced regression. No Pipfile.lock is generated with this fix and installation of vcs no longer fails with revision missing error. `#6225 `_
+- Fix for Windows on ARM missing distlib binaries in pyproject.toml `#6240 `_
+
+Vendored Libraries
+------------------
+
+- Clean up usage of click styling from exceptions, shell and virtualenv `#6178 `_
+- Remove click.echo from pipenv/cli `#6182 `_
+- Remove click.echo from exceptions.py `#6216 `_
+- Update importlib-metadata to 8.4.0 `#6235 `_
+
+2024.0.1 (2024-06-11)
+=====================
+
+No significant changes.
+
+
+2024.0.0 (2024-06-06)
+=====================
+
+Features & Improvements
+-----------------------
+
+- Supply any ``--extra-pip-args`` also in the resolver steps. `#6006 `_
+- The ``uninstall`` command now does the inverse of ``upgrade`` which means it no longer invokes a full ``lock`` cycle which was problematic for projects with many dependencies. `#6029 `_
+- The ``pipenv requirements`` subcommand now supports the ``--from-pipfile`` flag. When this flag is used, the requirements file will only include the packages explicitly listed in the Pipfile, excluding any sub-packages. `#6156 `_
+
+Behavior Changes
+----------------
+
+- ``pipenv==2024.0.0`` denotes the first major release of our semver strategy.
+ As much requested, the ``install`` no longer does a complete lock operation. Instead ``install`` follows the same code path as pipenv update (which is upgrade + sync).
+ This is what most new users expect the behavior to be; it is a behavioral change, a necessary one to make the tool more usable.
+ Remember that complete lock resolution can be invoked with ``pipenv lock`` just as before. `#6098 `_
+
+Bug Fixes
+---------
+
+- Fix a bug that passes pipenv check command if Pipfile.lock not exist `#6126 `_
+- Fix a bug that vcs subdependencies were locked without their subdirectory fragment if they had one `#6136 `_
+- ``pipenv`` converts off ``pkg_resources`` API usages. This necessitated also vendoring in:
+ * latest ``pipdeptree==2.18.1`` which also converted off ``pkg_resources``
+ * ``importlib-metadata==7.1.0`` to continue supporting python 3.8 and 3.9
+ * ``packaging==24.0`` since the packaging we were utilizing in pip's _vendor was insufficient for this conversion. `#6139 `_
+- Pipenv only supports absolute python version. If the user specifies a Python version with inequality signs like >=3.12, <3.12 in the [requires] field, the code has been modified to explicitly express in an error log that absolute versioning must be used. `#6164 `_
+
+Vendored Libraries
+------------------
+
+- Vendor in ``pip==24.0`` `#6117 `_
+- Spring 2024 Vendoring includes:
+ * ``click-didyoumean==0.3.1``
+ * ``expect==4.9.0``
+ * ``pipdeptree==2.16.2``
+ * ``python-dotenv==1.0.1``
+ * ``ruamel.yaml==0.18.6``
+ * ``shellingham==1.5.4``
+ * ``tomlkit==0.12.4`` `#6118 `_
+
+
+2023.12.1 (2024-02-04)
+======================
+
+Bug Fixes
+---------
+
+- Remove debug print statements that should not have made it into the last release. `#6079 `_
+
+2023.12.0 (2024-02-01)
+======================
+Pipenv 2023.12.0 (2024-02-01)
+=============================
+
+
+Bug Fixes
+---------
+
+- Removal of pydantic from pythonfinder and pipenv; reduced complexity of pythonfinder pathlib usage (avoid posix conversions). `#6065 `_
+- Adjusted logic which assumed any file, path or VCS install should be considered editable. Instead relies on the user specified editable flag to mark requirement as editable install. `#6069 `_
+- Remove logic that treats ``CI`` variable to use ``do_run_nt`` shell logic, as the original reasons for that patch were no longer valid. `#6072 `_
+
+2023.11.17 (2024-01-21)
+=======================
+Pipenv 2023.11.17 (2024-01-21)
+==============================
+
+
+Bug Fixes
+---------
+
+- Add markers to Pipfile when parsing requirements.txt `#6008 `_
+- Fix KeyError when using a source without a name in Pipfile `#6021 `_
+- Fix a bug with locking projects that contains packages with non canonical names from private indexes `#6056 `_
+
+Vendored Libraries
+------------------
+
+- Update vendored tomlkit to ``0.12.3`` `#6024 `_
+- Bump version of pipdeptree to 0.13.2 `#6055 `_
+
+2023.11.15 (2023-11-15)
+=======================
+Pipenv 2023.11.15 (2023-11-15)
+==============================
+
+
+Bug Fixes
+---------
+
+- Fix regression with path installs on most recent release ``2023.11.14`` `#6017 `_
+
+
+2023.11.14 (2023-11-14)
+=======================
+
+Behavior Changes
+----------------
+
+- pipenv now ignores existing venv dir when ``PIPENV_VENV_IN_PROJECT`` is false. `#6009 `_
+
+Bug Fixes
+---------
+
+- Assume the vcs and direct URL installs need to be reinstalled. `#5936 `_
+- Pass through pipfile index urls when creating https session so that keyring fully works `#5994 `_
+- Fix Using dependencies from a URL fails on Windows. `#6011 `_
+
+
+2023.10.24 (2023-10-24)
+=======================
+
+Features & Improvements
+-----------------------
+
+- Officially support python 3.12 `#5987 `_
+
+Bug Fixes
+---------
+
+- Additional safety check in _fold_markers logic that affected some lock resolutions in prior release. `#5988 `_
+
+Vendored Libraries
+------------------
+
+- Update vendored versions of:
+ * click==8.1.7
+ * markupsafe==2.1.3
+ * pydantic==1.10.13
+ * pythonfinder==2.0.6
+ * ruamel.yaml==0.17.39
+ * shellingham==1.5.3
+ * tomlkit==0.12.1 `#5986 `_
+- Update vendored pip to ``23.3.1`` `#5991 `_
+
+
+2023.10.20 (2023-10-20)
+=======================
+
+Features & Improvements
+-----------------------
+
+- Add quiet option to pipenv shell, hiding "Launching subshell in virtual environment..." `#5966 `_
+- Vendor in pip==23.3 which includes updates to certifi, urllib3, and adds truststore among other improvements. `#5979 `_
+
+Behavior Changes
+----------------
+
+- Change ``--py`` to use ``print`` preventing insertion of newline characters `#5969 `_
+
+Vendored Libraries
+------------------
+
+- Drop pep517 - as it is no longer used. `#5970 `_
+
+Removals and Deprecations
+-------------------------
+
+- Drop support for Python 3.7 `#5879 `_
+
+
+2023.10.3 (2023-10-03)
+======================
+
+Bug Fixes
+---------
+
+- Eveb better handling of vcs branch references that contain special characters. `#5934 `_
+- Bump certifi from 2023.5.7 to 2023.7.22 in /examples to address a security vulnerability `#5941 `_
+
+
+2023.9.8 (2023-09-08)
+=====================
+
+Bug Fixes
+---------
+
+- ignore_compatibility was supposed to default to False (except for hash collection) `#5926 `_
+
+
+2023.9.7 (2023-09-07)
+=====================
+
+Features & Improvements
+-----------------------
+
+- Updates build to use exclusively ``pyproject.toml``
+ ---------------------------------------------------
+
+ Modernizes the build process by consolidating all of ``setuptools`` metadata within ``pyproject.toml`` and removing deprecated ``setup.cfg`` and ``setup.py``. `#5837 `_
+
+Bug Fixes
+---------
+
+- Restore the ignore compatibility finder pip patch to resolve issues collecting hashes from google artifact registry (and possibly others). `#5887 `_
+- Handle case better where setup.py name is referencing a variable that is a string while encouraging folks to migrate their projects to pyproject.toml `#5905 `_
+- Better handling of local file install edge cases; handle local file extras. `#5919 `_
+- Include the Pipfile markers in the install phase when using ``--skip-lock``. `#5920 `_
+- Fallback to default vcs ref when no ref is supplied.
+ More proactively determine package name from the pip line where possible, fallback to the existing file scanning logics when unable to determine name. `#5921 `_
+
+
+# 2023.9.1 (2023-09-01)
+
+## Features & Improvements
+
+- Top level Pipfile sys_platform markers should be transitive; adds top level platform_machine entries that are also transitive. Marker entries continue to operate the same as before. [#5892](https://github.com/pypa/pipenv/issues/5892)
+
+## Bug Fixes
+
+- Apply patch for install_search_all_sources = True functionality. [#5895](https://github.com/pypa/pipenv/issues/5895)
+- Relative paths improvements for editable installs. [#5896](https://github.com/pypa/pipenv/issues/5896)
+- Set log level in resolver to WARN when verbose is not passed. [#5897](https://github.com/pypa/pipenv/issues/5897)
+- Handle more variations in private index html to improve hash collection. [#5898](https://github.com/pypa/pipenv/issues/5898)
+
+# 2023.8.28 (2023-08-28)
+
+## Bug Fixes
+
+- Revert change that caused the credentials in source url issue. [#5878](https://github.com/pypa/pipenv/issues/5878)
+- Do not treat named requirements as file installs just becacuse a match path exists; better handling of editable keyword for local file installs.
+ Handle additional edge cases in the setup.py ast parser logic for trying to determine local install package name. [#5885](https://github.com/pypa/pipenv/issues/5885)
+
+# 2023.8.26 (2023-08-26)
+
+## Bug Fixes
+
+- Additional property caching to avoid duplication of sources in the resolver. [#5863](https://github.com/pypa/pipenv/issues/5863)
+- Fix recent regressions with local/editable file installs. [#5870](https://github.com/pypa/pipenv/issues/5870)
+- Fixes the vcs subdirectory fragments regression; fixes sys_platform markers regression. [#5871](https://github.com/pypa/pipenv/issues/5871)
+- Fix regression that caused printing non-printable ascii characters when help was called. [#5872](https://github.com/pypa/pipenv/issues/5872)
+
+# 2023.8.25 (2023-08-25)
+
+## Bug Fixes
+
+- Fix regression of hash collection when downloading package from private indexes when the hash is not found in the index href url fragment. [#5866](https://github.com/pypa/pipenv/issues/5866)
+
+# 2023.8.23 (2023-08-22)
+
+## Bug Fixes
+
+- More gracefully handle @ symbols in vcs URLs to address recent regression with vcs URLs. [#5849](https://github.com/pypa/pipenv/issues/5849)
+
+# 2023.8.22 (2023-08-22)
+
+## Bug Fixes
+
+- Fix regression with `ssh://` vcs URLs introduced in `2023.8.21` whereby ssh vcs URLs are expected to have at least one `@` symbol. [#5846](https://github.com/pypa/pipenv/issues/5846)
+
+# 2023.8.21 (2023-08-21)
+
+## Bug Fixes
+
+- Add back some relevant caching to increase performance after the major refactor released with `2023.8.19` [#5841](https://github.com/pypa/pipenv/issues/5841)
+- Fix some edge cases around vcs dependencies without a ref, and older Pipfile/lockfile formats. [#5843](https://github.com/pypa/pipenv/issues/5843)
+
+## Vendored Libraries
+
+- Remove unused command line interface for vendored packages. [#5840](https://github.com/pypa/pipenv/issues/5840)
+
+# 2023.8.20 (2023-08-20)
+
+## Bug Fixes
+
+- Fix the expected output of the `version` command. [#5838](https://github.com/pypa/pipenv/issues/5838)
+
+# 2023.8.19 (2023-08-19)
+
+## Features & Improvements
+
+- The `--categories` option now works with requirements.txt file. [#5722](https://github.com/pypa/pipenv/issues/5722)
+
+## Bug Fixes
+
+- Drop requirementslib for managing pip lines and InstallRequirements, bring remaining requirementslib functionality into pipenv.
+ Fixes numerous reports about extras installs with vcs and file installs; format pip lines correctly to not generate deprecation warnings. [#5793](https://github.com/pypa/pipenv/issues/5793)
+
+## Vendored Libraries
+
+- Update pip 23.2 -> 23.2.1 [#5822](https://github.com/pypa/pipenv/issues/5822)
+
+## Improved Documentation
+
+- Added documentation on how to move or rename a project directory [#5129](https://github.com/pypa/pipenv/issues/5129)
+
+## Removals and Deprecations
+
+- The `--skip-lock` flag which was deprecated, has now been removed to unblock modernizing the pipenv resolver code. [#5805](https://github.com/pypa/pipenv/issues/5805)
+
+# 2023.7.23 (2023-07-23)
+
+## Features & Improvements
+
+- Upgrades `pip==23.2` which includes everything from the pip changelog. Drops the "install_compatatability_finder" pip internals patch. [#5808](https://github.com/pypa/pipenv/issues/5808)
+
+## Bug Fixes
+
+- Fix issue parsing some Pipfiles with separate packages.\ sections (tomlkit OutOfOrderTableProxy) [#5794](https://github.com/pypa/pipenv/issues/5794)
+- Fix all ruff linter warnings [#5807](https://github.com/pypa/pipenv/issues/5807)
+- Restore running Resolver in sub-process using the project python by default; maintains ability to run directly by setting `PIPENV_RESOLVER_PARENT_PYTHON` environment variable to 1 (useful for internal debugging). [#5809](https://github.com/pypa/pipenv/issues/5809)
+- Fix error when a Windows path begins with a '' with `pythonfinder==2.0.5`. [#5812](https://github.com/pypa/pipenv/issues/5812)
+
+## Vendored Libraries
+
+- Remove usage of click.secho in some modules. [#5804](https://github.com/pypa/pipenv/issues/5804)
+
+2023.7.11 (2023-07-11)
+
+## Bug Fixes
+
+- Invoke the resolver in the same process as pipenv rather than utilizing subprocess. [#5787](https://github.com/pypa/pipenv/issues/5787)
+- Fix regression markers being included as None/null in requirements command. [#5788](https://github.com/pypa/pipenv/issues/5788)
+
+# 2023.7.9 (2023-07-09)
+
+## Bug Fixes
+
+- Drop the --keep-outdated flag and --selective-upgrade flags that have been deprecated in favor of update/upgrade commands. [#5730](https://github.com/pypa/pipenv/issues/5730)
+- Fix regressions in the `requirements` command related to standard index extras and handling of local file requirements. [#5784](https://github.com/pypa/pipenv/issues/5784)
+
+# 2023.7.4 (2023-07-04)
+
+## Bug Fixes
+
+- Fixes regression on Pipfile requirements syntax. Ensure default operator is provided to requirement lib to avoid crash. [#5765](https://github.com/pypa/pipenv/issues/5765)
+- Ensure hashes included in a generated requirements file are after any markers. [#5777](https://github.com/pypa/pipenv/issues/5777)
+
+# 2023.7.3 (2023-07-02)
+
+## Bug Fixes
+
+- Fix regression with `--system` flag usage. [#5773](https://github.com/pypa/pipenv/issues/5773)
+
+# 2023.7.1 (2023-07-01)
+
+## Bug Fixes
+
+- Patch `_get_requests_session` method to consider `PIP_CLIENT_CERT` value when present. [#5746](https://github.com/pypa/pipenv/issues/5746)
+- Fix regression in `requirements` command that was causing package installs after upgrade to `requirementslib==3.0.0`. [#5755](https://github.com/pypa/pipenv/issues/5755)
+- Fix `error: invalid command 'egg_info'` edge case with requirementslib 3.0.0. It exposed pipenv resolver sometimes was using a different python than expected. [#5760](https://github.com/pypa/pipenv/issues/5760)
+- Fix issue in requirementslib 3.0.0 where dependencies defined in pyproject.toml were not being included in the lock file. [#5766](https://github.com/pypa/pipenv/issues/5766)
+
+## Removals and Deprecations
+
+- Bump dparse to 0.6.3 [#5750](https://github.com/pypa/pipenv/issues/5750)
+
+# 2023.6.26 (2023-06-26)
+
+## Improved Documentation
+
+- Add missing environment variable descriptions back to documentation [#missing_env_var_desc](https://github.com/pypa/pipenv/issues/missing_env_var_desc)
+
+# 2023.6.18 (2023-06-18)
+
+## Bug Fixes
+
+- Fixes resolver to only consider the default index for packages when a secondary index is not specified. This brings the code into alignment with stated assumptions about index restricted packages behavior of `pipenv`. [#5737](https://github.com/pypa/pipenv/issues/5737)
+
+## Removals and Deprecations
+
+- Deprecation of `--skip-lock` flag as it bypasses the security benefits of pipenv. Plus it lacks proper deterministic support of installation from multiple package indexes. [#5737](https://github.com/pypa/pipenv/issues/5737)
+
+# 2023.6.12 (2023-06-11)
+
+## Bug Fixes
+
+- Remove the `sys.path` modifications and as a result fixes keyring support. [#5719](https://github.com/pypa/pipenv/issues/5719)
+
+# 2023.6.11 (2023-06-11)
+
+## Vendored Libraries
+
+- Upgrades to `pipdeptree==2.8.0` which fixes edge cases of the `pipenv graph` command. [#5720](https://github.com/pypa/pipenv/issues/5720)
+
+# 2023.6.2 (2023-06-02)
+
+## Features & Improvements
+
+- Resolver performance: package sources following PEP 503 will leverage package hashes from the URL fragment, without downloading the package. [#5701](https://github.com/pypa/pipenv/issues/5701)
+
+## Bug Fixes
+
+- Improve regex for python versions to handle hidden paths; handle relative paths to python better as well. [#4588](https://github.com/pypa/pipenv/issues/4588)
+- Update `pythonfinder==2.0.4` with fix for "RecursionError: maximum recursion depth exceeded". [#5709](https://github.com/pypa/pipenv/issues/5709)
+
+## Vendored Libraries
+
+- Drop old vendored toml library. Use stdlib tomllib or tomli instead. [#5678](https://github.com/pypa/pipenv/issues/5678)
+- Drop vendored library cerberus. This isn't actually used by pipenv. [#5699](https://github.com/pypa/pipenv/issues/5699)
+
+# 2023.5.19 (2023-05-19)
+
+## Bug Fixes
+
+- Consider `--index` argument in `update` and `upgrade` commands. [#5692](https://github.com/pypa/pipenv/issues/5692)
+
+## Vendored Libraries
+
+- Upgrade `pythonfinder==2.0.0` which also brings in `pydantic==1.10.7`. [#5677](https://github.com/pypa/pipenv/issues/5677)
+
+# 2023.4.29 (2023-04-29)
+
+## Vendored Libraries
+
+- Vendor in `pip==23.1.2` latest. [#5671](https://github.com/pypa/pipenv/issues/5671)
+- Vendor in `requirementslib==2.3.0` which drops usage of `vistir`. [#5672](https://github.com/pypa/pipenv/issues/5672)
+
+# 2023.4.20 (2023-04-20)
+
+## Features & Improvements
+
+- Checks environment variable `PIP_TRUSTED_HOSTS` when evaluating an
+ index specified at the command line when adding to `Pipfile`.
+
+ For example, this command line
+
+ ```
+ PIP_TRUSTED_HOSTS=internal.mycompany.com pipenv install pypkg --index=https://internal.mycompany.com/pypi/simple
+ ```
+
+ will add the following to the `Pipfile`:
+
+ ```
+ [[source]]
+ url = 'https://internal.mycompany.com/pypi/simple'
+ verify_ssl = false
+ name = 'Internalmycompany'
+
+ [packages]
+ pypkg = {version="*", index="Internalmycompany"}
+ ```
+
+ This allows users with private indexes to add them to `Pipfile`
+ initially from command line with correct permissions using environment
+ variable `PIP_TRUSTED_HOSTS`. [#5572](https://github.com/pypa/pipenv/issues/5572)
+
+- Vendor in the updates, upgrades and fixes provided by `pip==23.1`. [#5655](https://github.com/pypa/pipenv/issues/5655)
+
+- Replace flake8 and isort with [ruff](https://beta.ruff.rs). [#ruff](https://github.com/pypa/pipenv/issues/ruff)
+
+## Bug Fixes
+
+- Fix regression with `--skip-lock` option with `install` command. [#5653](https://github.com/pypa/pipenv/issues/5653)
+
+## Vendored Libraries
+
+- Vendor in latest `python-dotenv==1.0.0` [#5656](https://github.com/pypa/pipenv/issues/5656)
+- Vendor in latest available dependencies: `attrs==23.1.0` `click-didyoumean==0.3.0` `click==8.1.3` `markupsafe==2.1.2` `pipdeptree==2.7.0` `shellingham==1.5.0.post1` `tomlkit==0.11.7` [#5657](https://github.com/pypa/pipenv/issues/5657)
+- Vendor in latest `requirementslib==2.2.5` which includes updates for pip 23.1 [#5659](https://github.com/pypa/pipenv/issues/5659)
+
+## Improved Documentation
+
+- Made documentation clear about tilde-equals operator for package versions. [#5594](https://github.com/pypa/pipenv/issues/5594)
+
+# 2023.3.20 (2023-03-19)
+
+No significant changes.
+
+# 2023.3.18 (2023-03-19)
+
+## Bug Fixes
+
+- Fix import error in virtualenv utility for creating new environments caused by `2023.3.18` release. [#5636](https://github.com/pypa/pipenv/issues/5636)
+
+# 2023.3.18 (2023-03-18)
+
+## Features & Improvements
+
+- Provide a more powerful solution than `--keep-outdated` and `--selective-upgrade` which are deprecated for removal.
+ Introducing the `pipenv upgrade` command which takes the same package specifiers as `pipenv install` and
+ updates the `Pipfile` and `Pipfile.lock` with a valid lock resolution that only effects the specified packages and their dependencies.
+ Additionally, the `pipenv update` command has been updated to use the `pipenv upgrade` routine when packages are provided, which will install sync the new lock file as well. [#5617](https://github.com/pypa/pipenv/issues/5617)
+
+## Vendored Libraries
+
+- Bump vistir to 0.8.0, requirementslib to 2.2.4. [#5635](https://github.com/pypa/pipenv/issues/5635)
+
+# 2023.2.18 (2023-02-18)
+
+## Features & Improvements
+
+- `pipenv` now reads the system `pip.conf` or `pip.ini` file in order to determine pre-defined indexes to use for package resolution and installation. [#5297](https://github.com/pypa/pipenv/issues/5297)
+- Behavior change for `pipenv check` now checks the default packages group of the lockfile.
+ Specifying `--categories` to override which categories to check against.
+ Pass `--use-installed` to get the prior behavior of checking the packages actually installed into the environment. [#5600](https://github.com/pypa/pipenv/issues/5600)
+
+## Bug Fixes
+
+- Fix regression with detection of `CI` env variable being set to something other than a truthy value. [#5554](https://github.com/pypa/pipenv/issues/5554)
+- Fix `--categories` argument inconsistency between requirements command and install/sync by allowing comma separated values or spaces. [#5570](https://github.com/pypa/pipenv/issues/5570)
+- Use Nushell overlays when running `pipenv shell`. [#5603](https://github.com/pypa/pipenv/issues/5603)
+
+## Vendored Libraries
+
+- Vendor in the `pip==23.0` release. [#5586](https://github.com/pypa/pipenv/issues/5586)
+- Vendor in `pip==23.0.1` minor pt release. Updates `pythonfinder==1.3.2`. [#5614](https://github.com/pypa/pipenv/issues/5614)
+
+## Improved Documentation
+
+- Make some improvements to the contributing guide. [#5611](https://github.com/pypa/pipenv/issues/5611)
+
+# 2023.2.4 (2023-02-04)
+
+## Bug Fixes
+
+- Fix overwriting of output in verbose mode [#5530](https://github.com/pypa/pipenv/issues/5530)
+- Fix for resolution error when direct url includes an extras. [#5536](https://github.com/pypa/pipenv/issues/5536)
+
+## Removals and Deprecations
+
+- Remove pytest-pypi package since it's not used anymore [#5556](https://github.com/pypa/pipenv/issues/5556)
+- Remove deprecated --three flag from the CLI. [#5576](https://github.com/pypa/pipenv/issues/5576)
+
+# 2022.12.19 (2022-12-19)
+
+## Bug Fixes
+
+- Fix for `requirementslib` hanging during install of remote wheels files. [#5546](https://github.com/pypa/pipenv/issues/5546)
+
+# 2022.12.17 (2022-12-17)
+
+## Bug Fixes
+
+- virtualenv creation no longer uses `--creator=venv` by default; introduced two environment variables:
+ `PIPENV_VIRTUALENV_CREATOR` -- May be specified to instruct virtualenv which `--creator=` to use.
+ `PIPENV_VIRTUALENV_COPIES` -- When specified as truthy, instructs virtualenv to not use symlinks. [#5477](https://github.com/pypa/pipenv/issues/5477)
+- Fix regression where `path` is not propagated to the `Pipfile.lock`. [#5479](https://github.com/pypa/pipenv/issues/5479)
+- Solve issue where null markers were getting added to lock file when extras were provided. [#5486](https://github.com/pypa/pipenv/issues/5486)
+- Fix: `update --outdated` raises NonExistentKey with outdated dev packages [#5540](https://github.com/pypa/pipenv/issues/5540)
+
+## Vendored Libraries
+
+- Vendor in `pip==22.3.1` which is currently the latest version of `pip`. [#5520](https://github.com/pypa/pipenv/issues/5520)
+- - Bump version of requirementslib to 2.2.1
+ - Bump version of vistir to 0.7.5
+ - Bump version of colorama to 0.4.6 [#5522](https://github.com/pypa/pipenv/issues/5522)
+- Bump plette version to 0.4.4 [#5539](https://github.com/pypa/pipenv/issues/5539)
+
+# 2022.11.30 (2022-11-30)
+
+## Bug Fixes
+
+- Fix regression: pipenv does not sync indexes to lockfile. [#5508](https://github.com/pypa/pipenv/issues/5508)
+
+# 2022.11.25 (2022-11-24)
+
+## Bug Fixes
+
+- Solving issue where `pipenv check` command has been broken in the published wheel distribution. [#5493](https://github.com/pypa/pipenv/issues/5493)
+
+# 2022.11.24 (2022-11-24)
+
+## Bug Fixes
+
+- Stop building universal wheels since Python 2 is no longer supported. [#5496](https://github.com/pypa/pipenv/issues/5496)
+
+# 2022.11.23 (2022-11-23)
+
+## Features & Improvements
+
+- Find nushell activate scripts. [#5470](https://github.com/pypa/pipenv/issues/5470)
+
+## Vendored Libraries
+
+- - Drop unused code from cerberus
+ - Drop unused module wheel [#5467](https://github.com/pypa/pipenv/issues/5467)
+- - Replace yaspin spinner with rich spinner.
+ - Bump vistir version to 0.7.4 [#5468](https://github.com/pypa/pipenv/issues/5468)
+- Bump version of requirementslib to 2.2.0
+ Drop yaspin which is no longer used.
+ Bump vistir to version 0.7.4
+ Remove parse.
+ Remove termcolor.
+ Remove idna. [#5481](https://github.com/pypa/pipenv/issues/5481)
+
+# 2022.11.11 (2022-11-11)
+
+## Bug Fixes
+
+- Fix regression of lock generation that caused the keep-outdated behavior to be default. [#5456](https://github.com/pypa/pipenv/issues/5456)
+
+# 2022.11.5 (2022-11-05)
+
+## Bug Fixes
+
+- Rollback the change in version of `colorama` due to regressions in core functionality. [#5459](https://github.com/pypa/pipenv/issues/5459)
+
+# 2022.11.4 (2022-11-04)
+
+## Features & Improvements
+
+- Allow pipenv settings to be explicitly disabled more easily by assigning to the environment variable a falsy value. [#5451](https://github.com/pypa/pipenv/issues/5451)
+
+## Bug Fixes
+
+- Provide an install iteration per index when `install_search_all_sources` is `false` (default behavior).
+ This fixes regression where install phase was using unexpected index after updating `pip==22.3` [#5444](https://github.com/pypa/pipenv/issues/5444)
+
+## Vendored Libraries
+
+- Drop tomli, which is not used anymore.
+ Bump attrs version see #5449.
+ Drop distlib, colorama and platformdirs - use the ones from pip.\_vendor. [#5450](https://github.com/pypa/pipenv/issues/5450)
+
+# 2022.10.25 (2022-10-25)
+
+## Features & Improvements
+
+- Add support to export requirements file for a specified set of categories. [#5431](https://github.com/pypa/pipenv/issues/5431)
+
+## Vendored Libraries
+
+- Remove appdirs.py in favor of platformdirs. [#5420](https://github.com/pypa/pipenv/issues/5420)
+
+## Removals and Deprecations
+
+- Remove usage of vistir.cmdparse in favor of pipenv.cmdparse [#5419](https://github.com/pypa/pipenv/issues/5419)
+
+# 2022.10.12 (2022-10-12)
+
+## Improved Documentation
+
+- Update pipenv docs for with example for callabale package functions in Pipfile scripts [#5396](https://github.com/pypa/pipenv/issues/5396)
+
+# 2022.10.11 (2022-10-11)
+
+## Bug Fixes
+
+- Revert decision to change the default isolation level because it caused problems with existing workflows; solution is to recommend users that have issues requiring pre-requisites to pass --extra-pip-args="--no-build-isolation" in their install or sync commands. [#5399](https://github.com/pypa/pipenv/issues/5399)
+
+# 2022.10.10 (2022-10-10)
+
+## Features & Improvements
+
+- Add ability for callable scripts in Pipfile under \[scripts\]. Callables can now be added like: `:` and can also take arguments. For example: `func = {call = "package.module:func('arg1', 'arg2')"}` then this can be activated in the shell with `pipenv run func` [#5294](https://github.com/pypa/pipenv/issues/5294)
+
+## Bug Fixes
+
+- Fixes regression from `2022.10.9` where `Pipfile` with `pipenv` section began generating new hash,
+ and also fix regression where lock phase did not update the hash value. [#5394](https://github.com/pypa/pipenv/issues/5394)
+
+# 2022.10.9 (2022-10-09)
+
+## Behavior Changes
+
+- New pipfiles show python_full_version under \[requires\] if specified. Previously creating a new pipenv project would only specify in the Pipfile the major and minor version, i.e. "python_version = 3.7". Now if you create a new project with a fully named python version it will record both in the Pipfile. So: "python_version = 3.7" and "python_full_version = 3.7.2" [#5345](https://github.com/pypa/pipenv/issues/5345)
+
+## Relates to dev process changes
+
+- Silence majority of pytest.mark warnings by registering custom marks. Can view a list of custom marks by running `pipenv run pytest --markers`
+
+# 2022.10.4 (2022-10-04)
+
+## Bug Fixes
+
+- Use `--creator=venv` when creating virtual environments to avoid issue with sysconfig `posix_prefix` on some systems. [#5075](https://github.com/pypa/pipenv/issues/5075)
+- Prefer to use the lockfile sources if available during the install phase. [#5380](https://github.com/pypa/pipenv/issues/5380)
+
+## Vendored Libraries
+
+- Drop vendored six - we no longer depend on this library, as we migrated from pipfile to plette. [#5187](https://github.com/pypa/pipenv/issues/5187)
+
+# 2022.9.24 (2022-09-24)
+
+## Bug Fixes
+
+- Update `requirementslib==2.0.3` to always evaluate the requirement markers fresh (without lru_cache) to fix marker determinism issue. [#4660](https://github.com/pypa/pipenv/issues/4660)
+
+# 2022.9.21 (2022-09-21)
+
+## Bug Fixes
+
+- Fix regression to `install --skip-lock` with update to `plette`. [#5368](https://github.com/pypa/pipenv/issues/5368)
+
+# 2022.9.20 (2022-09-20)
+
+## Behavior Changes
+
+- Remove usage of pipfile module in favour of Plette.
+ pipfile is not actively maintained anymore. Plette is actively maintained,
+ and has stricter checking of the Pipefile and Pipefile.lock. As a result,
+ Pipefile with unnamed package indices will fail to lock. If a Pipefile
+ was hand crafeted, and the source is anonymous an error will be thrown.
+ The solution is simple, add a name to your index, e.g, replace:
+
+ ```
+ [[source]]
+ url = "https://pypi.acme.com/simple"
+ verify_ssl = true
+ ```
+
+ With:
+
+ ```
+ [[source]]
+ url = "https://pypi.acme.com/simple"
+ verify_ssl = true
+ name = acmes_private_index `#5339 `_
+ ```
+
+## Bug Fixes
+
+- Modernize `pipenv` path patch with `importlib.util` to eliminate import of `pkg_resources` [#5349](https://github.com/pypa/pipenv/issues/5349)
+
+## Vendored Libraries
+
+- Remove iso8601 from vendored packages since it was not used. [#5346](https://github.com/pypa/pipenv/issues/5346)
+
+# 2022.9.8 (2022-09-08)
+
+## Features & Improvements
+
+- It is now possible to supply additional arguments to `pip` install by supplying `--extra-pip-args=""`
+ See the updated documentation `Supplying additional arguments to pip` for more details. [#5283](https://github.com/pypa/pipenv/issues/5283)
+
+## Bug Fixes
+
+- Make editable detection better because not everyone specifies editable entry in the Pipfile for local editable installs. [#4784](https://github.com/pypa/pipenv/issues/4784)
+- Add error handling for when the installed package setup.py does not contain valid markers. [#5329](https://github.com/pypa/pipenv/issues/5329)
+- Load the dot env earlier so that `PIPENV_CUSTOM_VENV_NAME` is more useful across projects. [#5334](https://github.com/pypa/pipenv/issues/5334)
+
+## Vendored Libraries
+
+- Bump version of shellingham to support nushell. [#5336](https://github.com/pypa/pipenv/issues/5336)
+- Bump plette to version v0.3.0 [#5337](https://github.com/pypa/pipenv/issues/5337)
+- Bump version of pipdeptree [#5343](https://github.com/pypa/pipenv/issues/5343)
+
+## Removals and Deprecations
+
+- Add deprecation warning to the --three flag. Pipenv now uses python3 by default. [#5328](https://github.com/pypa/pipenv/issues/5328)
+
+## Relates to dev process changes
+
+- Convert the test runner to use `pypiserver` as a standalone process for all tests that referencce internal `pypi` artifacts.
+ General refactoring of some test cases to create more variety in packages selected--preferring lighter weight packages--in existing test cases.
+
+# 2022.9.4 (2022-09-04)
+
+## Bug Fixes
+
+- Fix the issue from `2022.9.2` where tarball URL packages were being skipped on batch_install. [#5306](https://github.com/pypa/pipenv/issues/5306)
+
+# 2022.9.2 (2022-09-02)
+
+## Bug Fixes
+
+- Fix issue where unnamed constraints were provided but which are not allowed by `pip` resolver. [#5273](https://github.com/pypa/pipenv/issues/5273)
+
+# 2022.8.31 (2022-08-31)
+
+## Features & Improvements
+
+- Performance optimization to `batch_install` results in a faster and less CPU intensive `pipenv sync` or `pipenv install` experience. [#5301](https://github.com/pypa/pipenv/issues/5301)
+
+## Bug Fixes
+
+- `pipenv` now uses a `NamedTemporaryFile` for rsolver constraints and drops internal env var `PIPENV_PACKAGES`. [#4925](https://github.com/pypa/pipenv/issues/4925)
+
+## Removals and Deprecations
+
+- Remove no longer used method `which_pip`. [#5314](https://github.com/pypa/pipenv/issues/5314)
+- Drop progress bar file due to recent performance optimization to combine `batch_install` requirements in at most two invocations of `pip install`.
+ To see progress of install pass `--verbose` flag and `pip` progress will be output in realtime. [#5315](https://github.com/pypa/pipenv/issues/5315)
+
+# 2022.8.30 (2022-08-30)
+
+## Bug Fixes
+
+- Fix an issue when using `pipenv install --system` on systems that having the `python` executable pointing to Python 2 and a Python 3 executable being `python3`. [#5296](https://github.com/pypa/pipenv/issues/5296)
+- Sorting `constraints` before resolving, which fixes `pipenv lock` generates nondeterminism environment markers. [#5299](https://github.com/pypa/pipenv/issues/5299)
+- Fix #5273, use our own method for checking if a package is a valid constraint. [#5309](https://github.com/pypa/pipenv/issues/5309)
+
+## Vendored Libraries
+
+- Vendor in `requirementslib==2.0.1` which fixes issue with local install not marked editable, and vendor in `vistir==0.6.1` which drops python2 support.
+ Drops `orderedmultidict` from vendoring. [#5308](https://github.com/pypa/pipenv/issues/5308)
+
+# 2022.8.24 (2022-08-24)
+
+## Bug Fixes
+
+- Remove eager and unnecessary importing of `setuptools` and `pkg_resources` to avoid conflict upgrading `setuptools`.
+ Roll back `sysconfig` patch of `pip` because it was problematic for some `--system` commands. [#5228](https://github.com/pypa/pipenv/issues/5228)
+
+## Vendored Libraries
+
+- Vendor in `requirementslib==2.0.0` and drop `pip-shims` entirely. [#5228](https://github.com/pypa/pipenv/issues/5228)
+- Vendor in `pythonfinder==1.3.1` [#5292](https://github.com/pypa/pipenv/issues/5292)
+
+# 2022.8.19 (2022-08-19)
+
+## Bug Fixes
+
+- Fix issue where resolver is provided with `install_requires` constraints from `setup.py` that depend on editable dependencies and could not resolve them. [#5271](https://github.com/pypa/pipenv/issues/5271)
+- Fix for `pipenv lock` fails for packages with extras as of `2022.8.13`. [#5274](https://github.com/pypa/pipenv/issues/5274)
+- Revert the exclusion of `BAD_PACKAGES` from `batch_install` in order for `pipenv` to install specific versions of `setuptools`.
+ To prevent issue upgrading `setuptools` this patches `_USE_SYSCONFIG_DEFAULT` to use `sysconfig` for `3.7` and above whereas `pip` default behavior was `3.10` and above. [#5275](https://github.com/pypa/pipenv/issues/5275)
+
+# 2022.8.17 (2022-08-17)
+
+## Bug Fixes
+
+- Fix "The Python interpreter can't be found" error when running `pipenv install --system` with a python3 but no python. [#5261](https://github.com/pypa/pipenv/issues/5261)
+- Revise pip import patch to include only `pipenv` from site-packages and removed `--ignore-installed` argument from pip install in order to fix regressions with `--use-site-packages`. [#5265](https://github.com/pypa/pipenv/issues/5265)
+
+# 2022.8.15 (2022-08-15)
+
+## Bug Fixes
+
+- `pip_install` method was using a different way of finding the python executable than other `pipenv` commands, which caused an issue with skipping package installation if it was already installed in site-packages. [#5254](https://github.com/pypa/pipenv/issues/5254)
+
+# 2022.8.14 (2022-08-14)
+
+## Bug Fixes
+
+- Removed `packaging` library from `BAD_PACKAGES` constant to allow it to be installed, which fixes regression from `pipenv==2022.8.13`. [#5247](https://github.com/pypa/pipenv/issues/5247)
+
+# 2022.8.13 (2022-08-13)
+
+## Bug Fixes
+
+- If environment variable `CI` or `TF_BUILD` is set but does not evaluate to `False` it is now treated as `True`. [#5128](https://github.com/pypa/pipenv/issues/5128)
+- Fix auto-complete crashing on 'install' and 'uninstall' keywords [#5214](https://github.com/pypa/pipenv/issues/5214)
+- Address remaining `pipenv` commands that were still referencing the user or system installed `pip` to use the vendored `pip` internal to `pipenv`. [#5229](https://github.com/pypa/pipenv/issues/5229)
+- Use `packages` as constraints when locking `dev-packages` in Pipfile.
+ Use `packages` as constraints when installing new `dev-packages`. [#5234](https://github.com/pypa/pipenv/issues/5234)
+
+## Vendored Libraries
+
+- Vendor in minor `pip` update `22.2.2` [#5230](https://github.com/pypa/pipenv/issues/5230)
+
+## Improved Documentation
+
+- Add documentation for environment variables the configure pipenv. [#5235](https://github.com/pypa/pipenv/issues/5235)
+
+## Removals and Deprecations
+
+- The deprecated way of generating requirements `install -r` or `lock -r` has been removed in favor of the `pipenv requirements` command. [#5200](https://github.com/pypa/pipenv/issues/5200)
+
+# 2022.8.5 (2022-08-05)
+
+## Features & Improvements
+
+- support PIPENV_CUSTOM_VENV_NAME to be the venv name if specified, update relevant docs. [#4974](https://github.com/pypa/pipenv/issues/4974)
+
+## Bug Fixes
+
+- Remove usages of `pip_shims` from the non vendored `pipenv` code, but retain initialization for `requirementslib` still has usages. [#5204](https://github.com/pypa/pipenv/issues/5204)
+- Fix case sensitivity of color name `red` in exception when getting hashes from pypi in `_get_hashes_from_pypi`. [#5206](https://github.com/pypa/pipenv/issues/5206)
+- Write output from `subprocess_run` directly to `stdout` instead of creating temporary file.
+ Remove deprecated `distutils.sysconfig`, use `sysconfig`. [#5210](https://github.com/pypa/pipenv/issues/5210)
+
+## Vendored Libraries
+
+- - Rename patched `notpip` to `pip` in order to be clear that its a patched version of pip.
+ - Remove the part of \_post_pip_import.patch that overrode the standalone pip to be the user installed pip, now we fully rely on our vendored and patched `pip`, even for all types of installs.
+ - Vendor in the next newest version of `pip==22.2`
+ - Modify patch for `pipdeptree` to not use `pip-shims` [#5188](https://github.com/pypa/pipenv/issues/5188)
+ - Remove vendored `urllib3` in favor of using it from vendored version in `pip._vendor` [#5215](https://github.com/pypa/pipenv/issues/5215)
+
+## Removals and Deprecations
+
+- Remove tests that have been for a while been marked skipped and are no longer relevant. [#5165](https://github.com/pypa/pipenv/issues/5165)
+
+# 2022.7.24 (2022-07-24)
+
+## Bug Fixes
+
+- Re-enabled three installs tests again on the Windows CI as recent refactor work has fixed them. [#5064](https://github.com/pypa/pipenv/issues/5064)
+- Support ANSI `NO_COLOR` environment variable and deprecate `PIPENV_COLORBLIND` variable, which will be removed after this release. [#5158](https://github.com/pypa/pipenv/issues/5158)
+- Fixed edge case where a non-editable file, url or vcs would overwrite the value `no_deps` for all other requirements in the loop causing a retry condition. [#5164](https://github.com/pypa/pipenv/issues/5164)
+- Vendor in latest `requirementslib` for fix to lock when using editable VCS module with specific `@` git reference. [#5179](https://github.com/pypa/pipenv/issues/5179)
+
+## Vendored Libraries
+
+- Remove crayons and replace with click.secho and click.styles per [#3741](https://github.com/pypa/pipenv/issues/3741)
+- Vendor in latest version of `pip==22.1.2` which upgrades `pipenv` from `pip==22.0.4`.
+ Vendor in latest version of `requirementslib==1.6.7` which includes a fix for tracebacks on encountering Annotated variables.
+ Vendor in latest version of `pip-shims==0.7.3` such that imports could be rewritten to utilize `packaging` from vendor'd `pip`.
+ Drop the `packaging` requirement from the `vendor` directory in `pipenv`. [#5147](https://github.com/pypa/pipenv/issues/5147)
+- Remove unused vendored dependency `normailze-charset`. [#5161](https://github.com/pypa/pipenv/issues/5161)
+- Remove obsolete package `funcsigs`. [#5168](https://github.com/pypa/pipenv/issues/5168)
+- Bump vendored dependency `pyparsing==3.0.9`. [#5170](https://github.com/pypa/pipenv/issues/5170)
+
+# 2022.7.4 (2022-07-04)
+
+## Behavior Changes
+
+- Adjust `pipenv requirements` to add markers and add an `--exclude-markers` option to allow the exclusion of markers. [#5092](https://github.com/pypa/pipenv/issues/5092)
+
+## Bug Fixes
+
+- Stopped expanding environment variables when using `pipenv requirements` [#5134](https://github.com/pypa/pipenv/issues/5134)
+
+## Vendored Libraries
+
+- Depend on `requests` and `certifi` from vendored `pip` and remove them as explicit vendor dependencies. [#5000](https://github.com/pypa/pipenv/issues/5000)
+- Vendor in the latest version of `requirementslib==1.6.5` which includes bug fixes for beta python versions, projects with an at sign (@) in the path, and a `setuptools` deprecation warning. [#5132](https://github.com/pypa/pipenv/issues/5132)
+
+## Relates to dev process changes
+
+- Switch from using type comments to type annotations.
+
+# 2022.5.3.dev0 (2022-06-07)
+
+## Bug Fixes
+
+- Adjust pipenv to work with the newly added `venv` install scheme in Python.
+ First check if `venv` is among the available install schemes, and use it if it is. Otherwise fall back to the `nt` or `posix_prefix` install schemes as before. This should produce no change for environments where the install schemes were not redefined. [#5096](https://github.com/pypa/pipenv/issues/5096)
+
+# 2022.5.2 (2022-05-02)
+
+## Bug Fixes
+
+- Fixes issue of `pipenv lock -r` command printing to stdout instead of stderr. [#5091](https://github.com/pypa/pipenv/issues/5091)
+
+# 2022.4.30 (2022-04-30)
+
+## Bug Fixes
+
+- Fixes issue of `requirements` command problem by modifying to print `-e` and path of the editable package. [#5070](https://github.com/pypa/pipenv/issues/5070)
+- Revert specifier of `setuptools` requirement in `setup.py` back to what it was in order to fix `FileNotFoundError: [Errno 2]` issue report. [#5075](https://github.com/pypa/pipenv/issues/5075)
+- Fixes issue of requirements command where git requirements cause the command to fail, solved by using existing convert_deps_to_pip function. [#5076](https://github.com/pypa/pipenv/issues/5076)
+
+## Vendored Libraries
+
+- Vendor in `requirementslib==1.6.4` to Fix `SetuptoolsDeprecationWarning` `setuptools.config.read_configuration` became deprecated. [#5081](https://github.com/pypa/pipenv/issues/5081)
+
+## Removals and Deprecations
+
+- Remove more usage of misc functions of vistir. Many of this function are available in the STL or in another dependency of pipenv. [#5078](https://github.com/pypa/pipenv/issues/5078)
+
+# 2022.4.21 (2022-04-21)
+
+## Removals and Deprecations
+
+- Updated setup.py to remove support for python 3.6 from built `pipenv` packages' Metadata. [#5065](https://github.com/pypa/pipenv/issues/5065)
+
+# 2022.4.20 (2022-04-20)
+
+## Features & Improvements
+
+- Added new Pipenv option `install_search_all_sources` that allows installation of packages from an
+ existing `Pipfile.lock` to search all defined indexes for the constrained package version and hash signatures. [#5041](https://github.com/pypa/pipenv/issues/5041)
+
+## Bug Fixes
+
+- allow the user to disable the `no_input` flag, so the use of e.g Google Artifact Registry is possible. [#4706](https://github.com/pypa/pipenv/issues/4706)
+- Fixes case where packages could fail to install and the exit code was successful. [#5031](https://github.com/pypa/pipenv/issues/5031)
+
+## Vendored Libraries
+
+- Updated vendor version of `pip` from `21.2.2` to `22.0.4` which fixes a number of bugs including
+ several reports of pipenv locking for an infinite amount of time when using certain package constraints.
+ This also drops support for python 3.6 as it is EOL and support was removed in pip 22.x [#4995](https://github.com/pypa/pipenv/issues/4995)
+
+## Removals and Deprecations
+
+- Removed the vendor dependency `more-itertools` as it was originally added for `zipp`, which since stopped using it. [#5044](https://github.com/pypa/pipenv/issues/5044)
+- Removed all usages of `pipenv.vendor.vistir.compat.fs_str`, since this function was used for PY2-PY3 compatibility and is no longer needed. [#5062](https://github.com/pypa/pipenv/issues/5062)
+
+## Relates to dev process changes
+
+- Added pytest-cov and basic configuration to the project for generating html testing coverage reports.
+- Make all CI jobs run only after the lint stage. Also added a makefile target for vendoring the packages.
+
+# 2022.4.8 (2022-04-08)
+
+## Features & Improvements
+
+- Implements a `pipenv requirements` command which generates a requirements.txt compatible output without locking. [#4959](https://github.com/pypa/pipenv/issues/4959)
+- Internal to pipenv, the utils.py was split into a utils module with unused code removed. [#4992](https://github.com/pypa/pipenv/issues/4992)
+
+## Bug Fixes
+
+- Pipenv will now ignore `.venv` in the project when `PIPENV_VENV_IN_PROJECT` variable is False.
+ Unset variable maintains the existing behavior of preferring to use the project's `.venv` should it exist. [#2763](https://github.com/pypa/pipenv/issues/2763)
+- Fix an edge case of hash collection in index restricted packages whereby the hashes for some packages would
+ be missing from the `Pipfile.lock` following package index restrictions added in `pipenv==2022.3.23`. [#5023](https://github.com/pypa/pipenv/issues/5023)
+
+## Improved Documentation
+
+- Pipenv CLI documentation generation has been fixed. It had broke when `click` was vendored into the project in
+ `2021.11.9` because by default `sphinx-click` could no longer determine the CLI inherited from click. [#4778](https://github.com/pypa/pipenv/issues/4778)
+- Improve documentation around extra indexes and index restricted packages. [#5022](https://github.com/pypa/pipenv/issues/5022)
+
+## Removals and Deprecations
+
+- Removes the optional `install` argument `--extra-index-url` as it was not compatible with index restricted packages.
+ Using the `--index` argument is the correct way to specify a package should be pulled from the non-default index. [#5022](https://github.com/pypa/pipenv/issues/5022)
+
+## Relates to dev process changes
+
+- Added code linting using pre-commit-hooks, black, flake8, isort, pygrep-hooks, news-fragments and check-manifest.
+ Very similar to pip's configuration; adds a towncrier new's type `process` for change to Development processes.
+
+# 2022.3.28 (2022-03-27)
+
+## Bug Fixes
+
+- Environment variables were not being loaded when the `--quiet` flag was set [#5010](https://github.com/pypa/pipenv/issues/5010)
+- It would appear that `requirementslib` was not fully specifying the subdirectory to `build_pep517` and
+ and when a new version of `setuptools` was released, the test `test_lock_nested_vcs_direct_url`
+ broke indicating the Pipfile.lock no longer contained the extra dependencies that should have been resolved.
+ This regression affected `pipenv>=2021.11.9` but has been fixed by a patch to `requirementslib`. [#5019](https://github.com/pypa/pipenv/issues/5019)
+
+## Vendored Libraries
+
+- Vendor in pip==21.2.4 (from 21.2.2) in order to bring in requested bug fix for python3.6. Note: support for 3.6 will be dropped in a subsequent release. [#5008](https://github.com/pypa/pipenv/issues/5008)
+
+# 2022.3.24 (2022-03-23)
+
+## Features & Improvements
+
+- It is now possible to silence the `Loading .env environment variables` message on `pipenv run`
+ with the `--quiet` flag or the `PIPENV_QUIET` environment variable. [#4027](https://github.com/pypa/pipenv/issues/4027)
+
+## Bug Fixes
+
+- Fixes issue with new index safety restriction, whereby an unnamed extra sources index
+ caused and error to be thrown during install. [#5002](https://github.com/pypa/pipenv/issues/5002)
+- The text `Loading .env environment variables...` has been switched back to stderr as to not
+ break requirements.txt generation. Also it only prints now when a `.env` file is actually present. [#5003](https://github.com/pypa/pipenv/issues/5003)
+
+# 2022.3.23 (2022-03-22)
+
+## Features & Improvements
+
+- Use environment variable `PIPENV_SKIP_LOCK` to control the behaviour of lock skipping. [#4797](https://github.com/pypa/pipenv/issues/4797)
+- New CLI command `verify`, checks the Pipfile.lock is up-to-date [#4893](https://github.com/pypa/pipenv/issues/4893)
+
+## Behavior Changes
+
+- Pattern expansion for arguments was disabled on Windows. [#4935](https://github.com/pypa/pipenv/issues/4935)
+
+## Bug Fixes
+
+- Python versions on Windows can now be installed automatically through pyenv-win [#4525](https://github.com/pypa/pipenv/issues/4525)
+- Patched our vendored Pip to fix: Pipenv Lock (Or Install) Does Not Respect Index Specified For A Package. [#4637](https://github.com/pypa/pipenv/issues/4637)
+- If `PIP_TARGET` is set to environment variables, Refer specified directory for calculate delta, instead default directory [#4775](https://github.com/pypa/pipenv/issues/4775)
+- Remove remaining mention of python2 and --two flag from codebase. [#4938](https://github.com/pypa/pipenv/issues/4938)
+- Use `CI` environment value, over mere existence of name [#4944](https://github.com/pypa/pipenv/issues/4944)
+- Environment variables from dot env files are now properly expanded when included in scripts. [#4975](https://github.com/pypa/pipenv/issues/4975)
+
+## Vendored Libraries
+
+- Updated vendor version of `pythonfinder` from `1.2.9` to `1.2.10` which fixes a bug with WSL
+ (Windows Subsystem for Linux) when a path can not be read and Permission Denied error is encountered. [#4976](https://github.com/pypa/pipenv/issues/4976)
+
+## Removals and Deprecations
+
+- Removes long broken argument `--code` from `install` and `--unused` from `check`.
+ Check command no longer takes in arguments to ignore.
+ Removed the vendored dependencies: `pipreqs` and `yarg` [#4998](https://github.com/pypa/pipenv/issues/4998)
+
+# 2022.1.8 (2022-01-08)
+
+## Bug Fixes
+
+- Remove the extra parentheses around the venv prompt. [#4877](https://github.com/pypa/pipenv/issues/4877)
+- Fix a bug of installation fails when extra index url is given. [#4881](https://github.com/pypa/pipenv/issues/4881)
+- Fix regression where lockfiles would only include the hashes for releases for the platform generating the lockfile [#4885](https://github.com/pypa/pipenv/issues/4885)
+- Fix the index parsing to reject illegal requirements.txt. [#4899](https://github.com/pypa/pipenv/issues/4899)
+
+# 2021.11.23 (2021-11-23)
+
+## Bug Fixes
+
+- Update `charset-normalizer` from `2.0.3` to `2.0.7`, this fixes an import error on Python 3.6. [#4865](https://github.com/pypa/pipenv/issues/4865)
+- Fix a bug of deleting a virtualenv that is not managed by Pipenv. [#4867](https://github.com/pypa/pipenv/issues/4867)
+- Fix a bug that source is not added to `Pipfile` when index url is given with `pipenv install`. [#4873](https://github.com/pypa/pipenv/issues/4873)
+
+# 2021.11.15 (2021-11-15)
+
+## Bug Fixes
+
+- Return an empty dict when `PIPENV_DONT_LOAD_ENV` is set. [#4851](https://github.com/pypa/pipenv/issues/4851)
+- Don't use `sys.executable` when inside an activated venv. [#4852](https://github.com/pypa/pipenv/issues/4852)
+
+## Vendored Libraries
+
+- Drop the vendored `jinja2` dependency as it is not needed any more. [#4858](https://github.com/pypa/pipenv/issues/4858)
+- Update `click` from `8.0.1` to `8.0.3`, to fix a problem with bash completion. [#4860](https://github.com/pypa/pipenv/issues/4860)
+- Drop unused vendor `chardet`. [#4862](https://github.com/pypa/pipenv/issues/4862)
+
+## Improved Documentation
+
+- Fix the documentation to reflect the fact that special characters must be percent-encoded in the URL. [#4856](https://github.com/pypa/pipenv/issues/4856)
+
+# 2021.11.9 (2021-11-09)
+
+## Features & Improvements
+
+- Replace `click-completion` with `click`'s own completion implementation. [#4786](https://github.com/pypa/pipenv/issues/4786)
+
+## Bug Fixes
+
+- Fix a bug that `pipenv run` doesn't set environment variables correctly. [#4831](https://github.com/pypa/pipenv/issues/4831)
+- Fix a bug that certifi can't be loaded within `notpip`'s vendor library. This makes several objects of `pip` fail to be imported. [#4833](https://github.com/pypa/pipenv/issues/4833)
+- Fix a bug that `3.10.0` can be found be python finder. [#4837](https://github.com/pypa/pipenv/issues/4837)
+
+## Vendored Libraries
+
+- Update `pythonfinder` from `1.2.8` to `1.2.9`. [#4837](https://github.com/pypa/pipenv/issues/4837)
+
+# 2021.11.5.post0 (2021-11-05)
+
+## Bug Fixes
+
+- Fix a regression that `pipenv shell` fails to start a subshell. [#4828](https://github.com/pypa/pipenv/issues/4828)
+- Fix a regression that `pip_shims` object isn't imported correctly. [#4829](https://github.com/pypa/pipenv/issues/4829)
+
+# 2021.11.5 (2021-11-05)
+
+## Features & Improvements
+
+- Avoid sharing states but create project objects on demand. So that most integration test cases are able to switch to a in-process execution method. [#4757](https://github.com/pypa/pipenv/issues/4757)
+- Shell-quote `pip` commands when logging. [#4760](https://github.com/pypa/pipenv/issues/4760)
+
+## Bug Fixes
+
+- Ignore empty .venv in rood dir and create project name base virtual environment [#4790](https://github.com/pypa/pipenv/issues/4790)
+
+## Vendored Libraries
+
+- Update vendored dependencies
+ \- `attrs` from `20.3.0` to `21.2.0`
+ \- `cerberus` from `1.3.2` to `1.3.4`
+ \- `certifi` from `2020.11.8` to `2021.5.30`
+ \- `chardet` from `3.0.4` to `4.0.0`
+ \- `click` from `7.1.2` to `8.0.1`
+ \- `distlib` from `0.3.1` to `0.3.2`
+ \- `idna` from `2.10` to `3.2`
+ \- `importlib-metadata` from `2.0.0` to `4.6.1`
+ \- `importlib-resources` from `3.3.0` to `5.2.0`
+ \- `jinja2` from `2.11.2` to `3.0.1`
+ \- `markupsafe` from `1.1.1` to `2.0.1`
+ \- `more-itertools` from `5.0.0` to `8.8.0`
+ \- `packaging` from `20.8` to `21.0`
+ \- `pep517` from `0.9.1` to `0.11.0`
+ \- `pipdeptree` from `1.0.0` to `2.0.0`
+ \- `ptyprocess` from `0.6.0` to `0.7.0`
+ \- `python-dateutil` from `2.8.1` to `2.8.2`
+ \- `python-dotenv` from `0.15.0` to `0.19.0`
+ \- `pythonfinder` from `1.2.5` to `1.2.8`
+ \- `requests` from `2.25.0` to `2.26.0`
+ \- `shellingham` from `1.3.2` to `1.4.0`
+ \- `six` from `1.15.0` to `1.16.0`
+ \- `tomlkit` from `0.7.0` to `0.7.2`
+ \- `urllib3` from `1.26.1` to `1.26.6`
+ \- `zipp` from `1.2.0` to `3.5.0`
+
+ Add new vendored dependencies
+ \- `charset-normalizer 2.0.3`
+ \- `termcolor 1.1.0`
+ \- `tomli 1.1.0`
+ \- `wheel 0.36.2` [#4747](https://github.com/pypa/pipenv/issues/4747)
+
+- Drop the dependencies for Python 2.7 compatibility purpose. [#4751](https://github.com/pypa/pipenv/issues/4751)
+
+- Switch the dependency resolver from `pip-tools` to `pip`.
+
+ Update vendor libraries:
+ \- Update `requirementslib` from `1.5.16` to `1.6.1`
+ \- Update `pip-shims` from `0.5.6` to `0.6.0`
+ \- New vendor `platformdirs 2.4.0` [#4759](https://github.com/pypa/pipenv/issues/4759)
+
+## Improved Documentation
+
+- remove prefixes on install commands for easy copy/pasting [#4792](https://github.com/pypa/pipenv/issues/4792)
+- Officially drop support for Python 2.7 and Python 3.5. [#4261](https://github.com/pypa/pipenv/issues/4261)
+
+# 2021.5.29 (2021-05-29)
+
+## Bug Fixes
+
+- Fix a bug where passing --skip-lock when PIPFILE has no \[SOURCE\] section throws the error: "tomlkit.exceptions.NonExistentKey: 'Key "source" does not exist.'" [#4141](https://github.com/pypa/pipenv/issues/4141)
+- Fix bug where environment wouldn't activate in paths containing & and \$ symbols [#4538](https://github.com/pypa/pipenv/issues/4538)
+- Fix a bug that `importlib-metadata` from the project's dependencies conflicts with that from `pipenv`'s. [#4549](https://github.com/pypa/pipenv/issues/4549)
+- Fix a bug where `pep508checker.py` did not expect double-digit Python minor versions (e.g. "3.10"). [#4602](https://github.com/pypa/pipenv/issues/4602)
+- Fix bug where environment wouldn't activate in paths containing () and \[\] symbols [#4615](https://github.com/pypa/pipenv/issues/4615)
+- Fix bug preventing use of pipenv lock --pre [#4642](https://github.com/pypa/pipenv/issues/4642)
+
+## Vendored Libraries
+
+- Update `packaging` from `20.4` to `20.8`. [#4591](https://github.com/pypa/pipenv/issues/4591)
+
+# 2020.11.15 (2020-11-15)
+
+## Features & Improvements
+
+- Support expanding environment variables in requirement URLs. [#3516](https://github.com/pypa/pipenv/issues/3516)
+- Show warning message when a dependency is skipped in locking due to the mismatch of its markers. [#4346](https://github.com/pypa/pipenv/issues/4346)
+
+## Bug Fixes
+
+- Fix a bug that executable scripts with leading backslash can't be executed via `pipenv run`. [#4368](https://github.com/pypa/pipenv/issues/4368)
+- Fix a bug that VCS dependencies always satisfy even if the ref has changed. [#4387](https://github.com/pypa/pipenv/issues/4387)
+- Restrict the acceptable hash type to SHA256 only. [#4517](https://github.com/pypa/pipenv/issues/4517)
+- Fix the output of `pipenv scripts` under Windows platform. [#4523](https://github.com/pypa/pipenv/issues/4523)
+- Fix a bug that the resolver takes wrong section to validate constraints. [#4527](https://github.com/pypa/pipenv/issues/4527)
+
+## Vendored Libraries
+
+- Update vendored dependencies:
+ : - `colorama` from `0.4.3` to `0.4.4`
+ - `python-dotenv` from `0.10.3` to `0.15.0`
+ - `first` from `2.0.1` to `2.0.2`
+ - `iso8601` from `0.1.12` to `0.1.13`
+ - `parse` from `1.15.0` to `1.18.0`
+ - `pipdeptree` from `0.13.2` to `1.0.0`
+ - `requests` from `2.23.0` to `2.25.0`
+ - `idna` from `2.9` to `2.10`
+ - `urllib3` from `1.25.9` to `1.26.1`
+ - `certifi` from `2020.4.5.1` to `2020.11.8`
+ - `requirementslib` from `1.5.15` to `1.5.16`
+ - `attrs` from `19.3.0` to `20.3.0`
+ - `distlib` from `0.3.0` to `0.3.1`
+ - `packaging` from `20.3` to `20.4`
+ - `six` from `1.14.0` to `1.15.0`
+ - `semver` from `2.9.0` to `2.13.0`
+ - `toml` from `0.10.1` to `0.10.2`
+ - `cached-property` from `1.5.1` to `1.5.2`
+ - `yaspin` from `0.14.3` to `1.2.0`
+ - `resolvelib` from `0.3.0` to `0.5.2`
+ - `pep517` from `0.8.2` to `0.9.1`
+ - `zipp` from `0.6.0` to `1.2.0`
+ - `importlib-metadata` from `1.6.0` to `2.0.0`
+ - `importlib-resources` from `1.5.0` to `3.3.0` [#4533](https://github.com/pypa/pipenv/issues/4533)
+
+## Improved Documentation
+
+- Fix suggested pyenv setup to avoid using shimmed interpreter [#4534](https://github.com/pypa/pipenv/issues/4534)
+
+# 2020.11.4 (2020-11-04)
+
+## Features & Improvements
+
+- Add a new command `pipenv scripts` to display shortcuts from Pipfile. [#3686](https://github.com/pypa/pipenv/issues/3686)
+- Retrieve package file hash from URL to accelerate the locking process. [#3827](https://github.com/pypa/pipenv/issues/3827)
+- Add the missing `--system` option to `pipenv sync`. [#4441](https://github.com/pypa/pipenv/issues/4441)
+- Add a new option pair `--header/--no-header` to `pipenv lock` command,
+ which adds a header to the generated requirements.txt [#4443](https://github.com/pypa/pipenv/issues/4443)
+
+## Bug Fixes
+
+- Fix a bug that percent encoded characters will be unquoted incorrectly in the file URL. [#4089](https://github.com/pypa/pipenv/issues/4089)
+- Fix a bug where setting PIPENV_PYTHON to file path breaks environment name [#4225](https://github.com/pypa/pipenv/issues/4225)
+- Fix a bug that paths are not normalized before comparison. [#4330](https://github.com/pypa/pipenv/issues/4330)
+- Handle Python major and minor versions correctly in Pipfile creation. [#4379](https://github.com/pypa/pipenv/issues/4379)
+- Fix a bug that non-wheel file requirements can be resolved successfully. [#4386](https://github.com/pypa/pipenv/issues/4386)
+- Fix a bug that `pexept.exceptions.TIMEOUT` is not caught correctly because of the wrong import path. [#4424](https://github.com/pypa/pipenv/issues/4424)
+- Fix a bug that compound TOML table is not parsed correctly. [#4433](https://github.com/pypa/pipenv/issues/4433)
+- Fix a bug that invalid Python paths from Windows registry break `pipenv install`. [#4436](https://github.com/pypa/pipenv/issues/4436)
+- Fix a bug that function calls in `setup.py` can't be parsed rightly. [#4446](https://github.com/pypa/pipenv/issues/4446)
+- Fix a bug that dist-info inside `venv` directory will be mistaken as the editable package's metadata. [#4480](https://github.com/pypa/pipenv/issues/4480)
+- Make the order of hashes in resolution result stable. [#4513](https://github.com/pypa/pipenv/issues/4513)
+
+## Vendored Libraries
+
+- Update `tomlkit` from `0.5.11` to `0.7.0`. [#4433](https://github.com/pypa/pipenv/issues/4433)
+- Update `requirementslib` from `1.5.13` to `1.5.14`. [#4480](https://github.com/pypa/pipenv/issues/4480)
+
+## Improved Documentation
+
+- Discourage homebrew installation in installation guides. [#4013](https://github.com/pypa/pipenv/issues/4013)
+
+# 2020.8.13 (2020-08-13)
+
+## Bug Fixes
+
+- Fixed behaviour of `pipenv uninstall --all-dev`.
+ From now on it does not uninstall regular packages. [#3722](https://github.com/pypa/pipenv/issues/3722)
+- Fix a bug that incorrect Python path will be used when `--system` flag is on. [#4315](https://github.com/pypa/pipenv/issues/4315)
+- Fix falsely flagging a Homebrew installed Python as a virtual environment [#4316](https://github.com/pypa/pipenv/issues/4316)
+- Fix a bug that `pipenv uninstall` throws an exception that does not exist. [#4321](https://github.com/pypa/pipenv/issues/4321)
+- Fix a bug that Pipenv can't locate the correct file of special directives in `setup.cfg` of an editable package. [#4335](https://github.com/pypa/pipenv/issues/4335)
+- Fix a bug that `setup.py` can't be parsed correctly when the assignment is type-annotated. [#4342](https://github.com/pypa/pipenv/issues/4342)
+- Fix a bug that `pipenv graph` throws an exception that PipenvCmdError(cmd_string, c.out, c.err, return_code). [#4388](https://github.com/pypa/pipenv/issues/4388)
+- Do not copy the whole directory tree of local file package. [#4403](https://github.com/pypa/pipenv/issues/4403)
+- Correctly detect whether Pipenv in run under an activated virtualenv. [#4412](https://github.com/pypa/pipenv/issues/4412)
+
+## Vendored Libraries
+
+- Update `requirementslib` to `1.5.12`. [#4385](https://github.com/pypa/pipenv/issues/4385)
+- - Update `requirements` to `1.5.13`.
+ - Update `pip-shims` to `0.5.3`. [#4421](https://github.com/pypa/pipenv/issues/4421)
+
+# 2020.6.2 (2020-06-02)
+
+## Features & Improvements
+
+- Pipenv will now detect existing `venv` and `virtualenv` based virtual environments more robustly. [#4276](https://github.com/pypa/pipenv/issues/4276)
+
+## Bug Fixes
+
+- `+` signs in URL authentication fragments will no longer be incorrectly replaced with space ( \`\` \`\` ) characters. [#4271](https://github.com/pypa/pipenv/issues/4271)
+- Fixed a regression which caused Pipenv to fail when running under `/`. [#4273](https://github.com/pypa/pipenv/issues/4273)
+- `setup.py` files with `version` variables read from `os.environ` are now able to be parsed successfully. [#4274](https://github.com/pypa/pipenv/issues/4274)
+- Fixed a bug which caused Pipenv to fail to install packages in a virtual environment if those packages were already present in the system global environment. [#4276](https://github.com/pypa/pipenv/issues/4276)
+- Fix a bug that caused non-specific versions to be pinned in `Pipfile.lock`. [#4278](https://github.com/pypa/pipenv/issues/4278)
+- Corrected a missing exception import and invalid function call invocations in `pipenv.cli.command`. [#4286](https://github.com/pypa/pipenv/issues/4286)
+- Fixed an issue with resolving packages with names defined by function calls in `setup.py`. [#4292](https://github.com/pypa/pipenv/issues/4292)
+- Fixed a regression with installing the current directory, or `.`, inside a `venv` based virtual environment. [#4295](https://github.com/pypa/pipenv/issues/4295)
+- Fixed a bug with the discovery of python paths on Windows which could prevent installation of environments during `pipenv install`. [#4296](https://github.com/pypa/pipenv/issues/4296)
+- Fixed an issue in the `requirementslib` AST parser which prevented parsing of `setup.py` files for dependency metadata. [#4298](https://github.com/pypa/pipenv/issues/4298)
+- Fix a bug where Pipenv doesn't realize the session is interactive [#4305](https://github.com/pypa/pipenv/issues/4305)
+
+## Vendored Libraries
+
+- Updated requirementslib to version `1.5.11`. [#4292](https://github.com/pypa/pipenv/issues/4292)
+- Updated vendored dependencies:
+ : - **pythonfinder**: `1.2.2` => `1.2.4`
+ - **requirementslib**: `1.5.9` => `1.5.10` [#4302](https://github.com/pypa/pipenv/issues/4302)
+
+# 2020.5.28 (2020-05-28)
+
+## Features & Improvements
+
+- `pipenv install` and `pipenv sync` will no longer attempt to install satisfied dependencies during installation. [#3057](https://github.com/pypa/pipenv/issues/3057),
+ [#3506](https://github.com/pypa/pipenv/issues/3506)
+
+- Added support for resolution of direct-url dependencies in `setup.py` files to respect `PEP-508` style URL dependencies. [#3148](https://github.com/pypa/pipenv/issues/3148)
+
+- Added full support for resolution of all dependency types including direct URLs, zip archives, tarballs, etc.
+
+ - Improved error handling and formatting.
+ - Introduced improved cross platform stream wrappers for better `stdout` and `stderr` consistency. [#3298](https://github.com/pypa/pipenv/issues/3298)
+
+- For consistency with other commands and the `--dev` option
+ description, `pipenv lock --requirements --dev` now emits
+ both default and development dependencies.
+ The new `--dev-only` option requests the previous
+ behaviour (e.g. to generate a `dev-requirements.txt` file). [#3316](https://github.com/pypa/pipenv/issues/3316)
+
+- Pipenv will now successfully recursively lock VCS sub-dependencies. [#3328](https://github.com/pypa/pipenv/issues/3328)
+
+- Added support for `--verbose` output to `pipenv run`. [#3348](https://github.com/pypa/pipenv/issues/3348)
+
+- Pipenv will now discover and resolve the intrinsic dependencies of **all** VCS dependencies, whether they are editable or not, to prevent resolution conflicts. [#3368](https://github.com/pypa/pipenv/issues/3368)
+
+- Added a new environment variable, `PIPENV_RESOLVE_VCS`, to toggle dependency resolution off for non-editable VCS, file, and URL based dependencies. [#3577](https://github.com/pypa/pipenv/issues/3577)
+
+- Added the ability for Windows users to enable emojis by setting `PIPENV_HIDE_EMOJIS=0`. [#3595](https://github.com/pypa/pipenv/issues/3595)
+
+- Allow overriding PIPENV_INSTALL_TIMEOUT environment variable (in seconds). [#3652](https://github.com/pypa/pipenv/issues/3652)
+
+- Allow overriding PIP_EXISTS_ACTION environment variable (value is passed to pip install).
+ Possible values here:
+ Useful when you need to `PIP_EXISTS_ACTION=i` (ignore existing packages) - great for CI environments, where you need really fast setup. [#3738](https://github.com/pypa/pipenv/issues/3738)
+
+- Pipenv will no longer forcibly override `PIP_NO_DEPS` on all vcs and file dependencies as resolution happens on these in a pre-lock step. [#3763](https://github.com/pypa/pipenv/issues/3763)
+
+- Improved verbose logging output during `pipenv lock` will now stream output to the console while maintaining a spinner. [#3810](https://github.com/pypa/pipenv/issues/3810)
+
+- Added support for automatic python installs via `asdf` and associated `PIPENV_DONT_USE_ASDF` environment variable. [#4018](https://github.com/pypa/pipenv/issues/4018)
+
+- Pyenv/asdf can now be used whether or not they are available on PATH. Setting PYENV_ROOT/ASDF_DIR in a Pipenv's .env allows Pipenv to install an interpreter without any shell customizations, so long as pyenv/asdf is installed. [#4245](https://github.com/pypa/pipenv/issues/4245)
+
+- Added `--key` command line parameter for including personal PyUp.io API tokens when running `pipenv check`. [#4257](https://github.com/pypa/pipenv/issues/4257)
+
+## Behavior Changes
+
+- Make conservative checks of known exceptions when subprocess returns output, so user won't see the whole traceback - just the error. [#2553](https://github.com/pypa/pipenv/issues/2553)
+- Do not touch Pipfile early and rely on it so that one can do `pipenv sync` without a Pipfile. [#3386](https://github.com/pypa/pipenv/issues/3386)
+- Re-enable `--help` option for `pipenv run` command. [#3844](https://github.com/pypa/pipenv/issues/3844)
+- Make sure `pipenv lock -r --pypi-mirror {MIRROR_URL}` will respect the pypi-mirror in requirements output. [#4199](https://github.com/pypa/pipenv/issues/4199)
+
+## Bug Fixes
+
+- Raise `PipenvUsageError` when \[\[source\]\] does not contain url field. [#2373](https://github.com/pypa/pipenv/issues/2373)
+
+- Fixed a bug which caused editable package resolution to sometimes fail with an unhelpful setuptools-related error message. [#2722](https://github.com/pypa/pipenv/issues/2722)
+
+- Fixed an issue which caused errors due to reliance on the system utilities `which` and `where` which may not always exist on some systems.
+ \- Fixed a bug which caused periodic failures in python discovery when executables named `python` were not present on the target `$PATH`. [#2783](https://github.com/pypa/pipenv/issues/2783)
+
+- Dependency resolution now writes hashes for local and remote files to the lockfile. [#3053](https://github.com/pypa/pipenv/issues/3053)
+
+- Fixed a bug which prevented `pipenv graph` from correctly showing all dependencies when running from within `pipenv shell`. [#3071](https://github.com/pypa/pipenv/issues/3071)
+
+- Fixed resolution of direct-url dependencies in `setup.py` files to respect `PEP-508` style URL dependencies. [#3148](https://github.com/pypa/pipenv/issues/3148)
+
+- Fixed a bug which caused failures in warning reporting when running pipenv inside a virtualenv under some circumstances.
+
+ - Fixed a bug with package discovery when running `pipenv clean`. [#3298](https://github.com/pypa/pipenv/issues/3298)
+
+- Quote command arguments with carets (`^`) on Windows to work around unintended shell escapes. [#3307](https://github.com/pypa/pipenv/issues/3307)
+
+- Handle alternate names for UTF-8 encoding. [#3313](https://github.com/pypa/pipenv/issues/3313)
+
+- Abort pipenv before adding the non-exist package to Pipfile. [#3318](https://github.com/pypa/pipenv/issues/3318)
+
+- Don't normalize the package name user passes in. [#3324](https://github.com/pypa/pipenv/issues/3324)
+
+- Fix a bug where custom virtualenv can not be activated with pipenv shell [#3339](https://github.com/pypa/pipenv/issues/3339)
+
+- Fix a bug that `--site-packages` flag is not recognized. [#3351](https://github.com/pypa/pipenv/issues/3351)
+
+- Fix a bug where pipenv --clear is not working [#3353](https://github.com/pypa/pipenv/issues/3353)
+
+- Fix unhashable type error during `$ pipenv install --selective-upgrade` [#3384](https://github.com/pypa/pipenv/issues/3384)
+
+- Dependencies with direct `PEP508` compliant VCS URLs specified in their `install_requires` will now be successfully locked during the resolution process. [#3396](https://github.com/pypa/pipenv/issues/3396)
+
+- Fixed a keyerror which could occur when locking VCS dependencies in some cases. [#3404](https://github.com/pypa/pipenv/issues/3404)
+
+- Fixed a bug that `ValidationError` is thrown when some fields are missing in source section. [#3427](https://github.com/pypa/pipenv/issues/3427)
+
+- Updated the index names in lock file when source name in Pipfile is changed. [#3449](https://github.com/pypa/pipenv/issues/3449)
+
+- Fixed an issue which caused `pipenv install --help` to show duplicate entries for `--pre`. [#3479](https://github.com/pypa/pipenv/issues/3479)
+
+- Fix bug causing `[SSL: CERTIFICATE_VERIFY_FAILED]` when Pipfile `[[source]]` has verify_ssl=false and url with custom port. [#3502](https://github.com/pypa/pipenv/issues/3502)
+
+- Fix `sync --sequential` ignoring `pip install` errors and logs. [#3537](https://github.com/pypa/pipenv/issues/3537)
+
+- Fix the issue that lock file can't be created when `PIPENV_PIPFILE` is not under working directory. [#3584](https://github.com/pypa/pipenv/issues/3584)
+
+- Pipenv will no longer inadvertently set `editable=True` on all vcs dependencies. [#3647](https://github.com/pypa/pipenv/issues/3647)
+
+- The `--keep-outdated` argument to `pipenv install` and `pipenv lock` will now drop specifier constraints when encountering editable dependencies.
+ \- In addition, `--keep-outdated` will retain specifiers that would otherwise be dropped from any entries that have not been updated. [#3656](https://github.com/pypa/pipenv/issues/3656)
+
+- Fixed a bug which sometimes caused pipenv to fail to respect the `--site-packages` flag when passed with `pipenv install`. [#3718](https://github.com/pypa/pipenv/issues/3718)
+
+- Normalize the package names to lowercase when comparing used and in-Pipfile packages. [#3745](https://github.com/pypa/pipenv/issues/3745)
+
+- `pipenv update --outdated` will now correctly handle comparisons between pre/post-releases and normal releases. [#3766](https://github.com/pypa/pipenv/issues/3766)
+
+- Fixed a `KeyError` which could occur when pinning outdated VCS dependencies via `pipenv lock --keep-outdated`. [#3768](https://github.com/pypa/pipenv/issues/3768)
+
+- Resolved an issue which caused resolution to fail when encountering poorly formatted `python_version` markers in `setup.py` and `setup.cfg` files. [#3786](https://github.com/pypa/pipenv/issues/3786)
+
+- Fix a bug that installation errors are displayed as a list. [#3794](https://github.com/pypa/pipenv/issues/3794)
+
+- Update `pythonfinder` to fix a problem that `python.exe` will be mistakenly chosen for
+ virtualenv creation under WSL. [#3807](https://github.com/pypa/pipenv/issues/3807)
+
+- Fixed several bugs which could prevent editable VCS dependencies from being installed into target environments, even when reporting successful installation. [#3809](https://github.com/pypa/pipenv/issues/3809)
+
+- `pipenv check --system` should find the correct Python interpreter when `python` does not exist on the system. [#3819](https://github.com/pypa/pipenv/issues/3819)
+
+- Resolve the symlinks when the path is absolute. [#3842](https://github.com/pypa/pipenv/issues/3842)
+
+- Pass `--pre` and `--clear` options to `pipenv update --outdated`. [#3879](https://github.com/pypa/pipenv/issues/3879)
+
+- Fixed a bug which prevented resolution of direct URL dependencies which have PEP508 style direct url VCS sub-dependencies with subdirectories. [#3976](https://github.com/pypa/pipenv/issues/3976)
+
+- Honor PIPENV_SPINNER environment variable [#4045](https://github.com/pypa/pipenv/issues/4045)
+
+- Fixed an issue with `pipenv check` failing due to an invalid API key from `pyup.io`. [#4188](https://github.com/pypa/pipenv/issues/4188)
+
+- Fixed a bug which caused versions from VCS dependencies to be included in `Pipfile.lock` inadvertently. [#4217](https://github.com/pypa/pipenv/issues/4217)
+
+- Fixed a bug which caused pipenv to search non-existent virtual environments for `pip` when installing using `--system`. [#4220](https://github.com/pypa/pipenv/issues/4220)
+
+- `Requires-Python` values specifying constraint versions of python starting from `1.x` will now be parsed successfully. [#4226](https://github.com/pypa/pipenv/issues/4226)
+
+- Fix a bug of `pipenv update --outdated` that can't print output correctly. [#4229](https://github.com/pypa/pipenv/issues/4229)
+
+- Fixed a bug which caused pipenv to prefer source distributions over wheels from `PyPI` during the dependency resolution phase.
+ Fixed an issue which prevented proper build isolation using `pep517` based builders during dependency resolution. [#4231](https://github.com/pypa/pipenv/issues/4231)
+
+- Don't fallback to system Python when no matching Python version is found. [#4232](https://github.com/pypa/pipenv/issues/4232)
+
+## Vendored Libraries
+
+- Updated vendored dependencies:
+
+ > - **attrs**: `18.2.0` => `19.1.0`
+ > - **certifi**: `2018.10.15` => `2019.3.9`
+ > - **cached_property**: `1.4.3` => `1.5.1`
+ > - **cerberus**: `1.2.0` => `1.3.1`
+ > - **click-completion**: `0.5.0` => `0.5.1`
+ > - **colorama**: `0.3.9` => `0.4.1`
+ > - **distlib**: `0.2.8` => `0.2.9`
+ > - **idna**: `2.7` => `2.8`
+ > - **jinja2**: `2.10.0` => `2.10.1`
+ > - **markupsafe**: `1.0` => `1.1.1`
+ > - **orderedmultidict**: `(new)` => `1.0`
+ > - **packaging**: `18.0` => `19.0`
+ > - **parse**: `1.9.0` => `1.12.0`
+ > - **pathlib2**: `2.3.2` => `2.3.3`
+ > - **pep517**: `(new)` => `0.5.0`
+ > - **pexpect**: `4.6.0` => `4.7.0`
+ > - **pipdeptree**: `0.13.0` => `0.13.2`
+ > - **pyparsing**: `2.2.2` => `2.3.1`
+ > - **python-dotenv**: `0.9.1` => `0.10.2`
+ > - **pythonfinder**: `1.1.10` => `1.2.1`
+ > - **pytoml**: `(new)` => `0.1.20`
+ > - **requests**: `2.20.1` => `2.21.0`
+ > - **requirementslib**: `1.3.3` => `1.5.0`
+ > - **scandir**: `1.9.0` => `1.10.0`
+ > - **shellingham**: `1.2.7` => `1.3.1`
+ > - **six**: `1.11.0` => `1.12.0`
+ > - **tomlkit**: `0.5.2` => `0.5.3`
+ > - **urllib3**: `1.24` => `1.25.2`
+ > - **vistir**: `0.3.0` => `0.4.1`
+ > - **yaspin**: `0.14.0` => `0.14.3`
+
+ - Removed vendored dependency **cursor**. [#3298](https://github.com/pypa/pipenv/issues/3298)
+
+- Updated `pip_shims` to support `--outdated` with new pip versions. [#3766](https://github.com/pypa/pipenv/issues/3766)
+
+- Update vendored dependencies and invocations
+
+ - Update vendored and patched dependencies
+ - Update patches on `piptools`, `pip`, `pip-shims`, `tomlkit`
+ - Fix invocations of dependencies
+ - Fix custom `InstallCommand` instantiation
+ - Update `PackageFinder` usage
+ - Fix `Bool` stringify attempts from `tomlkit`
+
+ Updated vendored dependencies:
+ : - **attrs**: `` `18.2.0 `` => `` `19.1.0 ``
+ - **certifi**: `` `2018.10.15 `` => `` `2019.3.9 ``
+ - **cached_property**: `` `1.4.3 `` => `` `1.5.1 ``
+ - **cerberus**: `` `1.2.0 `` => `` `1.3.1 ``
+ - **click**: `` `7.0.0 `` => `` `7.1.1 ``
+ - **click-completion**: `` `0.5.0 `` => `` `0.5.1 ``
+ - **colorama**: `` `0.3.9 `` => `` `0.4.3 ``
+ - **contextlib2**: `` `(new) `` => `` `0.6.0.post1 ``
+ - **distlib**: `` `0.2.8 `` => `` `0.2.9 ``
+ - **funcsigs**: `` `(new) `` => `` `1.0.2 ``
+ - **importlib_metadata** `` `1.3.0 `` => `` `1.5.1 ``
+ - **importlib-resources**: `` `(new) `` => `` `1.4.0 ``
+ - **idna**: `` `2.7 `` => `` `2.9 ``
+ - **jinja2**: `` `2.10.0 `` => `` `2.11.1 ``
+ - **markupsafe**: `` `1.0 `` => `` `1.1.1 ``
+ - **more-itertools**: `` `(new) `` => `` `5.0.0 ``
+ - **orderedmultidict**: `` `(new) `` => `` `1.0 ``
+ - **packaging**: `` `18.0 `` => `` `19.0 ``
+ - **parse**: `` `1.9.0 `` => `` `1.15.0 ``
+ - **pathlib2**: `` `2.3.2 `` => `` `2.3.3 ``
+ - **pep517**: `` `(new) `` => `` `0.5.0 ``
+ - **pexpect**: `` `4.6.0 `` => `` `4.8.0 ``
+ - **pip-shims**: `` `0.2.0 `` => `` `0.5.1 ``
+ - **pipdeptree**: `` `0.13.0 `` => `` `0.13.2 ``
+ - **pyparsing**: `` `2.2.2 `` => `` `2.4.6 ``
+ - **python-dotenv**: `` `0.9.1 `` => `` `0.10.2 ``
+ - **pythonfinder**: `` `1.1.10 `` => `` `1.2.2 ``
+ - **pytoml**: `` `(new) `` => `` `0.1.20 ``
+ - **requests**: `` `2.20.1 `` => `` `2.23.0 ``
+ - **requirementslib**: `` `1.3.3 `` => `` `1.5.4 ``
+ - **scandir**: `` `1.9.0 `` => `` `1.10.0 ``
+ - **shellingham**: `` `1.2.7 `` => `` `1.3.2 ``
+ - **six**: `` `1.11.0 `` => `` `1.14.0 ``
+ - **tomlkit**: `` `0.5.2 `` => `` `0.5.11 ``
+ - **urllib3**: `` `1.24 `` => `` `1.25.8 ``
+ - **vistir**: `` `0.3.0 `` => `` `0.5.0 ``
+ - **yaspin**: `` `0.14.0 `` => `` `0.14.3 ``
+ - **zipp**: `` `0.6.0 ``
+
+ - Removed vendored dependency **cursor**. [#4169](https://github.com/pypa/pipenv/issues/4169)
+
+- Add and update vendored dependencies to accommodate `safety` vendoring:
+ \- **safety** `(none)` => `1.8.7`
+ \- **dparse** `(none)` => `0.5.0`
+ \- **pyyaml** `(none)` => `5.3.1`
+ \- **urllib3** `1.25.8` => `1.25.9`
+ \- **certifi** `2019.11.28` => `2020.4.5.1`
+ \- **pyparsing** `2.4.6` => `2.4.7`
+ \- **resolvelib** `0.2.2` => `0.3.0`
+ \- **importlib-metadata** `1.5.1` => `1.6.0`
+ \- **pip-shims** `0.5.1` => `0.5.2`
+ \- **requirementslib** `1.5.5` => `1.5.6` [#4188](https://github.com/pypa/pipenv/issues/4188)
+
+- Updated vendored `pip` => `20.0.2` and `pip-tools` => `5.0.0`. [#4215](https://github.com/pypa/pipenv/issues/4215)
+
+- Updated vendored dependencies to latest versions for security and bug fixes:
+
+ - **requirementslib** `1.5.8` => `1.5.9`
+ - **vistir** `0.5.0` => `0.5.1`
+ - **jinja2** `2.11.1` => `2.11.2`
+ - **click** `7.1.1` => `7.1.2`
+ - **dateutil** `(none)` => `2.8.1`
+ - **backports.functools_lru_cache** `1.5.0` => `1.6.1`
+ - **enum34** `1.1.6` => `1.1.10`
+ - **toml** `0.10.0` => `0.10.1`
+ - **importlib_resources** `1.4.0` => `1.5.0` [#4226](https://github.com/pypa/pipenv/issues/4226)
+
+- Changed attrs import path in vendored dependencies to always import from `pipenv.vendor`. [#4267](https://github.com/pypa/pipenv/issues/4267)
+
+## Improved Documentation
+
+- Added documentation about variable expansion in `Pipfile` entries. [#2317](https://github.com/pypa/pipenv/issues/2317)
+- Consolidate all contributing docs in the rst file [#3120](https://github.com/pypa/pipenv/issues/3120)
+- Update the out-dated manual page. [#3246](https://github.com/pypa/pipenv/issues/3246)
+- Move CLI docs to its own page. [#3346](https://github.com/pypa/pipenv/issues/3346)
+- Replace (non-existent) video on docs index.rst with equivalent gif. [#3499](https://github.com/pypa/pipenv/issues/3499)
+- Clarify wording in Basic Usage example on using double quotes to escape shell redirection [#3522](https://github.com/pypa/pipenv/issues/3522)
+- Ensure docs show navigation on small-screen devices [#3527](https://github.com/pypa/pipenv/issues/3527)
+- Added a link to the TOML Spec under General Recommendations & Version Control to clarify how Pipfiles should be written. [#3629](https://github.com/pypa/pipenv/issues/3629)
+- Updated the documentation with the new `pytest` entrypoint. [#3759](https://github.com/pypa/pipenv/issues/3759)
+- Fix link to GIF in README.md demonstrating Pipenv's usage, and add descriptive alt text. [#3911](https://github.com/pypa/pipenv/issues/3911)
+- Added a line describing potential issues in fancy extension. [#3912](https://github.com/pypa/pipenv/issues/3912)
+- Documental description of how Pipfile works and association with Pipenv. [#3913](https://github.com/pypa/pipenv/issues/3913)
+- Clarify the proper value of `python_version` and `python_full_version`. [#3914](https://github.com/pypa/pipenv/issues/3914)
+- Write description for --deploy extension and few extensions differences. [#3915](https://github.com/pypa/pipenv/issues/3915)
+- More documentation for `.env` files [#4100](https://github.com/pypa/pipenv/issues/4100)
+- Updated documentation to point to working links. [#4137](https://github.com/pypa/pipenv/issues/4137)
+- Replace docs.pipenv.org with pipenv.pypa.io [#4167](https://github.com/pypa/pipenv/issues/4167)
+- Added functionality to check spelling in documentation and cleaned up existing typographical issues. [#4209](https://github.com/pypa/pipenv/issues/4209)
+
+# 2018.11.26 (2018-11-26)
+
+## Bug Fixes
+
+- Environment variables are expanded correctly before running scripts on POSIX. [#3178](https://github.com/pypa/pipenv/issues/3178)
+- Pipenv will no longer disable user-mode installation when the `--system` flag is passed in. [#3222](https://github.com/pypa/pipenv/issues/3222)
+- Fixed an issue with attempting to render unicode output in non-unicode locales. [#3223](https://github.com/pypa/pipenv/issues/3223)
+- Fixed a bug which could cause failures to occur when parsing python entries from global pyenv version files. [#3224](https://github.com/pypa/pipenv/issues/3224)
+- Fixed an issue which prevented the parsing of named extras sections from certain `setup.py` files. [#3230](https://github.com/pypa/pipenv/issues/3230)
+- Correctly detect the virtualenv location inside an activated virtualenv. [#3231](https://github.com/pypa/pipenv/issues/3231)
+- Fixed a bug which caused spinner frames to be written to standard output during locking operations which could cause redirection pipes to fail. [#3239](https://github.com/pypa/pipenv/issues/3239)
+- Fixed a bug that editable packages can't be uninstalled correctly. [#3240](https://github.com/pypa/pipenv/issues/3240)
+- Corrected an issue with installation timeouts which caused dependency resolution to fail for longer duration resolution steps. [#3244](https://github.com/pypa/pipenv/issues/3244)
+- Adding normal pep 508 compatible markers is now fully functional when using VCS dependencies. [#3249](https://github.com/pypa/pipenv/issues/3249)
+- Updated `requirementslib` and `pythonfinder` for multiple bug fixes. [#3254](https://github.com/pypa/pipenv/issues/3254)
+- Pipenv will now ignore hashes when installing with `--skip-lock`. [#3255](https://github.com/pypa/pipenv/issues/3255)
+- Fixed an issue where pipenv could crash when multiple pipenv processes attempted to create the same directory. [#3257](https://github.com/pypa/pipenv/issues/3257)
+- Fixed an issue which sometimes prevented successful creation of a project Pipfile. [#3260](https://github.com/pypa/pipenv/issues/3260)
+- `pipenv install` will now unset the `PYTHONHOME` environment variable when not combined with `--system`. [#3261](https://github.com/pypa/pipenv/issues/3261)
+- Pipenv will ensure that warnings do not interfere with the resolution process by suppressing warnings' usage of standard output and writing to standard error instead. [#3273](https://github.com/pypa/pipenv/issues/3273)
+- Fixed an issue which prevented variables from the environment, such as `PIPENV_DEV` or `PIPENV_SYSTEM`, from being parsed and implemented correctly. [#3278](https://github.com/pypa/pipenv/issues/3278)
+- Clear pythonfinder cache after Python install. [#3287](https://github.com/pypa/pipenv/issues/3287)
+- Fixed a race condition in hash resolution for dependencies for certain dependencies with missing cache entries or fresh Pipenv installs. [#3289](https://github.com/pypa/pipenv/issues/3289)
+- Pipenv will now respect top-level pins over VCS dependency locks. [#3296](https://github.com/pypa/pipenv/issues/3296)
+
+## Vendored Libraries
+
+- Update vendored dependencies to resolve resolution output parsing and python finding:
+ : - `pythonfinder 1.1.9 -> 1.1.10`
+ - `requirementslib 1.3.1 -> 1.3.3`
+ - `vistir 0.2.3 -> 0.2.5` [#3280](https://github.com/pypa/pipenv/issues/3280)
+
+# 2018.11.14 (2018-11-14)
+
+## Features & Improvements
+
+- Improved exceptions and error handling on failures. [#1977](https://github.com/pypa/pipenv/issues/1977)
+- Added persistent settings for all CLI flags via `PIPENV_{FLAG_NAME}` environment variables by enabling `auto_envvar_prefix=PIPENV` in click (implements PEEP-0002). [#2200](https://github.com/pypa/pipenv/issues/2200)
+- Added improved messaging about available but skipped updates due to dependency conflicts when running `pipenv update --outdated`. [#2411](https://github.com/pypa/pipenv/issues/2411)
+- Added environment variable `PIPENV_PYUP_API_KEY` to add ability
+ to override the bundled PyUP.io API key. [#2825](https://github.com/pypa/pipenv/issues/2825)
+- Added additional output to `pipenv update --outdated` to indicate that the operation succeeded and all packages were already up to date. [#2828](https://github.com/pypa/pipenv/issues/2828)
+- Updated `crayons` patch to enable colors on native powershell but swap native blue for magenta. [#3020](https://github.com/pypa/pipenv/issues/3020)
+- Added support for `--bare` to `pipenv clean`, and fixed `pipenv sync --bare` to actually reduce output. [#3041](https://github.com/pypa/pipenv/issues/3041)
+- Added windows-compatible spinner via upgraded `vistir` dependency. [#3089](https://github.com/pypa/pipenv/issues/3089)
+- - Added support for python installations managed by `asdf`. [#3096](https://github.com/pypa/pipenv/issues/3096)
+- Improved runtime performance of no-op commands such as `pipenv --venv` by around 2/3. [#3158](https://github.com/pypa/pipenv/issues/3158)
+- Do not show error but success for running `pipenv uninstall --all` in a fresh virtual environment. [#3170](https://github.com/pypa/pipenv/issues/3170)
+- Improved asynchronous installation and error handling via queued subprocess parallelization. [#3217](https://github.com/pypa/pipenv/issues/3217)
+
+## Bug Fixes
+
+- Remote non-PyPI artifacts and local wheels and artifacts will now include their own hashes rather than including hashes from `PyPI`. [#2394](https://github.com/pypa/pipenv/issues/2394)
+- Non-ascii characters will now be handled correctly when parsed by pipenv's `ToML` parsers. [#2737](https://github.com/pypa/pipenv/issues/2737)
+- Updated `pipenv uninstall` to respect the `--skip-lock` argument. [#2848](https://github.com/pypa/pipenv/issues/2848)
+- Fixed a bug which caused uninstallation to sometimes fail to successfully remove packages from `Pipfiles` with comments on preceding or following lines. [#2885](https://github.com/pypa/pipenv/issues/2885),
+ [#3099](https://github.com/pypa/pipenv/issues/3099)
+- Pipenv will no longer fail when encountering python versions on Windows that have been uninstalled. [#2983](https://github.com/pypa/pipenv/issues/2983)
+- Fixed unnecessary extras are added when translating markers [#3026](https://github.com/pypa/pipenv/issues/3026)
+- Fixed a virtualenv creation issue which could cause new virtualenvs to inadvertently attempt to read and write to global site packages. [#3047](https://github.com/pypa/pipenv/issues/3047)
+- Fixed an issue with virtualenv path derivation which could cause errors, particularly for users on WSL bash. [#3055](https://github.com/pypa/pipenv/issues/3055)
+- Fixed a bug which caused `Unexpected EOF` errors to be thrown when `pip` was waiting for input from users who had put login credentials in environment variables. [#3088](https://github.com/pypa/pipenv/issues/3088)
+- Fixed a bug in `requirementslib` which prevented successful installation from mercurial repositories. [#3090](https://github.com/pypa/pipenv/issues/3090)
+- Fixed random resource warnings when using pyenv or any other subprocess calls. [#3094](https://github.com/pypa/pipenv/issues/3094)
+- - Fixed a bug which sometimes prevented cloning and parsing `mercurial` requirements. [#3096](https://github.com/pypa/pipenv/issues/3096)
+- Fixed an issue in `delegator.py` related to subprocess calls when using `PopenSpawn` to stream output, which sometimes threw unexpected `EOF` errors. [#3102](https://github.com/pypa/pipenv/issues/3102),
+ [#3114](https://github.com/pypa/pipenv/issues/3114),
+ [#3117](https://github.com/pypa/pipenv/issues/3117)
+- Fix the path casing issue that makes `pipenv clean` fail on Windows [#3104](https://github.com/pypa/pipenv/issues/3104)
+- Pipenv will avoid leaving build artifacts in the current working directory. [#3106](https://github.com/pypa/pipenv/issues/3106)
+- Fixed issues with broken subprocess calls leaking resource handles and causing random and sporadic failures. [#3109](https://github.com/pypa/pipenv/issues/3109)
+- Fixed an issue which caused `pipenv clean` to sometimes clean packages from the base `site-packages` folder or fail entirely. [#3113](https://github.com/pypa/pipenv/issues/3113)
+- Updated `pythonfinder` to correct an issue with unnesting of nested paths when searching for python versions. [#3121](https://github.com/pypa/pipenv/issues/3121)
+- Added additional logic for ignoring and replacing non-ascii characters when formatting console output on non-UTF-8 systems. [#3131](https://github.com/pypa/pipenv/issues/3131)
+- Fix virtual environment discovery when `PIPENV_VENV_IN_PROJECT` is set, but the in-project `.venv` is a file. [#3134](https://github.com/pypa/pipenv/issues/3134)
+- Hashes for remote and local non-PyPI artifacts will now be included in `Pipfile.lock` during resolution. [#3145](https://github.com/pypa/pipenv/issues/3145)
+- Fix project path hashing logic in purpose to prevent collisions of virtual environments. [#3151](https://github.com/pypa/pipenv/issues/3151)
+- Fix package installation when the virtual environment path contains parentheses. [#3158](https://github.com/pypa/pipenv/issues/3158)
+- Azure Pipelines YAML files are updated to use the latest syntax and product name. [#3164](https://github.com/pypa/pipenv/issues/3164)
+- Fixed new spinner success message to write only one success message during resolution. [#3183](https://github.com/pypa/pipenv/issues/3183)
+- Pipenv will now correctly respect the `--pre` option when used with `pipenv install`. [#3185](https://github.com/pypa/pipenv/issues/3185)
+- Fix a bug where exception is raised when run pipenv graph in a project without created virtualenv [#3201](https://github.com/pypa/pipenv/issues/3201)
+- When sources are missing names, names will now be derived from the supplied URL. [#3216](https://github.com/pypa/pipenv/issues/3216)
+
+## Vendored Libraries
+
+- Updated `pythonfinder` to correct an issue with unnesting of nested paths when searching for python versions. [#3061](https://github.com/pypa/pipenv/issues/3061),
+ [#3121](https://github.com/pypa/pipenv/issues/3121)
+- Updated vendored dependencies:
+ : - `certifi 2018.08.24 => 2018.10.15`
+ - `urllib3 1.23 => 1.24`
+ - `requests 2.19.1 => 2.20.0`
+ - ``` shellingham ``1.2.6 => 1.2.7 ```
+ - `tomlkit 0.4.4. => 0.4.6`
+ - `vistir 0.1.6 => 0.1.8`
+ - `pythonfinder 0.1.2 => 0.1.3`
+ - `requirementslib 1.1.9 => 1.1.10`
+ - `backports.functools_lru_cache 1.5.0 (new)`
+ - `cursor 1.2.0 (new)` [#3089](https://github.com/pypa/pipenv/issues/3089)
+- Updated vendored dependencies:
+ : - `requests 2.19.1 => 2.20.1`
+ - `tomlkit 0.4.46 => 0.5.2`
+ - `vistir 0.1.6 => 0.2.4`
+ - `pythonfinder 1.1.2 => 1.1.8`
+ - `requirementslib 1.1.10 => 1.3.0` [#3096](https://github.com/pypa/pipenv/issues/3096)
+- Switch to `tomlkit` for parsing and writing. Drop `prettytoml` and `contoml` from vendors. [#3191](https://github.com/pypa/pipenv/issues/3191)
+- Updated `requirementslib` to aid in resolution of local and remote archives. [#3196](https://github.com/pypa/pipenv/issues/3196)
+
+## Improved Documentation
+
+- Expanded development and testing documentation for contributors to get started. [#3074](https://github.com/pypa/pipenv/issues/3074)
+
+# 2018.10.13 (2018-10-13)
+
+## Bug Fixes
+
+- Fixed a bug in `pipenv clean` which caused global packages to sometimes be inadvertently targeted for cleanup. [#2849](https://github.com/pypa/pipenv/issues/2849)
+- Fix broken backport imports for vendored vistir. [#2950](https://github.com/pypa/pipenv/issues/2950),
+ [#2955](https://github.com/pypa/pipenv/issues/2955),
+ [#2961](https://github.com/pypa/pipenv/issues/2961)
+- Fixed a bug with importing local vendored dependencies when running `pipenv graph`. [#2952](https://github.com/pypa/pipenv/issues/2952)
+- Fixed a bug which caused executable discovery to fail when running inside a virtualenv. [#2957](https://github.com/pypa/pipenv/issues/2957)
+- Fix parsing of outline tables. [#2971](https://github.com/pypa/pipenv/issues/2971)
+- Fixed a bug which caused `verify_ssl` to fail to drop through to `pip install` correctly as `trusted-host`. [#2979](https://github.com/pypa/pipenv/issues/2979)
+- Fixed a bug which caused canonicalized package names to fail to resolve against PyPI. [#2989](https://github.com/pypa/pipenv/issues/2989)
+- Enhanced CI detection to detect Azure Devops builds. [#2993](https://github.com/pypa/pipenv/issues/2993)
+- Fixed a bug which prevented installing pinned versions which used redirection symbols from the command line. [#2998](https://github.com/pypa/pipenv/issues/2998)
+- Fixed a bug which prevented installing the local directory in non-editable mode. [#3005](https://github.com/pypa/pipenv/issues/3005)
+
+## Vendored Libraries
+
+- Updated `requirementslib` to version `1.1.9`. [#2989](https://github.com/pypa/pipenv/issues/2989)
+- Upgraded `pythonfinder => 1.1.1` and `vistir => 0.1.7`. [#3007](https://github.com/pypa/pipenv/issues/3007)
+
+# 2018.10.9 (2018-10-09)
+
+## Features & Improvements
+
+- Added environment variables `PIPENV_VERBOSE` and `PIPENV_QUIET` to control
+ output verbosity without needing to pass options. [#2527](https://github.com/pypa/pipenv/issues/2527)
+
+- Updated test-PyPI add-on to better support json-API access (forward compatibility).
+ Improved testing process for new contributors. [#2568](https://github.com/pypa/pipenv/issues/2568)
+
+- Greatly enhanced python discovery functionality:
+
+ - Added pep514 (windows launcher/finder) support for python discovery.
+ - Introduced architecture discovery for python installations which support different architectures. [#2582](https://github.com/pypa/pipenv/issues/2582)
+
+- Added support for `pipenv shell` on msys and cygwin/mingw/git bash for Windows. [#2641](https://github.com/pypa/pipenv/issues/2641)
+
+- Enhanced resolution of editable and VCS dependencies. [#2643](https://github.com/pypa/pipenv/issues/2643)
+
+- Deduplicate and refactor CLI to use stateful arguments and object passing. See [this issue](https://github.com/pallets/click/issues/108) for reference. [#2814](https://github.com/pypa/pipenv/issues/2814)
+
+## Behavior Changes
+
+- Virtual environment activation for `run` is revised to improve interpolation
+ with other Python discovery tools. [#2503](https://github.com/pypa/pipenv/issues/2503)
+- Improve terminal coloring to display better in Powershell. [#2511](https://github.com/pypa/pipenv/issues/2511)
+- Invoke `virtualenv` directly for virtual environment creation, instead of depending on `pew`. [#2518](https://github.com/pypa/pipenv/issues/2518)
+- `pipenv --help` will now include short help descriptions. [#2542](https://github.com/pypa/pipenv/issues/2542)
+- Add `COMSPEC` to fallback option (along with `SHELL` and `PYENV_SHELL`)
+ if shell detection fails, improving robustness on Windows. [#2651](https://github.com/pypa/pipenv/issues/2651)
+- Fallback to shell mode if `run` fails with Windows error 193 to handle non-executable commands. This should improve usability on Windows, where some users run non-executable files without specifying a command, relying on Windows file association to choose the current command. [#2718](https://github.com/pypa/pipenv/issues/2718)
+
+## Bug Fixes
+
+- Fixed a bug which prevented installation of editable requirements using `ssh://` style URLs [#1393](https://github.com/pypa/pipenv/issues/1393)
+- VCS Refs for locked local editable dependencies will now update appropriately to the latest hash when running `pipenv update`. [#1690](https://github.com/pypa/pipenv/issues/1690)
+- `.tar.gz` and `.zip` artifacts will now have dependencies installed even when they are missing from the Lockfile. [#2173](https://github.com/pypa/pipenv/issues/2173)
+- The command line parser will now handle multiple `-e/--editable` dependencies properly via click's option parser to help mitigate future parsing issues. [#2279](https://github.com/pypa/pipenv/issues/2279)
+- Fixed the ability of pipenv to parse `dependency_links` from `setup.py` when `PIP_PROCESS_DEPENDENCY_LINKS` is enabled. [#2434](https://github.com/pypa/pipenv/issues/2434)
+- Fixed a bug which could cause `-i/--index` arguments to sometimes be incorrectly picked up in packages. This is now handled in the command line parser. [#2494](https://github.com/pypa/pipenv/issues/2494)
+- Fixed non-deterministic resolution issues related to changes to the internal package finder in `pip 10`. [#2499](https://github.com/pypa/pipenv/issues/2499),
+ [#2529](https://github.com/pypa/pipenv/issues/2529),
+ [#2589](https://github.com/pypa/pipenv/issues/2589),
+ [#2666](https://github.com/pypa/pipenv/issues/2666),
+ [#2767](https://github.com/pypa/pipenv/issues/2767),
+ [#2785](https://github.com/pypa/pipenv/issues/2785),
+ [#2795](https://github.com/pypa/pipenv/issues/2795),
+ [#2801](https://github.com/pypa/pipenv/issues/2801),
+ [#2824](https://github.com/pypa/pipenv/issues/2824),
+ [#2862](https://github.com/pypa/pipenv/issues/2862),
+ [#2879](https://github.com/pypa/pipenv/issues/2879),
+ [#2894](https://github.com/pypa/pipenv/issues/2894),
+ [#2933](https://github.com/pypa/pipenv/issues/2933)
+- Fix subshell invocation on Windows for Python 2. [#2515](https://github.com/pypa/pipenv/issues/2515)
+- Fixed a bug which sometimes caused pipenv to throw a `TypeError` or to run into encoding issues when writing a Lockfile on python 2. [#2561](https://github.com/pypa/pipenv/issues/2561)
+- Improve quoting logic for `pipenv run` so it works better with Windows
+ built-in commands. [#2563](https://github.com/pypa/pipenv/issues/2563)
+- Fixed a bug related to parsing VCS requirements with both extras and subdirectory fragments.
+ Corrected an issue in the `requirementslib` parser which led to some markers being discarded rather than evaluated. [#2564](https://github.com/pypa/pipenv/issues/2564)
+- Fixed multiple issues with finding the correct system python locations. [#2582](https://github.com/pypa/pipenv/issues/2582)
+- Catch JSON decoding error to prevent exception when the lock file is of
+ invalid format. [#2607](https://github.com/pypa/pipenv/issues/2607)
+- Fixed a rare bug which could sometimes cause errors when installing packages with custom sources. [#2610](https://github.com/pypa/pipenv/issues/2610)
+- Update requirementslib to fix a bug which could raise an `UnboundLocalError` when parsing malformed VCS URIs. [#2617](https://github.com/pypa/pipenv/issues/2617)
+- Fixed an issue which prevented passing multiple `--ignore` parameters to `pipenv check`. [#2632](https://github.com/pypa/pipenv/issues/2632)
+- Fixed a bug which caused attempted hashing of `ssh://` style URIs which could cause failures during installation of private ssh repositories.
+ \- Corrected path conversion issues which caused certain editable VCS paths to be converted to `ssh://` URIs improperly. [#2639](https://github.com/pypa/pipenv/issues/2639)
+- Fixed a bug which caused paths to be formatted incorrectly when using `pipenv shell` in bash for windows. [#2641](https://github.com/pypa/pipenv/issues/2641)
+- Dependency links to private repositories defined via `ssh://` schemes will now install correctly and skip hashing as long as `PIP_PROCESS_DEPENDENCY_LINKS=1`. [#2643](https://github.com/pypa/pipenv/issues/2643)
+- Fixed a bug which sometimes caused pipenv to parse the `trusted_host` argument to pip incorrectly when parsing source URLs which specify `verify_ssl = false`. [#2656](https://github.com/pypa/pipenv/issues/2656)
+- Prevent crashing when a virtual environment in `WORKON_HOME` is faulty. [#2676](https://github.com/pypa/pipenv/issues/2676)
+- Fixed virtualenv creation failure when a .venv file is present in the project root. [#2680](https://github.com/pypa/pipenv/issues/2680)
+- Fixed a bug which could cause the `-e/--editable` argument on a dependency to be accidentally parsed as a dependency itself. [#2714](https://github.com/pypa/pipenv/issues/2714)
+- Correctly pass `verbose` and `debug` flags to the resolver subprocess so it generates appropriate output. This also resolves a bug introduced by the fix to #2527. [#2732](https://github.com/pypa/pipenv/issues/2732)
+- All markers are now included in `pipenv lock --requirements` output. [#2748](https://github.com/pypa/pipenv/issues/2748)
+- Fixed a bug in marker resolution which could cause duplicate and non-deterministic markers. [#2760](https://github.com/pypa/pipenv/issues/2760)
+- Fixed a bug in the dependency resolver which caused regular issues when handling `setup.py` based dependency resolution. [#2766](https://github.com/pypa/pipenv/issues/2766)
+- Updated vendored dependencies:
+ : - `pip-tools` (updated and patched to latest w/ `pip 18.0` compatibility)
+ - `pip 10.0.1 => 18.0`
+ - `click 6.7 => 7.0`
+ - `toml 0.9.4 => 0.10.0`
+ - `pyparsing 2.2.0 => 2.2.2`
+ - `delegator 0.1.0 => 0.1.1`
+ - `attrs 18.1.0 => 18.2.0`
+ - `distlib 0.2.7 => 0.2.8`
+ - `packaging 17.1.0 => 18.0`
+ - `passa 0.2.0 => 0.3.1`
+ - `pip_shims 0.1.2 => 0.3.1`
+ - `plette 0.1.1 => 0.2.2`
+ - `pythonfinder 1.0.2 => 1.1.0`
+ - `pytoml 0.1.18 => 0.1.19`
+ - `requirementslib 1.1.16 => 1.1.17`
+ - `shellingham 1.2.4 => 1.2.6`
+ - `tomlkit 0.4.2 => 0.4.4`
+ - `vistir 0.1.4 => 0.1.6`
+ [#2802](https://github.com/pypa/pipenv/issues/2802),
+ [#2867](https://github.com/pypa/pipenv/issues/2867),
+ [#2880](https://github.com/pypa/pipenv/issues/2880)
+- Fixed a bug where `pipenv` crashes when the `WORKON_HOME` directory does not exist. [#2877](https://github.com/pypa/pipenv/issues/2877)
+- Fixed pip is not loaded from pipenv's patched one but the system one [#2912](https://github.com/pypa/pipenv/issues/2912)
+- Fixed various bugs related to `pip 18.1` release which prevented locking, installation, and syncing, and dumping to a `requirements.txt` file. [#2924](https://github.com/pypa/pipenv/issues/2924)
+
+## Vendored Libraries
+
+- Pew is no longer vendored. Entry point `pewtwo`, packages `pipenv.pew` and
+ `pipenv.patched.pew` are removed. [#2521](https://github.com/pypa/pipenv/issues/2521)
+- Update `pythonfinder` to major release `1.0.0` for integration. [#2582](https://github.com/pypa/pipenv/issues/2582)
+- Update requirementslib to fix a bug which could raise an `UnboundLocalError` when parsing malformed VCS URIs. [#2617](https://github.com/pypa/pipenv/issues/2617)
+- - Vendored new libraries `vistir` and `pip-shims`, `tomlkit`, `modutil`, and `plette`.
+ - Update vendored libraries:
+ \- `scandir` to `1.9.0`
+ \- `click-completion` to `0.4.1`
+ \- `semver` to `2.8.1`
+ \- `shellingham` to `1.2.4`
+ \- `pytoml` to `0.1.18`
+ \- `certifi` to `2018.8.24`
+ \- `ptyprocess` to `0.6.0`
+ \- `requirementslib` to `1.1.5`
+ \- `pythonfinder` to `1.0.2`
+ \- `pipdeptree` to `0.13.0`
+ \- `python-dotenv` to `0.9.1` [#2639](https://github.com/pypa/pipenv/issues/2639)
+- Updated vendored dependencies:
+ : - `pip-tools` (updated and patched to latest w/ `pip 18.0` compatibility)
+ - `pip 10.0.1 => 18.0`
+ - `click 6.7 => 7.0`
+ - `toml 0.9.4 => 0.10.0`
+ - `pyparsing 2.2.0 => 2.2.2`
+ - `delegator 0.1.0 => 0.1.1`
+ - `attrs 18.1.0 => 18.2.0`
+ - `distlib 0.2.7 => 0.2.8`
+ - `packaging 17.1.0 => 18.0`
+ - `passa 0.2.0 => 0.3.1`
+ - `pip_shims 0.1.2 => 0.3.1`
+ - `plette 0.1.1 => 0.2.2`
+ - `pythonfinder 1.0.2 => 1.1.0`
+ - `pytoml 0.1.18 => 0.1.19`
+ - `requirementslib 1.1.16 => 1.1.17`
+ - `shellingham 1.2.4 => 1.2.6`
+ - `tomlkit 0.4.2 => 0.4.4`
+ - `vistir 0.1.4 => 0.1.6`
+ [#2902](https://github.com/pypa/pipenv/issues/2902),
+ [#2935](https://github.com/pypa/pipenv/issues/2935)
+
+## Improved Documentation
+
+- Simplified the test configuration process. [#2568](https://github.com/pypa/pipenv/issues/2568)
+- Updated documentation to use working fortune cookie add-on. [#2644](https://github.com/pypa/pipenv/issues/2644)
+- Added additional information about troubleshooting `pipenv shell` by using the the `$PIPENV_SHELL` environment variable. [#2671](https://github.com/pypa/pipenv/issues/2671)
+- Added a link to `PEP-440` version specifiers in the documentation for additional detail. [#2674](https://github.com/pypa/pipenv/issues/2674)
+- Added simple example to README.md for installing from git. [#2685](https://github.com/pypa/pipenv/issues/2685)
+- Stopped recommending `--system` for Docker contexts. [#2762](https://github.com/pypa/pipenv/issues/2762)
+- Fixed the example url for doing "pipenv install -e
+ some-repository-url#egg=something", it was missing the "egg=" in the fragment
+ identifier. [#2792](https://github.com/pypa/pipenv/issues/2792)
+- Fixed link to the "be cordial" essay in the contribution documentation. [#2793](https://github.com/pypa/pipenv/issues/2793)
+- Clarify `pipenv install` documentation [#2844](https://github.com/pypa/pipenv/issues/2844)
+- Replace reference to uservoice with PEEP-000 [#2909](https://github.com/pypa/pipenv/issues/2909)
+
+# 2018.7.1 (2018-07-01)
+
+## Features & Improvements
+
+- All calls to `pipenv shell` are now implemented from the ground up using [shellingham](https://github.com/sarugaku/shellingham), a custom library which was purpose built to handle edge cases and shell detection. [#2371](https://github.com/pypa/pipenv/issues/2371)
+- Added support for python 3.7 via a few small compatibility / bug fixes. [#2427](https://github.com/pypa/pipenv/issues/2427),
+ [#2434](https://github.com/pypa/pipenv/issues/2434),
+ [#2436](https://github.com/pypa/pipenv/issues/2436)
+- Added new flag `pipenv --support` to replace the diagnostic command `python -m pipenv.help`. [#2477](https://github.com/pypa/pipenv/issues/2477),
+ [#2478](https://github.com/pypa/pipenv/issues/2478)
+- Improved import times and CLI run times with minor tweaks. [#2485](https://github.com/pypa/pipenv/issues/2485)
+
+## Bug Fixes
+
+- Fixed an ongoing bug which sometimes resolved incompatible versions into the project Lockfile. [#1901](https://github.com/pypa/pipenv/issues/1901)
+- Fixed a bug which caused errors when creating virtualenvs which contained leading dash characters. [#2415](https://github.com/pypa/pipenv/issues/2415)
+- Fixed a logic error which caused `--deploy --system` to overwrite editable vcs packages in the Pipfile before installing, which caused any installation to fail by default. [#2417](https://github.com/pypa/pipenv/issues/2417)
+- Updated requirementslib to fix an issue with properly quoting markers in VCS requirements. [#2419](https://github.com/pypa/pipenv/issues/2419)
+- Installed new vendored jinja2 templates for `click-completion` which were causing template errors for users with completion enabled. [#2422](https://github.com/pypa/pipenv/issues/2422)
+- Added support for python 3.7 via a few small compatibility / bug fixes. [#2427](https://github.com/pypa/pipenv/issues/2427)
+- Fixed an issue reading package names from `setup.py` files in projects which imported utilities such as `versioneer`. [#2433](https://github.com/pypa/pipenv/issues/2433)
+- Pipenv will now ensure that its internal package names registry files are written with unicode strings. [#2450](https://github.com/pypa/pipenv/issues/2450)
+- Fixed a bug causing requirements input as relative paths to be output as absolute paths or URIs.
+ Fixed a bug affecting normalization of `git+git@host` URLs. [#2453](https://github.com/pypa/pipenv/issues/2453)
+- Pipenv will now always use `pathlib2` for `Path` based filesystem interactions by default on `python<3.5`. [#2454](https://github.com/pypa/pipenv/issues/2454)
+- Fixed a bug which prevented passing proxy PyPI indexes set with `--pypi-mirror` from being passed to pip during virtualenv creation, which could cause the creation to freeze in some cases. [#2462](https://github.com/pypa/pipenv/issues/2462)
+- Using the `python -m pipenv.help` command will now use proper encoding for the host filesystem to avoid encoding issues. [#2466](https://github.com/pypa/pipenv/issues/2466)
+- The new `jinja2` templates for `click_completion` will now be included in pipenv source distributions. [#2479](https://github.com/pypa/pipenv/issues/2479)
+- Resolved a long-standing issue with re-using previously generated `InstallRequirement` objects for resolution which could cause `PKG-INFO` file information to be deleted, raising a `TypeError`. [#2480](https://github.com/pypa/pipenv/issues/2480)
+- Resolved an issue parsing usernames from private PyPI URIs in `Pipfiles` by updating `requirementslib`. [#2484](https://github.com/pypa/pipenv/issues/2484)
+
+## Vendored Libraries
+
+- All calls to `pipenv shell` are now implemented from the ground up using [shellingham](https://github.com/sarugaku/shellingham), a custom library which was purpose built to handle edge cases and shell detection. [#2371](https://github.com/pypa/pipenv/issues/2371)
+- Updated requirementslib to fix an issue with properly quoting markers in VCS requirements. [#2419](https://github.com/pypa/pipenv/issues/2419)
+- Installed new vendored jinja2 templates for `click-completion` which were causing template errors for users with completion enabled. [#2422](https://github.com/pypa/pipenv/issues/2422)
+- Add patch to `prettytoml` to support Python 3.7. [#2426](https://github.com/pypa/pipenv/issues/2426)
+- Patched `prettytoml.AbstractTable._enumerate_items` to handle `StopIteration` errors in preparation of release of python 3.7. [#2427](https://github.com/pypa/pipenv/issues/2427)
+- Fixed an issue reading package names from `setup.py` files in projects which imported utilities such as `versioneer`. [#2433](https://github.com/pypa/pipenv/issues/2433)
+- Updated `requirementslib` to version `1.0.9` [#2453](https://github.com/pypa/pipenv/issues/2453)
+- Unraveled a lot of old, unnecessary patches to `pip-tools` which were causing non-deterministic resolution errors. [#2480](https://github.com/pypa/pipenv/issues/2480)
+- Resolved an issue parsing usernames from private PyPI URIs in `Pipfiles` by updating `requirementslib`. [#2484](https://github.com/pypa/pipenv/issues/2484)
+
+## Improved Documentation
+
+- Added instructions for installing using Fedora's official repositories. [#2404](https://github.com/pypa/pipenv/issues/2404)
+
+# 2018.6.25 (2018-06-25)
+
+## Features & Improvements
+
+- Pipenv-created virtualenvs will now be associated with a `.project` folder
+ (features can be implemented on top of this later or users may choose to use
+ `pipenv-pipes` to take full advantage of this.) [#1861](https://github.com/pypa/pipenv/issues/1861)
+- Virtualenv names will now appear in prompts for most Windows users. [#2167](https://github.com/pypa/pipenv/issues/2167)
+- Added support for cmder shell paths with spaces. [#2168](https://github.com/pypa/pipenv/issues/2168)
+- Added nested JSON output to the `pipenv graph` command. [#2199](https://github.com/pypa/pipenv/issues/2199)
+- Dropped vendored pip 9 and vendored, patched, and migrated to pip 10. Updated
+ patched piptools version. [#2255](https://github.com/pypa/pipenv/issues/2255)
+- PyPI mirror URLs can now be set to override instances of PyPI URLs by passing
+ the `--pypi-mirror` argument from the command line or setting the
+ `PIPENV_PYPI_MIRROR` environment variable. [#2281](https://github.com/pypa/pipenv/issues/2281)
+- Virtualenv activation lines will now avoid being written to some shell
+ history files. [#2287](https://github.com/pypa/pipenv/issues/2287)
+- Pipenv will now only search for `requirements.txt` files when creating new
+ projects, and during that time only if the user doesn't specify packages to
+ pass in. [#2309](https://github.com/pypa/pipenv/issues/2309)
+- Added support for mounted drives via UNC paths. [#2331](https://github.com/pypa/pipenv/issues/2331)
+- Added support for Windows Subsystem for Linux bash shell detection. [#2363](https://github.com/pypa/pipenv/issues/2363)
+- Pipenv will now generate hashes much more quickly by resolving them in a
+ single pass during locking. [#2384](https://github.com/pypa/pipenv/issues/2384)
+- `pipenv run` will now avoid spawning additional `COMSPEC` instances to
+ run commands in when possible. [#2385](https://github.com/pypa/pipenv/issues/2385)
+- Massive internal improvements to requirements parsing codebase, resolver, and
+ error messaging. [#2388](https://github.com/pypa/pipenv/issues/2388)
+- `pipenv check` now may take multiple of the additional argument
+ `--ignore` which takes a parameter `cve_id` for the purpose of ignoring
+ specific CVEs. [#2408](https://github.com/pypa/pipenv/issues/2408)
+
+## Behavior Changes
+
+- Pipenv will now parse & capitalize `platform_python_implementation` markers
+ .. warning:: This could cause an issue if you have an out of date `Pipfile`
+ which lower-cases the comparison value (e.g. `cpython` instead of
+ `CPython`). [#2123](https://github.com/pypa/pipenv/issues/2123)
+- Pipenv will now only search for `requirements.txt` files when creating new
+ projects, and during that time only if the user doesn't specify packages to
+ pass in. [#2309](https://github.com/pypa/pipenv/issues/2309)
+
+## Bug Fixes
+
+- Massive internal improvements to requirements parsing codebase, resolver, and
+ error messaging. [#1962](https://github.com/pypa/pipenv/issues/1962),
+ [#2186](https://github.com/pypa/pipenv/issues/2186),
+ [#2263](https://github.com/pypa/pipenv/issues/2263),
+ [#2312](https://github.com/pypa/pipenv/issues/2312)
+- Pipenv will now parse & capitalize `platform_python_implementation`
+ markers. [#2123](https://github.com/pypa/pipenv/issues/2123)
+- Fixed a bug with parsing and grouping old-style `setup.py` extras during
+ resolution [#2142](https://github.com/pypa/pipenv/issues/2142)
+- Fixed a bug causing pipenv graph to throw unhelpful exceptions when running
+ against empty or non-existent environments. [#2161](https://github.com/pypa/pipenv/issues/2161)
+- Fixed a bug which caused `--system` to incorrectly abort when users were in
+ a virtualenv. [#2181](https://github.com/pypa/pipenv/issues/2181)
+- Removed vendored `cacert.pem` which could cause issues for some users with
+ custom certificate settings. [#2193](https://github.com/pypa/pipenv/issues/2193)
+- Fixed a regression which led to direct invocations of `virtualenv`, rather
+ than calling it by module. [#2198](https://github.com/pypa/pipenv/issues/2198)
+- Locking will now pin the correct VCS ref during `pipenv update` runs.
+ Running `pipenv update` with a new vcs ref specified in the `Pipfile`
+ will now properly obtain, resolve, and install the specified dependency at
+ the specified ref. [#2209](https://github.com/pypa/pipenv/issues/2209)
+- `pipenv clean` will now correctly ignore comments from `pip freeze` when
+ cleaning the environment. [#2262](https://github.com/pypa/pipenv/issues/2262)
+- Resolution bugs causing packages for incompatible python versions to be
+ locked have been fixed. [#2267](https://github.com/pypa/pipenv/issues/2267)
+- Fixed a bug causing pipenv graph to fail to display sometimes. [#2268](https://github.com/pypa/pipenv/issues/2268)
+- Updated `requirementslib` to fix a bug in Pipfile parsing affecting
+ relative path conversions. [#2269](https://github.com/pypa/pipenv/issues/2269)
+- Windows executable discovery now leverages `os.pathext`. [#2298](https://github.com/pypa/pipenv/issues/2298)
+- Fixed a bug which caused `--deploy --system` to inadvertently create a
+ virtualenv before failing. [#2301](https://github.com/pypa/pipenv/issues/2301)
+- Fixed an issue which led to a failure to unquote special characters in file
+ and wheel paths. [#2302](https://github.com/pypa/pipenv/issues/2302)
+- VCS dependencies are now manually obtained only if they do not match the
+ requested ref. [#2304](https://github.com/pypa/pipenv/issues/2304)
+- Added error handling functionality to properly cope with single-digit
+ `Requires-Python` metadata with no specifiers. [#2377](https://github.com/pypa/pipenv/issues/2377)
+- `pipenv update` will now always run the resolver and lock before ensuring
+ dependencies are in sync with project Lockfile. [#2379](https://github.com/pypa/pipenv/issues/2379)
+- Resolved a bug in our patched resolvers which could cause nondeterministic
+ resolution failures in certain conditions. Running `pipenv install` with no
+ arguments in a project with only a `Pipfile` will now correctly lock first
+ for dependency resolution before installing. [#2384](https://github.com/pypa/pipenv/issues/2384)
+- Patched `python-dotenv` to ensure that environment variables always get
+ encoded to the filesystem encoding. [#2386](https://github.com/pypa/pipenv/issues/2386)
+
+## Improved Documentation
+
+- Update documentation wording to clarify Pipenv's overall role in the packaging ecosystem. [#2194](https://github.com/pypa/pipenv/issues/2194)
+- Added contribution documentation and guidelines. [#2205](https://github.com/pypa/pipenv/issues/2205)
+- Added instructions for supervisord compatibility. [#2215](https://github.com/pypa/pipenv/issues/2215)
+- Fixed broken links to development philosophy and contribution documentation. [#2248](https://github.com/pypa/pipenv/issues/2248)
+
+## Vendored Libraries
+
+- Removed vendored `cacert.pem` which could cause issues for some users with
+ custom certificate settings. [#2193](https://github.com/pypa/pipenv/issues/2193)
+
+- Dropped vendored pip 9 and vendored, patched, and migrated to pip 10. Updated
+ patched piptools version. [#2255](https://github.com/pypa/pipenv/issues/2255)
+
+- Updated `requirementslib` to fix a bug in Pipfile parsing affecting
+ relative path conversions. [#2269](https://github.com/pypa/pipenv/issues/2269)
+
+- Added custom shell detection library `shellingham`, a port of our changes
+ to `pew`. [#2363](https://github.com/pypa/pipenv/issues/2363)
+
+- Patched `python-dotenv` to ensure that environment variables always get
+ encoded to the filesystem encoding. [#2386](https://github.com/pypa/pipenv/issues/2386)
+
+- Updated vendored libraries. The following vendored libraries were updated:
+
+ - distlib from version `0.2.6` to `0.2.7`.
+ - jinja2 from version `2.9.5` to `2.10`.
+ - pathlib2 from version `2.1.0` to `2.3.2`.
+ - parse from version `2.8.0` to `2.8.4`.
+ - pexpect from version `2.5.2` to `2.6.0`.
+ - requests from version `2.18.4` to `2.19.1`.
+ - idna from version `2.6` to `2.7`.
+ - certifi from version `2018.1.16` to `2018.4.16`.
+ - packaging from version `16.8` to `17.1`.
+ - six from version `1.10.0` to `1.11.0`.
+ - requirementslib from version `0.2.0` to `1.0.1`.
+
+ In addition, scandir was vendored and patched to avoid importing host system binaries when falling back to pathlib2. [#2368](https://github.com/pypa/pipenv/issues/2368)
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
deleted file mode 100644
index 9b170d2fb1..0000000000
--- a/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Be cordial or be on your way.
-
-https://www.kennethreitz.org/essays/be-cordial-or-be-on-your-way
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000000..62e3fd5049
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,4 @@
+Contributing to Pipenv
+======================
+
+Please see: [docs](https://pipenv.pypa.io/en/latest/dev/contributing.html).
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 7ea90e5937..0000000000
--- a/Dockerfile
+++ /dev/null
@@ -1,24 +0,0 @@
-FROM python:3.6.2
-
-# -- Install Pipenv:
-RUN pip install pipenv --upgrade
-
-# -- Install Application into container:
-RUN mkdir /app
-WORKDIR /app
-
-# --------------------
-# - Using This File: -
-# --------------------
-
-# FROM kennethreitz/pipenv
-
-# COPY Pipfile Pipfile
-# COPY Pipfile.lock Pipfile.lock
-# COPY . /app
-
-# -- Install dependencies:
-# RUN pipenv install --deploy --system
-
-ENTRYPOINT []
-CMD [ "/bin/bash" ]
\ No newline at end of file
diff --git a/HISTORY.txt b/HISTORY.txt
index 5f345f2793..122f3ab595 100644
--- a/HISTORY.txt
+++ b/HISTORY.txt
@@ -1,8 +1,392 @@
+2018.7.1:
+ - All calls to `pipenv shell` are now implemented from the ground up using `shellingham`,
+ a custom library which was purpose built to handle edge cases and shell detection.
+ - Added support for python 3.7 via a few small compatibility / bugfixes.
+ - Added new flag `pipenv --support` to replace the diagnostic command `python -m
+ pipenv.help`.
+ - Improved import times and CLI runtimes with minor tweaks.
+ - Fixed an ongoing bug which sometimes resolved incompatible versions into lockfiles.
+ - Fixed a bug which caused errors when creating virtualenvs which contained leading dash
+ characters.
+ - Fixed a logic error which caused `--deploy --system` to overwrite editable vcs packages
+ in the pipfile before installing, which caused any installation to fail by default.
+ - Installed new vendored jinja2 templates for `click-completion` which were causing
+ template errors for users with completion enabled.
+ - Pipenv will now ensure that its internal package names registry files are written with
+ unicode strings.
+ - Fixed a bug causing requirements input as relative paths to be output as absolute paths
+ or URIs.
+ - Fixed a bug affecting normalization of `git+git@host` uris.
+ - Pipenv will now always use `pathlib2` for `Path` based filesystem interactions by
+ default on `python<3.5`.
+ - Fixed a bug which prevented passing proxy PyPI indexes set with `--pypi-mirror` from
+ being passed to pip during virtualenv creation, which could cause the creation to
+ freeze in some cases.
+ - Using the `python -m pipenv.help` command will now use proper encoding for the host
+ filesystem to avoid encoding issues.
+ - The new `jinja2` templates for `click_completion` will now be included in pipenv source
+ distributions.
+ - Resolved a long-standing issue with re-using previously generated `InstallRequirement`
+ objects for resolution which could cause `PKG-INFO` file information to be deleted,
+ raising a `TypeError`.
+ - Resolved an issue parsing usernames from private PyPI URIs in `Pipfiles` by updating
+ `requirementslib`.
+ - Updated requirementslib to fix an issue with properly quoting markers in VCS requirements.
+ - Add patch to `prettytoml` to support Python 3.7.
+ - Patched `prettytoml.AbstractTable._enumerate_items` to handle `StopIteration` errors in
+ preparation of release of python 3.7.
+ - Fixed an issue reading package names from `setup.py` files in projects which imported
+ utilities such as `versioneer`.
+ - Updated `requirementslib` to version `1.0.9`
+ - Unraveled a lot of old, unnecessary patches to `pip-tools` which were causing
+ non-deterministic resolution errors.
+2018.6.25:
+ - Added error handling functionality to properly cope with single-digit `Requires-Python`
+ metadata with no specifiers.
+ - Pipenv will now generate hashes much more quickly by resolving them in a single pass
+ during locking.
+ - `pipenv run` will now avoid spawning additional `COMSPEC` instances to run commands in
+ when possible.
+ - `pipenv check` now may take multiple of the additional argument `--ignore` which takes
+ a parameter `cve_id` for the purpose of ignoring specific CVEs.
+ - Patched `python-dotenv` to ensure that environment variables always get encoded to the
+ filesystem encoding.
+ - Virtualenv names will now appear in prompts for most Windows users.
+ - Resolver runtime and caching has been improved.
+ - Improved virtualenv discovery when using `pipenv --venv`.
+ - Improved error messages when failing to activate virtualenvs.
+ - Dependency resolver reliability has been improved.
+ - Added nested JSON output to the `pipenv graph` command.
+ - Added support for mounted drives via UNC paths.
+ - Added support for Windows Subsystem for Linux bash shell detection.
+ - Added custom shell detection library `shellingham`, a port of our changes to `pew`.
+ - Requirements are only auto-imported in new projects created without passing any packages
+ to install and without an initial Pipfile.
+ - Added support for cmder shell paths with spaces.
+ - Dropped vendored pip 9 and vendor, patch, and migrate to pip 10.
+ - Virtualenv activation lines will now avoid being written to some shell history files.
+ - Pipenv-created virtualenvs will now be associated with a `.project` folder (features can
+ be implemented on top of this later or users may choose to use `pipenv-pipes` to take
+ full advantage of this.)
+ - Lock and update VCS dependencies properly by checking them out and cloning them
+ manually before installing and generating a lockfile to guarantee dependencies are
+ locked.
+ - PyPI mirror URLs can now be set to override instances of PyPI urls by passing the
+ `--pypi-mirror` argument from the command line or setting the `PIPENV_PYPI_MIRROR`
+ environment variable.
+ - Locking will now pin the correct VCS ref during `pipenv update` runs.
+ - Running `pipenv update` with a new vcs ref specified in the `Pipfile` will now properly
+ obtain, resolve, and install the specified dependency at the specified ref.
+ - Pipenv will now parse & capitalize`platform_python_implementation` markers -- **note** this
+ could cause an issue if you have an out of date Pipfile which lowercases the comparison
+ value (e.g. `cpython` instead of `CPython`).
+ - Massive internal improvements to requirements parsing codebase, resolver, and error
+ messaging.
+ - Fixed a regression which led to direct invocations of `virtualenv`, rather than calling
+ it by module.
+ - Resolution bugs causing packages for incompatible python versions to be locked
+ have been fixed.
+ - VCS dependencies are now manually obtained only if they do not match the requested ref.
+ - Windows executable discovery now leverages `os.pathext`.
+ - Pipenv will now correctly unquote special characters in wheel URIs.
+ - Fixed a bug with parsing and grouping old-style setup.py extras during resolution.
+ - Fixed a bug which caused `--system` to incorrectly abort when users were in a virtualenv.
+ - Pipenv clean will now ignore comments when cleaning the environment.
+ - Fixed a bug which caused `--deploy --system` to inadvertently create a virtualenv
+ before failing.
+ - Errors when running `pipenv graph` running against empty or non-existent environments.
+ will now contain helpful information.
+ - Removed vendored `cacert.pem` which could cause issues for some users with custom
+ certificate settings.
+ - Updated requirementslib to fix a bug in pipfile parsing affecting relative path conversions on Windows.
+ - Fixed a bug causing pipenv graph to fail to display sometimes.
+2018.05.12:
+ - Switch to calver for versioning.
+11.10.4:
+ - Bugfix release (_mkstmp_inner backport breaks python3.4/3.5 compat)
+11.10.3:
+ - Bugfix release (break dependency on pathlib2).
+11.10.2:
+ - Backport NamedTemporaryFile for python 2.
+ - Implement atomic lockfile writing / rewriting.
+ - Allow non-interactive pyenv installations for CI.
+ - Bugfix regression which restricted pipfiles to two sources.
+ - Update default python 2.7 version to 2.7.15.
+ - Fix bug preventing usage within premade virtualenvs.
+ - Add PIPENV_MAX_RETRIES environment variable to allow retrying installs.
+ - Fix regression with `pipenv sync` which caused it to lock if out of sync.
+ - Update colorblind mode to respect progress bars.
+ - Use `\n` to generate new lockfiles and pipfiles, default to current newlines.
+ - Fix bug with environment variable expansion writing back to Pipfiles when
+ running `pipenv install `
+ - Accurately parse extras from egg fragments.
+ - Allow `editable=False` in pipfile.
+ - Fix `keep-outdated` argument for installation (previously unenforced).
+ - Update vendoring scripts to include licenses for vendored pip.
+11.10.1:
+ - Fix broken resolution when using multiple sources in pipfiles and passing
+ `--skip-lock`.
+ - Include all sources in `pipenv lock -r` output as `--extra-index-url` args.
+ - Translate index aliases to index urls from pipfile or lockfile.
+ - Fix virtualenv detection for .venv folders in project directories.
+ - Add LICENSE files for all vendored dependencies.
+ - Port automated tooling from pip for re-vendoring and downloading licenses
+ (thanks @hroncok @uranusjr and @ncoghlan for your help sorting this out).
+ - Remove GPL'ed code.
+ - Make imports lazy to improve initial load time.
+ - Extra path searching for python at runtime.
+ - Shellquote paths to requirement files in case of spaces on windows.
+ - Update PyPI urls.
+ - Require `--python` values to exist when passing a path.
+ - Bugfix for environment variable expansion in 'unlocked' pipfiles.
+ - Bugfix for `--deploy` flag.
+ - Bugfix for windows virtualenv drive letter case normalization.
+ - Bugfix for python version number parsing.
+ - Improved error messaging.
+11.10.0:
+ - Resolve editable packages on the local filesystem.
+ - Ensure lock hash does not change based on injected env vars.
+ - Fix bug in detecting .venv at project root when in subdirectories.
+ - Parse quoting in [scripts] section correctly + clearer run errors.
+ - Fix bug resolving & locking markers correctly.
+ - Fix locking failure for packages not available on the default PyPI.
+ - Upgrade python-dotenv to support "export" syntax.
+ - Resolve dependencies of wheel files.
+ - Bugfix for allow_global with new resolver fixes.
+ - Locally cache hashes for performance gains.
+ - Lock prereleases correctly.
+ - Add requests.pem back to package.
+ - Auto-toggle PIPENV_VENV_IN_PROJECT when .venv is present.
+ - Fix bug with pipfile casing.
+ - Enable environment variable interpolation in pipfiles.
+11.9.0:
+ - Vastly improve markers capabilities.
+ - Support for environment variables in Pipfiles.
+ - Cache the Pipfile internally (for large Pipfiles).
+ - Remove pipenv --update.
+ - Export PYTHONDONTWRITEBYTECODE, to attempt to increase compatibility.
+11.8.2:
+ - Cleanup TOML.
+ - Improve documentation.
+ - Pass clear flag to resolver.
+ - Improved private git URL handling.
+11.8.1:
+ - Removed (unused) Safety DB (licensing concerns).
+11.8.0:
+ - Fix a major bug in locking resolution.
+11.7.4:
+ - Don't use JSON results βΒ problematic.
+11.7.3:
+ - Increase compatibility with strange Python installations (concurrency.futures).
+11.7.2:
+ - Bugfixes.
+11.7.1:
+ - Windows bugfix.
+11.7.0:
+ - Improvements to lockfile generation with private indexes.
+11.6.9:
+ - Bugfixes.
+11.6.8:
+ - Fix a Windows bug.
+11.6.7:
+ - Fix a Windows bug.
+11.6.5:
+ - Fix graph resolution.
+ - May be some incompatibilities with private indexes and hashing. If so, it's worth it to fix graph resolution for now. Priorities. One thing at a time.
+11.6.4:
+ - Fix a bug.
+11.6.3:
+ - Depend on certifi.
+11.6.2:
+ - Properly vendor certifi.
+ - Better support for --extra-index-url for private PyPI servers.
+ - Bug fixes.
+11.6.1:
+ - Remove concurrent.futures, as it's not being used any longer, and is problematic.
+11.6.0:
+ - Vendor all of pip9, in preparation for the release of pip10.
+11.5.3:
+- Attempt to grab markers from -e β provided setup.py files.
+- Revert "rely on the underlying pipenv sync architecture to pick up dependencies".
+11.5.2:
+ - Fix bug with markers (e.g. responses package).
+11.5.1:
+ - Restore bare 'pipenv update' functionality.
+11.5.0:
+ - Properly resolve hashes for private indexes.
+ - Some subtle changes to the way resolution works βΒ shouldn't affect you, but warrented a version bump.
+11.4.0:
+ - Stability.
+ - Don't install dependencies straight-away with pipenvβinstall βΒ rely on the underlying pipenv sync architecture to pick up dependencies.
+ - Warn (abort) if requested update package is not in Pipfile.
+ - Don't configure the Pipfile for keep_outdated when update is used.
+11.3.3:
+ - Sorry for all the bugs.
+11.3.2:
+ - Bugfix, of the craziest, hardest to reproduce nature.
+11.3.1:
+ - Fix shell --fancy.
+11.3.0:
+ - Default to using the Python Pipenv was installed with for new virtualenvs.
+ - Report Python version of specified interpreter when creating virtualenv.
+ - Disable JSON API usage, for now. It appears to cause some minor bugs related to markers (working on it).
+11.2.2:
+ - Potential bugfix related to subprocess invocations and environment variables.
+11.2.1:
+ - Actually use the Warehouse JSON API.
+11.2.0:
+ - Reduce the number of "bad packages", internally (e.g. don't exclude `six` anymore).
+11.1.11:
+ - Help improvements.
+11.1.10:
+ - Help improvements.
+11.1.9:
+ - $ python -m pipenv.help
+11.1.8:
+ - Resolver improvements.
+11.1.7:
+ - Packaging fix.
+11.1.6:
+ - Support for 'py' interpreter (on Windows).
+ - Bugfixes.
+11.1.5:
+ - Vendor pew.
+ - Be specific about which version of psutil we want.
+ - Patch pip and pip-tools (further) like crazy, for hard-to-believe reasons, and the benefit of all.
+11.1.4:
+ - Resolve multiple extras when provided.
+ - Improve completion time.
+ - Remove vendored version of psutil (windows).
+ - Bugfixes.
+11.1.3:
+ - Bugfix.
+11.1.2:
+ - No longer include hashes in `lock -r`.
+ - Enable pew execution via python -m.
+11.1.1:
+ - Undo previous change.
+11.1.0:
+ - Default to the version of Python that Pipenv was installed with.
+11.0.9:
+ - PPA release.
+11.0.8:
+ - PPA release.
+11.0.7:
+ - PPA release.
+11.0.6:
+ - PPA release.
+11.0.5:
+ - PPA release.
+11.0.4:
+ - PPA release.
+11.0.3:
+ - PPA release.
+11.0.2:
+ - Hash order is deterministic now.
+ - Bugfix.
+11.0.1:
+ - Bugfix.
+11.0.0:
+ - Massive resolver improvements!
+ - Resolver now runs within virtual environments.
+ - Resolver now uses PyPI JSON metadata to provide additional dependency information.
+ - Environment information removed from `Pipfile.lock`.
+ - Clean up temporary files used during dependency resolution.
+10.1.2:
+ - Bugfix.
+10.1.1:
+ - Assume `PIPENV_VENV_IN_PROJECT` if `./.venv/` already exists.
+ - Use and generate hashes for PyPI mirrors and custom indexes.
+10.1.0:
+ - Default dependencies now take precedence over Develop dependencies when
+ creating a Pipfile.lock.
+ - Introducing `pipenv lock --keep-outdated`, which can also be passed to
+ `install` and `uninstall`.
+ - Introducing `pipenv install --selective-upgrade `, which only
+ updates the given package in your Pipfile.lock.
+ - New Pipfile configuration option for [pipenv] section: `keep_outdated`.
+10.0.1:
+ - Add extra indexes from pip config files in Pipfile generation.
+ - Fix bug with `pipenv clean`.
+ - Install from Pipfile.lock after each successful `pipenv install`.
+ - Temporary file cleanup.
+10.0.0:
+ - Introduce `pipenv sync` command.
+ - Introduce `pipenv clean` command.
+ - Deprecate `pipenv update` command.
+ - Fully remove `check --style` functionality.
+ - Better `lock -r` functionality.
+ - Up-to-date security checks for `pipenv check`.
+9.1.0:
+ - Add --system flag to $ pipenv check.
+ - Removal of package name suggestions.
+ - Support for [scripts] in Pipfile.
+ - Comment out invalid (to pip's hash checking mode) packages from `$ pipenv lock -r`.
+ - Updated patched version of dotenv.
+ - Do not allow `$ pipenv install --system packagename `to be used.
+ - Deprecate the usage of `$ pipenv check --style`.
+ - Show pip install logs with --verbose.
+ - Allow -v as shorthand for --verbose for all commands.
+ - Prevent duplicate virtualenv creation on windows due to drive casing.
+ - Discard comments in output of `pip freeze` when running `pipenv update`.
+ - Ignore existing `requirements.txt` files when pipenv is called with the `--requirements` flag.
+ - Support `allow_global` during dependency resolution.
+ - Add virtualenv activation support for `sh` (see #1388).
+ - Improve startup times via lazy loading of imports.
+ - Improve parsing of extras, markers, and path requirements.
+ - Fix regression with VCS url parsing being treated as a normal path.
+ - Resolve an issue causing local paths with the same name as a PyPI package to prevent proper dependency resolution.
+9.0.3:
+ - v9.0.1.
+9.0.2:
+ - A mistake.
+9.0.1:
+ - Fixed issue with specifiers being treated as paths on Windows.
+ - Fixed regression causing development packages to always be installed.
+9.0.0:
+ - Fixed bug where packages beginning with vcs names (e.g. git) weren't installed correctly.
+ - Fixed url parsing for +:// style urls.
+ - Pipenv can now install relative file paths.
+ - Better messaging around failed installs.
+ - More resilient network io when retrieving data from PyPI.
+ - Fixed bug with bad dependency pinning via pip-tools.
+ - Prompt user to destroy and recreate virtualenvironment if they are in a currently activated environment.
+ - Added enhancement for pip-tools to resolve dependencies with specific versions of python
+ - Fixed bug where newlines were not escaped in .env files when loaded
+ - Sequentially install all local and vcs dependencies to avoid write race conditions.
+ - Fixed accidental exclusion of files from some VCS installs.
+8.3.2:
+ - Moved automated update check to once every 24 hours.
+ - Better default for PYENV_ROOT.
+ - Correctly support all pip --index specifiers.
+ - Fix bug where pre-releases of Python were chosen over finals.
+8.3.1:
+ - Fixed issues with calling block too many times on single subprocess.
+ - Updated vendored delegator.py.
+ - Changed --dev flag for the uninstall command to --all-dev to better represent what it does.
+8.3.0:
+ - Add support for installation from remote requirements file.
+ - Add --reverse to pipenv graph, displaying inverted dependency graph.
+ - VCS dependencies now install sequentially to avoid write lock conflicts.
+ - Allow PIPENV_IGNORE_VIRTUALENVS to work with pipenv shell on Windows.
+ - Enforce newline termination of Pipfile.
+ - More robust requirements.txt conversion experience.
+ - Respect allow_prereleases in all locking scenarios.
+ - Separated default and development dependency output when using lock -r and lock -r -d respectively.
+ - Print whole help message with pipenv --help.
8.2.7:
- Add update --sequential.
- Fix unicode decode error on windows.
- Fix bug with non-editable installs.
- Update vendored setuptools.
+ - Improvements to check --unused.
+ - Fix install for local sdist packages.
+ - Updating the patched pip-tools with the wheel dependency bugfix.
+ - Fix git remote address modified changing underscore to a hyphen.
+ - Fix py2toml with dashes (dev-packages)
+ - Fix for --dry-run, reporting backwards.
+ - Fix installing with all release specifiers.
+ - Removed unused vendor libraries.
8.2.6:
- Fix for some git remotes.
- Increased the default number of max rounds for pip-tools, made it user-configurable.
@@ -79,7 +463,7 @@
- Fix argument parsing.
7.9.7:
- Fix help printout screen (and update it).
- - Use urllib3's warning supression directly.
+ - Use urllib3's warning suppression directly.
7.9.6:
- Did you mean?
7.9.5:
@@ -144,17 +528,17 @@
- Change --two, and --three to use --python 2 and --python 3 under the hood.
- This restores --two / --three usage on windows.
7.6.8:
- - `pipenv intall -r requirements.txt --dev` now works.
+ - `pipenv install -r requirements.txt --dev` now works.
7.6.7:
- New less-fancy progress bars (for linux users, specifically).
- - Suport --python 3.
+ - Support --python 3.
7.6.6:
- Packaging problem.
7.6.5:
- Patched vendored 'safety' package to remove yaml dependency βΒ should work on all Pythons now.
7.6.4:
- Extensive integration test suite.
- - Don't suggest autocurrections as often.
+ - Don't suggest autocorrections as often.
- Cleanups.
- Don't depend on setuptools anymore.
7.6.3:
@@ -194,13 +578,13 @@
7.4.4:
- PIPENV_PIPFILE environment variable support.
- --site-packages flag, for the crazy at heart.
- - Installation conccurency on Windows.
- - make `graph --json` consistient with `graph`.
+ - Installation concurrency on Windows.
+ - make `graph --json` consistent with `graph`.
- Much better support for suggesting package names.
- Updated to pipfile spec 4, support for path= for relative package names.
- Import sources from requirements files.
- Cleanup stderr/stdout.
- - 'pipenv check' only reports saftey now for Python 3.
+ - 'pipenv check' only reports safety now for Python 3.
7.4.3:
- Download/install things concurrently.
7.4.2:
@@ -353,7 +737,7 @@
6.0.0:
- New locking functionality βΒ support for multiple hashes per release!
- Hashes are now default, everywhere, once again! We figured it out :)
- - Pipenv talks to the PyPi (Warehouse) API now for grabbing hashes.
+ - Pipenv talks to the PyPI (Warehouse) API now for grabbing hashes.
- --hashes flag removed.
- Upgraded to Pipfile spec 2.
- New --legacy mode for lock.
@@ -376,7 +760,7 @@
5.3.3:
- Automatic notification of version updates.
5.3.2:
- - Automatic locking afer install/uninstall (because it's fast now!)
+ - Automatic locking after install/uninstall (because it's fast now!)
5.3.1:
- Improvements for windows.
5.3.0:
@@ -481,7 +865,7 @@
- Removal of $ pipenv install --requirements.
- Addition of $ pipenv lock -r.
3.3.2:
- - User-configuraable max-depth for Pipfile searching.
+ - User-configurable max-depth for Pipfile searching.
- Bugfix.
3.3.1:
- Bugfix for install.
@@ -502,11 +886,11 @@
3.2.10:
- Fix bugs.
3.2.9:
- - Remove remporary requirements.txt after installation.
+ - Remove temporary requirements.txt after installation.
- Add support for --python option, for specifying any version of Python.
- Read source Pipfile.lock.
3.2.8:
- - Lock before installing all depdendencies, if lockfile isn't present.
+ - Lock before installing all dependencies, if lockfile isn't present.
3.2.7:
- Cache proper names for great speed increases.
3.2.6:
diff --git a/LICENSE b/LICENSE
index f5639bb0e9..cda2cbdc9c 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright 2017 Kenneth Reitz
+Copyright 2020-2022 Python Packaging Authority
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/MANIFEST.in b/MANIFEST.in
index 19e030fd95..ba859608d7 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,3 +1,37 @@
-include README.rst LICENSE NOTICES HISTORY.txt pipenv/patched/safety.zip
-include pipenv/vendor/pipreqs/stdlib
-include pipenv/pipenv.1
\ No newline at end of file
+include LICENSE README.md CONTRIBUTING.md CHANGELOG.md NOTICES HISTORY.txt
+include Makefile pyproject.toml get-pipenv.py *.yml
+include examples/Pipfil*
+include *.md
+
+recursive-include pipenv LICENSE LICENSE* *LICENSE* *COPYING* t32.exe t64.exe w32.exe w64.exe cacert.pem
+recursive-include pipenv *.cfg
+recursive-include pipenv/vendor *.c
+recursive-include pipenv *.md *.APACHE *.BSD
+recursive-include pipenv Makefile
+recursive-include pipenv/vendor vendor.txt
+recursive-include pipenv *.json
+recursive-include pipenv *.rst
+
+include pipenv/patched/pip/_vendor/vendor.txt
+include pipenv/patched/patched.txt
+include pipenv/vendor/Makefile
+include pipenv/pipenv.1
+
+
+recursive-include docs Makefile *.rst *.py *.bat
+recursive-include docs/_templates *.html
+recursive-include docs/_static *.js *.css *.png
+recursive-exclude tests/test_artifacts *.pyd *.so *.pyc *.egg-info PKG-INFO
+
+# Include unit tests in sdist for downstream distribution testing
+# See: https://github.com/pypa/pipenv/issues/6294
+include tests/__init__.py
+include tests/conftest.py
+recursive-include tests/unit *.py
+
+prune .azure-pipelines
+prune .github
+prune pipenv/vendor/importlib_metadata/tests
+prune pipenv/vendor/importlib_resources/tests
+
+exclude examples/*
diff --git a/Makefile b/Makefile
index 40f13f293d..dd9a3426e1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,12 +1,192 @@
-.PHONY: docs
-
-run-tests:
- pipenv run pytest tests
-init:
- python setup.py install
- pipenv install --dev
-docs:
- cd docs && make html
+SHELL := bash
+get_venv_dir:=$(shell mktemp -d 2>/dev/null || mktemp -d -t 'tmpvenv')
+venv_dir := $(get_venv_dir)/pipenv_venv
+venv_file := $(CURDIR)/.test_venv
+get_venv_path =$(file < $(venv_file))
+# This is how we will build tag-specific wheels, e.g. py36 or py37
+PY_VERSIONS:= 3.8 3.9 3.10 3.11
+BACKSLASH = '\\'
+# This is how we will build generic wheels, e.g. py2 or py3
+INSTALL_TARGETS := $(addprefix install-py,$(PY_VERSIONS))
+CLEAN_TARGETS := $(addprefix clean-py,$(PY_VERSIONS))
+DATE_STRING := $(shell date +%Y.%m.%d)
+THIS_MONTH_DATE := $(shell date +%Y.%m.01)
+NEXT_MONTH_DATE := $(shell date -d "+1 month" +%Y.%m.01)
+PATCHED_PIP_VERSION := $(shell awk '/__version__/{gsub(/"/,"",$$3); print $$3}' pipenv/patched/pip/__init__.py)
+GITDIR_STAMPFILE := $(CURDIR)/.git-checkout-dir
+create_git_tmpdir = $(shell mktemp -dt pipenv-vendor-XXXXXXXX 2>/dev/null || mktemp -d 2>/dev/null)
+write_git_tmpdir = $(file > $(GITDIR_STAMPFILE),$(create_git_tmpdir))
+get_checkout_dir = $(file < $(GITDIR_STAMPFILE))
+get_checkout_subdir = $(addprefix $(get_checkout_dir), $(1))
+pip-checkout-dir = $(get_checkout_dir)/patch-pip
+PY ?= python
+
+format:
+ black pipenv/*.py
+
+.PHONY: install
+install:
+ pip install -e .
+
+install.stamp: install
+ @touch install.stamp
+
+.PHONY: install-py%
+install-py%: install.stamp
+ @echo building for $(addprefix python, $(subst install-py,,$@))
+ PIPENV_PYTHON=$(subst install-py,,$@) pipenv install --dev
+
+install-virtualenvs.stamp: ${INSTALL_TARGETS}
+ @touch install-virtualenvs.stamp
+
+.PHONY: ramdisk
+ramdisk: SIZE ?= 4g
+ramdisk:
+ sudo mkdir -p /mnt/ramdisk
+ sudo mount -t tmpfs -o size=$(SIZE) tmpfs /mnt/ramdisk
+ sudo chown -R ${USER}:${USER} /mnt/ramdisk
+
+.PHONY: ramdisk-virtualenv
+ramdisk-virtualenv: ramdisk
+ [ ! -e "/mnt/ramdisk/.venv/bin/activate" ] && \
+ $(PY) -m venv /mnt/ramdisk/.venv
+ echo "/mnt/ramdisk/.venv" > $(venv_file)
+
+.PHONY: virtualenv
+virtualenv:
+ [ ! -e $(venv_dir) ] && rm -rvf $(venv_file) && python -m venv $(venv_dir)
+ @echo $(venv_dir) > $(venv_file)
+
+.PHONY: test-install
+test-install:
+test-install: $(if $(RAMDISK), ramdisk-virtualenv virtualenv)
+ . $(get_venv_path)/bin/activate && \
+ python -m pip install --upgrade pip -e .[tests,dev] && \
+ pipenv install --dev && \
+ pipenv run python -m pip install --upgrade -e .[tests,dev]
+
+.PHONY: submodules
+submodules:
+ git submodule sync
+ git submodule update --init --recursive
+
+# Run the tests within ramdisk by setting RAMDISK=1
+# e.g make tests RAMDISK=1
+.PHONY: tests
+tests: parallel ?= -n auto
+tests: suite ?=
+tests: submodules test-install
+ source $(get_venv_path)/bin/activate && \
+ pipenv run pytest -ra $(parallel) -vvv --full-trace --tb=long $(suite)
+
+.PHONY: vendor
+vendor: virtualenv
+ . $(get_venv_path)/bin/activate && \
+ python -m pip install invoke && \
+ python -m pip install -e .[dev] && \
+ python -m invoke vendoring.update
+
+.PHONY: test-specific
+test-specific: submodules virtualenv test-install
+ . $(get_venv_path)/bin/activate && pipenv run pytest -ra -k '$(tests)'
+
+.PHONY: retest
+retest: parallel ?= -n auto
+retest: virtualenv submodules test-install
+ . $(get_venv_path)/bin/activate && pipenv run pytest $(parallel) -ra -k 'test_check_unused or test_install_editable_git_tag or test_get_vcs_refs or test_skip_requirements_when_pipfile or test_editable_vcs_install or test_basic_vcs_install or test_git_vcs_install or test_ssh_vcs_install or test_vcs_can_use_markers' -vvv --full-trace --tb=long
+
+.PHONY: build
+build: install-virtualenvs.stamp install.stamp
+ PIPENV_PYTHON=3.8 pipenv run python -m build
+
+.PHONY: update-version
+update-version:
+ @sed -i "s/^__version__ = .\+$\/__version__ = \"$(DATE_STRING)\"/g" ./pipenv/__version__.py
+
+.PHONY: update-prerelease-version
+update-prerelease-version:
+ @sed -i "s/^__version__ = .\+$\/__version__ = \"$(THIS_MONTH_DATE).a1\"/g" ./pipenv/__version__.py
+
+.PHONY: pre-bump
+pre-bump:
+ @sed -i "s/^__version__ = .\+$\/__version__ = \"$(NEXT_MONTH_DATE).dev0\"/g" ./pipenv/__version__.py
+
+.PHONY: lint
+lint:
+ ruff .
+
man:
- cd docs && make man
- mv docs/_build/man/pipenv.1 pipenv/pipenv.1
+ $(MAKE) -C docs $@
+
+.PHONY: check
+check: build.stamp
+ pipenv run twine check dist/* && pipenv run check-manifest .
+
+.PHONY: upload-test
+upload-test: build
+ twine upload --repository=testpypi dist/*
+
+.PHONY: clean-py%
+clean-py%:
+ @echo "cleaning environment for $@..."
+ PIPENV_PYTHON="$(subst clean-py,,$@)" pipenv --rm
+
+.PHONY: cleanbuild
+cleanbuild:
+ @echo "cleaning up existing builds..."
+ @rm -rf build/ dist/
+ @rm -rf build.stamp
+
+.PHONY: clean
+clean:
+ rm -rf install.stamp build.stamp install-virtualenvs.stamp .git-checkout-dir
+
+.PHONY: gitclean
+gitclean:
+ @echo "Cleaning up git trees..."
+ @rm -rf $(file < .git-checkout-dir)
+ @echo "Cleaning up git checkout stamp"
+ @rm -rf .git-checkout-dir
+
+.git-checkout-dir:
+ @echo "Creating git repo temp file"
+ @echo "Creating git checkout stamp file at .git-checkout-dir"
+ @echo $(file > $(CURDIR)/.git-checkout-dir,$(shell mktemp -dt pipenv-vendor-XXXXXXXX 2>/dev/null || mktemp -d 2>/dev/null))
+
+.PHONY: clone-pip
+clone-pip: .git-checkout-dir
+ [ -e $(pip-checkout-dir) ] && echo "Pip already exists, moving on!" || git clone https://github.com/pypa/pip.git $(pip-checkout-dir) -b $(PATCHED_PIP_VERSION)
+
+.PHONY: patch-pip
+patch-pip: clone-pip
+ @find $(CURDIR)/tasks/vendoring/patches/patched/ -regex ".*/pip[0-9]+.patch" -exec cp {} $(pip-checkout-dir) \;
+ @sed -i -r 's:([a-b]\/)pipenv/patched/:\1src/:g' $(pip-checkout-dir)/*.patch
+ @find $(CURDIR)/tasks/vendoring/patches/patched/ -regex ".*/_post-pip-[^/\.]*.patch" -exec cp {} $(pip-checkout-dir)/ \;
+ @sed -i -r 's:([a-b]\/)pipenv/patched/not:\1src/:g' $(pip-checkout-dir)/_post-*.patch
+ @cd $(pip-checkout-dir)/ && git apply --ignore-whitespace --verbose pip*.patch
+ @echo "Head to $(pip-checkout-dir) to update the pip patches to the latest version"
+
+.PHONY: patches
+patches: patch-pip
+
+.PHONY: reimport-pip-patch
+reimport-pip-patch:
+ @sed -i -r 's:([a-b]\/)src/:\1pipenv/patched/not:g' $(pip-checkout-dir)/_post-*.patch
+ @sed -i -r 's:([a-b]\/)src/:\1pipenv/patched/:g' $(pip-checkout-dir)/pip*.patch
+ @find $(pip-checkout-dir) -maxdepth 1 -regex ".*/pip[0-9]+.patch" -exec cp {} $(CURDIR)/tasks/vendoring/patches/patched/ \;
+ @find $(pip-checkout-dir) -maxdepth 1 -regex ".*/_post-pip-[^/\.]*.patch" -exec cp {} $(CURDIR)/tasks/vendoring/patches/patched/ \;
+
+
+.PHONY: pypi-server
+pypi-server: SERVER ?= gunicorn
+pypi-server:
+ pipenv run pypi-server run --server $(SERVER) -v --host=0.0.0.0 --port=8080 --hash-algo=sha256 --disable-fallback --welcome /dev/null ./tests/pypi/ ./tests/fixtures
+
+.PHONY: benchmark
+benchmark:
+ cd benchmarks && python benchmark.py
+
+.PHONY: benchmark-clean
+benchmark-clean:
+ cd benchmarks && rm -f requirements.txt Pipfile.lock stats.csv *-results.json
+ cd benchmarks && rm -rf timings/
diff --git a/NOTICES b/NOTICES
index e6475ef8eb..8ba4ddc1c3 100644
--- a/NOTICES
+++ b/NOTICES
@@ -1,3 +1,5 @@
-The contents of the vendor and pactched directories are subject to different licenses
-than the rest of this project. Their respective licenses can be looked
-up at pypi.python.org.
+The contents of the vendor and patched directories are subject to different licenses
+than the rest of this project.
+
+Their respective licenses can be looked up at pypi.python.org or in their
+corresponding LICENSE files.
diff --git a/Pipfile b/Pipfile
index a7b234e734..8aa0660c23 100644
--- a/Pipfile
+++ b/Pipfile
@@ -1,10 +1,43 @@
-[dev-packages]
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
-"flake8" = ">=3.3.0,<4"
-pytest = "*"
-mock = "*"
-sphinx = "<=1.5.5"
-"-e ." = "*"
+[dev-packages]
+urllib3 = ">=2.7.0"
+requests = ">=2.34.2"
+sphinx = "*"
+sphinx-click = "==4.*"
+sphinxcontrib-spelling = "==7.*"
+click = "==8.0.3"
+stdeb = {version="*", sys_platform = "== 'linux'"}
+pre-commit = "==2.*"
+atomicwrites = {version = "*", sys_platform = "== 'win32'"}
+pytest-cov = "==4.*"
+typing-extensions = "==4.*"
+waitress = {version = "3.*", sys_platform = "== 'win32'"}
+gunicorn = {version = "26.0.*", sys_platform = "== 'linux'"}
+parse = "*"
+myst-parser = {extras = ["linkify"], version = "*"}
+invoke = "*"
+exceptiongroup = "==1.1.0"
+pyyaml = "==6.0.1"
+build = "*"
twine = "*"
-"sphinx-click" = "*"
-"pytest-xdist" = "*"
\ No newline at end of file
+semver = "*"
+pypiserver = "*"
+tomli = "*"
+bottle = "*"
+legacy-cgi = {version = "*", markers = "python_version >= '3.13'"}
+pytest-rerunfailures = "*"
+
+[packages]
+pytz = "*"
+
+[scripts]
+tests = "bash ./run-tests.sh"
+test = "pytest -vvs"
+
+[pipenv]
+allow_prereleases = true
+use_pylock = true
diff --git a/Pipfile.lock b/Pipfile.lock
new file mode 100644
index 0000000000..2095392a95
--- /dev/null
+++ b/Pipfile.lock
@@ -0,0 +1,1579 @@
+{
+ "_meta": {
+ "hash": {
+ "sha256": "43665a86f35b3a62925ace26928f538760c5599356554a43a0a7c0a3be14681d"
+ },
+ "pipfile-spec": 6,
+ "requires": {},
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "exceptiongroup": {
+ "hashes": [
+ "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219",
+ "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==1.3.1"
+ },
+ "iniconfig": {
+ "hashes": [
+ "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730",
+ "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"
+ ],
+ "markers": "python_version >= '3.10'",
+ "version": "==2.3.0"
+ },
+ "packaging": {
+ "hashes": [
+ "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e",
+ "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==26.2"
+ },
+ "pluggy": {
+ "hashes": [
+ "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3",
+ "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==1.6.0"
+ },
+ "pygments": {
+ "hashes": [
+ "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f",
+ "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2.20.0"
+ },
+ "pytest": {
+ "hashes": [
+ "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9",
+ "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.10'",
+ "version": "==9.0.3"
+ },
+ "pytz": {
+ "hashes": [
+ "sha256:3378dde6a0c3d26719182142c56e60c7f9af7e968076f31aae569d72a0358ee1",
+ "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a"
+ ],
+ "version": "==2026.1.post1"
+ },
+ "tomli": {
+ "hashes": [
+ "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853",
+ "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe",
+ "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5",
+ "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d",
+ "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd",
+ "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26",
+ "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54",
+ "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6",
+ "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c",
+ "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a",
+ "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd",
+ "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f",
+ "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5",
+ "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9",
+ "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662",
+ "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9",
+ "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1",
+ "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585",
+ "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e",
+ "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c",
+ "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41",
+ "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f",
+ "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085",
+ "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15",
+ "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7",
+ "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c",
+ "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36",
+ "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076",
+ "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac",
+ "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8",
+ "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232",
+ "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece",
+ "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a",
+ "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897",
+ "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d",
+ "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4",
+ "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917",
+ "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396",
+ "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a",
+ "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc",
+ "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba",
+ "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f",
+ "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257",
+ "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30",
+ "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf",
+ "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9",
+ "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.4.1"
+ },
+ "typing-extensions": {
+ "hashes": [
+ "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466",
+ "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==4.15.0"
+ }
+ },
+ "develop": {
+ "alabaster": {
+ "hashes": [
+ "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e",
+ "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==1.0.0"
+ },
+ "arpeggio": {
+ "hashes": [
+ "sha256:9374d9c531b62018b787635f37fd81c9a6ee69ef2d28c5db3cd18791b1f7db2f",
+ "sha256:9e85ad35cfc6c938676817c7ae9a1000a7c72a34c71db0c687136c460d12b85e"
+ ],
+ "markers": "'dev' in dependency_groups",
+ "version": "==2.0.3"
+ },
+ "atomicwrites": {
+ "hashes": [
+ "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"
+ ],
+ "markers": "('dev' in dependency_groups) and (sys_platform == 'win32')",
+ "version": "==1.4.1"
+ },
+ "attrs": {
+ "hashes": [
+ "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11",
+ "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==25.4.0"
+ },
+ "babel": {
+ "hashes": [
+ "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d",
+ "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.8')",
+ "version": "==2.18.0"
+ },
+ "beautifulsoup4": {
+ "hashes": [
+ "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb",
+ "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_full_version >= '3.7.0')",
+ "version": "==4.14.3"
+ },
+ "black": {
+ "hashes": [
+ "sha256:0126ae5b7c09957da2bdbd91a9ba1207453feada9e9fe51992848658c6c8e01c",
+ "sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7",
+ "sha256:28ef38aee69e4b12fda8dba75e21f9b4f979b490c8ac0baa7cb505369ac9e1ff",
+ "sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b",
+ "sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07",
+ "sha256:2d6bfaf7fd0993b420bed691f20f9492d53ce9a2bcccea4b797d34e947318a78",
+ "sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f",
+ "sha256:474c27574d6d7037c1bc875a81d9be0a9a4f9ee95e62800dab3cfaadbf75acd5",
+ "sha256:5602bdb96d52d2d0672f24f6ffe5218795736dd34807fd0fd55ccd6bf206168b",
+ "sha256:5e9d0d86df21f2e1677cc4bd090cd0e446278bcbbe49bf3659c308c3e402843e",
+ "sha256:5ed0ca58586c8d9a487352a96b15272b7fa55d139fc8496b519e78023a8dab0a",
+ "sha256:6c54a4a82e291a1fee5137371ab488866b7c86a3305af4026bdd4dc78642e1ac",
+ "sha256:6e131579c243c98f35bce64a7e08e87fb2d610544754675d4a0e73a070a5aa3a",
+ "sha256:855822d90f884905362f602880ed8b5df1b7e3ee7d0db2502d4388a954cc8c54",
+ "sha256:86a8b5035fce64f5dcd1b794cf8ec4d31fe458cf6ce3986a30deb434df82a1d2",
+ "sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f",
+ "sha256:92c0ec1f2cc149551a2b7b47efc32c866406b6891b0ee4625e95967c8f4acfb1",
+ "sha256:9a5e9f45e5d5e1c5b5c29b3bd4265dcc90e8b92cf4534520896ed77f791f4da5",
+ "sha256:afc622538b430aa4c8c853f7f63bc582b3b8030fd8c80b70fb5fa5b834e575c2",
+ "sha256:b07fc0dab849d24a80a29cfab8d8a19187d1c4685d8a5e6385a5ce323c1f015f",
+ "sha256:b5e6f89631eb88a7302d416594a32faeee9fb8fb848290da9d0a5f2903519fc1",
+ "sha256:bf9bf162ed91a26f1adba8efda0b573bc6924ec1408a52cc6f82cb73ec2b142c",
+ "sha256:c7e72339f841b5a237ff14f7d3880ddd0fc7f98a1199e8c4327f9a4f478c1839",
+ "sha256:ddb113db38838eb9f043623ba274cfaf7d51d5b0c22ecb30afe58b1bb8322983",
+ "sha256:dfdd51fc3e64ea4f35873d1b3fb25326773d55d2329ff8449139ebaad7357efb",
+ "sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56",
+ "sha256:f89f2ab047c76a9c03f78d0d66ca519e389519902fa27e7a91117ef7611c0568"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==26.3.1"
+ },
+ "bottle": {
+ "hashes": [
+ "sha256:045684fbd2764eac9cdeb824861d1551d113e8b683d8d26e296898d3dd99a12e",
+ "sha256:787e78327e12b227938de02248333d788cfe45987edca735f8f88e03472c3f47"
+ ],
+ "markers": "'dev' in dependency_groups",
+ "version": "==0.13.4"
+ },
+ "build": {
+ "hashes": [
+ "sha256:6a07c1b8eb6f2b311b96fcbdbce5dab5fe637ffda0fd83c9cac622e927501596",
+ "sha256:f1b91b925aa322be454f8330c6fb48b465da993d1e7e7e6fa35027ec49f3c936"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==1.4.0"
+ },
+ "certifi": {
+ "hashes": [
+ "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a",
+ "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==2026.4.22"
+ },
+ "cffi": {
+ "hashes": [
+ "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb",
+ "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b",
+ "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f",
+ "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9",
+ "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44",
+ "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2",
+ "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c",
+ "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75",
+ "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65",
+ "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e",
+ "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a",
+ "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e",
+ "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25",
+ "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a",
+ "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe",
+ "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b",
+ "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91",
+ "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592",
+ "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187",
+ "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c",
+ "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1",
+ "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94",
+ "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba",
+ "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb",
+ "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165",
+ "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529",
+ "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca",
+ "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c",
+ "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6",
+ "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c",
+ "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0",
+ "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743",
+ "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63",
+ "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5",
+ "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5",
+ "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4",
+ "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d",
+ "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b",
+ "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93",
+ "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205",
+ "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27",
+ "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512",
+ "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d",
+ "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c",
+ "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037",
+ "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26",
+ "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322",
+ "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb",
+ "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c",
+ "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8",
+ "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4",
+ "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414",
+ "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9",
+ "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664",
+ "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9",
+ "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775",
+ "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739",
+ "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc",
+ "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062",
+ "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe",
+ "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9",
+ "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92",
+ "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5",
+ "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13",
+ "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d",
+ "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26",
+ "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f",
+ "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495",
+ "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b",
+ "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6",
+ "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c",
+ "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef",
+ "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5",
+ "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18",
+ "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad",
+ "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3",
+ "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7",
+ "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5",
+ "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534",
+ "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49",
+ "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2",
+ "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5",
+ "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453",
+ "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2.0.0"
+ },
+ "cfgv": {
+ "hashes": [
+ "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0",
+ "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==3.5.0"
+ },
+ "charset-normalizer": {
+ "hashes": [
+ "sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc",
+ "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c",
+ "sha256:07d9e39b01743c3717745f4c530a6349eadbfa043c7577eef86c502c15df2c67",
+ "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4",
+ "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0",
+ "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c",
+ "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5",
+ "sha256:12a6fff75f6bc66711b73a2f0addfc4c8c15a20e805146a02d147a318962c444",
+ "sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153",
+ "sha256:14265bfe1f09498b9d8ec91e9ec9fa52775edf90fcbde092b25f4a33d444fea9",
+ "sha256:16d971e29578a5e97d7117866d15889a4a07befe0e87e703ed63cd90cb348c01",
+ "sha256:177a0ba5f0211d488e295aaf82707237e331c24788d8d76c96c5a41594723217",
+ "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b",
+ "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c",
+ "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a",
+ "sha256:1dc8b0ea451d6e69735094606991f32867807881400f808a106ee1d963c46a83",
+ "sha256:1efde3cae86c8c273f1eb3b287be7d8499420cf2fe7585c41d370d3e790054a5",
+ "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7",
+ "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb",
+ "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c",
+ "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1",
+ "sha256:2cd4a60d0e2fb04537162c62bbbb4182f53541fe0ede35cdf270a1c1e723cc42",
+ "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab",
+ "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df",
+ "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e",
+ "sha256:320ade88cfb846b8cd6b4ddf5ee9e80ee0c1f52401f2456b84ae1ae6a1a5f207",
+ "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18",
+ "sha256:36836d6ff945a00b88ba1e4572d721e60b5b8c98c155d465f56ad19d68f23734",
+ "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38",
+ "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110",
+ "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18",
+ "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44",
+ "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d",
+ "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48",
+ "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e",
+ "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5",
+ "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d",
+ "sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53",
+ "sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790",
+ "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c",
+ "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b",
+ "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116",
+ "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d",
+ "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10",
+ "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6",
+ "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2",
+ "sha256:6370e8686f662e6a3941ee48ed4742317cafbe5707e36406e9df792cdb535776",
+ "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a",
+ "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265",
+ "sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008",
+ "sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943",
+ "sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374",
+ "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246",
+ "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e",
+ "sha256:6e0d51f618228538a3e8f46bd246f87a6cd030565e015803691603f55e12afb5",
+ "sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616",
+ "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15",
+ "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41",
+ "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960",
+ "sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752",
+ "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e",
+ "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72",
+ "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7",
+ "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8",
+ "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b",
+ "sha256:813c0e0132266c08eb87469a642cb30aaff57c5f426255419572aaeceeaa7bf4",
+ "sha256:82b271f5137d07749f7bf32f70b17ab6eaabedd297e75dce75081a24f76eb545",
+ "sha256:84c018e49c3bf790f9c2771c45e9313a08c2c2a6342b162cd650258b57817706",
+ "sha256:8751d2787c9131302398b11e6c8068053dcb55d5a8964e114b6e196cf16cb366",
+ "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb",
+ "sha256:87fad7d9ba98c86bcb41b2dc8dbb326619be2562af1f8ff50776a39e55721c5a",
+ "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e",
+ "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00",
+ "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f",
+ "sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a",
+ "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1",
+ "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66",
+ "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356",
+ "sha256:a6c5863edfbe888d9eff9c8b8087354e27618d9da76425c119293f11712a6319",
+ "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4",
+ "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad",
+ "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d",
+ "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5",
+ "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7",
+ "sha256:aef65cd602a6d0e0ff6f9930fcb1c8fec60dd2cfcb6facaf4bdb0e5873042db0",
+ "sha256:af21eb4409a119e365397b2adbaca4c9ccab56543a65d5dbd9f920d6ac29f686",
+ "sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34",
+ "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49",
+ "sha256:bb8cc7534f51d9a017b93e3e85b260924f909601c3df002bcdb58ddb4dc41a5c",
+ "sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1",
+ "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e",
+ "sha256:bd9b23791fe793e4968dba0c447e12f78e425c59fc0e3b97f6450f4781f3ee60",
+ "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0",
+ "sha256:c0f081d69a6e58272819b70288d3221a6ee64b98df852631c80f293514d3b274",
+ "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d",
+ "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0",
+ "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae",
+ "sha256:c593052c465475e64bbfe5dbd81680f64a67fdc752c56d7a0ae205dc8aeefe0f",
+ "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d",
+ "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe",
+ "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3",
+ "sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393",
+ "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1",
+ "sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af",
+ "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44",
+ "sha256:d61f00a0869d77422d9b2aba989e2d24afa6ffd552af442e0e58de4f35ea6d00",
+ "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c",
+ "sha256:dca4bbc466a95ba9c0234ef56d7dd9509f63da22274589ebd4ed7f1f4d4c54e3",
+ "sha256:dd915403e231e6b1809fe9b6d9fc55cf8fb5e02765ac625d9cd623342a7905d7",
+ "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd",
+ "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e",
+ "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b",
+ "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8",
+ "sha256:e5f4d355f0a2b1a31bc3edec6795b46324349c9cb25eed068049e4f472fb4259",
+ "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859",
+ "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46",
+ "sha256:e80c8378d8f3d83cd3164da1ad2df9e37a666cdde7b1cb2298ed0b558064be30",
+ "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b",
+ "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46",
+ "sha256:ed065083d0898c9d5b4bbec7b026fd755ff7454e6e8b73a67f8c744b13986e24",
+ "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a",
+ "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24",
+ "sha256:f22dec1690b584cea26fade98b2435c132c1b5f68e39f5a0b7627cd7ae31f1dc",
+ "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215",
+ "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063",
+ "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832",
+ "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6",
+ "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79",
+ "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==3.4.7"
+ },
+ "click": {
+ "hashes": [
+ "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3",
+ "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.6')",
+ "version": "==8.0.3"
+ },
+ "coverage": {
+ "extras": [
+ "toml"
+ ],
+ "hashes": [
+ "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256",
+ "sha256:02ca0eed225b2ff301c474aeeeae27d26e2537942aa0f87491d3e147e784a82b",
+ "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5",
+ "sha256:0428cbef5783ad91fe240f673cc1f76b25e74bbfe1a13115e4aa30d3f538162d",
+ "sha256:04690832cbea4e4663d9149e05dba142546ca05cb1848816760e7f58285c970a",
+ "sha256:0590e44dd2745c696a778f7bab6aa95256de2cbc8b8cff4f7db8ff09813d6969",
+ "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642",
+ "sha256:084b84a8c63e8d6fc7e3931b316a9bcafca1458d753c539db82d31ed20091a87",
+ "sha256:0b67af5492adb31940ee418a5a655c28e48165da5afab8c7fa6fd72a142f8740",
+ "sha256:0cd9ed7a8b181775459296e402ca4fb27db1279740a24e93b3b41942ebe4b215",
+ "sha256:0cef0cdec915d11254a7f549c1170afecce708d30610c6abdded1f74e581666d",
+ "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422",
+ "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8",
+ "sha256:0ecf12ecb326fe2c339d93fc131816f3a7367d223db37817208905c89bded911",
+ "sha256:10a0c37f0b646eaff7cce1874c31d1f1ccb297688d4c747291f4f4c70741cc8b",
+ "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587",
+ "sha256:1b11eef33edeae9d142f9b4358edb76273b3bfd30bc3df9a4f95d0e49caf94e8",
+ "sha256:1b88c69c8ef5d4b6fe7dea66d6636056a0f6a7527c440e890cf9259011f5e606",
+ "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9",
+ "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf",
+ "sha256:2aa055ae1857258f9e0045be26a6d62bdb47a72448b62d7b55f4820f361a2633",
+ "sha256:2d3807015f138ffea1ed9afeeb8624fd781703f2858b62a8dd8da5a0994c57b6",
+ "sha256:301e3b7dfefecaca37c9f1aa6f0049b7d4ab8dd933742b607765d757aca77d43",
+ "sha256:32ca0c0114c9834a43f045a87dcebd69d108d8ffb666957ea65aa132f50332e2",
+ "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61",
+ "sha256:356e76b46783a98c2a2fe81ec79df4883a1e62895ea952968fb253c114e7f930",
+ "sha256:35a31f2b1578185fbe6aa2e74cea1b1d0bbf4c552774247d9160d29b80ed56cc",
+ "sha256:380e8e9084d8eb38db3a9176a1a4f3c0082c3806fa0dc882d1d87abc3c789247",
+ "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75",
+ "sha256:3e1bb5f6c78feeb1be3475789b14a0f0a5b47d505bfc7267126ccbd50289999e",
+ "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376",
+ "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01",
+ "sha256:48c39bc4a04d983a54a705a6389512883d4a3b9862991b3617d547940e9f52b1",
+ "sha256:4b59148601efcd2bac8c4dbf1f0ad6391693ccf7a74b8205781751637076aee3",
+ "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743",
+ "sha256:505d7083c8b0c87a8fa8c07370c285847c1f77739b22e299ad75a6af6c32c5c9",
+ "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf",
+ "sha256:5b13955d31d1633cf9376908089b7cebe7d15ddad7aeaabcbe969a595a97e95e",
+ "sha256:5ec4af212df513e399cf11610cc27063f1586419e814755ab362e50a85ea69c1",
+ "sha256:60365289c3741e4db327e7baff2a4aaacf22f788e80fa4683393891b70a89fbd",
+ "sha256:631efb83f01569670a5e866ceb80fe483e7c159fac6f167e6571522636104a0b",
+ "sha256:6697e29b93707167687543480a40f0db8f356e86d9f67ddf2e37e2dfd91a9dab",
+ "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d",
+ "sha256:67e9bc5449801fad0e5dff329499fb090ba4c5800b86805c80617b4e29809b2a",
+ "sha256:68a4953be99b17ac3c23b6efbc8a38330d99680c9458927491d18700ef23ded0",
+ "sha256:6c36ddb64ed9d7e496028d1d00dfec3e428e0aabf4006583bb1839958d280510",
+ "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f",
+ "sha256:7034b5c56a58ae5e85f23949d52c14aca2cfc6848a31764995b7de88f13a1ea0",
+ "sha256:704de6328e3d612a8f6c07000a878ff38181ec3263d5a11da1db294fa6a9bdf8",
+ "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf",
+ "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209",
+ "sha256:750db93a81e3e5a9831b534be7b1229df848b2e125a604fe6651e48aa070e5f9",
+ "sha256:777c4d1eff1b67876139d24288aaf1817f6c03d6bae9c5cc8d27b83bcfe38fe3",
+ "sha256:78e696e1cc714e57e8b25760b33a8b1026b7048d270140d25dafe1b0a1ee05a3",
+ "sha256:79060214983769c7ba3f0cee10b54c97609dca4d478fa1aa32b914480fd5738d",
+ "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd",
+ "sha256:7f2c47b36fe7709a6e83bfadf4eefb90bd25fbe4014d715224c4316f808e59a2",
+ "sha256:800bc829053c80d240a687ceeb927a94fd108bbdc68dfbe505d0d75ab578a882",
+ "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09",
+ "sha256:8769751c10f339021e2638cd354e13adeac54004d1941119b2c96fe5276d45ea",
+ "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c",
+ "sha256:8fdf453a942c3e4d99bd80088141c4c6960bb232c409d9c3558e2dbaa3998562",
+ "sha256:941617e518602e2d64942c88ec8499f7fbd49d3f6c4327d3a71d43a1973032f3",
+ "sha256:972a9cd27894afe4bc2b1480107054e062df08e671df7c2f18c205e805ccd806",
+ "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e",
+ "sha256:9b74db26dfea4f4e50d48a4602207cd1e78be33182bc9cbf22da94f332f99878",
+ "sha256:9bb2a28101a443669a423b665939381084412b81c3f8c0fcfbac57f4e30b5b8e",
+ "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9",
+ "sha256:9dacc2ad679b292709e0f5fc1ac74a6d4d5562e424058962c7bb0c658ad25e45",
+ "sha256:9ddb4f4a5479f2539644be484da179b653273bca1a323947d48ab107b3ed1f29",
+ "sha256:a1a6d79a14e1ec1832cabc833898636ad5f3754a678ef8bb4908515208bf84f4",
+ "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c",
+ "sha256:ad14385487393e386e2ea988b09d62dd42c397662ac2dabc3832d71253eee479",
+ "sha256:ad146744ca4fd09b50c482650e3c1b1f4dfa1d4792e0a04a369c7f23336f0400",
+ "sha256:b5db73ba3c41c7008037fa731ad5459fc3944cb7452fc0aa9f822ad3533c583c",
+ "sha256:bd3a2fbc1c6cccb3c5106140d87cc6a8715110373ef42b63cf5aea29df8c217a",
+ "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf",
+ "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686",
+ "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de",
+ "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028",
+ "sha256:c555b48be1853fe3997c11c4bd521cdd9a9612352de01fa4508f16ec341e6fe0",
+ "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179",
+ "sha256:c9136ff29c3a91e25b1d1552b5308e53a1e0653a23e53b6366d7c2dcbbaf8a16",
+ "sha256:ce1998c0483007608c8382f4ff50164bfc5bd07a2246dd272aa4043b75e61e85",
+ "sha256:cec2d83125531bd153175354055cdb7a09987af08a9430bd173c937c6d0fba2a",
+ "sha256:cff784eef7f0b8f6cb28804fbddcfa99f89efe4cc35fb5627e3ac58f91ed3ac0",
+ "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810",
+ "sha256:d7cfad2d6d81dd298ab6b89fe72c3b7b05ec7544bdda3b707ddaecff8d25c161",
+ "sha256:d8a7a2049c14f413163e2bdabd37e41179b1d1ccb10ffc6ccc4b7a718429c607",
+ "sha256:da305e9937617ee95c2e39d8ff9f040e0487cbf1ac174f777ed5eddd7a7c1f26",
+ "sha256:da86cdcf10d2519e10cabb8ac2de03da1bcb6e4853790b7fbd48523332e3a819",
+ "sha256:dc022073d063b25a402454e5712ef9e007113e3a676b96c5f29b2bda29352f40",
+ "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5",
+ "sha256:e092b9499de38ae0fbfbc603a74660eb6ff3e869e507b50d85a13b6db9863e15",
+ "sha256:e0b216a19534b2427cc201a26c25da4a48633f29a487c61258643e89d28200c0",
+ "sha256:e1c85e0b6c05c592ea6d8768a66a254bfb3874b53774b12d4c89c481eb78cb90",
+ "sha256:e301d30dd7e95ae068671d746ba8c34e945a82682e62918e41b2679acd2051a0",
+ "sha256:e808af52a0513762df4d945ea164a24b37f2f518cbe97e03deaa0ee66139b4d6",
+ "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a",
+ "sha256:eb7fdf1ef130660e7415e0253a01a7d5a88c9c4d158bcf75cbbd922fd65a5b58",
+ "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b",
+ "sha256:ee2aa19e03161671ec964004fb74b2257805d9710bf14a5c704558b9d8dbaf17",
+ "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5",
+ "sha256:f4cd16206ad171cbc2470dbea9103cf9a7607d5fe8c242fdf1edf36174020664",
+ "sha256:f70c9ab2595c56f81a89620e22899eea8b212a4041bd728ac6f4a28bf5d3ddd0",
+ "sha256:fbabfaceaeb587e16f7008f7795cd80d20ec548dc7f94fbb0d4ec2e038ce563f"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==7.13.5"
+ },
+ "cryptography": {
+ "hashes": [
+ "sha256:08a597acce1ff37f347400087776599e2348a3a8bc53b44120e463cd274efe4a",
+ "sha256:09f73a725d582cef64b91281a322cd798d14a33b2b6f2b7ad9531dc336d84c02",
+ "sha256:0df56b056bc17c1b7d6821dfa65216e62bd232d8ab05eb3db44e71d235651471",
+ "sha256:0ee6ea481db1ab889cba043ec1eda17bb9c1ea79db6722f779c3667f9f70322f",
+ "sha256:15254441469dd6bf027039453288e2072124f8b6603563f5d759e1c9b69273fa",
+ "sha256:266f4ee051abb2f725b74ef8072b521ce1feacf685a3364fa6a6b45548db791a",
+ "sha256:2c37f2461406063b417837f5f3daab668652acd82423efcd7f0a9f04be972de1",
+ "sha256:32143b24adb918f078134e1e230f1eb8cc04886b92c28b5f0041aaf3e5699225",
+ "sha256:33842cf0888951cef5bc7ac724ab844a42044c1727b967b7f8997289a0464f92",
+ "sha256:3752f2dbc8f07a30aad2932c986cea495b03bb554887828225da104f732852b6",
+ "sha256:39489bfca54c7a1f6b297efcd8bc608ab92d16c4ca631b0cad4da46724588b24",
+ "sha256:3e4a1a3232eef2e6c732827d5722db29a0cc8b27af2a4d865b094cf954be9ca1",
+ "sha256:3fd2ca57062b241c856670b073487d2e86c4637937ca5601e48f97bf8e11fc8f",
+ "sha256:42fcd8e26fe555d9b3577a135f5091fefa0aa4e99129c23fb56787a1bd4ada72",
+ "sha256:43c5835e2cb98c8733d86f57d6fc879b613f5c3478607281c3e36daffc6dd8a6",
+ "sha256:48fe40804d4caa2288f24e70ca8c64c42dd826da0ad7e4f1b41b2128d679e6c8",
+ "sha256:4ab0a343c807bbcd90c971cd1ecf072937cd01847a9e002bef88fb47ac6be577",
+ "sha256:4fdc69f8e4316bcf0c8c8ec1f26f285d12e8142d88d96c876a59a03be3f6ae67",
+ "sha256:6184ca7b174f28d7c703f1290d4b297217c45355f77a98f67e9b7f14549ac54a",
+ "sha256:66fd0771e7b9c6dcd44cf1120690d2338d16d72795cf40cae2786a39eba65429",
+ "sha256:6b2c0c3e6ccf3ade7750f836ef3ee36eea250cc467d45c256895573ac08cc6f1",
+ "sha256:735824ec41b7f74a7c45fb1591349333e4c696cb6c044e5f46356e560143e4cd",
+ "sha256:7e234ac052af99f2700826a5c29ea99d9c1b1f80341cde62d11c8154dc8e0bd9",
+ "sha256:869c3b8a53bfe27147832df48b32adadf558249d50e76cb3769d40e986b13265",
+ "sha256:86be3b1b0b6bf09482fb50a979c508d2950ed95f5621ec77f4e385962006b83a",
+ "sha256:86fe77abb1bd87afb251d4d02ada7ecf53a32cee9b67d976abb2e45a13297475",
+ "sha256:88c852a0ae366e262e5a1744b685e6a433dc8788dd2a277e418bf4904203609d",
+ "sha256:8ace4507d1e6533c125f4fac754f8bb8b6a74c08e92179dabd7e16571a3efbf3",
+ "sha256:92a46e1d638daa264ba2971c0b0489c9409787943efae4d60ffda3d091ef832c",
+ "sha256:9621de99d2da096006b629979efd8ae7eb2d8b822488d0c89ee4000c306c59b1",
+ "sha256:9a49ca6c81417f6a5edb50375a60cccdd70fa0a91a5211829dbea74eba94d2ac",
+ "sha256:9bd3f92d76217892b15df84ca256c2c113d386fdda7a7d8691aeeced976507c6",
+ "sha256:9de21387aa95e2a895823d0745b430bed4f33503ba9ab5e0b5311f33e37d66d2",
+ "sha256:b024e784ad6c077ee0147b35ea9cbfc1e34e1fd4c1dcca214c2794d73a12df08",
+ "sha256:b4e391975f038e66432328639620a4aff2d307513b004f1ca06d6225bced815c",
+ "sha256:b74ca3b8e5ecdd833bf6a002ca41b4793bb27fb8f1c06ffaf2643c9e9140e31b",
+ "sha256:b7a2d1a937a738a881737cec135a38bb61470589b17515b9f73f571d0ae10401",
+ "sha256:b9a32b876490d66c8bcc9963ef220199569748434ab01a9d6aaeabf88e7f5158",
+ "sha256:bd81490cd5801d755cf97bb68ac191f14b708470b1c7cf4580f669b9c9264cd8",
+ "sha256:c1400da5e32a43253392277eac7490a60e497d810a63dd5608d71bbd7af507c9",
+ "sha256:d069066deead00ac7f090be101be875a06855908f7ec004c27b8fefb4acfb411",
+ "sha256:d5d30989c6917b478b5817902e85fddaea2261efa8648383d965381ccb9e1ac4",
+ "sha256:df637c05205ea7c1d7fbcbe54bbfea648a52951155f997af13d895d0ecc96991",
+ "sha256:e361afba8918070d376df76f408a4f67fec0ee9cff81a99e48fe9a233ef59e17",
+ "sha256:eb86ce1af36fe65041b6db9a8bb064ee621a7e5fded0f80d475ec243477cd242",
+ "sha256:f0d27a5696721ef7a672b8c810f6aded391058e0b9486e63e6d93baf765da691",
+ "sha256:f2ceef93cb096aa3c4cc4b5c94ca6131f9196d28c64d6111533402a9b2054d41",
+ "sha256:f817adc181390bd54f2f700107a7419040fb7c1bdf2fc26f36551a06a68c3345",
+ "sha256:fe0180af5bf9236518a087e35bf2d9a347d5f5f51e63c579d683ddff424e3d46"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.9' and python_full_version not in '3.9.0, 3.9.1'",
+ "version": "==48.0.1"
+ },
+ "distlib": {
+ "hashes": [
+ "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16",
+ "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d"
+ ],
+ "markers": "'dev' in dependency_groups",
+ "version": "==0.4.0"
+ },
+ "docutils": {
+ "hashes": [
+ "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968",
+ "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==0.22.4"
+ },
+ "exceptiongroup": {
+ "hashes": [
+ "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e",
+ "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.7')",
+ "version": "==1.1.0"
+ },
+ "execnet": {
+ "hashes": [
+ "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd",
+ "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.8')",
+ "version": "==2.1.2"
+ },
+ "filelock": {
+ "hashes": [
+ "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694",
+ "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==3.25.2"
+ },
+ "flake8": {
+ "hashes": [
+ "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b",
+ "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4')",
+ "version": "==3.9.2"
+ },
+ "gunicorn": {
+ "hashes": [
+ "sha256:40233d26a5f0d1872916188c276e21641155111c2853f0c2cd55260aec0d24fc",
+ "sha256:ca9346f85e3a4aeeb64d491045c16b9a35647abd37ea15efe53080eb8b090baf"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.10'",
+ "version": "==26.0.0"
+ },
+ "id": {
+ "hashes": [
+ "sha256:d0732d624fb46fd4e7bc4e5152f00214450953b9e772c182c1c22964def1a069",
+ "sha256:f5ec41ed2629a508f5d0988eda142e190c9c6da971100612c4de9ad9f9b237ca"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==1.6.1"
+ },
+ "identify": {
+ "hashes": [
+ "sha256:873ac56a5e3fd63e7438a7ecbc4d91aca692eb3fefa4534db2b7913f3fc352fd",
+ "sha256:8db9d3c8ea9079db92cafb0ebf97abdc09d52e97f4dcf773a2e694048b7cd737"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==2.6.18"
+ },
+ "idna": {
+ "hashes": [
+ "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8",
+ "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==3.15"
+ },
+ "imagesize": {
+ "hashes": [
+ "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96",
+ "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10' and python_version < '3.15')",
+ "version": "==2.0.0"
+ },
+ "iniconfig": {
+ "hashes": [
+ "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730",
+ "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==2.3.0"
+ },
+ "invoke": {
+ "hashes": [
+ "sha256:2413bc441b376e5cd3f55bb5d364f973ad8bdd7bf87e53c79de3c11bf3feecc8",
+ "sha256:515bf49b4a48932b79b024590348da22f39c4942dff991ad1fb8b8baea1be707"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.6')",
+ "version": "==2.2.1"
+ },
+ "jaraco.classes": {
+ "hashes": [
+ "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd",
+ "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.8')",
+ "version": "==3.4.0"
+ },
+ "jaraco.context": {
+ "hashes": [
+ "sha256:0df6a0287258f3e364072c3e40d5411b20cafa30cb28c4839d24319cecf9f808",
+ "sha256:bc046b2dc94f1e5532bd02402684414575cc11f565d929b6563125deb0a6e581"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==6.1.1"
+ },
+ "jaraco.functools": {
+ "hashes": [
+ "sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176",
+ "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==4.4.0"
+ },
+ "jeepney": {
+ "hashes": [
+ "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683",
+ "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.7')",
+ "version": "==0.9.0"
+ },
+ "jinja2": {
+ "hashes": [
+ "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d",
+ "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.7')",
+ "version": "==3.1.6"
+ },
+ "keyring": {
+ "hashes": [
+ "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f",
+ "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==25.7.0"
+ },
+ "legacy-cgi": {
+ "hashes": [
+ "sha256:7e235ce58bf1e25d1fc9b2d299015e4e2cd37305eccafec1e6bac3fc04b878cd",
+ "sha256:abb9dfc7835772f7c9317977c63253fd22a7484b5c9bbcdca60a29dcce97c577"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.13')",
+ "version": "==2.6.4"
+ },
+ "linkify-it-py": {
+ "hashes": [
+ "sha256:0d252c1594ecba2ecedc444053db5d3a9b7ec1b0dd929c8f1d74dce89f86c05e",
+ "sha256:43360231720999c10e9328dc3691160e27a718e280673d444c38d7d3aaa3b98b"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==2.1.0"
+ },
+ "markdown-it-py": {
+ "hashes": [
+ "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147",
+ "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==4.0.0"
+ },
+ "markupsafe": {
+ "hashes": [
+ "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f",
+ "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a",
+ "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf",
+ "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19",
+ "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf",
+ "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c",
+ "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175",
+ "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219",
+ "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb",
+ "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6",
+ "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab",
+ "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26",
+ "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1",
+ "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce",
+ "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218",
+ "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634",
+ "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695",
+ "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad",
+ "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73",
+ "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c",
+ "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe",
+ "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa",
+ "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559",
+ "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa",
+ "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37",
+ "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758",
+ "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f",
+ "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8",
+ "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d",
+ "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c",
+ "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97",
+ "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a",
+ "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19",
+ "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9",
+ "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9",
+ "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc",
+ "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2",
+ "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4",
+ "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354",
+ "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50",
+ "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698",
+ "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9",
+ "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b",
+ "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc",
+ "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115",
+ "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e",
+ "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485",
+ "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f",
+ "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12",
+ "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025",
+ "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009",
+ "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d",
+ "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b",
+ "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a",
+ "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5",
+ "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f",
+ "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d",
+ "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1",
+ "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287",
+ "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6",
+ "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f",
+ "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581",
+ "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed",
+ "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b",
+ "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c",
+ "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026",
+ "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8",
+ "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676",
+ "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6",
+ "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e",
+ "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d",
+ "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d",
+ "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01",
+ "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7",
+ "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419",
+ "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795",
+ "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1",
+ "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5",
+ "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d",
+ "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42",
+ "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe",
+ "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda",
+ "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e",
+ "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737",
+ "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523",
+ "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591",
+ "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc",
+ "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a",
+ "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==3.0.3"
+ },
+ "mccabe": {
+ "hashes": [
+ "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
+ "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
+ ],
+ "markers": "'dev' in dependency_groups",
+ "version": "==0.6.1"
+ },
+ "mdit-py-plugins": {
+ "hashes": [
+ "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f",
+ "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==0.5.0"
+ },
+ "mdurl": {
+ "hashes": [
+ "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8",
+ "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.7')",
+ "version": "==0.1.2"
+ },
+ "mock": {
+ "hashes": [
+ "sha256:4e460e818629b4b173f32d08bf30d3af8123afbb8e04bb5707a1fd4799e503f0",
+ "sha256:7ba87f72ca0e915175596069dbbcc7c75af7b5e9b9bc107ad6349ede0819982f"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.6')",
+ "version": "==5.2.0"
+ },
+ "more-itertools": {
+ "hashes": [
+ "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b",
+ "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==10.8.0"
+ },
+ "mypy-extensions": {
+ "hashes": [
+ "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505",
+ "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.8')",
+ "version": "==1.1.0"
+ },
+ "myst-parser": {
+ "hashes": [
+ "sha256:ab31e516024918296e169139072b81592336f2fef55b8986aa31c9f04b5f7211",
+ "sha256:f6f231452c56e8baa662cc352c548158f6a16fcbd6e3800fc594978002b94f3a"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.11')",
+ "version": "==5.0.0"
+ },
+ "nh3": {
+ "hashes": [
+ "sha256:0d5eb734a78ac364af1797fef718340a373f626a9ff6b4fb0b4badf7927e7b81",
+ "sha256:185ed41b88c910b9ca8edc89ca3b4be688a12cb9de129d84befa2f74a0039fee",
+ "sha256:1ef87f8e916321a88b45f2d597f29bd56e560ed4568a50f0f1305afab86b7189",
+ "sha256:21a63ccb18ddad3f784bb775955839b8b80e347e597726f01e43ca1abcc5c808",
+ "sha256:21b058cd20d9f0919421a820a2843fdb5e1749c0bf57a6247ab8f4ba6723c9fc",
+ "sha256:24769a428e9e971e4ccfb24628f83aaa7dc3c8b41b130c8ddc1835fa1c924489",
+ "sha256:2efd17c0355d04d39e6d79122b42662277ac10a17ea48831d90b46e5ef7e4fc0",
+ "sha256:3a62b8ae7c235481715055222e54c682422d0495a5c73326807d4e44c5d14691",
+ "sha256:45fe0d6a607264910daec30360c8a3b5b1500fd832d21b2da608256287bcb92d",
+ "sha256:4c730617bdc15d7092dcc0469dc2826b914c8f874996d105b4bc3842a41c1cd9",
+ "sha256:52e973cb742e95b9ae1b35822ce23992428750f4b46b619fe86eba4205255b30",
+ "sha256:5a4b2c1f3e6f3cbe7048e17f4fefad3f8d3e14cc0fd08fb8599e0d5653f6b181",
+ "sha256:5bc1d4b30ba1ba896669d944b6003630592665974bd11a3dc2f661bde92798a7",
+ "sha256:90126a834c18af03bfd6ff9a027bfa6bbf0e238527bc780a24de6bd7cc1041e2",
+ "sha256:92a958e6f6d0100e025a5686aafd67e3c98eac67495728f8bb64fbeb3e474493",
+ "sha256:9ed40cf8449a59a03aa465114fedce1ff7ac52561688811d047917cc878b19ca",
+ "sha256:a446eae598987f49ee97ac2f18eafcce4e62e7574bd1eb23782e4702e54e217d",
+ "sha256:b50c3770299fb2a7c1113751501e8878d525d15160a4c05194d7fe62b758aad8",
+ "sha256:b7a18ee057761e455d58b9d31445c3e4b2594cff4ddb84d2e331c011ef46f462",
+ "sha256:b838e619f483531483d26d889438e53a880510e832d2aafe73f93b7b1ac2bce2",
+ "sha256:e8ee96156f7dfc6e30ecda650e480c5ae0a7d38f0c6fafc3c1c655e2500421d9",
+ "sha256:e974850b131fdffa75e7ad8e0d9c7a855b96227b093417fdf1bd61656e530f37",
+ "sha256:e98fa3dbfd54e25487e36ba500bc29bca3a4cab4ffba18cfb1a35a2d02624297",
+ "sha256:f433a2dd66545aad4a720ad1b2150edcdca75bfff6f4e6f378ade1ec138d5e77",
+ "sha256:f4400a73c2a62859e769f9d36d1b5a7a5c65c4179d1dddd2f6f3095b2db0cbfc",
+ "sha256:f508ddd4e2433fdcb78c790fc2d24e3a349ba775e5fa904af89891321d4844a3",
+ "sha256:fc305a2264868ec8fa16548296f803d8fd9c1fa66cd28b88b605b1bd06667c0b"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.8')",
+ "version": "==0.3.3"
+ },
+ "nodeenv": {
+ "hashes": [
+ "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827",
+ "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6')",
+ "version": "==1.10.0"
+ },
+ "packaging": {
+ "hashes": [
+ "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e",
+ "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==26.2"
+ },
+ "parse": {
+ "hashes": [
+ "sha256:55339ca698019815df3b8e8b550e5933933527e623b0cdf1ca2f404da35ffb47",
+ "sha256:825e1a88e9d9fb481b8d2ca709c6195558b6eaa97c559ad3a9a20aa2d12815a3"
+ ],
+ "markers": "'dev' in dependency_groups",
+ "version": "==1.21.1"
+ },
+ "parver": {
+ "hashes": [
+ "sha256:2281b187276c8e8e3c15634f62287b2fb6fe0efe3010f739a6bd1e45fa2bf2b2",
+ "sha256:b9fde1e6bb9ce9f07e08e9c4bea8d8825c5e78e18a0052d02e02bf9517eb4777"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.8')",
+ "version": "==0.5"
+ },
+ "pathspec": {
+ "hashes": [
+ "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645",
+ "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==1.0.4"
+ },
+ "pip": {
+ "hashes": [
+ "sha256:4e8486d821d814b77319acb7b9e8bf5a4ee7590a643e7cb21029f209be8573c1",
+ "sha256:81e13ebcca3ffa8cc85e4deff5c27e1ee26dea0aa7fc2f294a073ac208806ff3"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.10'",
+ "version": "==26.1"
+ },
+ "platformdirs": {
+ "hashes": [
+ "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934",
+ "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==4.9.4"
+ },
+ "pluggy": {
+ "hashes": [
+ "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3",
+ "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==1.6.0"
+ },
+ "pre-commit": {
+ "hashes": [
+ "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658",
+ "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.7')",
+ "version": "==2.21.0"
+ },
+ "pycodestyle": {
+ "hashes": [
+ "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068",
+ "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3')",
+ "version": "==2.7.0"
+ },
+ "pycparser": {
+ "hashes": [
+ "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29",
+ "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"
+ ],
+ "markers": "python_version >= '3.10'",
+ "version": "==3.0"
+ },
+ "pyenchant": {
+ "hashes": [
+ "sha256:04a5bd0e022ebe2e8c6d9e498ec3d650602e264ec5486e9c6a1b7f99c9507c49",
+ "sha256:1d55e075645a6edbb3c590fb42f9e02b4d455e4affe28a2227d5cb6d4868e626",
+ "sha256:3da00b1d01314d85aac733bb997415d7a3e875666dc81735ddcf320aa36b7a70",
+ "sha256:825288246b5debc9436f91967650974ef0d5636458502619e322c476f1283891"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==3.3.0"
+ },
+ "pyflakes": {
+ "hashes": [
+ "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3",
+ "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3')",
+ "version": "==2.3.1"
+ },
+ "pygments": {
+ "hashes": [
+ "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f",
+ "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.9'",
+ "version": "==2.20.0"
+ },
+ "pypiserver": {
+ "hashes": [
+ "sha256:156540f87ecfd6db06ae2c16e25ae5afe4fda6f510bd1c34e46fbb0c491bcd9e",
+ "sha256:45f116d0bff6aafcaed002cfad48a6832e62a82393e3a9b447d5c41a0e310fff"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==2.4.1"
+ },
+ "pyproject-hooks": {
+ "hashes": [
+ "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8",
+ "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.7')",
+ "version": "==1.2.0"
+ },
+ "pytest": {
+ "hashes": [
+ "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b",
+ "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==9.0.2"
+ },
+ "pytest-cov": {
+ "hashes": [
+ "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6",
+ "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.7')",
+ "version": "==4.1.0"
+ },
+ "pytest-rerunfailures": {
+ "hashes": [
+ "sha256:5d11b12c0ca9a1665b5054052fcc1084f8deadd9328962745ef6b04e26382e86",
+ "sha256:c38b266db8a808953ebd71ac25c381cb1981a78ff9340a14bcb9f1b9bff1899e"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==16.1"
+ },
+ "pytest-timeout": {
+ "hashes": [
+ "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a",
+ "sha256:c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.7')",
+ "version": "==2.4.0"
+ },
+ "pytest-xdist": {
+ "hashes": [
+ "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88",
+ "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==3.8.0"
+ },
+ "python-discovery": {
+ "hashes": [
+ "sha256:7acca36e818cd88e9b2ba03e045ad7e93e1713e29c6bbfba5d90202310b7baa5",
+ "sha256:90e795f0121bc84572e737c9aa9966311b9fde44ffb88a5953b3ec9b31c6945e"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.8')",
+ "version": "==1.1.3"
+ },
+ "pytokens": {
+ "hashes": [
+ "sha256:0fc71786e629cef478cbf29d7ea1923299181d0699dbe7c3c0f4a583811d9fc1",
+ "sha256:11edda0942da80ff58c4408407616a310adecae1ddd22eef8c692fe266fa5009",
+ "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083",
+ "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1",
+ "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de",
+ "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2",
+ "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a",
+ "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1",
+ "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5",
+ "sha256:30f51edd9bb7f85c748979384165601d028b84f7bd13fe14d3e065304093916a",
+ "sha256:34bcc734bd2f2d5fe3b34e7b3c0116bfb2397f2d9666139988e7a3eb5f7400e3",
+ "sha256:3ad72b851e781478366288743198101e5eb34a414f1d5627cdd585ca3b25f1db",
+ "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68",
+ "sha256:42f144f3aafa5d92bad964d471a581651e28b24434d184871bd02e3a0d956037",
+ "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321",
+ "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc",
+ "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7",
+ "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f",
+ "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918",
+ "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9",
+ "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c",
+ "sha256:682fa37ff4d8e95f7df6fe6fe6a431e8ed8e788023c6bcc0f0880a12eab80ad1",
+ "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1",
+ "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3",
+ "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b",
+ "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb",
+ "sha256:941d4343bf27b605e9213b26bfa1c4bf197c9c599a9627eb7305b0defcfe40c1",
+ "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a",
+ "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4",
+ "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa",
+ "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78",
+ "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe",
+ "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9",
+ "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d",
+ "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975",
+ "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440",
+ "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16",
+ "sha256:da5baeaf7116dced9c6bb76dc31ba04a2dc3695f3d9f74741d7910122b456edc",
+ "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d",
+ "sha256:dcafc12c30dbaf1e2af0490978352e0c4041a7cde31f4f81435c2a5e8b9cabb6",
+ "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6",
+ "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.8')",
+ "version": "==0.4.1"
+ },
+ "pyyaml": {
+ "hashes": [
+ "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5",
+ "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc",
+ "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df",
+ "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741",
+ "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206",
+ "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27",
+ "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595",
+ "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62",
+ "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98",
+ "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696",
+ "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290",
+ "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9",
+ "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d",
+ "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6",
+ "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867",
+ "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47",
+ "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486",
+ "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6",
+ "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3",
+ "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007",
+ "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938",
+ "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0",
+ "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c",
+ "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735",
+ "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d",
+ "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28",
+ "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4",
+ "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba",
+ "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8",
+ "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef",
+ "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5",
+ "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd",
+ "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3",
+ "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0",
+ "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515",
+ "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c",
+ "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c",
+ "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924",
+ "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34",
+ "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43",
+ "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859",
+ "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673",
+ "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54",
+ "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a",
+ "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b",
+ "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab",
+ "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa",
+ "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c",
+ "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585",
+ "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d",
+ "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.6')",
+ "version": "==6.0.1"
+ },
+ "readme-renderer": {
+ "hashes": [
+ "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151",
+ "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==44.0"
+ },
+ "requests": {
+ "hashes": [
+ "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0",
+ "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.10'",
+ "version": "==2.34.2"
+ },
+ "requests-toolbelt": {
+ "hashes": [
+ "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6",
+ "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3')",
+ "version": "==1.0.0"
+ },
+ "rfc3986": {
+ "hashes": [
+ "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd",
+ "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.7')",
+ "version": "==2.0.0"
+ },
+ "rich": {
+ "hashes": [
+ "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d",
+ "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_full_version >= '3.8.0')",
+ "version": "==14.3.3"
+ },
+ "roman-numerals": {
+ "hashes": [
+ "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2",
+ "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==4.1.0"
+ },
+ "secretstorage": {
+ "hashes": [
+ "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137",
+ "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==3.5.0"
+ },
+ "semver": {
+ "hashes": [
+ "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746",
+ "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.7')",
+ "version": "==3.0.4"
+ },
+ "setuptools": {
+ "hashes": [
+ "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9",
+ "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==82.0.1"
+ },
+ "snowballstemmer": {
+ "hashes": [
+ "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064",
+ "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version not in '3.0, 3.1, 3.2')",
+ "version": "==3.0.1"
+ },
+ "soupsieve": {
+ "hashes": [
+ "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349",
+ "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==2.8.3"
+ },
+ "sphinx": {
+ "hashes": [
+ "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb",
+ "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.12')",
+ "version": "==9.1.0"
+ },
+ "sphinx-click": {
+ "hashes": [
+ "sha256:2821c10a68fc9ee6ce7c92fad26540d8d8c8f45e6d7258f0e4fb7529ae8fab49",
+ "sha256:cc67692bd28f482c7f01531c61b64e9d2f069bfcf3d24cbbb51d4a84a749fa48"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.7')",
+ "version": "==4.4.0"
+ },
+ "sphinxcontrib-applehelp": {
+ "hashes": [
+ "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1",
+ "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==2.0.0"
+ },
+ "sphinxcontrib-devhelp": {
+ "hashes": [
+ "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad",
+ "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==2.0.0"
+ },
+ "sphinxcontrib-htmlhelp": {
+ "hashes": [
+ "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8",
+ "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==2.1.0"
+ },
+ "sphinxcontrib-jsmath": {
+ "hashes": [
+ "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178",
+ "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.5')",
+ "version": "==1.0.1"
+ },
+ "sphinxcontrib-qthelp": {
+ "hashes": [
+ "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab",
+ "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==2.0.0"
+ },
+ "sphinxcontrib-serializinghtml": {
+ "hashes": [
+ "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331",
+ "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==2.0.0"
+ },
+ "sphinxcontrib-spelling": {
+ "hashes": [
+ "sha256:56561c3f6a155b0946914e4de988729859315729dc181b5e4dc8a68fe78de35a",
+ "sha256:95a0defef8ffec6526f9e83b20cc24b08c9179298729d87976891840e3aa3064"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.6')",
+ "version": "==7.7.0"
+ },
+ "stdeb": {
+ "hashes": [
+ "sha256:3f883c522ecb76394514ea4d282eda7671c8bd0db0fd904f9774ba20e02035e6",
+ "sha256:e7084e24f1616ab599d3f390599363b39670905179c261d23cd8ddcc0ecb3b71"
+ ],
+ "markers": "('dev' in dependency_groups) and (sys_platform == 'linux')",
+ "version": "==0.11.0"
+ },
+ "tomli": {
+ "hashes": [
+ "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729",
+ "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b",
+ "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d",
+ "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df",
+ "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576",
+ "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d",
+ "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1",
+ "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a",
+ "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e",
+ "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc",
+ "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702",
+ "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6",
+ "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd",
+ "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4",
+ "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776",
+ "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a",
+ "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66",
+ "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87",
+ "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2",
+ "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f",
+ "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475",
+ "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f",
+ "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95",
+ "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9",
+ "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3",
+ "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9",
+ "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76",
+ "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da",
+ "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8",
+ "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51",
+ "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86",
+ "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8",
+ "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0",
+ "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b",
+ "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1",
+ "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e",
+ "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d",
+ "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c",
+ "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867",
+ "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a",
+ "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c",
+ "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0",
+ "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4",
+ "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614",
+ "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132",
+ "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa",
+ "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.8')",
+ "version": "==2.4.0"
+ },
+ "towncrier": {
+ "hashes": [
+ "sha256:b953d133d98f9aeae9084b56a3563fd2519dfc6ec33f61c9cd2c61ff243fb513",
+ "sha256:eef16d29f831ad57abb3ae32a0565739866219f1ebfbdd297d32894eb9940eb1"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==25.8.0"
+ },
+ "twine": {
+ "hashes": [
+ "sha256:418ebf08ccda9a8caaebe414433b0ba5e25eb5e4a927667122fbe8f829f985d8",
+ "sha256:e5ed0d2fd70c9959770dce51c8f39c8945c574e18173a7b81802dab51b4b75cf"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.9')",
+ "version": "==6.2.0"
+ },
+ "typing-extensions": {
+ "hashes": [
+ "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466",
+ "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.9'",
+ "version": "==4.15.0"
+ },
+ "uc-micro-py": {
+ "hashes": [
+ "sha256:3603a3859af53e5a39bc7677713c78ea6589ff188d70f4fee165db88e22b242c",
+ "sha256:c53691e495c8db60e16ffc4861a35469b0ba0821fe409a8a7a0a71864d33a811"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.10')",
+ "version": "==2.0.0"
+ },
+ "urllib3": {
+ "hashes": [
+ "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c",
+ "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.10'",
+ "version": "==2.7.0"
+ },
+ "virtualenv": {
+ "hashes": [
+ "sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098",
+ "sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f"
+ ],
+ "markers": "('dev' in dependency_groups) and (python_version >= '3.8')",
+ "version": "==21.2.0"
+ },
+ "waitress": {
+ "hashes": [
+ "sha256:682aaaf2af0c44ada4abfb70ded36393f0e307f4ab9456a215ce0020baefc31f",
+ "sha256:c56d67fd6e87c2ee598b76abdd4e96cfad1f24cacdea5078d382b1f9d7b5ed2e"
+ ],
+ "markers": "('dev' in dependency_groups) and (sys_platform == 'win32')",
+ "version": "==3.0.2"
+ }
+ }
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000..5abd4f0e1c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,402 @@
+Pipenv: Python Development Workflow for Humans
+==============================================
+
+[](https://python.org/pypi/pipenv)
+[](https://python.org/pypi/pipenv)
+[](https://github.com/pypa/pipenv/actions/workflows/ci.yaml)
+[](https://python.org/pypi/pipenv)
+
+------------------------------------------------------------------------
+
+**Pipenv** is a Python virtualenv management tool that supports a multitude of systems and nicely bridges the gaps between pip, python (using system python, pyenv or asdf) and virtualenv.
+*Linux, macOS, and Windows are all first-class citizens in pipenv.*
+
+Pipenv automatically creates and manages a virtualenv for your projects, as well as adds/removes packages from your `Pipfile` as you install/uninstall packages. It also generates a project `Pipfile.lock`, which is used to produce deterministic builds.
+
+Pipenv is primarily meant to provide users and developers of applications with an easy method to arrive at a consistent working project environment.
+
+The problems that Pipenv seeks to solve are multi-faceted:
+
+- You no longer need to use `pip` and `virtualenv` separately: they work together.
+- Managing a `requirements.txt` file with package hashes can be problematic. Pipenv uses `Pipfile` and `Pipfile.lock` to separate abstract dependency declarations from the last tested combination.
+- Hashes are documented in the lock file which are verified during install. Security considerations are put first.
+- Strongly encourage the use of the latest versions of dependencies to minimize security risks [arising from outdated components](https://www.owasp.org/index.php/Top_10-2017_A9-Using_Components_with_Known_Vulnerabilities).
+- Gives you insight into your dependency graph (e.g. `$ pipenv graph`).
+- Streamline development workflow by supporting local customizations with `.env` files.
+
+Table Of Contents
+------------------
+
+- [Pipenv](#pipenv-python-development-workflow-for-humans)
+
+- [Installation](#installation)
+
+- [Features](#features)
+
+- [Basic Concepts](#basic-concepts)
+
+- [Other Commands](#other-commands)
+
+- [Shell Completion](#shell-completion)
+
+- [Usage](#usage)
+
+ - [Usage Examples](#usage-examples)
+
+ - [Commands](#commands)
+
+ - [Locate the Project](#locate-the-project)
+
+ - [Locate the virtualenv](#locate-the-virtualenv)
+
+ - [Locate the Python Interpreter](#locate-the-python-interpreter)
+
+ - [Install Packages](#install-packages)
+
+ - [Installing from git](#installing-from-git)
+
+ - [Install a dev dependency](#install-a-dev-dependency)
+
+ - [Show a dependency graph](#show-a-dependency-graph)
+
+ - [Generate a lockfile](#generate-a-lockfile)
+
+ - [Install all dev dependencies](#install-all-dev-dependencies)
+
+ - [Uninstall everything](#uninstall-everything)
+
+ - [Use the shell](#use-the-shell)
+
+- [Documentation](#documentation)
+
+Installation
+------------
+
+**Pipenv can be installed with Python 3.7 and above.**
+
+For most users, we recommend installing Pipenv using `pip`:
+
+ pip install --user pipenv
+
+Or, if you\'re using FreeBSD:
+
+ pkg install py39-pipenv
+
+Or, if you\'re using Gentoo:
+
+ sudo emerge pipenv
+
+Or, if you\'re using Void Linux:
+
+ sudo xbps-install -S python3-pipenv
+
+Alternatively, some users prefer to use [Pipx](https://pypi.org/p/pipx):
+
+ pipx install pipenv
+
+Or, some users prefer to use Python pip module.
+
+
+ python -m pip install pipenv
+
+Refer to the [documentation](https://pipenv.pypa.io/en/latest/#install-pipenv-today) for latest instructions.
+
+β¨π°β¨
+
+Features
+----------
+
+- Enables truly *deterministic builds*, while easily specifying *only
+ what you want*.
+- Generates and checks file hashes for locked dependencies.
+- Automatically install required Pythons, if `pyenv` or `asdf` is available.
+- Automatically finds your project home, recursively, by looking for a
+ `Pipfile`.
+- Automatically generates a `Pipfile`, if one doesn\'t exist.
+- Automatically creates a virtualenv in a standard location.
+- Automatically adds/removes packages to a `Pipfile` when they are installed/uninstalled.
+- Automatically loads `.env` files, if they exist.
+
+For command reference, see [Commands](https://pipenv.pypa.io/en/latest/commands/).
+
+### Basic Concepts
+
+- A virtualenv will automatically be created, when one doesn\'t exist.
+- When no parameters are passed to `install`, all packages
+ `[packages]` specified will be installed.
+- Otherwise, whatever virtualenv defaults to will be the default.
+
+
+### Shell Completion
+
+Shell completion is powered by [argcomplete](https://kislyuk.github.io/argcomplete/).
+Install the optional dependency first:
+
+ pip install "pipenv[completion]"
+
+For **fish**, add this to `~/.config/fish/completions/pipenv.fish`:
+
+ register-python-argcomplete --shell fish pipenv | source
+
+There is also a [fish plugin](https://github.com/fisherman/pipenv), which will automatically
+activate your subshells for you!
+
+For **zsh**, add this to your `~/.zshrc`:
+
+ autoload -U bashcompinit
+ bashcompinit
+ eval "$(register-python-argcomplete pipenv)"
+
+For **bash** (including Git Bash on Windows), add this to `~/.bashrc` or `~/.bash_profile`:
+
+ eval "$(register-python-argcomplete pipenv)"
+
+Then reload your shell, and tab completions are enabled!
+
+> **Note:** If you are upgrading from pipenv < 2026.5.0, the old
+> `_PIPENV_COMPLETE` environment variable method no longer works.
+> Replace it with the `register-python-argcomplete` commands above.
+> See the [Shell Completion docs](https://pipenv.pypa.io/en/latest/shell.html#shell-completion)
+> for details.
+
+Usage
+-------
+
+ $ pipenv --help
+ Usage: pipenv [OPTIONS] COMMAND [ARGS]...
+
+ Options:
+ --where Output project home information.
+ --venv Output virtualenv information.
+ --py Output Python interpreter information.
+ --envs Output Environment Variable options.
+ --rm Remove the virtualenv.
+ --bare Minimal output.
+ --man Display manpage.
+ --support Output diagnostic information for use in
+ GitHub issues.
+ --site-packages / --no-site-packages
+ Enable site-packages for the virtualenv.
+ [env var: PIPENV_SITE_PACKAGES]
+ --python TEXT Specify which version of Python virtualenv
+ should use.
+ --clear Clears caches (pipenv, pip). [env var:
+ PIPENV_CLEAR]
+ -q, --quiet Quiet mode.
+ -v, --verbose Verbose mode.
+ --pypi-mirror TEXT Specify a PyPI mirror.
+ --version Show the version and exit.
+ -h, --help Show this message and exit.
+
+
+ ### Usage Examples:
+
+ Create a new project using Python 3.7, specifically:
+ $ pipenv --python 3.7
+
+ Remove project virtualenv (inferred from current directory):
+ $ pipenv --rm
+
+ Install all dependencies for a project (including dev):
+ $ pipenv install --dev
+
+ Create a lockfile containing pre-releases:
+ $ pipenv lock --pre
+
+ Show a graph of your installed dependencies:
+ $ pipenv graph
+
+ Check your installed dependencies for security vulnerabilities:
+ $ pipenv check
+
+ Install a local setup.py into your virtual environment/Pipfile:
+ $ pipenv install -e .
+
+ Use a lower-level pip command:
+ $ pipenv run pip freeze
+
+ ### Commands:
+
+ check Checks for PyUp Safety security vulnerabilities and against
+ PEP 508 markers provided in Pipfile.
+ clean Uninstalls all packages not specified in Pipfile.lock.
+ graph Displays currently-installed dependency graph information.
+ install Installs provided packages and adds them to Pipfile, or (if no
+ packages are given), installs all packages from Pipfile.
+ lock Generates Pipfile.lock.
+ open View a given module in your editor.
+ requirements Generate a requirements.txt from Pipfile.lock.
+ run Spawns a command installed into the virtualenv.
+ scripts Lists scripts in current environment config.
+ shell Spawns a shell within the virtualenv.
+ sync Installs all packages specified in Pipfile.lock.
+ uninstall Uninstalls a provided package and removes it from Pipfile.
+ update Runs lock, then sync.
+ upgrade Update the lock of the specified dependency / sub-dependency,
+ but does not actually install the packages.
+ verify Verify the hash in Pipfile.lock is up-to-date.
+
+
+### Locate the project:
+
+ $ pipenv --where
+ /Users/kennethreitz/Library/Mobile Documents/com~apple~CloudDocs/repos/kr/pipenv/test
+
+### Locate the virtualenv:
+
+ $ pipenv --venv
+ /Users/kennethreitz/.local/share/virtualenvs/test-Skyy4vre
+
+### Locate the Python interpreter:
+
+ $ pipenv --py
+ /Users/kennethreitz/.local/share/virtualenvs/test-Skyy4vre/bin/python
+
+### Install packages:
+
+ $ pipenv install
+ Creating a virtualenv for this project...
+ ...
+ No package provided, installing all dependencies.
+ Virtualenv location: /Users/kennethreitz/.local/share/virtualenvs/test-EJkjoYts
+ Installing dependencies from Pipfile.lock...
+ ...
+
+ To activate this project's virtualenv, run the following:
+ $ pipenv shell
+
+### Installing from git:
+
+You can install packages with pipenv from git and other version control systems using URLs formatted according to the following rule:
+
+ +:////@#
+
+The only optional section is the `@` section. When using git over SSH, you may use the shorthand vcs and scheme alias `git+git@:/@#`. Note that this is translated to `git+ssh://git@` when parsed.
+
+Valid values for `` include `git`, `bzr`, `svn`, and `hg`. Valid values for `` include `http,`, `https`, `ssh`, and `file`. In specific cases you also have access to other schemes: `svn` may be combined with `svn` as a scheme, and `bzr` can be combined with `sftp` and `lp`.
+
+Note that it is **strongly recommended** that you install any version-controlled dependencies in editable mode, using `pipenv install -e`, in order to ensure that dependency resolution can be performed with an up to date copy of the repository each time it is performed, and that it includes all known dependencies.
+
+Below is an example usage which installs the git repository located at `https://github.com/requests/requests.git` from tag `v2.19.1` as package name `requests`:
+
+ $ pipenv install -e git+https://github.com/requests/requests.git@v2.19#egg=requests
+ Creating a Pipfile for this project...
+ Installing -e git+https://github.com/requests/requests.git@v2.19.1#egg=requests...
+ [...snipped...]
+ Adding -e git+https://github.com/requests/requests.git@v2.19.1#egg=requests to Pipfile's [packages]...
+ [...]
+
+You can read more about [pip's implementation of vcs support here](https://pip.pypa.io/en/stable/topics/vcs-support/).
+
+### Install a dev dependency:
+
+ $ pipenv install pytest --dev
+ Installing pytest...
+ ...
+ Adding pytest to Pipfile's [dev-packages]...
+
+### Show a dependency graph:
+
+ $ pipenv graph
+ requests==2.18.4
+ - certifi [required: >=2017.4.17, installed: 2017.7.27.1]
+ - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
+ - idna [required: >=2.5,<2.7, installed: 2.6]
+ - urllib3 [required: <1.23,>=1.21.1, installed: 1.22]
+
+### Generate a lockfile:
+
+ $ pipenv lock
+ Assuring all dependencies from Pipfile are installed...
+ Locking [dev-packages] dependencies...
+ Locking [packages] dependencies...
+ Note: your project now has only default [packages] installed.
+ To install [dev-packages], run: $ pipenv install --dev
+
+### Install all dev dependencies:
+
+ $ pipenv install --dev
+ Pipfile found at /Users/kennethreitz/repos/kr/pip2/test/Pipfile. Considering this to be the project home.
+ Pipfile.lock out of date, updating...
+ Assuring all dependencies from Pipfile are installed...
+ Locking [dev-packages] dependencies...
+ Locking [packages] dependencies...
+
+### Uninstall everything:
+
+ $ pipenv uninstall --all
+ No package provided, un-installing all dependencies.
+ Found 25 installed package(s), purging...
+ ...
+ Environment now purged and fresh!
+
+### Use the shell:
+
+ $ pipenv shell
+ Loading .env environment variables...
+ Launching subshell in virtual environment. Type 'exit' or 'Ctrl+D' to return.
+ $ β―
+
+
+### PURPOSE AND ADVANTAGES OF PIPENV
+
+To understand the problems that Pipenv solves, it's useful to show how Python package management has evolved.
+
+Take yourself back to the first Python iteration. We had Python, but there was no clean way to install packages.
+
+Then came Easy Install, a package that installs other Python packages with relative ease. But it came with a catch: it wasn't easy to uninstall packages that were no longer needed.
+
+Enter pip, which most Python users are familiar with. pip lets us install and uninstall packages. We could specify versions, run pip freeze > requirements.txt to output a list of installed packages to a text file, and use that same text file to install everything an app needed with pip install -r requirements.txt.
+
+But pip didn't include a way to isolate packages from each other. We might work on apps that use different versions of the same libraries, so we needed a way to enable that.
+
+
+Pipenv aims to solve several problems.
+First, the problem of needing the pip library for package installation, plus a library for creating a virtual environment, plus a library for managing virtual environments, plus all the commands associated with those libraries. That's a lot to manage. Pipenv ships with package management and virtual environment support, so you can use one tool to install, uninstall, track, and document your dependencies and to create, use, and organize your virtual environments. When you start a project with it, Pipenv will automatically create a virtual environment for that project if you aren't already using one.
+
+Pipenv accomplishes this dependency management by abandoning the requirements.txt norm and trading it for a new document called a Pipfile. When you install a library with Pipenv, a Pipfile for your project is automatically updated with the details of that installation, including version information and possibly the Git repository location, file path, and other information.
+
+Second, Pipenv wants to make it easier to manage complex interdependencies.
+
+Using Pipenv, which gives you Pipfile, lets you avoid these problems by managing dependencies for different environments for you. This command will install the main project dependencies:
+
+ pipenv install
+
+Adding the --dev tag will install the dev/testing requirements:
+
+ pipenv install --dev
+To generate a Pipfile.lock file, run:
+
+pipenv lock
+
+You can also run Python scripts with Pipenv. To run a top-level Python script called hello.py, run:
+
+pipenv run python hello.py
+
+And you will see your expected result in the console.
+
+To start a shell, run:
+
+pipenv shell
+
+If you would like to convert a project that currently uses a requirements.txt file to use Pipenv, install Pipenv and run:
+
+pipenv install requirements.txt
+
+This will create a Pipfile and install the specified requirements.
+
+
+Documentation
+---------------
+
+Documentation resides over at [pipenv.pypa.io](https://pipenv.pypa.io/en/latest/).
+
+## Star History
+
+
+
+
+
+
+
+
diff --git a/README.rst b/README.rst
deleted file mode 100644
index c2a73aa809..0000000000
--- a/README.rst
+++ /dev/null
@@ -1,243 +0,0 @@
-Pipenv: Python Development Workflow for Humans
-==============================================
-
-.. image:: https://img.shields.io/pypi/v/pipenv.svg
- :target: https://pypi.python.org/pypi/pipenv
-
-.. image:: https://img.shields.io/pypi/l/pipenv.svg
- :target: https://pypi.python.org/pypi/pipenv
-
-.. image:: https://img.shields.io/pypi/pyversions/pipenv.svg
- :target: https://pypi.python.org/pypi/pipenv
-
-.. image:: https://travis-ci.org/kennethreitz/pipenv.svg?branch=master
- :target: https://travis-ci.org/kennethreitz/pipenv
-
-.. image:: https://img.shields.io/appveyor/ci/kennethreitz/pipenv.svg
- :target: https://ci.appveyor.com/project/kennethreitz/pipenv/branch/master
-
-.. image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg
- :target: https://saythanks.io/to/kennethreitz
-
----------------
-
-**Pipenv** βΒ the officially recommended Python packaging tool from `Python.org `_, free (as in freedom).
-
-Pipenv is a tool that aims to bring the best of all packaging worlds (bundler, composer, npm, cargo, yarn, etc.) to the Python world. *Windows is a firstβclass citizen, in our world.*
-
-It automatically creates and manages a virtualenv for your projects, as well as adds/removes packages from your ``Pipfile`` as you install/uninstall packages. It also generates the everβimportant ``Pipfile.lock``, which is used to produce deterministic builds.
-
-.. image:: http://media.kennethreitz.com.s3.amazonaws.com/pipenv.gif
-
-The problems that Pipenv seeks to solve are multi-faceted:
-
-- You no longer need to use ``pip`` and ``virtualenv`` separately. They work together.
-- Managing a ``requirements.txt`` file `can be problematic `_, so Pipenv uses the upcoming ``Pipfile`` and ``Pipfile.lock`` instead, which is superior for basic use cases.
-- Hashes are used everywhere, always. Security. Automatically expose security vulnerabilities.
-- Give you insight into your dependency graph (e.g. ``$ pipenv graph``).
-- Streamline development workflow by loading ``.env`` files.
-
-Installation
-------------
-
-::
-
- $ pip install pipenv
-
-β¨π°β¨
-
-β€ User Testimonials
--------------------
-
-**Jannis Leidel**, former pip maintainerβ
- *Pipenv is the porcelain I always wanted to build for pip. It fits my brain and mostly replaces virtualenvwrapper and manual pip calls for me. Use it.*
-
-**Justin Myles Holmes**β
- *Pipenv is finally an abstraction meant to engage the mind instead of merely the filesystem.*
-
-**Isaac Sanders**β
- *Pipenv is literally the best thing about my day today. Thanks, Kenneth!*
-
-
-
-β€ Features
-----------
-
-- Enables truly *deterministic builds*, while easily specifying *only what you want*.
-- Generates and checks file hashes for locked dependencies.
-- Automatically install required Pythons, if ``pyenv`` is available.
-- Automatically finds your project home, recursively, by looking for a ``Pipfile``.
-- Automatically generates a ``Pipfile``, if one doesn't exist.
-- Automatically creates a virtualenv in a standard location.
-- Automatically adds/removes packages to a ``Pipfile`` when they are un/installed.
-- Automatically loads ``.env`` files, if they exist.
-
-The main commands are ``install``, ``uninstall``, and ``lock``, which generates a ``Pipfile.lock``. These are intended to replace ``$ pip install`` usage, as well as manual virtualenv management (to activate a virtualenv, run ``$ pipenv shell``).
-
-Basic Concepts
-//////////////
-
-- A virtualenv will automatically be created, when one doesn't exist.
-- When no parameters are passed to ``install``, all packages ``[packages]`` specified will be installed.
-- To initialize a Python 3 virtual environment, run ``$ pipenv --three``.
-- To initialize a Python 2 virtual environment, run ``$ pipenv --two``.
-- Otherwise, whatever virtualenv defaults to will be the default.
-
-Other Commands
-//////////////
-
-- ``shell`` will spawn a shell with the virtualenv activated.
-- ``run`` will run a given command from the virtualenv, with any arguments forwarded (e.g. ``$ pipenv run python``).
-- ``check`` asserts that PEP 508 requirements are being met by the current environment.
-- ``graph`` will print a pretty graph of all your installed dependencies.
-
-Shell Completion
-////////////////
-
-For example, with fish, put this in your ``~/.config/fish/completions/pipenv.fish``::
-
- eval (pipenv --completion)
-
-Magic shell completions are now enabled! There is also a `fish plugin `_, which will automatically activate your subshells for you!
-
-Fish is the best shell. You should use it.
-
-β€ Usage
--------
-
-::
-
- $ pipenv
- Usage: pipenv [OPTIONS] COMMAND [ARGS]...
-
- Options:
- --update Update Pipenv & pip to latest.
- --where Output project home information.
- --venv Output virtualenv information.
- --py Output Python interpreter information.
- --envs Output Environment Variable options.
- --rm Remove the virtualenv.
- --bare Minimal output.
- --completion Output completion (to be eval'd).
- --man Display manpage.
- --three / --two Use Python 3/2 when creating virtualenv.
- --python TEXT Specify which version of Python virtualenv should use.
- --site-packages Enable site-packages for the virtualenv.
- --jumbotron An easter egg, effectively.
- --version Show the version and exit.
- -h, --help Show this message and exit.
-
-
- Usage Examples:
- Create a new project using Python 3.6, specifically:
- $ pipenv --python 3.6
-
- Install all dependencies for a project (including dev):
- $ pipenv install --dev
-
- Create a lockfile containing pre-releases:
- $ pipenv lock --pre
-
- Show a graph of your installed dependencies:
- $ pipenv graph
-
- Check your installed dependencies for security vulnerabilties:
- $ pipenv check
-
- Install a local setup.py into your virtual environment/Pipfile:
- $ pipenv install -e .
-
- Commands:
- check Checks for security vulnerabilities and...
- graph Displays currentlyβinstalled dependency graph...
- install Installs provided packages and adds them to...
- lock Generates Pipfile.lock.
- open View a given module in your editor.
- run Spawns a command installed into the...
- shell Spawns a shell within the virtualenv.
- uninstall Un-installs a provided package and removes it...
- update Uninstalls all packages, and re-installs...
-
-
-
-Locate the project::
-
- $ pipenv --where
- /Users/kennethreitz/Library/Mobile Documents/com~apple~CloudDocs/repos/kr/pipenv/test
-
-Locate the virtualenv::
-
- $ pipenv --venv
- /Users/kennethreitz/.local/share/virtualenvs/test-Skyy4vre
-
-Locate the Python interpreter::
-
- $ pipenv --py
- /Users/kennethreitz/.local/share/virtualenvs/test-Skyy4vre/bin/python
-
-Install packages::
-
- $ pipenv install
- Creating a virtualenv for this project...
- ...
- No package provided, installing all dependencies.
- Virtualenv location: /Users/kennethreitz/.local/share/virtualenvs/test-EJkjoYts
- Installing dependencies from Pipfile.lock...
- ...
-
- To activate this project's virtualenv, run the following:
- $ pipenv shell
-
-Install a dev dependency::
-
- $ pipenv install pytest --dev
- Installing pytest...
- ...
- Adding pytest to Pipfile's [dev-packages]...
-
-Show a dependency graph::
-
- $ pipenv graph
- requests==2.18.4
- - certifi [required: >=2017.4.17, installed: 2017.7.27.1]
- - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
- - idna [required: >=2.5,<2.7, installed: 2.6]
- - urllib3 [required: <1.23,>=1.21.1, installed: 1.22]
-
-Generate a lockfile::
-
- $ pipenv lock
- Assuring all dependencies from Pipfile are installed...
- Locking [dev-packages] dependencies...
- Locking [packages] dependencies...
- Note: your project now has only default [packages] installed.
- To install [dev-packages], run: $ pipenv install --dev
-
-Install all dev dependencies::
-
- $ pipenv install --dev
- Pipfile found at /Users/kennethreitz/repos/kr/pip2/test/Pipfile. Considering this to be the project home.
- Pipfile.lock out of date, updating...
- Assuring all dependencies from Pipfile are installed...
- Locking [dev-packages] dependencies...
- Locking [packages] dependencies...
-
-Uninstall everything::
-
- $ pipenv uninstall --all
- No package provided, un-installing all dependencies.
- Found 25 installed package(s), purging...
- ...
- Environment now purged and fresh!
-
-Use the shell::
-
- $ pipenv shell
- Loading .env environment variablesβ¦
- Launching subshell in virtual environment. Type 'exit' or 'Ctrl+D' to return.
- $ β―
-
-β€ Documentation
----------------
-
-Documentation resides over at `pipenv.org `_.
diff --git a/RELEASING.md b/RELEASING.md
new file mode 100644
index 0000000000..e5e1ac591d
--- /dev/null
+++ b/RELEASING.md
@@ -0,0 +1,7 @@
+# Releasing Pipenv
+
+To create a new release:
+
+```
+pipenv run invoke release.release
+```
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000000..da9c516dd7
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,5 @@
+## Security contact information
+
+To report a security vulnerability, please use the
+[Tidelift security contact](https://tidelift.com/security).
+Tidelift will coordinate the fix and disclosure.
diff --git a/_appveyor/install.ps1 b/_appveyor/install.ps1
deleted file mode 100644
index 160ba55c07..0000000000
--- a/_appveyor/install.ps1
+++ /dev/null
@@ -1,229 +0,0 @@
-# Sample script to install Python and pip under Windows
-# Authors: Olivier Grisel, Jonathan Helmus, Kyle Kastner, and Alex Willmer
-# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/
-
-$MINICONDA_URL = "http://repo.continuum.io/miniconda/"
-$BASE_URL = "https://www.python.org/ftp/python/"
-$GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py"
-$GET_PIP_PATH = "C:\get-pip.py"
-
-$PYTHON_PRERELEASE_REGEX = @"
-(?x)
-(?\d+)
-\.
-(?\d+)
-\.
-(?\d+)
-(?[a-z]{1,2}\d+)
-"@
-
-
-function Download ($filename, $url) {
- $webclient = New-Object System.Net.WebClient
-
- $basedir = $pwd.Path + "\"
- $filepath = $basedir + $filename
- if (Test-Path $filename) {
- Write-Host "Reusing" $filepath
- return $filepath
- }
-
- # Download and retry up to 3 times in case of network transient errors.
- Write-Host "Downloading" $filename "from" $url
- $retry_attempts = 2
- for ($i = 0; $i -lt $retry_attempts; $i++) {
- try {
- $webclient.DownloadFile($url, $filepath)
- break
- }
- Catch [Exception]{
- Start-Sleep 1
- }
- }
- if (Test-Path $filepath) {
- Write-Host "File saved at" $filepath
- } else {
- # Retry once to get the error message if any at the last try
- $webclient.DownloadFile($url, $filepath)
- }
- return $filepath
-}
-
-
-function ParsePythonVersion ($python_version) {
- if ($python_version -match $PYTHON_PRERELEASE_REGEX) {
- return ([int]$matches.major, [int]$matches.minor, [int]$matches.micro,
- $matches.prerelease)
- }
- $version_obj = [version]$python_version
- return ($version_obj.major, $version_obj.minor, $version_obj.build, "")
-}
-
-
-function DownloadPython ($python_version, $platform_suffix) {
- $major, $minor, $micro, $prerelease = ParsePythonVersion $python_version
-
- if (($major -le 2 -and $micro -eq 0) `
- -or ($major -eq 3 -and $minor -le 2 -and $micro -eq 0) `
- ) {
- $dir = "$major.$minor"
- $python_version = "$major.$minor$prerelease"
- } else {
- $dir = "$major.$minor.$micro"
- }
-
- if ($prerelease) {
- if (($major -le 2) `
- -or ($major -eq 3 -and $minor -eq 1) `
- -or ($major -eq 3 -and $minor -eq 2) `
- -or ($major -eq 3 -and $minor -eq 3) `
- ) {
- $dir = "$dir/prev"
- }
- }
-
- if (($major -le 2) -or ($major -le 3 -and $minor -le 4)) {
- $ext = "msi"
- if ($platform_suffix) {
- $platform_suffix = ".$platform_suffix"
- }
- } else {
- $ext = "exe"
- if ($platform_suffix) {
- $platform_suffix = "-$platform_suffix"
- }
- }
-
- $filename = "python-$python_version$platform_suffix.$ext"
- $url = "$BASE_URL$dir/$filename"
- $filepath = Download $filename $url
- return $filepath
-}
-
-
-function InstallPython ($python_version, $architecture, $python_home) {
- Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home
- if (Test-Path $python_home) {
- Write-Host $python_home "already exists, skipping."
- return $false
- }
- if ($architecture -eq "32") {
- $platform_suffix = ""
- } else {
- $platform_suffix = "amd64"
- }
- $installer_path = DownloadPython $python_version $platform_suffix
- $installer_ext = [System.IO.Path]::GetExtension($installer_path)
- Write-Host "Installing $installer_path to $python_home"
- $install_log = $python_home + ".log"
- if ($installer_ext -eq '.msi') {
- InstallPythonMSI $installer_path $python_home $install_log
- } else {
- InstallPythonEXE $installer_path $python_home $install_log
- }
- if (Test-Path $python_home) {
- Write-Host "Python $python_version ($architecture) installation complete"
- } else {
- Write-Host "Failed to install Python in $python_home"
- Get-Content -Path $install_log
- Exit 1
- }
-}
-
-
-function InstallPythonEXE ($exepath, $python_home, $install_log) {
- $install_args = "/quiet InstallAllUsers=1 TargetDir=$python_home"
- RunCommand $exepath $install_args
-}
-
-
-function InstallPythonMSI ($msipath, $python_home, $install_log) {
- $install_args = "/qn /log $install_log /i $msipath TARGETDIR=$python_home"
- $uninstall_args = "/qn /x $msipath"
- RunCommand "msiexec.exe" $install_args
- if (-not(Test-Path $python_home)) {
- Write-Host "Python seems to be installed else-where, reinstalling."
- RunCommand "msiexec.exe" $uninstall_args
- RunCommand "msiexec.exe" $install_args
- }
-}
-
-function RunCommand ($command, $command_args) {
- Write-Host $command $command_args
- Start-Process -FilePath $command -ArgumentList $command_args -Wait -Passthru
-}
-
-
-function InstallPip ($python_home) {
- $pip_path = $python_home + "\Scripts\pip.exe"
- $python_path = $python_home + "\python.exe"
- if (-not(Test-Path $pip_path)) {
- Write-Host "Installing pip..."
- $webclient = New-Object System.Net.WebClient
- $webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH)
- Write-Host "Executing:" $python_path $GET_PIP_PATH
- & $python_path $GET_PIP_PATH
- } else {
- Write-Host "pip already installed."
- }
-}
-
-
-function DownloadMiniconda ($python_version, $platform_suffix) {
- if ($python_version -eq "3.4") {
- $filename = "Miniconda3-3.5.5-Windows-" + $platform_suffix + ".exe"
- } else {
- $filename = "Miniconda-3.5.5-Windows-" + $platform_suffix + ".exe"
- }
- $url = $MINICONDA_URL + $filename
- $filepath = Download $filename $url
- return $filepath
-}
-
-
-function InstallMiniconda ($python_version, $architecture, $python_home) {
- Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home
- if (Test-Path $python_home) {
- Write-Host $python_home "already exists, skipping."
- return $false
- }
- if ($architecture -eq "32") {
- $platform_suffix = "x86"
- } else {
- $platform_suffix = "x86_64"
- }
- $filepath = DownloadMiniconda $python_version $platform_suffix
- Write-Host "Installing" $filepath "to" $python_home
- $install_log = $python_home + ".log"
- $args = "/S /D=$python_home"
- Write-Host $filepath $args
- Start-Process -FilePath $filepath -ArgumentList $args -Wait -Passthru
- if (Test-Path $python_home) {
- Write-Host "Python $python_version ($architecture) installation complete"
- } else {
- Write-Host "Failed to install Python in $python_home"
- Get-Content -Path $install_log
- Exit 1
- }
-}
-
-
-function InstallMinicondaPip ($python_home) {
- $pip_path = $python_home + "\Scripts\pip.exe"
- $conda_path = $python_home + "\Scripts\conda.exe"
- if (-not(Test-Path $pip_path)) {
- Write-Host "Installing pip..."
- $args = "install --yes pip"
- Write-Host $conda_path $args
- Start-Process -FilePath "$conda_path" -ArgumentList $args -Wait -Passthru
- } else {
- Write-Host "pip already installed."
- }
-}
-
-function main () {
- InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON
- InstallPip $env:PYTHON
-}
-
-main
diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644
index c17c9150d2..0000000000
--- a/appveyor.yml
+++ /dev/null
@@ -1,51 +0,0 @@
-# AppVeyor.yml from https://github.com/ogrisel/python-appveyor-demo
-# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/
-
-build: off
-
-environment:
-
- # Create expected SHELL variable for pipenv.
- SHELL: "windows"
-
- matrix:
-
- - PYTHON: "C:\\Python27-x64"
- PYTHON_VERSION: "2.7.x"
- PYTHON_ARCH: "64"
-
- - PYTHON: "C:\\Python34-x64"
- PYTHON_VERSION: "3.4.x"
- PYTHON_ARCH: "64"
-
- - PYTHON: "C:\\Python35-x64"
- PYTHON_VERSION: "3.5.x"
- PYTHON_ARCH: "64"
-
- - PYTHON: "C:\\Python36-x64"
- PYTHON_VERSION: "3.6.x"
- PYTHON_ARCH: "64"
-
-install:
- # Install Python (from the official .msi of http://python.org) and pip when
- # not already installed.
- - ps: if (-not(Test-Path($env:PYTHON))) { & _appveyor\install.ps1 }
-
- # Prepend newly installed Python to the PATH of this build (this cannot be
- # done from inside the powershell script as it would require to restart
- # the parent CMD process).
- - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
- - "SET PYTHONIOENCODING=utf-8"
-
- # Check that we have the expected version and architecture for Python
- - "python --version"
- - "python -c \"import struct; print(struct.calcsize('P') * 8)\""
-
- # Upgrade to the latest version of pip to avoid it displaying warnings
- # about it being out of date.
- - "pip install --disable-pip-version-check --user --upgrade pip"
- - "pip install -e . --upgrade"
- - "pipenv install --system --dev --skip-lock"
-
-test_script:
- - "pipenv run pytest -n 8 tests/test_pipenv.py tests/test_project.py tests/test_utils.py"
diff --git a/benchmarks/.gitignore b/benchmarks/.gitignore
new file mode 100644
index 0000000000..dbf8d7e684
--- /dev/null
+++ b/benchmarks/.gitignore
@@ -0,0 +1,13 @@
+# Generated files
+requirements.txt
+Pipfile.lock
+stats.csv
+benchmark-results.json
+*-results.json
+
+# Timing data
+timings/
+
+# Virtual environments
+.venv/
+__pycache__/
diff --git a/benchmarks/Pipfile b/benchmarks/Pipfile
new file mode 100644
index 0000000000..031346e1ec
--- /dev/null
+++ b/benchmarks/Pipfile
@@ -0,0 +1,12 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+# Dependencies will be added during benchmark import step
+
+[dev-packages]
+
+[requires]
+python_version = "3.11"
diff --git a/benchmarks/README.md b/benchmarks/README.md
new file mode 100644
index 0000000000..6315e740a6
--- /dev/null
+++ b/benchmarks/README.md
@@ -0,0 +1,85 @@
+# Pipenv Package Manager Benchmark
+
+This directory contains benchmarking tests for pipenv based on the [python-package-manager-shootout](https://github.com/lincolnloop/python-package-manager-shootout) project.
+
+## Purpose
+
+These benchmarks help validate that pipenv performance doesn't regress over time by testing common package management operations against a real-world dependency set from [Sentry's requirements](https://github.com/getsentry/sentry/blob/main/requirements-base.txt).
+
+## Operations Benchmarked
+
+- **tooling** - Installing pipenv using the current development version
+- **import** - Converting requirements.txt to Pipfile format
+- **lock** - Generating Pipfile.lock from dependencies
+- **install-cold** - Installing packages with empty cache
+- **install-warm** - Installing packages with populated cache
+- **update** - Updating all packages to latest versions
+- **add-package** - Adding a new package and updating lock file
+
+## Usage
+
+### Local Testing
+
+```bash
+# Run all benchmark operations
+make benchmark
+
+# Clean benchmark artifacts
+make benchmark-clean
+
+# Run individual operations
+cd benchmarks
+python benchmark.py # Run full benchmark suite
+python benchmark.py setup # Download requirements.txt
+python benchmark.py tooling # Benchmark pipenv installation
+python benchmark.py import # Benchmark requirements import
+python benchmark.py lock-cold # Benchmark lock with cold cache
+python benchmark.py lock-warm # Benchmark lock with warm cache
+python benchmark.py install-cold # Benchmark install with cold cache
+python benchmark.py install-warm # Benchmark install with warm cache
+python benchmark.py update-cold # Benchmark update with cold cache
+python benchmark.py update-warm # Benchmark update with warm cache
+python benchmark.py add-package # Benchmark adding a package
+python benchmark.py stats # Generate stats.csv
+
+# Local diagnosis helpers
+python benchmark.py lock-warm --repeat 3
+python benchmark.py lock-warm --profile
+python benchmark.py update-warm --output-json update-results.json
+```
+
+### CI Integration
+
+The benchmarks run automatically in GitHub Actions on the `ubuntu-latest` runner as part of the CI pipeline. Results are:
+
+- Displayed in the job summary with timing statistics
+- Uploaded as artifacts for historical analysis
+- Used to detect performance regressions
+
+## Files
+
+- `benchmark.py` - Main benchmark runner script
+- `Pipfile` - Base Pipfile template (dependencies added during import)
+- `requirements.txt` - Downloaded from Sentry's requirements-base.txt during setup
+- `timings/` - Directory created during benchmarks to store timing data
+- `stats.csv` - Generated CSV with benchmark results
+- `benchmark-results.json` - Per-run command timings for local/CI comparison
+
+## Dependencies
+
+The benchmark uses Sentry's `requirements-base.txt` as a representative real-world dependency set. This includes packages like:
+
+- Django and related packages
+- Database connectors
+- Serialization libraries
+- HTTP clients
+- Development tools
+
+## Notes
+
+- Benchmarks only run on Linux in CI to ensure consistent timing measurements
+- System dependencies (libxmlsec1-dev, librdkafka-dev) are installed for Sentry requirements
+- Cache clearing ensures cold/warm scenarios are properly tested
+- `python benchmark.py` reuses an existing local `requirements.txt`; pass `--force-setup` to re-download it
+- Results include elapsed time, CPU time, memory usage, and I/O statistics where the platform exposes them
+- `--profile` writes `.prof` files under `timings/` and keeps pipenv resolver work in-process for easier local profiling
diff --git a/benchmarks/benchmark.py b/benchmarks/benchmark.py
new file mode 100644
index 0000000000..c4bf15ba94
--- /dev/null
+++ b/benchmarks/benchmark.py
@@ -0,0 +1,626 @@
+#!/usr/bin/env python3
+"""
+Pipenv benchmark runner based on python-package-manager-shootout.
+"""
+
+from __future__ import annotations
+
+import argparse
+import csv
+import json
+import os
+import shutil
+import statistics
+import subprocess
+import sys
+import time
+import urllib.request
+from dataclasses import asdict, dataclass
+from pathlib import Path
+
+try:
+ import resource
+except ImportError: # pragma: no cover - Windows
+ resource = None
+
+
+OPERATIONS = (
+ "setup",
+ "tooling",
+ "import",
+ "lock-cold",
+ "lock-warm",
+ "install-cold",
+ "install-warm",
+ "update-cold",
+ "update-warm",
+ "add-package",
+ "stats",
+)
+
+TIMED_STATS = (
+ "tooling",
+ "import",
+ "lock-cold",
+ "lock-warm",
+ "install-cold",
+ "install-warm",
+ "update-cold",
+ "update-warm",
+ "add-package",
+)
+
+
+def subprocess_env(profile_resolver: bool = False):
+ """Get environment variables for subprocess calls with CI-friendly settings."""
+ env = os.environ.copy()
+ # Ensure pipenv doesn't wait for user input.
+ env["PIPENV_YES"] = "1"
+ env["PIPENV_NOSPIN"] = "1"
+ # Force pipenv to create its own venv, not use any existing one.
+ env["PIPENV_IGNORE_VIRTUALENVS"] = "1"
+ # Suppress courtesy notices.
+ env["PIPENV_VERBOSITY"] = "-1"
+ if profile_resolver:
+ # Keep resolver work in the profiled parent process for local diagnosis.
+ env["PIPENV_RESOLVER_PARENT_PYTHON"] = "1"
+ return env
+
+
+@dataclass
+class TimingRecord:
+ stat: str
+ iteration: int
+ command: list[str]
+ elapsed_time: float
+ system: float
+ user: float
+ cpu_percent: float
+ max_rss: int
+ inputs: int
+ outputs: int
+ returncode: int
+ profile: str | None = None
+
+ def timing_values(self) -> list[str]:
+ return [
+ f"{self.elapsed_time:.3f}",
+ f"{self.system:.3f}",
+ f"{self.user:.3f}",
+ f"{self.cpu_percent:.1f}",
+ str(self.max_rss),
+ str(self.inputs),
+ str(self.outputs),
+ ]
+
+ def timing_line(self) -> str:
+ return ",".join(self.timing_values()) + "\n"
+
+
+def _usage_snapshot():
+ if resource is None:
+ return None
+ return resource.getrusage(resource.RUSAGE_CHILDREN)
+
+
+def _usage_delta(
+ before, after, elapsed: float
+) -> tuple[float, float, float, int, int, int]:
+ if before is None or after is None:
+ return 0.0, 0.0, 0.0, 0, 0, 0
+
+ user = max(after.ru_utime - before.ru_utime, 0.0)
+ system = max(after.ru_stime - before.ru_stime, 0.0)
+ cpu_percent = ((user + system) / elapsed * 100.0) if elapsed else 0.0
+ inputs = max(after.ru_inblock - before.ru_inblock, 0)
+ outputs = max(after.ru_oublock - before.ru_oublock, 0)
+ # ru_maxrss from RUSAGE_CHILDREN is a cumulative high-water mark across
+ # child processes, not a per-command measurement, so do not report it as
+ # if it belonged to the command being benchmarked.
+ return system, user, cpu_percent, 0, int(inputs), int(outputs)
+
+
+class PipenvBenchmark:
+ def __init__(
+ self,
+ benchmark_dir: Path,
+ *,
+ profile: bool = False,
+ output_json: Path | None = None,
+ force_setup: bool = False,
+ ):
+ self.benchmark_dir = benchmark_dir
+ self.timings_dir = benchmark_dir / "timings"
+ self.timings_dir.mkdir(exist_ok=True)
+ self.requirements_url = (
+ "https://raw.githubusercontent.com/getsentry/sentry/"
+ "51281a6abd8ff4a93d2cebc04e1d5fc7aa9c4c11/requirements-base.txt"
+ )
+ self.test_package = "goodconf"
+ self.profile = profile
+ self.output_json = output_json
+ self.force_setup = force_setup
+ self.records: list[TimingRecord] = []
+ self.timing_samples: dict[str, list[TimingRecord]] = {}
+
+ def _profiled_command(
+ self, command: list[str], timing_file: str, iteration: int
+ ) -> tuple[list[str], Path | None, bool]:
+ if not self.profile:
+ return command, None, False
+
+ stat = timing_file.removesuffix(".txt")
+ profile_path = self.timings_dir / f"{stat}.{iteration}.prof"
+
+ if command and command[0] == "pipenv":
+ profiled = [
+ sys.executable,
+ "-m",
+ "cProfile",
+ "-o",
+ str(profile_path),
+ "-m",
+ "pipenv",
+ *command[1:],
+ ]
+ return profiled, profile_path, True
+
+ if command and Path(command[0]).resolve() == Path(sys.executable).resolve():
+ profiled = [
+ sys.executable,
+ "-m",
+ "cProfile",
+ "-o",
+ str(profile_path),
+ *command[1:],
+ ]
+ return profiled, profile_path, False
+
+ return command, None, False
+
+ def _write_timing_file(self, path: Path, values: list[str]) -> None:
+ with open(path, "w") as f:
+ f.write(",".join(values) + "\n")
+
+ def _record_timing(self, record: TimingRecord, timing_file: str) -> None:
+ self.records.append(record)
+ samples = self.timing_samples.setdefault(record.stat, [])
+ samples.append(record)
+
+ self._write_timing_file(
+ self.timings_dir / f"{record.stat}.{record.iteration}.txt",
+ record.timing_values(),
+ )
+
+ aggregate_values = [
+ f"{statistics.median(sample.elapsed_time for sample in samples):.3f}",
+ f"{statistics.median(sample.system for sample in samples):.3f}",
+ f"{statistics.median(sample.user for sample in samples):.3f}",
+ f"{statistics.median(sample.cpu_percent for sample in samples):.1f}",
+ str(int(statistics.median(sample.max_rss for sample in samples))),
+ str(int(statistics.median(sample.inputs for sample in samples))),
+ str(int(statistics.median(sample.outputs for sample in samples))),
+ ]
+ self._write_timing_file(self.timings_dir / timing_file, aggregate_values)
+
+ def run_timed_command(
+ self,
+ command: list[str],
+ timing_file: str,
+ cwd: Path | None = None,
+ timeout: int = 600,
+ ) -> tuple[float, int]:
+ """Run a command and measure execution time."""
+ if cwd is None:
+ cwd = self.benchmark_dir
+
+ stat = timing_file.removesuffix(".txt")
+ iteration = len(self.timing_samples.get(stat, [])) + 1
+ command_to_run, profile_path, profile_resolver = self._profiled_command(
+ command, timing_file, iteration
+ )
+
+ env = subprocess_env(profile_resolver=profile_resolver)
+
+ print(f" Running: {' '.join(command_to_run)}", flush=True)
+ before_usage = _usage_snapshot()
+ start_time = time.perf_counter()
+
+ # Use Popen with communicate() to avoid pipe buffer deadlock
+ # that can occur with capture_output=True on commands with lots of output.
+ process = subprocess.Popen(
+ command_to_run,
+ cwd=cwd,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ text=True,
+ env=env,
+ )
+
+ try:
+ stdout, stderr = process.communicate(timeout=timeout)
+ elapsed = time.perf_counter() - start_time
+ after_usage = _usage_snapshot()
+ returncode = process.returncode
+ system, user, cpu_percent, max_rss, inputs, outputs = _usage_delta(
+ before_usage, after_usage, elapsed
+ )
+
+ if returncode != 0:
+ print(
+ f" Command failed after {elapsed:.3f}s: "
+ f"{' '.join(command_to_run)}"
+ )
+ print(f" Return code: {returncode}")
+ if stderr and stderr.strip():
+ print(" Error output:")
+ for line in stderr.strip().split("\n"):
+ print(f" {line}")
+ if stdout and stdout.strip():
+ print(" Stdout:")
+ for line in stdout.strip().split("\n"):
+ print(f" {line}")
+ raise subprocess.CalledProcessError(
+ returncode, command_to_run, stdout, stderr
+ )
+
+ record = TimingRecord(
+ stat=stat,
+ iteration=iteration,
+ command=command_to_run,
+ elapsed_time=elapsed,
+ system=system,
+ user=user,
+ cpu_percent=cpu_percent,
+ max_rss=max_rss,
+ inputs=inputs,
+ outputs=outputs,
+ returncode=returncode,
+ profile=str(profile_path) if profile_path else None,
+ )
+ self._record_timing(record, timing_file)
+
+ print(f" Completed in {elapsed:.3f}s")
+ if profile_path:
+ print(f" Profile written to {profile_path}")
+ if stdout and stdout.strip():
+ output_lines = stdout.strip().split("\n")[:3]
+ for line in output_lines:
+ print(f" {line[:100]}")
+ if len(stdout.strip().split("\n")) > 3:
+ print(" ...")
+
+ return elapsed, returncode
+
+ except subprocess.TimeoutExpired:
+ process.kill()
+ stdout, stderr = process.communicate()
+ elapsed = time.perf_counter() - start_time
+ print(f" Command timed out after {elapsed:.3f}s: {' '.join(command_to_run)}")
+ print(f" Timeout was set to {timeout}s")
+ if stdout and stdout.strip():
+ print(" Stdout before timeout:")
+ for line in stdout.strip().split("\n")[-10:]:
+ print(f" {line}")
+ if stderr and stderr.strip():
+ print(" Stderr before timeout:")
+ for line in stderr.strip().split("\n")[-5:]:
+ print(f" {line}")
+ raise
+
+ def setup_requirements(self):
+ """Download and prepare requirements.txt."""
+ print("Setting up requirements.txt...")
+ requirements_path = self.benchmark_dir / "requirements.txt"
+
+ if requirements_path.exists() and not self.force_setup:
+ print(f"Reusing existing {requirements_path}")
+ return
+
+ try:
+ with urllib.request.urlopen(self.requirements_url) as response:
+ content = response.read().decode("utf-8")
+
+ # Filter out --index-url lines like the original.
+ filtered_lines = [
+ line
+ for line in content.splitlines()
+ if not line.strip().startswith("--index-url")
+ ]
+
+ with open(requirements_path, "w") as f:
+ f.write("\n".join(filtered_lines))
+
+ print(f"Downloaded {len(filtered_lines)} requirements")
+
+ except Exception as e:
+ print(f"Failed to download requirements: {e}")
+ raise
+
+ def clean_cache(self):
+ """Clean pipenv and pip caches."""
+ print("Cleaning caches...")
+ cache_dirs = [Path.home() / ".cache" / "pip", Path.home() / ".cache" / "pipenv"]
+
+ for cache_dir in cache_dirs:
+ if cache_dir.exists():
+ shutil.rmtree(cache_dir, ignore_errors=True)
+
+ def clean_venv(self):
+ """Clean virtual environment."""
+ print("Cleaning virtual environment...")
+ try:
+ result = subprocess.run(
+ ["pipenv", "--venv"],
+ cwd=self.benchmark_dir,
+ capture_output=True,
+ text=True,
+ check=False,
+ timeout=30,
+ env=subprocess_env(),
+ )
+ if result.returncode == 0:
+ venv_path = Path(result.stdout.strip())
+ if venv_path.exists():
+ print(f" Removing venv: {venv_path}")
+ shutil.rmtree(venv_path, ignore_errors=True)
+ else:
+ print(" No virtual environment found")
+ except subprocess.TimeoutExpired:
+ print(" Warning: pipenv --venv timed out")
+ except Exception as e:
+ print(f" Warning: Could not clean venv: {e}")
+
+ def clean_lock(self):
+ """Remove Pipfile.lock."""
+ print("Cleaning lock file...")
+ lock_file = self.benchmark_dir / "Pipfile.lock"
+ if lock_file.exists():
+ lock_file.unlink()
+
+ def benchmark_tooling(self):
+ """Benchmark pipenv installation using the current development version."""
+ print("Benchmarking tooling...")
+ parent_dir = self.benchmark_dir.parent
+ elapsed, _ = self.run_timed_command(
+ [sys.executable, "-m", "pip", "install", "-e", str(parent_dir)], "tooling.txt"
+ )
+ print(f"Tooling completed in {elapsed:.3f}s")
+
+ def benchmark_import(self):
+ """Benchmark importing requirements.txt to Pipfile."""
+ print("Benchmarking import...")
+ elapsed, _ = self.run_timed_command(
+ ["pipenv", "install", "-r", "requirements.txt"], "import.txt"
+ )
+ print(f"Import completed in {elapsed:.3f}s")
+
+ def benchmark_lock(self, timing_file: str):
+ """Benchmark lock file generation."""
+ print(f"Benchmarking lock ({timing_file})...")
+ elapsed, _ = self.run_timed_command(["pipenv", "lock"], timing_file)
+ print(f"Lock completed in {elapsed:.3f}s")
+
+ def benchmark_install(self, timing_file: str):
+ """Benchmark package installation."""
+ print(f"Benchmarking install ({timing_file})...")
+ elapsed, _ = self.run_timed_command(["pipenv", "sync"], timing_file)
+ print(f"Install completed in {elapsed:.3f}s")
+
+ def benchmark_update(self, timing_file: str):
+ """Benchmark package updates."""
+ print(f"Benchmarking update ({timing_file})...")
+ elapsed, _ = self.run_timed_command(
+ ["pipenv", "update"], timing_file, timeout=900
+ )
+ print(f"Update completed in {elapsed:.3f}s")
+
+ def benchmark_add_package(self):
+ """Benchmark adding a new package."""
+ print("Benchmarking add package...")
+ elapsed, _ = self.run_timed_command(
+ ["pipenv", "install", self.test_package], "add-package.txt"
+ )
+ print(f"Add package completed in {elapsed:.3f}s")
+
+ def get_pipenv_version(self) -> str:
+ """Get pipenv version."""
+ try:
+ result = subprocess.run(
+ ["pipenv", "--version"],
+ capture_output=True,
+ text=True,
+ check=True,
+ timeout=30,
+ env=subprocess_env(),
+ )
+ return result.stdout.split()[-1]
+ except Exception:
+ return "unknown"
+
+ def generate_stats(self):
+ """Generate CSV stats file."""
+ print("Generating stats...")
+ version = self.get_pipenv_version()
+ timestamp = int(time.time())
+
+ stats_file = self.benchmark_dir / "stats.csv"
+
+ with open(stats_file, "w", newline="") as csvfile:
+ writer = csv.writer(csvfile)
+ writer.writerow(
+ [
+ "tool",
+ "version",
+ "timestamp",
+ "stat",
+ "elapsed time",
+ "system",
+ "user",
+ "cpu percent",
+ "max rss",
+ "inputs",
+ "outputs",
+ ]
+ )
+
+ for stat in TIMED_STATS:
+ timing_file = self.timings_dir / f"{stat}.txt"
+ if timing_file.exists():
+ with open(timing_file) as f:
+ timing_data = f.read().strip().split(",")
+ writer.writerow(["pipenv", version, timestamp, stat] + timing_data)
+
+ print(f"Stats written to {stats_file}")
+
+ def write_json_results(self):
+ if not self.output_json:
+ return
+
+ payload = {
+ "tool": "pipenv",
+ "version": self.get_pipenv_version(),
+ "generated_at": int(time.time()),
+ "records": [asdict(record) for record in self.records],
+ }
+ with open(self.output_json, "w") as f:
+ json.dump(payload, f, indent=2)
+ f.write("\n")
+ print(f"JSON results written to {self.output_json}")
+
+ def run_operation(self, operation: str):
+ if operation == "setup":
+ self.setup_requirements()
+ elif operation == "tooling":
+ self.benchmark_tooling()
+ elif operation == "import":
+ self.benchmark_import()
+ elif operation == "lock-cold":
+ self.clean_cache()
+ self.clean_venv()
+ self.clean_lock()
+ self.benchmark_lock("lock-cold.txt")
+ elif operation == "lock-warm":
+ self.clean_lock()
+ self.benchmark_lock("lock-warm.txt")
+ elif operation == "install-cold":
+ self.clean_cache()
+ self.clean_venv()
+ self.benchmark_install("install-cold.txt")
+ elif operation == "install-warm":
+ self.clean_venv()
+ self.benchmark_install("install-warm.txt")
+ elif operation == "update-cold":
+ self.clean_cache()
+ self.benchmark_update("update-cold.txt")
+ elif operation == "update-warm":
+ self.benchmark_update("update-warm.txt")
+ elif operation == "add-package":
+ self.benchmark_add_package()
+ elif operation == "stats":
+ self.generate_stats()
+ else:
+ raise ValueError(f"Unknown operation: {operation}")
+
+ def run_full_benchmark(self):
+ """Run the complete benchmark suite."""
+ print("=" * 60)
+ print("Starting pipenv benchmark suite...")
+ print("=" * 60)
+
+ steps = [
+ ("Setup", "setup"),
+ ("Tooling", "tooling"),
+ ("Import", "import"),
+ ("Lock (cold)", "lock-cold"),
+ ("Lock (warm)", "lock-warm"),
+ ("Install (cold)", "install-cold"),
+ ("Install (warm)", "install-warm"),
+ ("Update (cold)", "update-cold"),
+ ("Update (warm)", "update-warm"),
+ ("Add package", "add-package"),
+ ("Generate stats", "stats"),
+ ]
+
+ for index, (label, operation) in enumerate(steps, start=1):
+ print(f"\n[{index}/{len(steps)}] {label}")
+ print("-" * 40)
+ self.run_operation(operation)
+
+ print("\n" + "=" * 60)
+ print("Benchmark suite completed!")
+ print("=" * 60)
+
+
+def parse_args(argv=None):
+ parser = argparse.ArgumentParser(description="Run pipenv package-manager benchmarks.")
+ parser.add_argument(
+ "operation",
+ nargs="?",
+ default="all",
+ choices=("all", *OPERATIONS),
+ help="Benchmark operation to run. Defaults to the full suite.",
+ )
+ parser.add_argument(
+ "--repeat",
+ type=int,
+ default=1,
+ help="Repeat the selected operation or full suite and store median timings.",
+ )
+ parser.add_argument(
+ "--profile",
+ action="store_true",
+ help=(
+ "Capture cProfile files in timings/. For pipenv commands, "
+ "resolver work is kept in-process."
+ ),
+ )
+ parser.add_argument(
+ "--output-json",
+ type=Path,
+ default=Path("benchmark-results.json"),
+ help="Write per-run timing records to this JSON file.",
+ )
+ parser.add_argument(
+ "--no-json",
+ action="store_true",
+ help="Do not write benchmark-results.json.",
+ )
+ parser.add_argument(
+ "--force-setup",
+ action="store_true",
+ help="Download requirements.txt even when a local copy already exists.",
+ )
+ args = parser.parse_args(argv)
+ if args.repeat < 1:
+ parser.error("--repeat must be at least 1")
+ return args
+
+
+def main(argv=None):
+ args = parse_args(argv)
+ benchmark_dir = Path(__file__).parent
+ output_json = None if args.no_json else benchmark_dir / args.output_json
+ benchmark = PipenvBenchmark(
+ benchmark_dir,
+ profile=args.profile,
+ output_json=output_json,
+ force_setup=args.force_setup,
+ )
+
+ for iteration in range(1, args.repeat + 1):
+ if args.repeat > 1:
+ print(f"\nBenchmark iteration {iteration}/{args.repeat}")
+ if args.operation == "all":
+ benchmark.run_full_benchmark()
+ else:
+ benchmark.run_operation(args.operation)
+
+ if args.operation not in {"all", "stats"}:
+ benchmark.generate_stats()
+ if args.operation != "stats":
+ benchmark.write_json_results()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/docker/Dockerfile b/docker/Dockerfile
new file mode 100644
index 0000000000..33609c62e8
--- /dev/null
+++ b/docker/Dockerfile
@@ -0,0 +1,5 @@
+ARG PYVERSION
+FROM docker.io/python:${PYVERSION}
+
+ARG VERSION
+RUN pip install pipenv=="${VERSION}"
diff --git a/docker/Makefile b/docker/Makefile
new file mode 100644
index 0000000000..409ad0764a
--- /dev/null
+++ b/docker/Makefile
@@ -0,0 +1,20 @@
+ALL_PYVERSIONS = 3.11-alpine 3.10-alpine 3.9-alpine 3.8-alpine 3.11 3.10 3.9 3.8
+
+
+ifneq (,$(wildcard ./.env))
+ include .env
+ export
+endif
+
+
+docker-build:
+ echo $(PYVERSION) $(PIPENV)
+ docker build -t $(REGISTRY)/$(ORG)/$(IMG):$(TAG) --build-arg PYVERSION=$(PYVERSION) --build-arg VERSION=$(PIPENV) -f Dockerfile .
+
+
+docker-push:
+ docker push $(REGISTRY)/$(ORG)/$(IMG):$(TAG)
+
+
+build-all:
+ $(foreach var,$(ALL_PYVERSIONS), make docker-build docker-push TAG=$(var)-$(PIPENV) PYVERSION=$(var) PIPENV=$(PIPENV);)
diff --git a/docker/README.md b/docker/README.md
new file mode 100644
index 0000000000..5cbe0e32dc
--- /dev/null
+++ b/docker/README.md
@@ -0,0 +1,11 @@
+# Public docker images
+
+Build all images with:
+```
+$ make build-all PIPENV=2023.07.3
+```
+Build a single image with with:
+
+```
+$ make docker-build docker-push TAG=3.11-alpine-v2023-6-26 PYVERSION=3.11-alpine PIPENV=2023.6.26
+```
diff --git a/docs/Makefile b/docs/Makefile
index 6b4a9de90b..2d91525a44 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -17,4 +17,4 @@ help:
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
- @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
\ No newline at end of file
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/docs/_static/custom.css b/docs/_static/custom.css
new file mode 100644
index 0000000000..8ada6183c6
--- /dev/null
+++ b/docs/_static/custom.css
@@ -0,0 +1,7 @@
+/* Hide module name and default value for environment variable section */
+div[id$='environment-variables'] code.descclassname {
+ display: none;
+}
+div[id$='environment-variables'] em.property {
+ display: none;
+}
diff --git a/docs/_static/konami.js b/docs/_static/konami.js
new file mode 100644
index 0000000000..41672442ef
--- /dev/null
+++ b/docs/_static/konami.js
@@ -0,0 +1,151 @@
+/*
+ * Konami-JS ~
+ * :: Now with support for touch events and multiple instances for
+ * :: those situations that call for multiple easter eggs!
+ * Code: https://github.com/snaptortoise/konami-js
+ * Copyright (c) 2009 George Mandis (georgemandis.com, snaptortoise.com)
+ * Version: 1.6.2 (7/17/2018)
+ * Licensed under the MIT License (http://opensource.org/licenses/MIT)
+ * Tested in: Safari 4+, Google Chrome 4+, Firefox 3+, IE7+, Mobile Safari 2.2.1+ and Android
+ */
+
+var Konami = function (callback) {
+ var konami = {
+ addEvent: function (obj, type, fn, ref_obj) {
+ if (obj.addEventListener)
+ obj.addEventListener(type, fn, false);
+ else if (obj.attachEvent) {
+ // IE
+ obj["e" + type + fn] = fn;
+ obj[type + fn] = function () {
+ obj["e" + type + fn](window.event, ref_obj);
+ }
+ obj.attachEvent("on" + type, obj[type + fn]);
+ }
+ },
+ removeEvent: function (obj, eventName, eventCallback) {
+ if (obj.removeEventListener) {
+ obj.removeEventListener(eventName, eventCallback);
+ } else if (obj.attachEvent) {
+ obj.detachEvent(eventName);
+ }
+ },
+ input: "",
+ pattern: "38384040373937396665",
+ keydownHandler: function (e, ref_obj) {
+ if (ref_obj) {
+ konami = ref_obj;
+ } // IE
+ konami.input += e ? e.keyCode : event.keyCode;
+ if (konami.input.length > konami.pattern.length) {
+ konami.input = konami.input.substr((konami.input.length - konami.pattern.length));
+ }
+ if (konami.input === konami.pattern) {
+ konami.code(konami._currentLink);
+ konami.input = '';
+ e.preventDefault();
+ return false;
+ }
+ },
+ load: function (link) {
+ this._currentLink = link;
+ this.addEvent(document, "keydown", this.keydownHandler, this);
+ this.iphone.load(link);
+ },
+ unload: function () {
+ this.removeEvent(document, 'keydown', this.keydownHandler);
+ this.iphone.unload();
+ },
+ code: function (link) {
+ window.location = link
+ },
+ iphone: {
+ start_x: 0,
+ start_y: 0,
+ stop_x: 0,
+ stop_y: 0,
+ tap: false,
+ capture: false,
+ orig_keys: "",
+ keys: ["UP", "UP", "DOWN", "DOWN", "LEFT", "RIGHT", "LEFT", "RIGHT", "TAP", "TAP"],
+ input: [],
+ code: function (link) {
+ konami.code(link);
+ },
+ touchmoveHandler: function (e) {
+ if (e.touches.length === 1 && konami.iphone.capture === true) {
+ var touch = e.touches[0];
+ konami.iphone.stop_x = touch.pageX;
+ konami.iphone.stop_y = touch.pageY;
+ konami.iphone.tap = false;
+ konami.iphone.capture = false;
+ konami.iphone.check_direction();
+ }
+ },
+ touchendHandler: function () {
+ konami.iphone.input.push(konami.iphone.check_direction());
+
+ if (konami.iphone.input.length > konami.iphone.keys.length) konami.iphone.input.shift();
+
+ if (konami.iphone.input.length === konami.iphone.keys.length) {
+ var match = true;
+ for (var i = 0; i < konami.iphone.keys.length; i++) {
+ if (konami.iphone.input[i] !== konami.iphone.keys[i]) {
+ match = false;
+ }
+ }
+ if (match) {
+ konami.iphone.code(konami._currentLink);
+ }
+ }
+ },
+ touchstartHandler: function (e) {
+ konami.iphone.start_x = e.changedTouches[0].pageX;
+ konami.iphone.start_y = e.changedTouches[0].pageY;
+ konami.iphone.tap = true;
+ konami.iphone.capture = true;
+ },
+ load: function (link) {
+ this.orig_keys = this.keys;
+ konami.addEvent(document, "touchmove", this.touchmoveHandler);
+ konami.addEvent(document, "touchend", this.touchendHandler, false);
+ konami.addEvent(document, "touchstart", this.touchstartHandler);
+ },
+ unload: function () {
+ konami.removeEvent(document, 'touchmove', this.touchmoveHandler);
+ konami.removeEvent(document, 'touchend', this.touchendHandler);
+ konami.removeEvent(document, 'touchstart', this.touchstartHandler);
+ },
+ check_direction: function () {
+ x_magnitude = Math.abs(this.start_x - this.stop_x);
+ y_magnitude = Math.abs(this.start_y - this.stop_y);
+ x = ((this.start_x - this.stop_x) < 0) ? "RIGHT" : "LEFT";
+ y = ((this.start_y - this.stop_y) < 0) ? "DOWN" : "UP";
+ result = (x_magnitude > y_magnitude) ? x : y;
+ result = (this.tap === true) ? "TAP" : result;
+ return result;
+ }
+ }
+ }
+
+ typeof callback === "string" && konami.load(callback);
+ if (typeof callback === "function") {
+ konami.code = callback;
+ konami.load();
+ }
+
+ return konami;
+};
+
+
+if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
+ module.exports = Konami;
+} else {
+ if (typeof define === 'function' && define.amd) {
+ define([], function() {
+ return Konami;
+ });
+ } else {
+ window.Konami = Konami;
+ }
+}
diff --git a/docs/_static/pipenv.png b/docs/_static/pipenv.png
index 724aedf170..0fb52fd34b 100644
Binary files a/docs/_static/pipenv.png and b/docs/_static/pipenv.png differ
diff --git a/docs/_templates/hacks.html b/docs/_templates/hacks.html
index 45ef5859f2..00c88843ca 100644
--- a/docs/_templates/hacks.html
+++ b/docs/_templates/hacks.html
@@ -1,4 +1,5 @@
-Alabaster (krTheme++) Hacks -->
+
+
-
-
-
-
+
-
-
Stay Informed
-
Receive updates on new releases and upcoming projects.
- Pipenv is a production-ready tool that aims to bring the best of all packaging worlds to the Python world. It harnesses Pipfile, pip, and virtualenv into one single command.
+ Pipenv is a production-ready tool that aims to bring the best of all packaging worlds to the Python world. It harnesses Pipfile, pip, and virtualenv into one single command.
It features very pretty terminal colors.
Stay Informed
Receive updates on new releases and upcoming projects.
-
diff --git a/docs/advanced.md b/docs/advanced.md
new file mode 100644
index 0000000000..49dfeae6e5
--- /dev/null
+++ b/docs/advanced.md
@@ -0,0 +1,581 @@
+# Advanced Pipenv Usage
+
+This guide covers advanced features and techniques for using Pipenv effectively in complex scenarios. These topics build on the basic functionality covered in other documentation sections.
+
+## Passing Additional Arguments to pip
+
+When you need more control over the underlying pip commands that Pipenv executes, you can pass additional arguments directly to pip.
+
+### Using --extra-pip-args
+
+The `--extra-pip-args` option allows you to supply additional arguments to pip during installation:
+
+```bash
+$ pipenv install --extra-pip-args="--use-feature=truststore --proxy=127.0.0.1"
+```
+
+This is particularly useful for:
+
+- Using experimental pip features
+- Configuring proxies
+- Setting build options for packages with C extensions
+- Controlling cache behavior
+- Specifying platform-specific wheels
+
+### Common Use Cases
+
+#### Using System Certificate Stores
+
+```bash
+$ pipenv install --extra-pip-args="--use-feature=truststore"
+```
+
+#### Installing Platform-Specific Packages
+
+```bash
+$ pipenv install --extra-pip-args="--platform=win_amd64 --only-binary=:all:"
+```
+
+#### Setting Build Options
+
+```bash
+$ pipenv install pycurl --extra-pip-args="--global-option=--with-openssl-dir=/usr/local/opt/openssl"
+```
+
+### Using Environment Variables During Installation
+
+Some packages require environment variables to be set during installation for proper compilation or configuration. You can set these variables before running `pipenv install`:
+
+#### Example: Installing CUDA-enabled Packages
+
+For packages that need CMake arguments, such as `llama-cpp-python` with CUDA support:
+
+```bash
+# Unix/Linux/macOS
+$ CMAKE_ARGS="-DGGML_CUDA=on" pipenv install llama-cpp-python
+
+# Or export for multiple commands
+$ export CMAKE_ARGS="-DGGML_CUDA=on"
+$ pipenv install llama-cpp-python
+```
+
+#### Example: Other Build Environment Variables
+
+```bash
+# For packages that need specific compiler flags
+$ CFLAGS="-O3" CXXFLAGS="-O3" pipenv install some-package
+
+# For packages using meson build system
+$ MESON_ARGS="-Dfeature=enabled" pipenv install some-package
+
+# For packages requiring specific library paths
+$ LDFLAGS="-L/usr/local/lib" CPPFLAGS="-I/usr/local/include" pipenv install some-package
+```
+
+```{note}
+These environment variables are passed to pip and subsequently to the package's build system (setuptools, CMake, meson, etc.). The specific variables needed depend on the package being installed.
+```
+
+## Deployment Strategies
+
+Pipenv provides several approaches for deploying applications in production environments.
+
+### Using --deploy Flag
+
+The `--deploy` flag ensures that your `Pipfile.lock` is up-to-date with your `Pipfile` before installation:
+
+```bash
+$ pipenv install --deploy
+```
+
+This will fail if:
+- The `Pipfile.lock` is out of date
+- The `Pipfile.lock` is missing
+- The hash in `Pipfile.lock` doesn't match the `Pipfile`
+
+This is crucial for production deployments to ensure you're installing exactly what you expect.
+
+### System-Wide Installation
+
+For some deployment scenarios (like containerized applications), you may want to install packages directly to the system Python rather than in a virtual environment:
+
+```bash
+$ pipenv install --system --deploy
+```
+
+This installs all packages specified in `Pipfile.lock` to the system Python. Use this approach with caution, as it can potentially conflict with system packages.
+
+### Verifying Lock File Without Installing
+
+To verify that your `Pipfile.lock` is up-to-date without installing packages:
+
+```bash
+$ pipenv verify
+```
+
+This is useful in CI/CD pipelines to ensure the lock file has been properly updated after changes to the `Pipfile`.
+
+### Docker Deployment
+
+For Docker deployments, a multi-stage build approach is recommended:
+
+```dockerfile
+FROM python:3.10-slim AS builder
+
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Install pipenv and dependencies
+RUN pip install pipenv && \
+ pipenv install --deploy --system
+
+FROM python:3.10-slim
+
+WORKDIR /app
+
+# Copy installed packages from builder stage
+COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
+
+# Copy application code
+COPY . .
+
+# Run the application
+CMD ["python", "app.py"]
+```
+
+This approach:
+1. Installs dependencies in a builder stage
+2. Copies only the necessary files to the final image
+3. Results in a smaller, more secure image
+
+## Working with Different Python Distributions
+
+Pipenv can work with various Python distributions and installations.
+
+### Using Specific Python Interpreters
+
+To use a specific Python interpreter:
+
+```bash
+$ pipenv --python /path/to/python
+```
+
+This is useful when you have multiple Python versions installed or need to use a specific distribution.
+
+### Anaconda/Conda Integration
+
+Pipenv can work with Anaconda/Conda Python installations, though there are some important considerations.
+
+#### Basic Usage
+
+To use Pipenv with Anaconda, specify the full path to the Conda Python interpreter:
+
+```bash
+$ pipenv --python /path/to/anaconda/bin/python
+```
+
+**Important**: You must provide the complete path to the Python executable. A partial version number like `--python 3.10` may not work if Pipenv cannot find the Conda installation in its search paths.
+
+To find your Conda Python path:
+
+```bash
+# With conda environment activated
+$ which python
+/home/user/anaconda3/envs/myenv/bin/python
+
+# Or check conda info
+$ conda info --envs
+```
+
+#### Reusing Conda-Installed Packages
+
+To allow the Pipenv virtualenv to access packages installed in Conda:
+
+```bash
+$ pipenv --python /path/to/anaconda/bin/python --site-packages
+```
+
+The `--site-packages` flag allows the virtual environment to access packages installed in the parent Python installation.
+
+#### Troubleshooting Conda Issues
+
+**Virtualenv Creation Fails with Import Errors**
+
+If you encounter errors like `ImportError: cannot import name '_io'` or similar during virtualenv creation, this is typically due to outdated packages in your Conda installation:
+
+```bash
+# Update conda's virtualenv and Python packages
+$ conda update python virtualenv
+```
+
+**Python Version Not Found**
+
+If Pipenv reports that a Python version was not found:
+
+1. Verify the Python version is installed in Conda:
+ ```bash
+ $ conda search python
+ ```
+
+2. Use the full path instead of just the version number:
+ ```bash
+ # Instead of this:
+ $ pipenv --python 3.10
+
+ # Use the full path:
+ $ pipenv --python ~/anaconda3/envs/py310/bin/python
+ ```
+
+**Mixing Conda and Pipenv**
+
+While Pipenv can work with Conda Python, be aware that:
+
+- Pipenv creates its own virtualenv separate from Conda environments
+- Package installations via Pipenv are isolated from Conda
+- For best results, choose either Conda or Pipenv for dependency management in a project, not both
+
+### pyenv Integration
+
+Pipenv automatically detects and works with pyenv:
+
+```bash
+# Set local Python version with pyenv
+$ pyenv local 3.10.4
+
+# Pipenv will use this version automatically
+$ pipenv install
+```
+
+If the specified Python version isn't installed, Pipenv will prompt you to install it with pyenv:
+
+```bash
+$ pipenv --python 3.11
+Warning: Python 3.11 was not found on your system...
+Would you like us to install latest CPython 3.11 with pyenv? [Y/n]: y
+Installing CPython 3.11.0 with pyenv...
+```
+
+### asdf Integration
+
+Similar to pyenv, Pipenv also works with asdf:
+
+```bash
+# Install Python with asdf
+$ asdf install python 3.10.4
+
+# Use this version with Pipenv
+$ pipenv --python 3.10.4
+```
+
+## Generating Requirements Files
+
+While Pipenv uses `Pipfile` and `Pipfile.lock`, you may need to generate traditional `requirements.txt` files for compatibility with other tools.
+
+### Basic Requirements Generation
+
+```bash
+$ pipenv requirements > requirements.txt
+```
+
+This generates a `requirements.txt` file from your `Pipfile.lock` with exact versions.
+
+### Including Development Dependencies
+
+```bash
+$ pipenv requirements --dev > requirements-dev.txt
+```
+
+### Development Dependencies Only
+
+```bash
+$ pipenv requirements --dev-only > dev-requirements.txt
+```
+
+### Including Hashes
+
+```bash
+$ pipenv requirements --hash > requirements.txt
+```
+
+This includes package hashes for additional security.
+
+### Excluding PEP 508 Markers
+
+```bash
+$ pipenv requirements --exclude-markers > requirements.txt
+```
+
+This removes environment markers (like `python_version >= '3.7'`).
+
+### Specific Package Categories
+
+```bash
+$ pipenv requirements --categories="docs,tests" > requirements-docs-tests.txt
+```
+
+This generates requirements for specific custom package categories.
+
+## Security Features
+
+Pipenv includes several advanced security features to help protect your projects.
+
+### Vulnerability Scanning
+
+Pipenv integrates with the [safety](https://github.com/pyupio/safety) package to scan for known vulnerabilities:
+
+```bash
+$ pipenv scan
+```
+
+This checks your dependencies against the PyUp Safety database of known vulnerabilities.
+
+#### Using a Custom Vulnerability Database
+
+```bash
+$ pipenv scan --db /path/to/custom/db
+```
+
+#### Ignoring Specific Vulnerabilities
+
+```bash
+$ pipenv scan --ignore 12345
+```
+
+#### Different Output Formats
+
+```bash
+$ pipenv scan --output json > vulnerabilities.json
+```
+
+### Automatic Python Installation
+
+Pipenv can automatically install the required Python version if you have pyenv or asdf installed:
+
+```toml
+# Pipfile
+[requires]
+python_version = "3.11"
+```
+
+When you run `pipenv install`, it will check if Python 3.11 is available and prompt to install it if needed.
+
+## Custom Scripts
+
+Pipenv allows you to define custom scripts in your `Pipfile` for common tasks.
+
+### Defining Scripts
+
+```toml
+[scripts]
+start = "python app.py"
+test = "pytest"
+lint = "flake8 ."
+format = "black ."
+```
+
+### Running Scripts
+
+```bash
+$ pipenv run start
+$ pipenv run test
+```
+
+### Script with Arguments
+
+```bash
+$ pipenv run test tests/test_api.py -v
+```
+
+### Complex Script Definitions
+
+You can define more complex scripts using the extended syntax:
+
+```toml
+[scripts]
+start = {cmd = "python app.py"}
+complex = {call = "package.module:function('arg1', 'arg2')"}
+```
+
+## Environment Variables and Configuration
+
+### Automatic Loading of .env
+
+Pipenv automatically loads environment variables from `.env` files in your project directory:
+
+```
+# .env
+DEBUG=True
+DATABASE_URL=postgresql://user:password@localhost/dbname
+```
+
+These variables are available when you run `pipenv shell` or `pipenv run`.
+
+### Custom .env Location
+
+```bash
+$ PIPENV_DOTENV_LOCATION=/path/to/.env pipenv shell
+```
+
+### Variable Expansion in .env
+
+You can use variable expansion in your `.env` files:
+
+```
+# .env
+HOME_DIR=${HOME}
+CONFIG_PATH=${HOME_DIR}/.config/app
+```
+
+## Working with Air-Gapped Environments
+
+In environments without internet access, you can still use Pipenv by preparing packages in advance.
+
+### Downloading Packages
+
+On a connected system:
+
+```bash
+# Generate requirements with hashes
+$ pipenv requirements --hash > requirements.txt
+
+# Download packages
+$ pip download -r requirements.txt -d ./packages
+```
+
+### Installing in Air-Gapped Environment
+
+Transfer the packages directory to the air-gapped environment, then:
+
+```bash
+$ pip install --no-index --find-links=./packages -r requirements.txt
+```
+
+## Testing and CI/CD Integration
+
+### Using Pipenv with tox
+
+Here's an example `tox.ini` for testing with multiple Python versions:
+
+```ini
+[tox]
+envlist = py37, py38, py39, py310, py311
+
+[testenv]
+deps = pipenv
+commands =
+ pipenv install --dev
+ pipenv run pytest {posargs:tests}
+```
+
+### GitHub Actions Integration
+
+```yaml
+name: Python Tests
+
+on: [push, pull_request]
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ python-version: ['3.8', '3.9', '3.10', '3.11']
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up Python ${{ matrix.python-version }}
+ uses: actions/setup-python@v4
+ with:
+ python-version: ${{ matrix.python-version }}
+ - name: Install dependencies
+ run: |
+ python -m pip install --upgrade pip
+ pip install pipenv
+ pipenv install --dev
+ - name: Verify lock file
+ run: pipenv verify
+ - name: Run tests
+ run: pipenv run pytest
+ - name: Security scan
+ run: pipenv scan
+```
+
+## Performance Optimization
+
+### Caching
+
+Pipenv maintains a cache to speed up installations. You can control this cache:
+
+```bash
+# Clear the cache
+$ pipenv lock --clear
+
+# Set a custom cache location
+$ export PIPENV_CACHE_DIR=/path/to/custom/cache
+```
+
+### Speeding Up Installations
+
+For faster installations during development:
+
+```bash
+# Skip lock file generation
+$ export PIPENV_SKIP_LOCK=1
+$ pipenv install package-name
+```
+
+```{warning}
+Only use PIPENV_SKIP_LOCK during development, not in production environments.
+```
+
+### Handling Large Dependency Trees
+
+For projects with many dependencies:
+
+```bash
+# Increase the maximum depth for dependency resolution
+$ export PIPENV_MAX_DEPTH=20
+$ pipenv lock
+```
+
+## Community Integrations
+
+Pipenv works well with various tools and services in the Python ecosystem:
+
+- **Heroku**: Automatically detects and uses Pipfile/Pipfile.lock
+- **Platform.sh**: Native support for Pipenv projects
+- **PyUp**: Security monitoring for Pipenv projects
+- **VS Code**: Built-in support for Pipenv environments
+- **PyCharm**: Supports Pipenv for project environments
+- **Emacs**: Integration via pipenv.el
+- **Fish Shell**: Automatic shell activation
+
+## Opening Modules in Your Editor
+
+Pipenv allows you to quickly open installed packages in your editor:
+
+```bash
+$ pipenv open requests
+```
+
+This opens the source code of the requests package in your default editor (defined by the `EDITOR` environment variable).
+
+You can specify a different editor for a one-time use:
+
+```bash
+$ EDITOR=code pipenv open flask
+```
+
+This is useful for:
+- Exploring package source code
+- Debugging issues
+- Understanding how a package works
+- Adding temporary patches
+
+## Conclusion
+
+These advanced features make Pipenv a powerful tool for Python dependency management in complex scenarios. By leveraging these capabilities, you can create more efficient, secure, and maintainable Python projects.
+
+Remember that while these advanced features provide additional flexibility and power, they should be used judiciously. Always follow best practices for security and reproducibility, especially in production environments.
diff --git a/docs/advanced.rst b/docs/advanced.rst
deleted file mode 100644
index 8b47ee9443..0000000000
--- a/docs/advanced.rst
+++ /dev/null
@@ -1,397 +0,0 @@
-.. _advanced:
-
-Advanced Usage of Pipenv
-========================
-
-.. image:: https://farm4.staticflickr.com/3672/33231486560_bff4124c9a_k_d.jpg
-
-This document covers some of Pipenv's more glorious and advanced features.
-
-β€ Specifying Package Indexes
-----------------------------
-
-If you'd like a specific package to be installed with a specific package index, you can do the following::
-
- [[source]]
- url = "https://pypi.python.org/simple"
- verify_ssl = true
- name = "pypi"
-
- [[source]]
- url = "http://pypi.home.kennethreitz.org/simple"
- verify_ssl = false
- name = "home"
-
- [dev-packages]
-
- [packages]
- requests = {version="*", index="home"}
- maya = {version="*", index="pypi"}
- records = "*"
-
-Very fancy.
-
-β€ Specifying Basically Anything
--------------------------------
-
-If you'd like to specify that a specific package only be installed on certain systems,
-you can use `PEP 508 specifiers `_ to accomplish this.
-
-Here's an example ``Pipfile``, which will only install ``pywinusb`` on Windows systems::
-
- [[source]]
- url = "https://pypi.python.org/simple"
- verify_ssl = true
- name = "pypi"
-
- [packages]
- requests = "*"
- pywinusb = {version = "*", os_name = "== 'windows'"}
-
-VoilΓ !
-
-Here's a more complex example::
-
- [[source]]
- url = "https://pypi.python.org/simple"
- verify_ssl = true
-
- [packages]
- unittest2 = {version = ">=1.0,<3.0", markers="python_version < '2.7.9' or (python_version >= '3.0' and python_version < '3.4')"}
-
-Magic. Pure, unadulterated magic.
-
-
-β€ Deploying System Dependencies
--------------------------------
-
-You can tell Pipenv to install things into its parent system with the ``--system`` flag::
-
- $ pipenv install --system
-
-This is useful for Docker containers, and deployment infrastructure (e.g. Heroku does this).
-
-Also useful for deployment is the ``--deploy`` flag::
-
- $ pipenv install --system --deploy
-
-This will fail a build if the ``Pipfile.lock`` is outβofβdate, instead of generating a new one.
-
-
-β€ Generating a ``requirements.txt``
------------------------------------
-
-You can convert a ``Pipfile`` and ``Pipenv.lock`` into a ``requirements.txt`` file very easily, and get all the benefits of hashes, extras, and other goodies we have included.
-
-Let's take this ``Pipfile``::
-
- [[source]]
- url = "https://pypi.python.org/simple"
- verify_ssl = true
-
- [packages]
- requests = {version="*"}
-
-And generate a ``requirements.txt`` out of it::
-
- $ pipenv lock -r
- chardet==3.0.4 --hash=sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691 --hash=sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae
- requests==2.18.4 --hash=sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b --hash=sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e
- certifi==2017.7.27.1 --hash=sha256:54a07c09c586b0e4c619f02a5e94e36619da8e2b053e20f594348c0611803704 --hash=sha256:40523d2efb60523e113b44602298f0960e900388cf3bb6043f645cf57ea9e3f5
- idna==2.6 --hash=sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4 --hash=sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f
- urllib3==1.22 --hash=sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b --hash=sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f
-
-Very fancy.
-
-β€ Detection of Security Vulnerabilities
----------------------------------------
-
-Pipenv includes the `safety `_ package, and will use it to scan your dependency graph
-for known security vulnerabilities!
-
-Example::
-
- $ cat Pipfile
- [packages]
- django = "==1.10.1"
-
- $ pipenv check
- Checking PEP 508 requirementsβ¦
- Passed!
- Checking installed package safetyβ¦
-
- 33075: django >=1.10,<1.10.3 resolved (1.10.1 installed)!
- Django before 1.8.x before 1.8.16, 1.9.x before 1.9.11, and 1.10.x before 1.10.3, when settings.DEBUG is True, allow remote attackers to conduct DNS rebinding attacks by leveraging failure to validate the HTTP Host header against settings.ALLOWED_HOSTS.
-
- 33076: django >=1.10,<1.10.3 resolved (1.10.1 installed)!
- Django 1.8.x before 1.8.16, 1.9.x before 1.9.11, and 1.10.x before 1.10.3 use a hardcoded password for a temporary database user created when running tests with an Oracle database, which makes it easier for remote attackers to obtain access to the database server by leveraging failure to manually specify a password in the database settings TEST dictionary.
-
- 33300: django >=1.10,<1.10.7 resolved (1.10.1 installed)!
- CVE-2017-7233: Open redirect and possible XSS attack via user-supplied numeric redirect URLs
- ============================================================================================
-
- Django relies on user input in some cases (e.g.
- :func:`django.contrib.auth.views.login` and :doc:`i18n `)
- to redirect the user to an "on success" URL. The security check for these
- redirects (namely ``django.utils.http.is_safe_url()``) considered some numeric
- URLs (e.g. ``http:999999999``) "safe" when they shouldn't be.
-
- Also, if a developer relies on ``is_safe_url()`` to provide safe redirect
- targets and puts such a URL into a link, they could suffer from an XSS attack.
-
- CVE-2017-7234: Open redirect vulnerability in ``django.views.static.serve()``
- =============================================================================
-
- A maliciously crafted URL to a Django site using the
- :func:`~django.views.static.serve` view could redirect to any other domain. The
- view no longer does any redirects as they don't provide any known, useful
- functionality.
-
- Note, however, that this view has always carried a warning that it is not
- hardened for production use and should be used only as a development aid.
-
-β¨π°β¨
-
-β€ Code Style Checking
----------------------
-
-Pipenv has `Flake 8 `_ built into it. You can check the style of your code like so, without installing anything::
-
- $ cat t.py
- import requests
-
- $ pipenv check --style t.py
- t.py:1:1: F401 'requests' imported but unused
- t.py:1:16: W292 no newline at end of file
-
-Super useful :)
-
-β€ Open a Module in Your Editor
-------------------------------
-
-Pipenv allows you to open any Python module that is installed (including ones in your codebase), with the ``$ pipenv open`` command::
-
- $ pipenv install -e git+https://github.com/kennethreitz/background.git#egg=background
- Installing -e git+https://github.com/kennethreitz/background.git#egg=backgroundβ¦
- ...
- Updated Pipfile.lock!
-
- $ pipenv open background
- Opening '/Users/kennethreitz/.local/share/virtualenvs/hmm-mGOawwm_/src/background/background.py' in your EDITOR.
-
-This allows you to easily read the code you're consuming, instead of looking it up on GitHub.
-
-.. note:: The standard ``EDITOR`` environment variable is used for this. If you're using Sublime Text, for example, you'll want to ``export EDITOR=subl`` (once you've installed the command-line utility).
-
-β€ Automatic Python Installation
--------------------------------
-
-If you have `pyenv `_ installed and configured, Pipenv will automatically ask you if you want to install a required version of Python if you don't already have it available.
-
-This is a very fancy feature, and we're very proud of it::
-
- $ cat Pipfile
- [[source]]
- url = "https://pypi.python.org/simple"
- verify_ssl = true
-
- [dev-packages]
-
- [packages]
- requests = "*"
-
- [requires]
- python_version = "3.6"
-
- $ pipenv install
- Warning: Python 3.6 was not found on your systemβ¦
- Would you like us to install latest CPython 3.6 with pyenv? [Y/n]: y
- Installing CPython 3.6.2 with pyenv (this may take a few minutes)β¦
- ...
- Making Python installation globalβ¦
- Creating a virtualenv for this projectβ¦
- Using /Users/kennethreitz/.pyenv/shims/python3 to create virtualenvβ¦
- ...
- No package provided, installing all dependencies.
- ...
- Installing dependencies from Pipfile.lockβ¦
- π ββββββββββββββββββββββββββββββββ 5/5 β 00:00:03
- To activate this project's virtualenv, run the following:
- $ pipenv shell
-
-Pipenv automatically honors both the ``python_full_version`` and ``python_version`` `PEP 508 `_ specifiers.
-
-π«β¨π°β¨π«
-
-β€ Automatic Loading of ``.env``
--------------------------------
-
-If a ``.env`` file is present in your project, ``$ pipenv shell`` and ``$ pipenv run`` will automatically load it, for you::
-
- $ cat .env
- HELLO=WORLDβ
-
- $ pipenv run python
- Loading .env environment variablesβ¦
- Python 2.7.13 (default, Jul 18 2017, 09:17:00)
- [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
- Type "help", "copyright", "credits" or "license" for more information.
- >>> import os
- >>> os.environ['HELLO']
- 'WORLD'
-
-This is very useful for keeping production credentials out of your codebase.
-We do not recommend committing ``.env`` files into source control!
-
-If your ``.env`` file is located in a different path or has a different name you may set the ``PIPENV_DOTENV_LOCATION`` environment variable::
-
- $ PIPENV_DOTENV_LOCATION=/path/to/.env pipenv shell
-
-
-β€ Configuration With Environment Variables
-------------------------------------------
-
-``pipenv`` comes with a handful of options that can be enabled via shell environment
-variables. To activate them, simply create the variable in your shell and pipenv
-will detect it.
-
- - ``PIPENV_DEFAULT_PYTHON_VERSION`` β Use this version of Python when creating new virtual environments, by default (e.g. ``3.6``).
-
- - ``PIPENV_SHELL_FANCY`` β Always use fancy mode when invoking ``pipenv shell``.
-
- - ``PIPENV_VENV_IN_PROJECT`` β If set, use ``.venv`` in your project directory
- instead of the global virtualenv manager ``pew``.
-
- - ``PIPENV_COLORBLIND`` β Disable terminal colors, for some reason.
-
- - ``PIPENV_NOSPIN`` β Disable terminal spinner, for cleaner logs. Automatically set in CI environments.
-
- - ``PIPENV_MAX_DEPTH`` β Set to an integer for the maximum number of directories to resursively
- search for a Pipfile.
-
- - ``PIPENV_TIMEOUT`` β Set to an integer for the max number of seconds Pipenv will
- wait for virtualenv creation to complete. Defaults to 120 seconds.
-
- - ``PIPENV_IGNORE_VIRTUALENVS`` β Set to disable automatically using an activated virtualenv over
- the current project's own virtual environment.
-
-
-Also note that `pip itself supports environment variables `_, if you need additional customization.
-
-For example::
-
- $ PIP_INSTALL_OPTION="-- -DCMAKE_BUILD_TYPE=Release" pipenv install -e .
-
-
-β€ Custom Virtual Environment Location
--------------------------------------
-
-Pipenv's underlying ``pew`` dependency will automatically honor the ``WORKON_HOME`` environment
-variable, if you have it set βΒ so you can tell pipenv to store your virtual environments wherever you want, e.g.::
-
- export WORKON_HOME=~/.venvs
-
-In addition, you can also have Pipenv stick the virtualenv in ``project/.venv`` by setting the ``PIPENV_VENV_IN_PROJECT`` environment variable.
-
-
-β€ Testing Projects
-------------------
-
-Pipenv is being used in projects like `Requests`_ for declaring development dependencies and running the test suite.
-
-We've currently tested deployments with both `Travis-CI`_ and `tox`_ with success.
-
-Travis CI
-/////////
-
-An example Travis CI setup can be found in `Requests`_. The project uses a Makefile to
-define common functions such as its ``init`` and ``tests`` commands. Here is
-a stripped down example ``.travis.yml``::
-
- language: python
- python:
- - "2.6"
- - "2.7"
- - "3.3"
- - "3.4"
- - "3.5"
- - "3.6"
- - "3.7dev"
-
- # command to install dependencies
- install: "make"
-
- # command to run tests
- script:
- - make test
-
-and the corresponding Makefile::
-
- init:
- pip install pipenv
- pipenv install --dev
-
- test:
- pipenv run py.test tests
-
-
-Tox Automation Project
-//////////////////////
-
-Alternatively, you can configure a ``tox.ini`` like the one below for both local
-and external testing::
-
- [tox]
- envlist = flake8-py3, py26, py27, py33, py34, py35, py36, pypy
-
- [testenv]
- passenv=HOME
- deps = pipenv
- commands=
- pipenv install --dev
- pipenv run py.test tests
-
- [testenv:flake8-py3]
- passenv=HOME
- basepython = python3.4
- commands=
- {[testenv]deps}
- pipenv install --dev
- pipenv run flake8 --version
- pipenv run flake8 setup.py docs project test
-
-.. note:: With Pipenv's default configuration, you'll need to use tox's ``passenv`` parameter
- to pass your shell's ``HOME`` variable.
-
-.. _Requests: https://github.com/kennethreitz/requests
-.. _tox: https://tox.readthedocs.io/en/latest/
-.. _Travis-CI: https://travis-ci.org/
-
-β€ Shell Completion
-------------------
-
-To enable completion in fish, add this to your config::
-
- eval (pipenv --completion)
-
-Magic shell completions are now enabled!
-
-β¨π°β¨
-
-β€ Working with Platform-Provided Python Components
---------------------------------------------------
-
-It's reasonably common for platform specific Python bindings for
-operating system interfaces to only be available through the system
-package manager, and hence unavailable for installation into virtual
-environments with `pip`. In these cases, the virtual environment can
-be created with access to the system `site-packages` directory::
-
- $ pipenv --three --site-packages
-
-To ensure that all `pip`-installable components actually are installed
-into the virtual environment and system packages are only used for
-interfaces that don't participate in Python-level dependency resolution
-at all, use the `PIP_IGNORE_INSTALLED` setting::
-
- $ PIP_IGNORE_INSTALLED=1 pipenv install --dev
diff --git a/docs/basics.rst b/docs/basics.rst
deleted file mode 100644
index 2df2c7c6d4..0000000000
--- a/docs/basics.rst
+++ /dev/null
@@ -1,311 +0,0 @@
-.. _basic:
-
-Basic Usage of Pipenv
-=====================
-
-.. image:: https://farm4.staticflickr.com/3931/33173826122_b7ee8f1a26_k_d.jpg
-
-This document covers some of Pipenv's more basic features.
-
-β€ Example Pipfile & Pipfile.lock
---------------------------------
-
-.. _example_files:
-
-Here is a simple example of a ``Pipfile`` and the resulting ``Pipfile.lock``.
-
-Example Pipfile
-///////////////
-
-::
-
- [[source]]
- url = "https://pypi.python.org/simple"
- verify_ssl = true
- name = "pypi"
-
- [packages]
- requests = "*"
-
-
- [dev-packages]
- pytest = "*"
-
-
-Example Pipfile.lock
-////////////////////
-
-::
-
- {
- "_meta": {
- "hash": {
- "sha256": "8d14434df45e0ef884d6c3f6e8048ba72335637a8631cc44792f52fd20b6f97a"
- },
- "host-environment-markers": {
- "implementation_name": "cpython",
- "implementation_version": "3.6.1",
- "os_name": "posix",
- "platform_machine": "x86_64",
- "platform_python_implementation": "CPython",
- "platform_release": "16.7.0",
- "platform_system": "Darwin",
- "platform_version": "Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64",
- "python_full_version": "3.6.1",
- "python_version": "3.6",
- "sys_platform": "darwin"
- },
- "pipfile-spec": 5,
- "requires": {},
- "sources": [
- {
- "name": "pypi",
- "url": "https://pypi.python.org/simple",
- "verify_ssl": true
- }
- ]
- },
- "default": {
- "certifi": {
- "hashes": [
- "sha256:54a07c09c586b0e4c619f02a5e94e36619da8e2b053e20f594348c0611803704",
- "sha256:40523d2efb60523e113b44602298f0960e900388cf3bb6043f645cf57ea9e3f5"
- ],
- "version": "==2017.7.27.1"
- },
- "chardet": {
- "hashes": [
- "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691",
- "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"
- ],
- "version": "==3.0.4"
- },
- "idna": {
- "hashes": [
- "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4",
- "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f"
- ],
- "version": "==2.6"
- },
- "requests": {
- "hashes": [
- "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b",
- "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"
- ],
- "version": "==2.18.4"
- },
- "urllib3": {
- "hashes": [
- "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b",
- "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"
- ],
- "version": "==1.22"
- }
- },
- "develop": {
- "py": {
- "hashes": [
- "sha256:2ccb79b01769d99115aa600d7eed99f524bf752bba8f041dc1c184853514655a",
- "sha256:0f2d585d22050e90c7d293b6451c83db097df77871974d90efd5a30dc12fcde3"
- ],
- "version": "==1.4.34"
- },
- "pytest": {
- "hashes": [
- "sha256:b84f554f8ddc23add65c411bf112b2d88e2489fd45f753b1cae5936358bdf314",
- "sha256:f46e49e0340a532764991c498244a60e3a37d7424a532b3ff1a6a7653f1a403a"
- ],
- "version": "==3.2.2"
- }
- }
- }
-
-
-.. _initialization:
-
-β€ Importing from requirements.txt
----------------------------------
-
-If you only have a ``requirements.txt`` file available when running ``pipenv install``,
-pipenv will automatically import the contents of this file and create a ``Pipfile`` for you.
-
-You can also specify ``$ pipenv install -r path/to/requirements.txt`` to import a requirements file.
-
-Note, that when importing a requirements file, they often have version numbers pinned, which you likely won't want
-in your ``Pipfile``, so you'll have to manually update your ``Pipfile`` afterwards to reflect this.
-
-
-.. _specifying_versions:
-
-β€ Specifying Versions of a Package
-----------------------------------
-
-To tell pipenv to install a specific version of a library, the usage is simple::
-
- $ pipenv install requests==2.13.0
-
-This will update your ``Pipfile`` to reflect this requirement, automatically.
-
-
-β€ Specifying Versions of Python
--------------------------------
-
-To create a new virtualenv, using a specific version of Python you have installed (and
-on your ``PATH``), use the ``--python VERSION`` flag, like so:
-
-Use Python 3::
-
- $ pipenv --python 3
-
-Use Python3.6::
-
- $ pipenv --python 3.6
-
-Use Python 2.7.14::
-
- $ pipenv --python 2.7.14
-
-When given a Python version, like this, Pipenv will automatically scan your system for a Python that matches that given version.
-
-If a ``Pipfile`` hasn't been created yet, one will be created for you, that looks like this::
-
- [[source]]
- url = "https://pypi.python.org/simple"
- verify_ssl = true
-
- [dev-packages]
-
- [packages]
-
- [requires]
- python_version = "3.6"
-
-Note the inclusion of ``[requires] python_version = "3.6"``. This specifies that your application requires this version
-of Python, and will be used automatically when running ``pipenv install`` against this ``Pipfile`` in the future
-(e.g. on other machines). If this is not true, feel free to simply remove this section.
-
-If you don't specify a Python version on the commandβline, either the ``[requires]`` ``python_full_version`` or ``python_version`` will be selected
-automatically, falling back to whatever your system's default ``python`` installation is, at time of execution.
-
-
-β€ Editable Dependencies (e.g. ``-e .`` )
-----------------------------------------
-
-You can tell Pipenv to install a path as editable β often this is useful for
-the current working directory when working on packages::
-
- $ pipenv install '-e .' --dev
-
- $ cat Pipfile
- [dev-packages]
- "e1839a8" = {path = ".", editable = true}
-
-Note that all sub-dependencies will get added to the ``Pipfile.lock`` as well.
-
-
-.. _environment_management:
-
-β€ Environment Management with Pipenv
-------------------------------------
-
-The three primary commands you'll use in managing your pipenv environment are
-``$ pipenv install``, ``$ pipenv uninstall``, and ``$ pipenv lock``.
-
-.. _pipenv_install:
-
-$ pipenv install
-////////////////
-
-``$ pipenv install`` is used for installing packages into the pipenv virtual environment
-and updating your Pipfile.
-
-Along with the basic install command, which takes the form::
-
- $ pipenv install [package names]
-
-The user can provide these additional parameters:
-
- - ``--two`` β Performs the installation in a virtualenv using the system ``python2`` link.
- - ``--three`` β Performs the installation in a virtualenv using the system ``python3`` link.
- - ``--python`` β Performs the installation in a virtualenv using the provided Python interpreter.
-
- .. warning:: None of the above commands should be used together. They are also
- **destructive** and will delete your current virtualenv before replacing
- it with an appropriately versioned one.
-
- .. note:: The virtualenv created by Pipenv may be different from what you were expecting.
- Dangerous characters (i.e. ``$`!*@"`` as well as space, line feed, carriage return,
- and tab) are converted to underscores. Additionally, the full path to the current
- folder is encoded into a "slug value" and appended to ensure the virtualenv name
- is unique.
-
- - ``--dev`` β Install both ``develop`` and ``default`` packages from ``Pipfile.lock``.
- - ``--system`` β Use the system ``pip`` command rather than the one from your virtualenv.
- - ``--ignore-pipfile`` β Ignore the ``Pipfile`` and install from the ``Pipfile.lock``.
- - ``--skip-lock`` β Ignore the ``Pipfile.lock`` and install from the ``Pipfile``. In addition, do not write out a ``Pipfile.lock`` reflecting changes to the ``Pipfile``.
-
-.. _pipenv_uninstall:
-
-$ pipenv uninstall
-//////////////////
-
-``$ pipenv uninstall`` supports all of the parameters in `pipenv install <#pipenv-install>`_,
-as well as one additonal, ``--all``.
-
- - ``--all`` β This parameter will purge all files from the virtual environment,
- but leave the Pipfile untouched.
-
-
-.. _pipenv_lock:
-
-$ pipenv lock
-/////////////
-
-``$ pipenv lock`` is used to create a ``Pipfile.lock``, which declares **all** dependencies (and sub-dependencies) of your project, their latest available versions, and the current hashes for the downloaded files. This ensures repeatable, and most importantly *deterministic*, builds.
-
-β€ About Shell Configuration
----------------------------
-
-Shells are typically misconfigured for subshell use, so ``$ pipenv shell --fancy`` may produce unexpected results. If this is the case, try ``$ pipenv shell``, which uses "compatibility mode", and will attempt to spawn a subshell despite misconfiguration.
-
-A proper shell configuration only sets environment variables like ``PATH`` during a login session, not during every subshell spawn (as they are typically configured to do). In fish, this looks like this::
-
- if status --is-login
- set -gx PATH /usr/local/bin $PATH
- end
-
-You should do this for your shell too, in your ``~/.profile`` or ``~/.bashrc`` or wherever appropriate.
-
-.. note:: The shell launched in interactive mode. This means that if your shell reads its configuration from a specific file for interactive mode (e.g. bash by default looks for a ``~/.bashrc`` configuration file for interactive mode), then you'll need to modify (or create) this file.
-
-
-β€ A Note about VCS Dependencies
--------------------------------
-
-Pipenv will resolve the subβdepencies of VCS dependencies, but only if they are editable, like so::
-
- [packages]
- requests = {git = "https://github.com/requests/requests.git", editable=true}
-
-If editable is not true, subβdependencies will not get resolved.
-
-
-β€ Pipfile.lock Security Features
---------------------------------
-
-``Pipfile.lock`` takes advantage of some great new security improvements in ``pip``.
-By default, the ``Pipfile.lock`` will be generated with the sha256 hashes of each downloaded
-package. This will allow ``pip`` to guarantee you're installing what you intend to when
-on a compromised network, or downloading dependencies from an untrusted PyPI endpoint.
-
-We highly recommend approaching deployments with promoting projects from a development
-environment into production. You can use ``pipenv lock`` to compile your dependencies on
-your development environment and deploy the compiled ``Pipfile.lock`` to all of your
-production environments for reproducible builds.
-
-.. note:
-
- If you'd like a ``requirements.txt`` output of the lockfile, run ``$ pipenv lock -r``.
- This will include all hashes, however (which is great!). To get a ``requirements.txt``
- without hashes, use ``$ pipenv run pip freeze``.
-
diff --git a/docs/best_practices.md b/docs/best_practices.md
new file mode 100644
index 0000000000..909efd60bb
--- /dev/null
+++ b/docs/best_practices.md
@@ -0,0 +1,464 @@
+# Pipenv Best Practices
+
+This document outlines recommended best practices for using Pipenv effectively in your Python projects. Following these guidelines will help you maintain a clean, reproducible, and secure development environment.
+
+## Project Setup
+
+### Directory Structure
+
+Organize your project with a clear directory structure:
+
+```
+my_project/
+βββ .env # Environment variables (not in version control)
+βββ .gitignore # Git ignore file
+βββ Pipfile # Dependency declarations
+βββ Pipfile.lock # Locked dependencies with hashes
+βββ README.md # Project documentation
+βββ src/ # Source code
+β βββ my_package/ # Your package
+β βββ __init__.py
+β βββ ...
+βββ tests/ # Test files
+β βββ __init__.py
+β βββ ...
+βββ docs/ # Documentation
+ βββ ...
+```
+
+### Virtual Environment Location
+
+Consider storing the virtual environment in your project directory for easier management:
+
+```bash
+export PIPENV_VENV_IN_PROJECT=1
+```
+
+This creates a `.venv` directory in your project, making it easier to find and manage.
+
+## Dependency Management
+
+### Specify Python Version
+
+Always specify the Python version in your Pipfile to ensure consistency across environments:
+
+```toml
+[requires]
+python_version = "3.10"
+```
+
+### Version Constraints
+
+Use appropriate version constraints based on your needs:
+
+- For applications:
+ - Use exact versions (`==`) or compatible releases (`~=`) for stability
+ - Example: `requests = "==2.28.1"` or `requests = "~=2.28.0"`
+
+- For libraries:
+ - Use minimum versions (`>=`) to allow compatibility
+ - Example: `requests = ">=2.28.0"`
+
+- Avoid using `*` (any version) in production code, as it can lead to unpredictable behavior
+
+### Development Dependencies
+
+Keep development dependencies separate from production dependencies:
+
+```bash
+# Install production dependencies
+$ pipenv install flask sqlalchemy
+
+# Install development dependencies
+$ pipenv install pytest black mypy --dev
+```
+
+### Custom Package Categories
+
+For complex projects, use custom package categories to organize dependencies:
+
+```toml
+[packages]
+flask = "*"
+sqlalchemy = "*"
+
+[dev-packages]
+pytest = "*"
+black = "*"
+
+[docs]
+sphinx = "*"
+sphinx-rtd-theme = "*"
+
+[tests]
+pytest-cov = "*"
+pytest-mock = "*"
+```
+
+Install specific categories:
+
+```bash
+$ pipenv install --categories="docs,tests"
+```
+
+### Lock File Management
+
+- Always commit both `Pipfile` and `Pipfile.lock` to version control
+- Run `pipenv lock` after changing dependencies to update the lock file
+- Use `pipenv install --deploy` in CI/CD and production to ensure the lock file is up-to-date
+
+### Dependency Updates
+
+Regularly check for and update dependencies to get security fixes:
+
+```bash
+# Check for outdated packages
+$ pipenv update --outdated
+
+# Update all packages
+$ pipenv update
+```
+
+For production systems, test updates thoroughly before deployment.
+
+## Security Practices
+
+### Vulnerability Scanning
+
+Regularly scan for security vulnerabilities:
+
+```bash
+$ pipenv scan
+```
+
+Consider integrating this into your CI/CD pipeline.
+
+### Hash Verification
+
+Pipenv automatically adds hashes to `Pipfile.lock`. Use these for secure installations:
+
+```bash
+$ pipenv install --deploy
+```
+
+### Private Packages
+
+For private packages, use secure URLs and authentication:
+
+```toml
+[[source]]
+name = "private"
+url = "https://private-repo.example.com/simple"
+verify_ssl = true
+```
+
+Use environment variables for credentials:
+
+```bash
+export PIP_INDEX_URL=https://${USERNAME}:${PASSWORD}@private-repo.example.com/simple
+```
+
+## Development Workflow
+
+### Daily Development
+
+```bash
+# Pull latest changes
+$ git pull
+
+# Install dependencies
+$ pipenv install --dev
+
+# Activate environment
+$ pipenv shell
+
+# Work on code...
+
+# Run tests
+$ pytest
+
+# Deactivate when done
+$ exit # or Ctrl+D
+```
+
+### Using run Instead of shell
+
+For one-off commands, use `pipenv run` instead of activating the shell:
+
+```bash
+$ pipenv run pytest
+$ pipenv run python -m my_package
+```
+
+### Environment Variables
+
+Use `.env` files for local configuration:
+
+```
+# .env
+DEBUG=True
+DATABASE_URL=sqlite:///dev.db
+```
+
+Pipenv automatically loads these when you use `pipenv shell` or `pipenv run`.
+
+**Important**: Never commit sensitive information in `.env` files to version control. Add `.env` to your `.gitignore`.
+
+## Deployment
+
+### Production Installation
+
+For production deployments:
+
+```bash
+# Install only production dependencies
+$ pipenv install --deploy
+
+# Or for systems without virtualenv support
+$ pipenv install --system --deploy
+```
+
+### CI/CD Integration
+
+In your CI/CD pipeline:
+
+```yaml
+# Example GitHub Actions workflow
+steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.10'
+ - name: Install pipenv
+ run: pip install pipenv
+ - name: Verify Pipfile.lock
+ run: pipenv verify
+ - name: Install dependencies
+ run: pipenv install --dev
+ - name: Run tests
+ run: pipenv run pytest
+ - name: Check for security vulnerabilities
+ run: pipenv scan
+```
+
+### Docker Integration
+
+For containerized applications:
+
+```dockerfile
+FROM python:3.10-slim
+
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Install pipenv and dependencies
+RUN pip install pipenv && \
+ pipenv install --system --deploy
+
+# Copy application code
+COPY . .
+
+# Run the application
+CMD ["python", "-m", "my_package"]
+```
+
+## Collaboration
+
+### Onboarding New Developers
+
+Make it easy for new developers to set up the project:
+
+```bash
+# Clone the repository
+$ git clone https://github.com/example/project.git
+$ cd project
+
+# Install dependencies
+$ pipenv install --dev
+
+# Activate the environment
+$ pipenv shell
+```
+
+Include these instructions in your README.md.
+
+### Handling Dependency Conflicts
+
+If you encounter dependency conflicts:
+
+1. Check for incompatible version constraints in your Pipfile
+2. Try clearing the cache: `pipenv lock --clear`
+3. Consider relaxing version constraints if appropriate
+4. Use `pipenv graph` to visualize dependencies and identify conflicts
+
+### Migrating from requirements.txt
+
+If migrating from a project using requirements.txt:
+
+```bash
+$ pipenv install -r requirements.txt
+```
+
+Then review the generated Pipfile and adjust as needed.
+
+## Performance Optimization
+
+### Cache Management
+
+Pipenv maintains a cache to speed up installations. If you encounter issues:
+
+```bash
+# Clear the cache
+$ pipenv lock --clear
+
+# Or set a custom cache location
+$ export PIPENV_CACHE_DIR=/path/to/custom/cache
+```
+
+### Speeding Up Development Workflow
+
+For faster development iterations:
+
+```bash
+# Skip lock file generation during development
+$ export PIPENV_SKIP_LOCK=1
+$ pipenv install some-package
+```
+
+**Note**: Only use this during development, not in production.
+
+### Handling Large Dependency Trees
+
+For projects with many dependencies:
+
+```bash
+# Increase the maximum depth for dependency resolution
+$ export PIPENV_MAX_DEPTH=20
+$ pipenv lock
+```
+
+## Troubleshooting
+
+### Common Issues and Solutions
+
+#### Lock file hash mismatch
+
+```
+Pipfile.lock out of date, update it with "pipenv lock" or "pipenv update".
+```
+
+Solution: Run `pipenv lock` to update the lock file.
+
+#### Dependency resolution failures
+
+```
+Could not find a version that matches package==version
+```
+
+Solutions:
+- Check for conflicting version constraints
+- Try `pipenv lock --clear` to clear the cache
+- Consider relaxing version constraints
+
+#### Virtualenv creation issues
+
+```
+Failed to create virtual environment.
+```
+
+Solutions:
+- Ensure you have permissions to create directories
+- Try `PIPENV_VENV_IN_PROJECT=1` to create the virtualenv in the project directory
+- Check that the specified Python version is available
+
+### Getting Help
+
+If you encounter issues:
+
+```bash
+# Get detailed environment information
+$ pipenv --support
+```
+
+Include this output when asking for help in issues or forums.
+
+## Advanced Usage
+
+### Custom Scripts
+
+Define custom scripts in your Pipfile for common tasks:
+
+```toml
+[scripts]
+start = "python -m my_package"
+test = "pytest"
+lint = "flake8 src tests"
+format = "black src tests"
+```
+
+Run them with:
+
+```bash
+$ pipenv run start
+$ pipenv run test
+```
+
+### Integration with Other Tools
+
+#### Pre-commit hooks
+
+```yaml
+# .pre-commit-config.yaml
+repos:
+ - repo: local
+ hooks:
+ - id: tests
+ name: run tests
+ entry: pipenv run pytest
+ language: system
+ pass_filenames: false
+```
+
+#### tox
+
+```ini
+# tox.ini
+[tox]
+envlist = py38, py39, py310
+
+[testenv]
+deps = pipenv
+commands =
+ pipenv install --dev
+ pipenv run pytest
+```
+
+### Multiple Python Versions
+
+For projects that support multiple Python versions:
+
+```bash
+# Test with Python 3.8
+$ pipenv --python 3.8 install --dev
+$ pipenv run pytest
+
+# Test with Python 3.9
+$ pipenv --rm # Remove the current virtualenv
+$ pipenv --python 3.9 install --dev
+$ pipenv run pytest
+```
+
+## Conclusion
+
+Following these best practices will help you maintain a clean, reproducible, and secure Python development environment with Pipenv. Adapt these recommendations to your specific project needs and team workflows.
+
+Remember that the key benefits of Pipenv are:
+
+1. **Deterministic builds** through the lock file
+2. **Security** through hash verification
+3. **Simplified workflow** by combining virtualenv and package management
+4. **Dependency isolation** for each project
+
+By leveraging these features effectively, you can focus more on development and less on environment management.
diff --git a/docs/changelog.md b/docs/changelog.md
new file mode 100644
index 0000000000..9c0cea107e
--- /dev/null
+++ b/docs/changelog.md
@@ -0,0 +1 @@
+```{include} ../CHANGELOG.md
diff --git a/docs/cli.md b/docs/cli.md
new file mode 100644
index 0000000000..f8b902e71c
--- /dev/null
+++ b/docs/cli.md
@@ -0,0 +1,615 @@
+# Pipenv Command Line Interface
+
+This comprehensive guide covers Pipenv's command line interface, including all available commands, options, and usage examples.
+
+## Overview
+
+Pipenv provides a powerful command line interface (CLI) that simplifies Python dependency management and virtual environment workflows. The CLI follows a consistent pattern:
+
+```bash
+pipenv [OPTIONS] COMMAND [ARGS]...
+```
+
+## Global Options
+
+These options can be used with any Pipenv command:
+
+| Option | Description |
+|--------|-------------|
+| `--where` | Output project home information |
+| `--venv` | Output virtualenv information |
+| `--py` | Output Python interpreter information |
+| `--envs` | Output environment variable options |
+| `--rm` | Remove the virtualenv (deprecated: use `pipenv remove` instead) |
+| `--bare` | Minimal output |
+| `--man` | Display manpage |
+| `--support` | Output diagnostic information for GitHub issues |
+| `--site-packages` | Enable site-packages for the virtualenv |
+| `--python TEXT` | Specify which Python version to use |
+| `--clear` | Clear caches (pipenv, pip) |
+| `-q, --quiet` | Quiet mode |
+| `-v, --verbose` | Verbose mode |
+| `--pypi-mirror TEXT` | Specify a PyPI mirror |
+| `--version` | Show the version and exit |
+| `-h, --help` | Show help message and exit |
+
+## Core Commands
+
+### install
+
+Installs packages and adds them to Pipfile, or installs all packages from Pipfile.lock if no packages are specified.
+
+```bash
+pipenv install [OPTIONS] [PACKAGES]...
+```
+
+#### Options
+
+| Option | Description |
+|--------|-------------|
+| `--dev` | Install both development and default packages |
+| `--categories TEXT` | Install packages to specified category groups |
+| `--system` | Install to system Python instead of virtualenv |
+| `--deploy` | Abort if Pipfile.lock is out-of-date |
+| `--ignore-pipfile` | Install from Pipfile.lock, ignoring Pipfile |
+| `--skip-lock` | Skip locking of dependencies |
+| `--requirements, -r TEXT` | Import a requirements.txt file |
+| `--extra-pip-args TEXT` | Pass additional arguments to pip |
+| `--python TEXT` | Specify which Python version to use |
+| `--dry-run` | Show what would happen without making changes |
+
+#### Examples
+
+Install a specific package:
+```bash
+$ pipenv install requests
+```
+
+Install a package with version constraint:
+```bash
+$ pipenv install "requests>=2.20.0"
+```
+
+Install a development dependency:
+```bash
+$ pipenv install pytest --dev
+```
+
+Install from requirements.txt:
+```bash
+$ pipenv install -r requirements.txt
+```
+
+Install with deployment check:
+```bash
+$ pipenv install --deploy
+```
+
+### uninstall
+
+Uninstalls a provided package and removes it from Pipfile.
+
+```bash
+pipenv uninstall [OPTIONS] [PACKAGES]...
+```
+
+#### Options
+
+| Option | Description |
+|--------|-------------|
+| `--all` | Purge all files from the virtual environment |
+| `--all-dev` | Remove all development packages |
+| `--skip-lock` | Skip locking of dependencies |
+| `--categories TEXT` | Uninstall from specified category groups |
+
+#### Examples
+
+Uninstall a package:
+```bash
+$ pipenv uninstall requests
+```
+
+Uninstall all packages:
+```bash
+$ pipenv uninstall --all
+```
+
+Uninstall all development packages:
+```bash
+$ pipenv uninstall --all-dev
+```
+
+### lock
+
+Generates Pipfile.lock with all dependencies and their sub-dependencies.
+
+```bash
+pipenv lock [OPTIONS]
+```
+
+#### Options
+
+| Option | Description |
+|--------|-------------|
+| `--pre` | Allow pre-releases |
+| `--clear` | Clear the dependency cache |
+| `--verbose` | Show verbose output |
+| `--categories TEXT` | Lock specified categories only |
+| `--keep-outdated` | Keep outdated dependencies |
+| `--python TEXT` | Specify which Python version to use for resolution |
+| `--extra-pip-args TEXT` | Pass additional arguments to pip |
+
+#### Examples
+
+Generate a lock file:
+```bash
+$ pipenv lock
+```
+
+Generate a lock file with pre-releases:
+```bash
+$ pipenv lock --pre
+```
+
+Lock specific categories:
+```bash
+$ pipenv lock --categories="docs,tests"
+```
+
+### sync
+
+Installs all packages specified in Pipfile.lock.
+
+```bash
+pipenv sync [OPTIONS]
+```
+
+#### Options
+
+| Option | Description |
+|--------|-------------|
+| `--dev` | Install both development and default packages |
+| `--all` | Install packages from all categories defined in the Pipfile |
+| `--categories TEXT` | Install packages from specified category groups |
+| `--python TEXT` | Specify which Python version to use |
+| `--extra-pip-args TEXT` | Pass additional arguments to pip |
+
+#### Examples
+
+Install packages from lock file:
+```bash
+$ pipenv sync
+```
+
+Install development packages too:
+```bash
+$ pipenv sync --dev
+```
+
+Install all categories (default, dev, and any custom categories):
+```bash
+$ pipenv sync --all
+```
+
+Install specific categories:
+```bash
+$ pipenv sync --categories="docs,tests"
+```
+
+### update
+
+Runs lock when no packages are specified, or upgrade for specific packages, and then sync.
+
+```bash
+pipenv update [OPTIONS] [PACKAGES]...
+```
+
+#### Options
+
+| Option | Description |
+|--------|-------------|
+| `--dev` | Update development packages |
+| `--all` | Update packages from all categories defined in the Pipfile |
+| `--categories TEXT` | Update packages in specified categories |
+| `--outdated` | List out-of-date dependencies |
+| `--dry-run` | Show what would happen without making changes |
+| `--python TEXT` | Specify which Python version to use |
+| `--clear` | Clear the dependency cache |
+
+#### Examples
+
+Update all packages:
+```bash
+$ pipenv update
+```
+
+Update specific packages:
+```bash
+$ pipenv update requests pytest
+```
+
+Check for outdated packages:
+```bash
+$ pipenv update --outdated
+```
+
+### upgrade
+
+Updates the lock file for specified dependencies without installing them.
+
+```bash
+pipenv upgrade [OPTIONS] [PACKAGES]...
+```
+
+#### Options
+
+| Option | Description |
+|--------|-------------|
+| `--dev` | Upgrade development packages |
+| `--all` | Upgrade packages from all categories defined in the Pipfile |
+| `--categories TEXT` | Upgrade packages in specified categories |
+| `--dry-run` | Show what would happen without making changes |
+| `--python TEXT` | Specify which Python version to use |
+| `--clear` | Clear the dependency cache |
+
+#### Examples
+
+Upgrade a specific package in the lock file:
+```bash
+$ pipenv upgrade requests
+```
+
+Upgrade development packages:
+```bash
+$ pipenv upgrade --dev
+```
+
+### check
+
+Checks for security vulnerabilities and PEP 508 marker compliance.
+
+```bash
+pipenv check [OPTIONS]
+```
+**Note**: The check command is deprecated and will be unsupported beyond 01 June 2025. In future versions, the check command will run the scan command by default. Use the `--scan` option to run the new scan command now.
+
+#### Options
+
+| Option | Description |
+|--------|-------------|
+| `--db TEXT` | Path or URL to a PyUp Safety vulnerabilities database |
+| `--ignore, -i TEXT` | Ignore specified vulnerability |
+| `--output [screen\|text\|json\|bare]` | Specify output format |
+| `--key TEXT` | Safety API key from PyUp.io |
+| `--use-installed` | Use installed packages instead of lockfile |
+| `--categories TEXT` | Check packages in specified categories |
+| `--auto-install` | Automatically install safety if not already installed |
+| `--scan` | Use the new scan command instead |
+
+#### Examples
+
+Check for vulnerabilities:
+```bash
+$ pipenv check
+```
+
+Check with a specific output format:
+```bash
+$ pipenv check --output json
+```
+
+Use the new scan command:
+```bash
+$ pipenv check --scan
+```
+
+### scan
+
+Enhanced security scanning (replacement for check).
+
+```bash
+pipenv scan [OPTIONS]
+```
+
+#### Options
+
+Similar to the `check` command, with enhanced functionality.
+
+#### Examples
+
+Scan for vulnerabilities:
+```bash
+$ pipenv scan
+```
+
+Scan with a specific output format:
+```bash
+$ pipenv scan --output json
+```
+
+### run
+
+Spawns a command installed into the virtualenv.
+
+```bash
+pipenv run [OPTIONS] COMMAND [ARGS]...
+```
+
+#### Examples
+
+Run a Python script:
+```bash
+$ pipenv run python app.py
+```
+
+Run tests:
+```bash
+$ pipenv run pytest
+```
+
+Run a custom script defined in Pipfile:
+```bash
+$ pipenv run start
+```
+
+### shell
+
+Spawns a shell within the virtualenv.
+
+```bash
+pipenv shell [OPTIONS] [SHELL_ARGS]...
+```
+
+#### Options
+
+| Option | Description |
+|--------|-------------|
+| `--fancy` | Use a fancy shell activation method |
+
+#### Examples
+
+Activate the virtual environment:
+```bash
+$ pipenv shell
+```
+
+Activate with fancy mode:
+```bash
+$ pipenv shell --fancy
+```
+
+### graph
+
+Displays currently-installed dependency graph information.
+
+```bash
+pipenv graph [OPTIONS]
+```
+
+#### Options
+
+| Option | Description |
+|--------|-------------|
+| `--bare` | Output graph in bare format |
+| `--json` | Output graph in JSON format |
+| `--json-tree` | Output graph as JSON tree |
+| `--reverse` | Reversed dependency graph |
+
+#### Examples
+
+Show dependency graph:
+```bash
+$ pipenv graph
+```
+
+Show reverse dependencies:
+```bash
+$ pipenv graph --reverse
+```
+
+Show JSON output:
+```bash
+$ pipenv graph --json
+```
+
+### clean
+
+Uninstalls all packages not specified in Pipfile.lock.
+
+```bash
+pipenv clean [OPTIONS]
+```
+
+#### Options
+
+| Option | Description |
+|--------|-------------|
+| `--dry-run` | Show what would be removed without removing |
+
+#### Examples
+
+Remove unused packages:
+```bash
+$ pipenv clean
+```
+
+Preview what would be removed:
+```bash
+$ pipenv clean --dry-run
+```
+
+### requirements
+
+Generate a requirements.txt from Pipfile.lock.
+
+```bash
+pipenv requirements [OPTIONS]
+```
+
+#### Options
+
+| Option | Description |
+|--------|-------------|
+| `--dev` | Include development packages |
+| `--dev-only` | Only include development packages |
+| `--hash` | Include package hashes |
+| `--exclude-markers` | Exclude PEP 508 markers |
+| `--categories TEXT` | Include packages from specified categories |
+
+#### Examples
+
+Generate requirements.txt:
+```bash
+$ pipenv requirements > requirements.txt
+```
+
+Include development packages:
+```bash
+$ pipenv requirements --dev > requirements-dev.txt
+```
+
+Include hashes:
+```bash
+$ pipenv requirements --hash > requirements.txt
+```
+
+### scripts
+
+Lists scripts defined in the current environment config.
+
+```bash
+pipenv scripts [OPTIONS]
+```
+
+#### Examples
+
+List available scripts:
+```bash
+$ pipenv scripts
+```
+
+### open
+
+Opens a Python module in your editor.
+
+```bash
+pipenv open [OPTIONS] MODULE
+```
+
+#### Examples
+
+Open the requests module:
+```bash
+$ pipenv open requests
+```
+
+Open with a specific editor:
+```bash
+$ EDITOR=code pipenv open requests
+```
+
+### verify
+
+Verifies that the Pipfile.lock is up-to-date with the Pipfile.
+
+```bash
+pipenv verify [OPTIONS]
+```
+
+#### Examples
+
+Verify lock file integrity:
+```bash
+$ pipenv verify
+```
+
+## Environment Variables
+
+Pipenv's behavior can be customized through environment variables. Here are some commonly used ones:
+
+| Variable | Description |
+|----------|-------------|
+| `PIPENV_VENV_IN_PROJECT` | Create virtualenv in project directory |
+| `PIPENV_IGNORE_VIRTUALENVS` | Ignore active virtualenvs |
+| `PIPENV_PIPFILE` | Custom Pipfile location |
+| `PIPENV_DOTENV_LOCATION` | Custom .env file location |
+| `PIPENV_CACHE_DIR` | Custom cache directory |
+| `PIPENV_TIMEOUT` | Timeout for pip operations |
+| `PIPENV_SKIP_LOCK` | Skip lock file generation |
+| `PIPENV_PYPI_MIRROR` | PyPI mirror URL |
+| `PIPENV_MAX_DEPTH` | Maximum depth for dependency resolution |
+| `PIPENV_DONT_LOAD_ENV` | Don't load .env files |
+
+For a complete list, see the [Configuration](configuration.md) page.
+
+## Command Relationships
+
+Understanding how Pipenv commands relate to each other can help you use them more effectively:
+
+- `install`: Adds packages to Pipfile and updates Pipfile.lock
+- `lock`: Updates Pipfile.lock without installing packages
+- `sync`: Installs packages from Pipfile.lock without modifying it
+- `update`: Combines `lock` and `sync` (or `upgrade` and `sync` for specific packages)
+- `upgrade`: Updates Pipfile.lock for specific packages without installing them
+- `uninstall`: Removes packages from virtualenv and Pipfile
+- `clean`: Removes packages from virtualenv that aren't in Pipfile.lock
+- `remove`: Deletes the entire virtualenv for the current project
+
+## Best Practices
+
+### CI/CD Pipelines
+
+For continuous integration and deployment:
+
+```bash
+# Verify the lock file is up-to-date
+$ pipenv verify
+
+# Install dependencies
+$ pipenv sync --dev
+
+# Run tests
+$ pipenv run pytest
+```
+
+### Production Deployment
+
+For production environments:
+
+```bash
+# Install only production dependencies
+$ pipenv install --deploy
+
+# Or for systems without virtualenv support
+$ pipenv install --system --deploy
+```
+
+### Development Workflow
+
+For daily development:
+
+```bash
+# Install dependencies including development packages
+$ pipenv install --dev
+
+# Activate environment
+$ pipenv shell
+
+# Run your application
+$ python app.py
+```
+
+## Troubleshooting
+
+### Common Issues
+
+- **Command not found**: Ensure Pipenv is installed and in your PATH
+- **Pipfile not found**: Run commands from your project directory
+- **Lock file out of date**: Run `pipenv lock` to update it
+- **Dependency conflicts**: Try `pipenv lock --clear` to clear the cache
+
+For more troubleshooting tips, see the [Troubleshooting](troubleshooting.md) guide.
+
+## Conclusion
+
+Pipenv's CLI provides a comprehensive set of commands for managing Python dependencies and virtual environments. By understanding these commands and their options, you can streamline your Python development workflow and ensure consistent, reproducible environments.
diff --git a/docs/commands.md b/docs/commands.md
new file mode 100644
index 0000000000..12695f8a2f
--- /dev/null
+++ b/docs/commands.md
@@ -0,0 +1,556 @@
+# Pipenv Commands Reference
+
+This document provides a comprehensive reference for all Pipenv commands, including detailed explanations, options, and practical examples.
+
+## Core Commands Overview
+
+| Command | Description |
+|---------|-------------|
+| `install` | Install packages or create/update virtual environment |
+| `uninstall` | Remove packages from virtual environment and Pipfile |
+| `lock` | Generate Pipfile.lock with dependencies and hashes |
+| `sync` | Install packages from Pipfile.lock without modifying the lockfile |
+| `update` | Update dependencies and install them (lock + sync) |
+| `upgrade` | Update the lock of specified dependencies without installing |
+| `check` | Check for security vulnerabilities and PEP 508 compliance (use `--scan` for enhanced scanning) |
+| `shell` | Spawn a shell within the virtual environment |
+| `run` | Run a command within the virtual environment |
+| `graph` | Display dependency graph information |
+| `remove` | Remove the virtualenv for the current project |
+| `clean` | Remove packages not specified in Pipfile.lock |
+| `verify` | Verify the Pipfile.lock hash is up-to-date |
+| `requirements` | Generate a requirements.txt from Pipfile.lock |
+| `scripts` | List scripts defined in the environment |
+| `open` | Open a Python module in your editor |
+
+## install
+
+The `install` command is used for installing packages into the Pipenv virtual environment and updating your Pipfile and Pipfile.lock.
+
+### Basic Usage
+
+```bash
+$ pipenv install [package_name]
+```
+
+When run without arguments, `pipenv install` will create a virtual environment if one doesn't exist, and install all packages specified in the Pipfile.
+
+When a package name is provided, it will install that package, add it to the Pipfile, and update the Pipfile.lock.
+
+### Examples
+
+Install a specific package:
+
+```bash
+$ pipenv install requests
+```
+
+Install a package with version constraint:
+
+```bash
+$ pipenv install "requests>=2.20.0"
+```
+
+Install a package from a Git repository:
+
+```bash
+$ pipenv install -e git+https://github.com/requests/requests.git@master#egg=requests
+```
+
+Install a package as a development dependency:
+
+```bash
+$ pipenv install pytest --dev
+```
+
+Install packages from a requirements.txt file:
+
+```bash
+$ pipenv install -r requirements.txt
+```
+
+### Options
+
+| Option | Description |
+|--------|-------------|
+| `--dev` | Install both development and default packages from Pipfile |
+| `--categories` | Install packages to the specified category groups |
+| `--deploy` | Abort if Pipfile.lock is out-of-date |
+| `--ignore-pipfile` | Install from Pipfile.lock, ignoring Pipfile |
+| `--system` | Install to system Python instead of virtual environment |
+| `--python` | Specify which Python version to use |
+| `--requirements, -r` | Import a requirements.txt file |
+| `--extra-pip-args` | Pass additional arguments to pip |
+
+### Important Note
+
+Prior to Pipenv 2024, the `install` command would relock the lock file every time it was run. Based on user feedback, this behavior was changed so that `install` only updates the lock when adding or changing a package. To relock the entire set of Pipfile specifiers, use `pipenv lock`.
+
+### --ignore-pipfile vs sync
+
+The `--ignore-pipfile` flag is similar to `pipenv sync`, but with an important difference:
+
+- **`pipenv install --ignore-pipfile`**: Installs packages from `Pipfile.lock`, ignoring the `Pipfile`. However, it may still attempt to re-lock your dependencies unless you also use the `--deploy` flag.
+
+- **`pipenv sync`**: Installs packages exactly as specified in `Pipfile.lock` without ever attempting to re-lock. This is considered an atomic operation.
+
+**For deployment scenarios, `pipenv sync` is the recommended command** because it guarantees that no modifications will be made to your lock file.
+
+```bash
+# Development: may re-lock if needed
+$ pipenv install --ignore-pipfile
+
+# Production: never re-locks, fails if lock is out of date
+$ pipenv install --ignore-pipfile --deploy
+
+# Production (recommended): atomic install from lock file
+$ pipenv sync
+```
+
+## sync
+
+The `sync` command installs dependencies from the Pipfile.lock without making any changes to the lockfile. This is useful for deployment scenarios where you want to ensure exact package versions are installed.
+
+### Basic Usage
+
+```bash
+$ pipenv sync
+```
+
+### Examples
+
+Install only default packages:
+
+```bash
+$ pipenv sync
+```
+
+Install both default and development packages:
+
+```bash
+$ pipenv sync --dev
+```
+
+Install all categories (default, dev, and any custom categories):
+
+```bash
+$ pipenv sync --all
+```
+
+Install specific package categories:
+
+```bash
+$ pipenv sync --categories="tests,docs"
+```
+
+### Options
+
+| Option | Description |
+|--------|-------------|
+| `--dev` | Install both development and default packages |
+| `--all` | Install packages from all categories defined in the Pipfile |
+| `--categories` | Install packages from specified category groups |
+
+## uninstall
+
+The `uninstall` command removes packages from your virtual environment and Pipfile.
+
+### Basic Usage
+
+```bash
+$ pipenv uninstall [package_name]
+```
+
+### Examples
+
+Uninstall a specific package:
+
+```bash
+$ pipenv uninstall requests
+```
+
+Uninstall multiple packages:
+
+```bash
+$ pipenv uninstall requests pytest
+```
+
+Uninstall all packages:
+
+```bash
+$ pipenv uninstall --all
+```
+
+Uninstall all development packages:
+
+```bash
+$ pipenv uninstall --all-dev
+```
+
+Uninstall a dev package using --dev flag:
+
+```bash
+$ pipenv uninstall ruff --dev
+```
+
+### Options
+
+| Option | Description |
+|--------|-------------|
+| `--all` | Remove all packages from virtual environment |
+| `--all-dev` | Remove all development packages |
+| `--dev` | Uninstall package from dev-packages section |
+| `--categories` | Specify which categories to uninstall from |
+| `--skip-lock` | Don't update Pipfile.lock after uninstalling |
+
+## lock
+
+The `lock` command generates a Pipfile.lock file, which contains all dependencies (including sub-dependencies) with their exact versions and hashes.
+
+### Basic Usage
+
+```bash
+$ pipenv lock
+```
+
+### Examples
+
+Generate a lockfile including pre-release versions:
+
+```bash
+$ pipenv lock --pre
+```
+
+Generate a lockfile for a specific Python version:
+
+```bash
+$ pipenv lock --python 3.9
+```
+
+### Options
+
+| Option | Description |
+|--------|-------------|
+| `--pre` | Allow pre-releases to be pinned |
+| `--clear` | Clear the dependency cache |
+| `--python` | Specify which Python version to use for resolution |
+| `--categories` | Lock specified categories only |
+
+## update
+
+The `update` command runs `lock` when no packages are specified, or `upgrade` for specific packages, and then runs `sync` to install the updated packages.
+
+### Basic Usage
+
+```bash
+$ pipenv update [package_name]
+```
+
+### Examples
+
+Update all packages:
+
+```bash
+$ pipenv update
+```
+
+Update specific packages:
+
+```bash
+$ pipenv update requests pytest
+```
+
+Check for outdated packages without updating:
+
+```bash
+$ pipenv update --outdated
+```
+
+### Options
+
+| Option | Description |
+|--------|-------------|
+| `--outdated` | List out-of-date dependencies |
+| `--dev` | Update development packages |
+| `--categories` | Update packages in specified categories |
+
+## upgrade
+
+The `upgrade` command updates the lock file for specified dependencies and their sub-dependencies, but does not install the updated packages.
+
+### Basic Usage
+
+```bash
+$ pipenv upgrade [package_name]
+```
+
+### Examples
+
+Upgrade a specific package in the lock file:
+
+```bash
+$ pipenv upgrade requests
+```
+
+Upgrade multiple packages:
+
+```bash
+$ pipenv upgrade requests pytest
+```
+
+### Options
+
+| Option | Description |
+|--------|-------------|
+| `--dev` | Upgrade development packages |
+| `--categories` | Upgrade packages in specified categories |
+
+## check
+
+The `check` command checks for security vulnerabilities in your dependencies and verifies that your environment meets PEP 508 requirements.
+
+### Basic Usage
+
+```bash
+$ pipenv check
+```
+
+### Examples
+
+Check with a specific vulnerability database:
+
+```bash
+$ pipenv check --db /path/to/db
+```
+
+Check with a specific output format:
+
+```bash
+$ pipenv check --output json
+```
+
+### Options
+
+| Option | Description |
+|--------|-------------|
+| `--db` | Path or URL to a PyUp Safety vulnerabilities database |
+| `--ignore, -i` | Ignore specified vulnerability |
+| `--output` | Specify output format (screen, text, json, bare) |
+| `--key` | Safety API key from PyUp.io |
+| `--use-installed` | Use installed packages instead of lockfile |
+| `--categories` | Check packages in specified categories |
+| `--auto-install` | Automatically install safety if not already installed |
+| `--scan` | Enable the newer version of the check command with improved functionality. |
+
+**Note**: The check command is deprecated and will be unsupported beyond June 1, 2025. Use `pipenv check --scan` for enhanced security scanning.
+
+## run
+
+The `run` command executes a command within the context of the virtual environment.
+
+### Basic Usage
+
+```bash
+$ pipenv run [command]
+```
+
+### Examples
+
+Run a Python script:
+
+```bash
+$ pipenv run python main.py
+```
+
+Run a test suite:
+
+```bash
+$ pipenv run pytest
+```
+
+Run a custom script defined in Pipfile:
+
+```bash
+$ pipenv run start
+```
+
+## shell
+
+The `shell` command spawns a shell within the virtual environment, allowing you to interact with your installed packages.
+
+### Basic Usage
+
+```bash
+$ pipenv shell
+```
+
+### Examples
+
+Activate the shell with a specific shell program:
+
+```bash
+$ pipenv shell --fancy
+```
+
+### Options
+
+| Option | Description |
+|--------|-------------|
+| `--fancy` | Use a fancy shell activation method |
+
+## graph
+
+The `graph` command displays a dependency graph of your installed packages.
+
+### Basic Usage
+
+```bash
+$ pipenv graph
+```
+
+
+### Examples
+
+Show a dependency graph with reverse dependencies:
+
+```bash
+$ pipenv graph --reverse
+```
+
+### Options
+
+| Option | Description |
+|--------|-------------|
+| `--bare` | Output graph in bare format |
+| `--json` | Output graph in JSON format |
+| `--json-tree` | Output graph as JSON tree |
+| `--reverse` | Reversed dependency graph |
+
+## requirements
+
+The `requirements` command generates a requirements.txt file from your Pipfile.lock.
+
+### Basic Usage
+
+```bash
+$ pipenv requirements
+```
+
+### Examples
+
+Generate requirements with hashes:
+
+```bash
+$ pipenv requirements --hash
+```
+
+Generate requirements for development packages only:
+
+```bash
+$ pipenv requirements --dev-only
+```
+
+Generate requirements for specific categories:
+
+```bash
+$ pipenv requirements --categories="tests,docs"
+```
+
+### Options
+
+| Option | Description |
+|--------|-------------|
+| `--dev` | Include development packages |
+| `--dev-only` | Only include development packages |
+| `--hash` | Include package hashes |
+| `--exclude-markers` | Exclude PEP 508 markers |
+| `--categories` | Include packages from specified categories |
+
+## remove
+
+The `remove` command deletes the virtualenv associated with the current project.
+
+### Basic Usage
+
+```bash
+$ pipenv remove
+```
+
+### Examples
+
+Remove the current project's virtualenv:
+
+```bash
+$ pipenv remove
+Removing virtualenv (/home/user/.local/share/virtualenvs/myproject-abc123)...
+```
+
+You can then recreate it with `pipenv install`.
+
+> **Note**: The legacy `pipenv --rm` flag performs the same action but is deprecated and will be removed in a future release. Use `pipenv remove` instead.
+
+## clean
+
+The `clean` command uninstalls all packages not specified in Pipfile.lock.
+
+### Basic Usage
+
+```bash
+$ pipenv clean
+```
+
+### Examples
+
+Dry run to see what would be removed:
+
+```bash
+$ pipenv clean --dry-run
+```
+
+### Options
+
+| Option | Description |
+|--------|-------------|
+| `--dry-run` | Show what would be removed without removing |
+
+## verify
+
+The `verify` command checks that the Pipfile.lock is up-to-date with the Pipfile.
+
+### Basic Usage
+
+```bash
+$ pipenv verify
+```
+
+This command is useful in CI/CD pipelines to ensure that the lock file is synchronized with the Pipfile before deployment.
+
+## scripts
+
+The `scripts` command lists scripts defined in the current environment configuration.
+
+### Basic Usage
+
+```bash
+$ pipenv scripts
+```
+
+## open
+
+The `open` command opens a Python module in your editor.
+
+### Basic Usage
+
+```bash
+$ pipenv open [module_name]
+```
+
+### Examples
+
+Open the requests module in your editor:
+
+```bash
+$ pipenv open requests
+```
+
+**Note**: This command uses the `EDITOR` environment variable to determine which editor to use.
diff --git a/docs/conf.py b/docs/conf.py
index 58766b75ce..c8bc5ac6c8 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
#
# pipenv documentation build configuration file, created by
# sphinx-quickstart on Mon Jan 30 13:28:36 2017.
@@ -17,7 +16,6 @@
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
import os
-import sys
# Path hackery to get current version number.
here = os.path.abspath(os.path.dirname(__file__))
@@ -25,7 +23,6 @@
about = {}
with open(os.path.join(here, "..", "pipenv", "__version__.py")) as f:
exec(f.read(), about)
-
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
@@ -35,37 +32,58 @@
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
-extensions = ['sphinx.ext.autodoc',
- 'sphinx.ext.todo',
- 'sphinx.ext.coverage',
- 'sphinx.ext.viewcode',
- 'sphinx_click.ext']
+extensions = [
+ "sphinx.ext.autodoc",
+ "sphinx.ext.todo",
+ "sphinx.ext.coverage",
+ "sphinx.ext.viewcode",
+ "myst_parser",
+]
# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
+templates_path = ["_templates"]
+
+myst_enable_extensions = [
+ "amsmath",
+ "colon_fence",
+ "deflist",
+ "dollarmath",
+ "fieldlist",
+ "html_admonition",
+ "html_image",
+ "linkify",
+ "replacements",
+ "smartquotes",
+ "strikethrough",
+ "substitution",
+ "tasklist",
+]
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
-# source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
+source_suffix = [".rst", ".md"]
+# source_suffix = ".rst"
# The master toctree document.
-master_doc = 'index'
+master_doc = "index"
# General information about the project.
-project = u'pipenv'
-copyright = u'2017. A Kenneth Reitz Project'
-author = u'Kenneth Reitz'
+project = "pipenv"
+copyright = (
+ "2020. A project founded by Kenneth Reitz and maintained by "
+ 'Python Packaging Authority (PyPA).'
+)
+author = "Python Packaging Authority"
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
-version = about['__version__']
+version = about["__version__"]
# The full version, including alpha/beta/rc tags.
-release = about['__version__']
+release = about["__version__"]
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
@@ -77,52 +95,60 @@
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
-exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
+pygments_style = "sphinx"
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True
-
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
-html_theme = 'alabaster'
+html_theme = "alabaster"
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
html_theme_options = {
- 'show_powered_by': False,
- 'github_user': 'kennethreitz',
- 'github_repo': 'pipenv',
- 'github_banner': False,
- 'show_related': False
+ "show_powered_by": False,
+ "github_user": "pypa",
+ "github_repo": "pipenv",
+ "github_banner": False,
+ "show_related": False,
}
html_sidebars = {
- 'index': ['sidebarintro.html', 'sourcelink.html', 'searchbox.html',
- 'hacks.html'],
- '**': ['sidebarlogo.html', 'localtoc.html', 'relations.html',
- 'sourcelink.html', 'searchbox.html', 'hacks.html']
+ "index": ["sidebarlogo.html", "sourcelink.html", "searchbox.html", "hacks.html"],
+ "**": [
+ "sidebarlogo.html",
+ "localtoc.html",
+ "relations.html",
+ "sourcelink.html",
+ "searchbox.html",
+ "hacks.html",
+ ],
}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
+html_static_path = ["_static"]
+
+
+def setup(app):
+ app.add_css_file("custom.css")
# -- Options for HTMLHelp output ------------------------------------------
# Output file base name for HTML help builder.
-htmlhelp_basename = 'pipenvdoc'
+htmlhelp_basename = "pipenvdoc"
# -- Options for LaTeX output ---------------------------------------------
@@ -131,15 +157,12 @@
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
-
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
-
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
-
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
@@ -149,8 +172,7 @@
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
- (master_doc, 'pipenv.tex', u'pipenv Documentation',
- u'Kenneth Reitz', 'manual'),
+ (master_doc, "pipenv.tex", "pipenv Documentation", "Kenneth Reitz", "manual"),
]
@@ -158,10 +180,7 @@
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
-man_pages = [
- (master_doc, 'pipenv', u'pipenv Documentation',
- [author], 1)
-]
+man_pages = [("installation", "pipenv", "", [author], 1)]
# -- Options for Texinfo output -------------------------------------------
@@ -170,13 +189,18 @@
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
- (master_doc, 'pipenv', u'pipenv Documentation',
- author, 'pipenv', 'One line description of project.',
- 'Miscellaneous'),
+ (
+ master_doc,
+ "pipenv",
+ "pipenv Documentation",
+ author,
+ "pipenv",
+ "One line description of project.",
+ "Miscellaneous",
+ ),
]
-
# -- Options for Epub output ----------------------------------------------
# Bibliographic Dublin Core info.
@@ -195,6 +219,4 @@
# epub_uid = ''
# A list of files that should not be packed into the epub file.
-epub_exclude_files = ['search.html']
-
-
+epub_exclude_files = ["search.html"]
diff --git a/docs/configuration.md b/docs/configuration.md
new file mode 100644
index 0000000000..8686f432e1
--- /dev/null
+++ b/docs/configuration.md
@@ -0,0 +1,354 @@
+# Pipenv Configuration
+
+This document covers the various ways to configure Pipenv's behavior through environment variables, configuration files, and command-line options.
+
+## Environment Variables
+
+Pipenv can be customized through environment variables, which is particularly useful for CI/CD pipelines, team-wide settings, or personal preferences.
+
+### Setting Environment Variables
+
+#### Temporary (Session-Only)
+
+```bash
+# Unix/Linux/macOS
+$ export PIPENV_VENV_IN_PROJECT=1
+$ pipenv install
+
+# Windows (Command Prompt)
+> set PIPENV_VENV_IN_PROJECT=1
+> pipenv install
+
+# Windows (PowerShell)
+> $env:PIPENV_VENV_IN_PROJECT=1
+> pipenv install
+```
+
+#### Permanent
+
+For Unix/Linux/macOS, add to your shell profile (e.g., `~/.bashrc`, `~/.zshrc`):
+
+```bash
+export PIPENV_VENV_IN_PROJECT=1
+```
+
+For Windows, set through System Properties > Environment Variables.
+
+### Boolean Options
+
+To enable boolean options, set the variable to a true value: `"1"`, `"true"`, `"yes"`, or `"on"`.
+
+To disable a boolean option, set it to a false value: `"0"`, `"false"`, `"no"`, or `"off"`.
+
+### Available Environment Variables
+
+#### Virtual Environment
+
+| Variable | Description | Default |
+|----------|-------------|---------|
+| `PIPENV_VENV_IN_PROJECT` | Create virtualenv in project directory | `0` |
+| `PIPENV_IGNORE_VIRTUALENVS` | Ignore active virtualenvs | `0` |
+| `PIPENV_CUSTOM_VENV_NAME` | Use custom virtualenv name | None |
+| `PIPENV_VIRTUALENV` | Path to virtualenv executable | Detected from system |
+| `PIPENV_PYTHON` | Path to Python executable | Detected from system |
+| `PIPENV_DEFAULT_PYTHON_VERSION` | Default Python version to use | System default |
+| `VIRTUAL_ENV` | Current active virtualenv | None |
+
+#### Installation and Dependencies
+
+| Variable | Description | Default |
+|----------|-------------|---------|
+| `PIPENV_INSTALL_DEPENDENCIES` | Install package dependencies | `1` |
+| `PIPENV_RESOLVE_VCS` | Resolve VCS dependencies | `1` |
+| `PIPENV_SKIP_LOCK` | Skip lock when installing | `0` |
+| `PIPENV_PYPI_MIRROR` | PyPI mirror URL | None |
+| `PIPENV_MAX_DEPTH` | Maximum depth for dependency resolution | `10` |
+| `PIPENV_TIMEOUT` | Timeout for pip operations | `15` |
+| `PIPENV_INSTALL_TIMEOUT` | Timeout for package installation | `900` |
+
+#### File Locations
+
+| Variable | Description | Default |
+|----------|-------------|---------|
+| `PIPENV_PIPFILE` | Custom Pipfile location | `./Pipfile` |
+| `PIPENV_CACHE_DIR` | Custom cache directory | `~/.cache/pipenv` |
+| `PIPENV_DOTENV_LOCATION` | Custom .env file location | `./.env` |
+
+#### Behavior
+
+| Variable | Description | Default |
+|----------|-------------|---------|
+| `PIPENV_DONT_LOAD_ENV` | Don't load .env files | `0` |
+| `PIPENV_DONT_USE_PYENV` | Don't use pyenv | `0` |
+| `PIPENV_DONT_USE_ASDF` | Don't use asdf | `0` |
+| `PIPENV_SHELL_FANCY` | Use fancy shell | `0` |
+| `PIPENV_NOSPIN` | Disable spinner animation | `0` |
+| `PIPENV_QUIET` | Quiet mode | `0` |
+| `PIPENV_VERBOSE` | Verbose mode | `0` |
+| `PIPENV_YES` | Yes to all prompts | `0` |
+| `PIPENV_IGNORE_PIPFILE` | Ignore Pipfile, use only lock | `0` |
+| `PIPENV_REQUESTS_TIMEOUT` | Timeout for HTTP requests | `10` |
+| `PIPENV_CLEAR` | Clear caches on run | `0` |
+| `PIPENV_SITE_PACKAGES` | Enable site-packages for virtualenv | `0` |
+
+#### Security and Credentials
+
+| Variable | Description | Default |
+|----------|-------------|---------|
+| `PIPENV_PYUP_API_KEY` | PyUp.io API key for security checks | None |
+| `PIPENV_KEYRING_PROVIDER` | Keyring provider for credential lookup (`auto`, `disabled`, `import`, `subprocess`) | None (pip default: `auto`) |
+
+#### Runtime Environment Variables
+
+These variables are automatically set by Pipenv when running `pipenv run` or `pipenv shell`:
+
+| Variable | Description |
+|----------|-------------|
+| `PIPENV_ACTIVE` | Set to `1` when inside a Pipenv-managed environment |
+| `PIPENV_PROJECT_DIR` | Path to the project root directory (where Pipfile is located) |
+| `VIRTUAL_ENV` | Path to the virtualenv directory |
+
+The `PIPENV_PROJECT_DIR` variable is particularly useful for scripts that need to reference project-relative paths regardless of the current working directory:
+
+```toml
+# Pipfile
+[scripts]
+test = "pytest $PIPENV_PROJECT_DIR/tests"
+mypy = "mypy --config-file=$PIPENV_PROJECT_DIR/mypy.ini $PIPENV_PROJECT_DIR/src"
+```
+
+### Examples
+
+#### Store virtualenvs in the project directory
+
+```bash
+export PIPENV_VENV_IN_PROJECT=1
+```
+
+This creates a `.venv` directory in your project, making it easier to manage and find the virtualenv.
+
+#### Use a custom Python version by default
+
+```bash
+export PIPENV_DEFAULT_PYTHON_VERSION=3.10
+```
+
+This sets Python 3.10 as the default when creating new environments.
+
+#### Skip lock file generation during development
+
+```bash
+export PIPENV_SKIP_LOCK=1
+```
+
+This speeds up installation during development, but should not be used in production environments.
+
+#### Use a PyPI mirror
+
+```bash
+export PIPENV_PYPI_MIRROR=https://mirrors.aliyun.com/pypi/simple/
+```
+
+This is useful in regions where accessing the official PyPI might be slow.
+
+#### Increase timeout for large packages
+
+```bash
+export PIPENV_INSTALL_TIMEOUT=1800
+```
+
+This increases the timeout to 30 minutes for installing large packages.
+
+## Configuration with pip
+
+Pipenv uses pip under the hood, so you can also use pip's configuration options. These can be set through:
+
+1. Environment variables (e.g., `PIP_TIMEOUT`, `PIP_INDEX_URL`)
+2. pip configuration files (`pip.conf` or `pip.ini`)
+
+### Common pip Environment Variables
+
+| Variable | Description |
+|----------|-------------|
+| `PIP_INDEX_URL` | Base URL of the Python Package Index |
+| `PIP_EXTRA_INDEX_URL` | Additional index URLs |
+| `PIP_TRUSTED_HOST` | Mark a host as trusted |
+| `PIP_RETRIES` | Number of retries for network operations |
+| `PIP_TIMEOUT` | Timeout for HTTP requests |
+| `PIP_DEFAULT_TIMEOUT` | Default timeout for HTTP requests |
+| `PIP_FIND_LINKS` | Additional locations to find packages |
+| `PIP_NO_CACHE_DIR` | Disable the cache |
+| `PIP_CACHE_DIR` | Cache directory |
+
+### Examples
+
+#### Using a private package index
+
+```bash
+export PIP_INDEX_URL=https://private-repo.example.com/simple
+export PIP_TRUSTED_HOST=private-repo.example.com
+```
+
+#### Passing additional options to pip
+
+```bash
+export PIP_INSTALL_OPTION="--no-deps"
+```
+
+#### Combining with Pipenv options
+
+```bash
+export PIP_INDEX_URL=https://private-repo.example.com/simple
+export PIPENV_TIMEOUT=60
+pipenv install requests
+```
+
+## Project-Specific Configuration
+
+### Using .env Files
+
+Pipenv automatically loads environment variables from `.env` files in your project directory. This is useful for project-specific settings:
+
+```
+# .env file
+PIPENV_VENV_IN_PROJECT=1
+PIP_INDEX_URL=https://private-repo.example.com/simple
+```
+
+### Custom .env Location
+
+You can specify a custom location for your `.env` file:
+
+```bash
+export PIPENV_DOTENV_LOCATION=/path/to/custom/.env
+pipenv shell
+```
+
+### Disabling .env Loading
+
+If you don't want Pipenv to load `.env` files:
+
+```bash
+export PIPENV_DONT_LOAD_ENV=1
+pipenv shell
+```
+
+## Command-Line Options
+
+Many configuration options can also be set directly via command-line arguments, which take precedence over environment variables:
+
+```bash
+pipenv install --python 3.9 --site-packages
+```
+
+## Advanced Configuration
+
+### Changing Cache Location
+
+The default cache location is `~/.cache/pipenv` on Unix/Linux/macOS and `%LOCALAPPDATA%\pipenv\Cache` on Windows. You can change this:
+
+```bash
+export PIPENV_CACHE_DIR=/path/to/custom/cache
+```
+
+This is useful when:
+- You have limited space in your home directory
+- You want to share the cache across users
+- You're working in an environment with restricted permissions
+
+### Network Configuration in Restricted Environments
+
+For environments with network restrictions:
+
+```bash
+# Increase timeout for slow connections
+export PIPENV_TIMEOUT=60
+export PIP_TIMEOUT=60
+
+# Use a proxy
+export HTTP_PROXY=http://proxy.example.com:8080
+export HTTPS_PROXY=http://proxy.example.com:8080
+
+# Specify trusted hosts that don't need HTTPS
+export PIP_TRUSTED_HOST=internal-repo.example.com
+```
+
+### CI/CD Pipeline Configuration
+
+For continuous integration environments:
+
+```bash
+# Non-interactive mode
+export PIPENV_YES=1
+export PIPENV_NOSPIN=1
+export PIPENV_QUIET=1
+
+# Fail if lock file is out of date
+pipenv install --deploy
+```
+
+### Development vs. Production Settings
+
+#### Development
+
+```bash
+# Development environment
+export PIPENV_VENV_IN_PROJECT=1 # Keep virtualenv with project
+export PIPENV_MAX_DEPTH=20 # Allow deeper dependency resolution
+```
+
+#### Production
+
+```bash
+# Production environment
+export PIPENV_IGNORE_PIPFILE=1 # Use only the lock file
+export PIPENV_NOSPIN=1 # Disable spinner for cleaner logs
+pipenv install --deploy # Fail if lock file is out of date
+```
+
+## Troubleshooting Configuration Issues
+
+### Checking Current Configuration
+
+To see what environment variables Pipenv is using:
+
+```bash
+pipenv --support
+```
+
+This shows all active Pipenv-related environment variables and their values.
+
+### Common Configuration Problems
+
+#### Virtualenv Creation Fails
+
+If virtualenv creation fails, check:
+- `PIPENV_PYTHON` points to a valid Python executable
+- You have permissions to write to the virtualenv directory
+- `PIPENV_VENV_IN_PROJECT=1` if you're in a directory with restricted permissions
+
+#### Package Installation Timeouts
+
+If package installations time out:
+- Increase `PIPENV_TIMEOUT` and `PIPENV_INSTALL_TIMEOUT`
+- Check network connectivity to PyPI or your custom index
+- Consider using a PyPI mirror with `PIPENV_PYPI_MIRROR`
+
+#### Lock File Generation Issues
+
+If lock file generation fails:
+- Ensure there are no conflicting dependencies
+- Try `PIPENV_RESOLVE_VCS=0` if you have VCS dependencies causing issues
+- Increase `PIPENV_MAX_DEPTH` for complex dependency trees
+
+## Best Practices
+
+1. **Version Control**: Don't commit environment-specific settings to version control. Use `.env` files that are excluded via `.gitignore`.
+
+2. **Documentation**: Document required environment variables in your project's README.
+
+3. **Consistency**: Use the same configuration across development, testing, and production environments when possible.
+
+4. **Minimal Configuration**: Only set the variables you need to change from defaults.
+
+5. **Security**: Be careful with security-sensitive settings like API keys. Use environment variables rather than committing them to files.
diff --git a/docs/credentials.md b/docs/credentials.md
new file mode 100644
index 0000000000..c0c9b5872b
--- /dev/null
+++ b/docs/credentials.md
@@ -0,0 +1,504 @@
+# Managing Credentials in Pipenv
+
+This guide covers best practices for securely managing credentials and authentication in Pipenv, including environment variables, private repositories, and security considerations.
+
+## Credentials in Package Sources
+
+When working with private package repositories or authenticated services, you need to securely manage credentials in your Pipenv workflow.
+
+### Environment Variable Expansion
+
+Pipenv automatically expands environment variables in your `Pipfile`, providing a secure way to inject credentials without storing them in version control.
+
+#### Basic Environment Variable Syntax
+
+You can use environment variables in your `Pipfile` using the following syntax:
+
+- `${VARIABLE_NAME}` - Standard syntax
+- `$VARIABLE_NAME` - Alternative syntax
+- `%VARIABLE_NAME%` - Windows-specific syntax (also supported on all platforms)
+
+#### Example: Private Repository Authentication
+
+```toml
+[[source]]
+url = "https://${USERNAME}:${PASSWORD}@mypypi.example.com/simple"
+verify_ssl = true
+name = "private-pypi"
+```
+
+When Pipenv reads this `Pipfile`, it will replace `${USERNAME}` and `${PASSWORD}` with the values of the corresponding environment variables.
+
+#### Setting Environment Variables
+
+Before running Pipenv commands, set the required environment variables:
+
+**Linux/macOS:**
+```bash
+$ export USERNAME="your-username"
+$ export PASSWORD="your-password"
+$ pipenv install
+```
+
+**Windows (Command Prompt):**
+```cmd
+> set USERNAME=your-username
+> set PASSWORD=your-password
+> pipenv install
+```
+
+**Windows (PowerShell):**
+```powershell
+> $env:USERNAME="your-username"
+> $env:PASSWORD="your-password"
+> pipenv install
+```
+
+### Security Considerations
+
+Pipenv hashes your `Pipfile` *before* expanding environment variables and substitutes them again when installing from the lock file. This means:
+
+1. Your credentials are never stored in the lock file
+2. You don't need to commit any secrets to version control
+3. Different developers can use different credentials with the same `Pipfile`
+
+```{warning}
+While environment variables provide better security than hardcoded credentials, they are still accessible to any process running with the same user permissions. For highly sensitive credentials, consider using a dedicated secrets management solution.
+```
+
+### URL Encoding for Special Characters
+
+If your credentials contain special characters, they must be URL-encoded according to [RFC 3986](https://datatracker.ietf.org/doc/html/rfc3986).
+
+For example, if your password is `p@ssw0rd!`, it should be encoded as `p%40ssw0rd%21`:
+
+```toml
+[[source]]
+url = "https://${USERNAME}:${PASSWORD_ENCODED}@mypypi.example.com/simple"
+verify_ssl = true
+name = "private-pypi"
+```
+
+You can generate URL-encoded strings using Python:
+
+```python
+import urllib.parse
+print(urllib.parse.quote("p@ssw0rd!", safe=""))
+# Output: p%40ssw0rd%21
+```
+
+## Credentials in Package Requirements
+
+Environment variables can also be used in package requirement specifiers, but with some limitations.
+
+### VCS Repository Authentication
+
+For version control system (VCS) repositories that require authentication:
+
+```toml
+[packages]
+requests = {git = "git://${USERNAME}:${PASSWORD}@private.git.com/psf/requests.git", ref = "2.22.0"}
+```
+
+```{note}
+For VCS repositories, only the `${VAR_NAME}` syntax is supported. Neither `$VAR_NAME` nor `%VAR_NAME%` will work in this context.
+```
+
+### Runtime vs. Install-time Expansion
+
+It's important to understand that environment variables are expanded at runtime, not when the `Pipfile` or `Pipfile.lock` is created. This means:
+
+1. The entries in `Pipfile` and `Pipfile.lock` remain untouched
+2. You need to have the environment variables set every time you run Pipenv commands
+3. Different environments (development, CI/CD, production) can use different credentials
+
+## Keyring Integration
+
+Pipenv supports keyring integration for authentication to private registries. With pip 23.1+, there are two approaches to configure keyring authentication.
+
+### Modern Approach: System-Wide Keyring (pip >= 23.1)
+
+Starting with pip 23.1, you can install keyring system-wide (outside of your project virtualenv) and configure pip to use it via the subprocess provider. This is the recommended approach as it doesn't require installing keyring in every project.
+
+#### Setup Steps
+
+1. **Install keyring globally** (using pip, pipx, or your system package manager):
+ ```bash
+ # Using pip (user install)
+ $ pip install --user keyring keyrings.google-artifactregistry-auth
+
+ # Or using pipx (recommended for CLI tools)
+ $ pipx install keyring
+ $ pipx inject keyring keyrings.google-artifactregistry-auth
+ ```
+
+2. **Ensure keyring is on your PATH**:
+ ```bash
+ $ which keyring
+ /home/user/.local/bin/keyring
+ ```
+
+3. **Ensure virtualenv seeds pip >= 23.1** (one-time setup):
+ ```bash
+ $ virtualenv --upgrade-embed-wheels
+ ```
+
+4. **Configure the keyring provider** using one of these methods:
+
+ **Option A: Environment variable (recommended for Pipenv)**:
+ ```bash
+ $ export PIPENV_KEYRING_PROVIDER=subprocess
+ ```
+
+ **Option B: pip configuration**:
+ ```bash
+ # Global configuration
+ $ pip config set --global keyring-provider subprocess
+
+ # Or user-level configuration
+ $ pip config set --user keyring-provider subprocess
+ ```
+
+ !!! note
+ Setting `PIPENV_KEYRING_PROVIDER` ensures that keyring credentials are used
+ during both dependency resolution and installation, even though Pipenv disables
+ interactive pip input by default. This is particularly important for credential
+ managers like Windows Credential Manager.
+
+5. **Configure your index URL with the appropriate username**:
+ - For Google Artifact Registry: use `oauth2accesstoken` as username
+ - For Azure Artifacts: use `VssSessionToken` as username
+
+ ```toml
+ # Pipfile
+ [[source]]
+ url = "https://oauth2accesstoken@europe-python.pkg.dev/my-project/python/simple/"
+ verify_ssl = true
+ name = "private-gcp"
+ ```
+
+### Legacy Approach: Keyring in Project Virtualenv
+
+Alternatively, you can install keyring directly in your project's virtual environment. This approach works with all pip versions but requires installing keyring in every project.
+
+### Google Cloud Artifact Registry
+
+Google Cloud Artifact Registry supports authentication via keyring:
+
+1. Install the required packages:
+ ```bash
+ $ pipenv run pip install keyring keyrings.google-artifactregistry-auth
+ ```
+
+2. Configure your `Pipfile`:
+ ```toml
+ [[source]]
+ url = "https://pypi.org/simple"
+ verify_ssl = true
+ name = "pypi"
+
+ [[source]]
+ url = "https://europe-python.pkg.dev/my-project/python/simple"
+ verify_ssl = true
+ name = "private-gcp"
+
+ [packages]
+ flask = "*"
+ private-test-package = {version = "*", index = "private-gcp"}
+ ```
+
+3. If the keyring might ask for user input, you may need to disable input enforcement:
+ ```toml
+ [pipenv]
+ disable_pip_input = false
+ ```
+
+ Alternatively, if your keyring provider does not require user interaction (e.g. Windows Credential Manager), you can set `PIPENV_KEYRING_PROVIDER=subprocess` instead.
+
+### Azure Artifact Registry
+
+For Azure Artifact Registry:
+
+1. Install the required packages:
+ ```bash
+ $ pipenv run pip install keyring artifacts-keyring
+ ```
+
+2. Configure your `Pipfile` similar to the Google Cloud example above, using `VssSessionToken` as the username in your index URL.
+
+### Windows Credential Manager
+
+On Windows, pip can use credentials stored in Windows Credential Manager via the keyring library.
+To use these credentials with Pipenv:
+
+1. **Install keyring globally**:
+ ```powershell
+ > pip install --user keyring
+ ```
+
+2. **Set the keyring provider**:
+ ```powershell
+ > $env:PIPENV_KEYRING_PROVIDER="subprocess"
+ ```
+
+ Or set it permanently via system environment variables.
+
+3. **Store your credentials** in Windows Credential Manager (via Control Panel or `cmdkey`).
+
+4. **Configure your `Pipfile`** with the private index URL (with or without the username):
+ ```toml
+ [[source]]
+ url = "https://username@private-repo.example.com/simple"
+ verify_ssl = true
+ name = "private"
+ ```
+
+### AWS CodeArtifact
+
+For AWS CodeArtifact:
+
+1. Install the required packages:
+ ```bash
+ $ pipenv run pip install keyring keyrings.codeartifact
+ ```
+
+2. Configure your `Pipfile` with the appropriate AWS CodeArtifact URL.
+
+## Best Practices for Credential Management
+
+### Use Environment Variables
+
+Always use environment variables instead of hardcoding credentials:
+
+```toml
+# Good
+url = "https://${USERNAME}:${PASSWORD}@private-repo.example.com/simple"
+
+# Bad
+url = "https://actual-username:actual-password@private-repo.example.com/simple"
+```
+
+### Store Credentials in .env Files
+
+For local development, store credentials in `.env` files that are not committed to version control:
+
+```
+# .env
+USERNAME=your-username
+PASSWORD=your-password
+```
+
+Add `.env` to your `.gitignore`:
+```
+# .gitignore
+.env
+```
+
+Pipenv will automatically load variables from `.env` files when you run commands.
+
+### Provide Templates
+
+Include a template `.env.example` file in your repository:
+
+```
+# .env.example
+USERNAME=
+PASSWORD=
+```
+
+This helps other developers understand which environment variables they need to set.
+
+### Use Different Credentials for Different Environments
+
+Maintain separate credential sets for different environments:
+
+```
+# .env.development
+USERNAME=dev-username
+PASSWORD=dev-password
+
+# .env.production
+USERNAME=prod-username
+PASSWORD=prod-password
+```
+
+Use them with:
+```bash
+$ PIPENV_DOTENV_LOCATION=.env.development pipenv install
+```
+
+### Rotate Credentials Regularly
+
+Regularly rotate your credentials to minimize the impact of potential leaks:
+
+1. Generate new credentials
+2. Update your environment variables or `.env` files
+3. Revoke the old credentials
+
+### Consider Credential Managers
+
+For team environments, consider using dedicated credential management solutions:
+
+- [HashiCorp Vault](https://www.vaultproject.io/)
+- [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/)
+- [Google Secret Manager](https://cloud.google.com/secret-manager)
+- [Azure Key Vault](https://azure.microsoft.com/en-us/services/key-vault/)
+
+These can be integrated into your workflow to provide secure, centralized credential management.
+
+## CI/CD Integration
+
+### GitHub Actions
+
+For GitHub Actions, use secrets to store credentials:
+
+```yaml
+name: Python Package
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up Python
+ uses: actions/setup-python@v4
+ with:
+ python-version: '3.10'
+ - name: Install dependencies
+ env:
+ USERNAME: ${{ secrets.PYPI_USERNAME }}
+ PASSWORD: ${{ secrets.PYPI_PASSWORD }}
+ run: |
+ pip install pipenv
+ pipenv install --dev
+```
+
+### GitLab CI
+
+For GitLab CI, use CI/CD variables:
+
+```yaml
+stages:
+ - test
+
+test:
+ stage: test
+ image: python:3.10
+ variables:
+ USERNAME: ${PYPI_USERNAME}
+ PASSWORD: ${PYPI_PASSWORD}
+ script:
+ - pip install pipenv
+ - pipenv install --dev
+ - pipenv run pytest
+```
+
+### Jenkins
+
+For Jenkins, use credentials binding:
+
+```groovy
+pipeline {
+ agent {
+ docker {
+ image 'python:3.10'
+ }
+ }
+ stages {
+ stage('Build') {
+ steps {
+ withCredentials([
+ string(credentialsId: 'pypi-username', variable: 'USERNAME'),
+ string(credentialsId: 'pypi-password', variable: 'PASSWORD')
+ ]) {
+ sh 'pip install pipenv'
+ sh 'pipenv install --dev'
+ sh 'pipenv run pytest'
+ }
+ }
+ }
+ }
+}
+```
+
+## Troubleshooting
+
+### Common Issues
+
+#### Environment Variables Not Being Expanded
+
+If environment variables aren't being expanded:
+
+1. Verify the variables are set correctly:
+ ```bash
+ $ echo $USERNAME
+ $ echo $PASSWORD
+ ```
+
+2. Check the syntax in your `Pipfile`:
+ - Use `${VARIABLE_NAME}` for the most reliable expansion
+ - Ensure there are no typos in variable names
+
+3. Try setting the variables directly in the command:
+ ```bash
+ $ USERNAME=user PASSWORD=pass pipenv install
+ ```
+
+#### Authentication Failures
+
+If you're experiencing authentication failures:
+
+1. Verify your credentials work outside of Pipenv:
+ ```bash
+ $ curl -u "${USERNAME}:${PASSWORD}" https://private-repo.example.com/simple
+ ```
+
+2. Check for special characters that might need URL encoding
+
+3. Ensure your credentials have the necessary permissions
+
+#### Keychain Integration Issues
+
+If keychain integration isn't working:
+
+1. Verify the keychain packages are installed:
+ ```bash
+ $ pipenv run pip list | grep keyring
+ ```
+
+2. Check if the keychain is properly configured for your system
+
+3. Try disabling pip input enforcement:
+ ```toml
+ [pipenv]
+ disable_pip_input = false
+ ```
+
+## Security Considerations
+
+### Credential Leakage Risks
+
+Be aware of these common credential leakage risks:
+
+1. **Command history**: Credentials passed directly in commands are stored in shell history
+2. **Process listing**: Environment variables set on the command line may be visible in process listings
+3. **Log files**: Debug logs might include expanded environment variables
+4. **Core dumps**: Application crashes might include memory containing credentials
+
+### Mitigating Risks
+
+To mitigate these risks:
+
+1. Use `.env` files instead of setting variables on the command line
+2. Limit access to environments where credentials are used
+3. Use temporary credentials or tokens when possible
+4. Implement the principle of least privilege for all credentials
+5. Monitor for unauthorized access to your repositories
+
+## Conclusion
+
+Properly managing credentials in Pipenv is essential for security and maintainability. By using environment variables, `.env` files, and following best practices, you can securely authenticate to private repositories and services without compromising sensitive information.
+
+Remember that credential management is an ongoing process that requires regular review and updates to maintain security. Always follow the principle of least privilege and rotate credentials regularly to minimize potential security risks.
diff --git a/docs/dev/contributing.md b/docs/dev/contributing.md
new file mode 100644
index 0000000000..00b8c0a0af
--- /dev/null
+++ b/docs/dev/contributing.md
@@ -0,0 +1,349 @@
+# Contributing to Pipenv
+
+If you're reading this, you're probably interested in contributing to Pipenv.
+Thank you very much! Open source projects live-and-die based on the support
+they receive from others, and the fact that you're even considering
+contributing to the Pipenv project is _very_ generous of you.
+
+This document lays out guidelines and advice for contributing to this project.
+If you're thinking of contributing, please start by reading this document and
+getting a feel for how contributing to this project works.
+
+The guide is split into sections based on the type of contribution you're
+thinking of making, with a section that covers general guidelines for all
+contributors.
+
+## General Guidelines
+
+### Be Cordial
+
+> **Be cordial or be on your way**. _βKenneth Reitz_
+
+Pipenv has one very important rule governing all forms of contribution,
+including reporting bugs or requesting features. This golden rule is [be cordial or be on your way](https://kennethreitz.org/essays/2013/01/27/be-cordial-or-be-on-your-way)
+
+**All contributions are welcome**, as long as
+everyone involved is treated with respect.
+
+### Get Early Feedback
+
+If you are contributing, do not feel the need to sit on your contribution until
+it is perfectly polished and complete. It helps everyone involved for you to
+seek feedback as early as you possibly can. Submitting an early, unfinished
+version of your contribution for feedback in no way prejudices your chances of
+getting that contribution accepted, and can save you from putting a lot of work
+into a contribution that is not suitable for the project.
+
+### Contribution Suitability
+
+Our project maintainers have the last word on whether or not a contribution is
+suitable for Pipenv. All contributions will be considered carefully, but from
+time to time, contributions will be rejected because they do not suit the
+current goals or needs of the project.
+
+If your contribution is rejected, don't despair! As long as you followed these
+guidelines, you will have a much better chance of getting your next
+contribution accepted.
+
+## Questions
+
+The GitHub issue tracker is for _bug reports_ and _feature requests_. Please do
+not use it to ask questions about how to use Pipenv. These questions should
+instead be directed to [Stack Overflow](https://stackoverflow.com/). Make sure that your question is tagged
+with the `pipenv` tag when asking it on Stack Overflow, to ensure that it is
+answered promptly and accurately.
+
+## Code Contributions
+
+### Steps for Submitting Code
+
+When contributing code, you'll want to follow this checklist:
+
+1. Fork the repository on GitHub.
+2. Set up your [development environment](#development-setup)
+3. Run the tests from [here](#run-the-tests) to confirm they all pass on your system. If they don't, you'll need to investigate why they fail. If you're unable to diagnose this yourself, raise it as a bug report by following the guidelines
+ in this [document](#bug-reports).
+4. Write tests that demonstrate your bug or feature. Ensure that they fail.
+5. Make your change.
+6. Run the entire test suite again, confirming that all tests pass _including the ones you just added_.
+7. Send a GitHub Pull Request to the main repository's `main` branch. GitHub Pull Requests are the expected method of code collaboration on this project.
+
+The following sub-sections go into more detail on some of the points above.
+
+### Development Setup
+
+The repository version of Pipenv must be installed over other global versions to resolve conflicts with the `pipenv` folder being implicitly added to `sys.path`.
+See [pypa/pipenv#2557](https://github.com/pypa/pipenv/issues/2557) for more details.
+
+Pipenv now uses pre-commit hooks similar to Pip in order to apply linting and
+code formatting automatically! The build now also checks that these linting rules
+have been applied to the code before running the tests.
+The build will fail when linting changes are detected so be sure to sync dev requirements
+and install the pre-commit hooks locally:
+
+```bash
+ $ python -m pip install -e ".[tests,dev]"
+ $ pipenv install --dev
+ $ pipenv run python -m pip install -e ".[tests,dev]"
+ # This will configure running the pre-commit checks at start of each commit
+ $ pre-commit install
+ # Should you want to check the pre-commit configuration against all configured project files
+ $ pre-commit run --all-files --verbose
+```
+
+### Code Review
+
+Contributions will not be merged until they have been code reviewed. You should
+implement any code review feedback unless you strongly object to it. In the
+event that you object to the code review feedback, you should make your case
+clearly and calmly. If, after doing so, the feedback is judged to still apply,
+you must either apply the feedback or withdraw your contribution.
+
+### Package Index
+
+To speed up testing, tests that rely on a package index for locking and
+installing use a local server that contains vendored packages in the
+`tests/pypi` directory. Each vendored package should have it's own folder
+containing the necessary releases. When adding a release for a package, it is
+easiest to use either the `.tar.gz` or universal wheels (ex: `py2.py3-none`). If
+a `.tar.gz` or universal wheel is not available, add wheels for all available
+architectures and platforms.
+
+## News Fragments (Changelog Entries)
+
+Pipenv uses [towncrier](https://towncrier.readthedocs.io/) to manage its changelog.
+Every pull request that changes user-visible behaviour should include a **news fragment**
+so the change is captured in the next release's `CHANGELOG.md`.
+
+### Creating a News Fragment
+
+News fragments live in the `news/` directory. Create a file named:
+
+```
+news/..rst
+```
+
+Where `` is one of:
+
+| Type | Description | Appears in CHANGELOG? |
+|------|-------------|----------------------|
+| `feature` | New feature or improvement | Yes |
+| `behavior` | Change to existing behavior | Yes |
+| `bugfix` | Bug fix | Yes |
+| `vendor` | Update to a vendored library | Yes |
+| `doc` | Documentation-only improvement | Yes |
+| `removal` | Deprecation or removal | Yes |
+| `process` | Change to dev/CI process | Yes |
+| `trivial` | Typo fix, refactor, or other minor change | **No** (not shown in CHANGELOG) |
+
+For example, to document a bug fix for issue #1234:
+
+```bash
+$ echo "Fixed the frobnication logic when the widget is None." > news/1234.bugfix.rst
+```
+
+### Trivial Fragments
+
+Use the `trivial` type for changes that do **not** warrant a user-facing changelog entry
+(e.g. internal refactors, test-only changes, typo fixes in comments):
+
+```bash
+$ echo "." > news/1234.trivial.rst
+```
+
+```{note}
+Trivial fragments **are** required by CI to confirm you have considered whether a
+changelog entry is needed β but they are intentionally excluded from the generated
+`CHANGELOG.md`. This is expected: `towncrier` collects them, deletes the files, and
+silently omits them from the output. You do not need to add anything to the trivial
+fragment's content; a single `.` is conventional.
+```
+
+### Generating the Changelog Locally
+
+To preview what the next changelog section will look like:
+
+```bash
+$ towncrier build --draft --version 9999.0.0
+```
+
+This prints the draft changelog to stdout without modifying any files.
+
+## Documentation Contributions
+
+Documentation improvements are always welcome! The documentation files live in
+the `docs/` directory of the codebase. They're written in
+[MarkDown](https://www.markdownguide.org/), and use [Sphinx](http://sphinx-doc.org/index.html) to generate the full suite of
+documentation.
+
+When contributing documentation, please do your best to follow the style of the
+documentation files. This means a soft-limit of 79 characters wide in your text
+files and a semi-formal, yet friendly and approachable, prose style.
+
+When presenting Python code, use single-quoted strings (`'hello'` instead of
+`"hello"`).
+
+## Bug Reports
+
+Bug reports are hugely important! They are recorded as [GitHub issues](https://github.com/pypa/pipenv/issues). Please
+be aware of the following things when filing bug reports:
+
+1. Avoid raising duplicate issues. _Please_ use the GitHub issue search feature
+ to check whether your bug report or feature request has been mentioned in
+ the past. Duplicate bug reports and feature requests are a huge maintenance
+ burden on the limited resources of the project. If it is clear from your
+ report that you would have struggled to find the original, that's okay, but
+ if searching for a selection of words in your issue title would have found
+ the duplicate then the issue will likely be closed extremely abruptly.
+
+2. When filing bug reports about exceptions or tracebacks, please include the
+ _complete_ traceback. Partial tracebacks, or just the exception text, are
+ not helpful. Issues that do not contain complete tracebacks may be closed
+ without warning.
+
+3. Make sure you provide a suitable amount of information to work with. This
+ means you should provide:
+
+ - Guidance on **how to reproduce the issue**. Ideally, this should be a
+ _small_ code sample that can be run immediately by the maintainers.
+ Failing that, let us know what you're doing, how often it happens, what
+ environment you're using, etc. Be thorough: it prevents us needing to ask
+ further questions.
+
+ - Tell us **what you expected to happen**. When we run your example code,
+ what are we expecting to happen? What does "success" look like for your
+ code?
+
+ - Tell us **what actually happens**. It's not helpful for you to say "it
+ doesn't work" or "it fails". Tell us _how_ it fails: do you get an
+ exception? A hang? The packages installed seem incorrect?
+ How was the actual result different from your expected result?
+
+ - Tell us **what version of Pipenv you're using**, and
+ **how you installed it**. Different versions of Pipenv behave
+ differently and have different bugs, and some distributors of Pipenv
+ ship patches on top of the code we supply.
+
+If you do not provide all of these things, it will take us much longer to
+fix your problem. If we ask you to clarify these and you never respond, we
+will close your issue without fixing it.
+
+## Run the tests
+
+Tests are written in `pytest` style and can be run very simply:
+
+```bash
+ pytest
+```
+
+However many tests depend on running a private pypi server on localhost:8080.
+This can be accomplished by using either the `run-tests.sh` or `run-tests.bat` scripts
+which will start the `pypiserver` process ahead of invoking pytest.
+
+You may also manually perform this step and then invoke pytest as you would normally. Example:
+
+ # Linux or MacOS
+ pipenv run pypi-server run -v --host=0.0.0.0 --port=8080 --hash-algo=sha256 --disable-fallback ./tests/pypi/ ./tests/fixtures &
+
+ # Windows
+ cmd /c start pipenv run pypi-server run -v --host=0.0.0.0 --port=8080 --hash-algo=sha256 --disable-fallback ./tests/pypi/ ./tests/fixtures
+
+This will run all Pipenv tests, which can take awhile. To run a subset of the
+tests, the standard pytest filters are available, such as:
+
+- provide a directory or file: `pytest tests/unit` or `pytest tests/unit/test_cmdparse.py`
+- provide a keyword expression: `pytest -k test_lock_editable_vcs_without_install`
+- provide a nodeid: `pytest tests/unit/test_cmdparse.py::test_parse`
+- provide a test marker: `pytest -m lock`
+
+There are a few other ways of running the tests:
+
+1. test scripts
+
+The scripts for bash or windows: `run-tests.sh` and `run-tests.bat`
+
+Note that, you override the default Python Pipenv will use with
+PIPENV_PYTHON and the Python binary name with PYTHON in case it
+is not called `python` on your system or in case you have many.
+Here is an example how you can override both variables (you can
+override just one too):
+
+ $ PYTHON=python3.8 PIPENV_PYTHON=python3.9 run-tests.sh
+
+You can also do:
+
+$ PYTHON=/opt/python/python3.10/python3 run-tests.sh
+
+If you need to change how pytest is invoked, see how to run the
+test suite manually. The `run-tests.sh` script does the same
+steps the Github CI workflow does, and as such it is recommended
+you run it before you open a PR. Taking this second approach,
+will allow you, for example, to run a single test case, or
+`fail fast` if you need it.
+
+2. Manually
+
+This repeats the steps of the scripts above:
+
+```console
+$ git clone https://github.com/pypa/pipenv.git
+$ cd pipenv
+$ git submodule sync && git submodule update --init --recursive
+$ python -m pip install -e ".[tests,dev]"
+$ pipenv install --dev
+$ pipenv run python -m pip install -e ".[tests,dev]"
+$ pipenv run pytest [--any optional arguments to pytest]
+```
+
+The second options assumes you already have `pipenv` on your system.
+And simply repeats all the steps in the script above.
+
+Preferably, you should be running your tests in a Linux container
+(or FreeBSD Jail or even VM). This will guarantee that you don't break
+stuff, and that the tests run in a pristine environment.
+
+Consider doing something like this:
+
+ $ docker run --rm -v $(pwd):/usr/src -it python:3.7 bash
+ # inside the container
+ # adduser --disabled-password debian
+ # su debian && cd /usr/src/
+ # bash run-tests.sh
+
+3. Using the Makefile:
+
+The Makefile automates all the task as in the script. However, it allows
+one more fine grained control on every step. For example:
+
+ $ make ramdisk # create a ram disk to preserve your SSDs life
+ $ make ramdisk-virtualenv
+ $ make test suite="-m not cli" # run all tests but cli
+
+or
+
+ $ make tests parallel="" suite="tests/integration/test_cli.py::test_pipenv_check"
+
+It is important that your environment is setup correctly, and
+this may take some work, for example, on a specific Mac installation, the following
+steps may be needed:
+
+```bash
+# Make sure the tests can access github
+if [ "$SSH_AGENT_PID" = "" ]
+then
+ eval ``ssh-agent``
+ ssh-add
+fi
+
+# Use unix like utilities, installed with brew,
+# e.g. brew install coreutils
+for d in /usr/local/opt/*/libexec/gnubin /usr/local/opt/python/libexec/bin
+do
+ [[ ":$PATH:" != *":$d:"* ]] && PATH="$d:${PATH}"
+done
+
+export PATH
+
+# PIP_FIND_LINKS currently breaks test_uninstall.py
+ unset PIP_FIND_LINKS
+```
diff --git a/docs/diagnose.md b/docs/diagnose.md
new file mode 100644
index 0000000000..75dde76633
--- /dev/null
+++ b/docs/diagnose.md
@@ -0,0 +1,399 @@
+# Diagnosing and Troubleshooting Pipenv Issues
+
+This guide provides comprehensive information on diagnosing and resolving common issues with Pipenv, including detailed troubleshooting steps, diagnostic commands, and best practices.
+
+## Diagnostic Tools and Commands
+
+Pipenv includes several built-in tools to help diagnose issues with your environment and dependencies.
+
+### The `--support` Flag
+
+The `--support` flag generates diagnostic information that can be helpful when reporting issues:
+
+```bash
+$ pipenv --support
+```
+
+This command outputs:
+- Python version and path
+- Pipenv version
+- PIP version
+- System information
+- Environment variables
+- Pipenv configuration
+- Installed packages
+
+Include this output when filing issues on GitHub to help maintainers understand your environment.
+
+### Verbose Mode
+
+For more detailed output during Pipenv operations, use the verbose flag:
+
+```bash
+$ pipenv install --verbose
+```
+
+This shows detailed information about what Pipenv is doing, which can help identify where issues are occurring.
+
+### Debug Mode
+
+For even more detailed debugging information, set the `PIPENV_DEBUG` environment variable:
+
+```bash
+$ PIPENV_DEBUG=1 pipenv install
+```
+
+This enables debug-level logging, showing internal operations that can help diagnose complex issues.
+
+## Common Issues and Solutions
+
+### Dependency Resolution Problems
+
+#### Issue: Dependencies Could Not Be Resolved
+
+If Pipenv can't resolve your dependencies, try clearing the resolver cache:
+
+```bash
+$ pipenv lock --clear
+```
+
+If that doesn't work, try manually deleting the cache directory:
+
+- **Linux/macOS**: `~/.cache/pipenv`
+- **Windows**: `%LOCALAPPDATA%\pipenv\pipenv\Cache`
+- **macOS (alternative)**: `~/Library/Caches/pipenv`
+
+#### Issue: Pre-release Versions Not Installing
+
+By default, Pipenv doesn't install pre-release versions. To enable them:
+
+```bash
+# Command line flag
+$ pipenv install --pre package-name
+
+# Or in Pipfile
+# [pipenv]
+# allow_prereleases = true
+```
+
+#### Issue: Dependency Conflicts
+
+If you have conflicting dependencies:
+
+1. Use `pipenv graph` to visualize your dependency tree
+2. Look for packages with overlapping version requirements
+3. Try relaxing version constraints in your Pipfile
+4. Consider using custom package categories to separate conflicting dependencies
+
+### Installation and Environment Issues
+
+#### Issue: Module Not Found Errors
+
+If you get "No module named X" errors:
+
+1. Verify the package is installed:
+ ```bash
+ $ pipenv graph | grep package-name
+ ```
+
+2. Check if you're running the command within the Pipenv environment:
+ ```bash
+ $ pipenv run python -c "import package_name"
+ ```
+
+3. Ensure you're not mixing system packages with Pipenv:
+ ```bash
+ $ pipenv --rm # Remove the virtual environment
+ $ pipenv install # Recreate it
+ ```
+
+#### Issue: Python Version Not Found
+
+If Pipenv can't find the specified Python version:
+
+1. Check available Python versions:
+ ```bash
+ # If using pyenv
+ $ pyenv versions
+
+ # If using asdf
+ $ asdf list python
+ ```
+
+2. Install the required version:
+ ```bash
+ # With pyenv
+ $ pyenv install 3.10.4
+
+ # With asdf
+ $ asdf install python 3.10.4
+ ```
+
+3. Specify the Python version explicitly:
+ ```bash
+ $ pipenv --python 3.10
+ ```
+
+#### Issue: Pipenv Doesn't Respect pyenv's Python Versions
+
+Pipenv by default uses the Python it was installed against. To use your current pyenv interpreter:
+
+```bash
+$ pipenv --python $(pyenv which python)
+```
+
+### Locale and Encoding Issues
+
+#### Issue: ValueError: unknown locale: UTF-8
+
+This is a common issue on macOS due to a bug in locale detection:
+
+```bash
+# Add to your shell configuration file (~/.bashrc, ~/.zshrc, etc.)
+export LC_ALL=en_US.UTF-8
+export LANG=en_US.UTF-8
+```
+
+You can change both the `en_US` and `UTF-8` parts to match your preferred language and encoding.
+
+#### Issue: /bin/pip: No such file or directory
+
+This may be related to locale settings. Apply the same fix as above.
+
+### Lock File Issues
+
+#### Issue: Lock File Out of Date
+
+If your lock file is out of date:
+
+```bash
+$ pipenv lock
+```
+
+#### Issue: Exception During Locking
+
+If an exception occurs during locking:
+
+```bash
+$ pipenv lock --clear
+```
+
+This clears the cache and forces a fresh resolution of all dependencies.
+
+#### Issue: Hash Verification Failure
+
+If you encounter hash verification failures:
+
+1. Update your lock file:
+ ```bash
+ $ pipenv lock
+ ```
+
+2. If that doesn't work, try installing with:
+ ```bash
+ $ pipenv install --ignore-pipfile
+ ```
+
+3. If you're still having issues, check for network problems or proxy settings that might be interfering with downloads.
+
+### Virtual Environment Issues
+
+#### Issue: Virtual Environment Not Found
+
+If Pipenv can't find your virtual environment:
+
+1. Check if it exists:
+ ```bash
+ $ pipenv --venv
+ ```
+
+2. If it doesn't exist, create it:
+ ```bash
+ $ pipenv install
+ ```
+
+3. If you've moved or renamed your project, remove the old environment and create a new one:
+ ```bash
+ $ pipenv --rm
+ $ pipenv install
+ ```
+
+#### Issue: Shell Activation Problems
+
+If `pipenv shell` doesn't work correctly:
+
+1. Try compatibility mode (the default):
+ ```bash
+ $ pipenv shell
+ ```
+
+2. If that doesn't work, try fancy mode:
+ ```bash
+ $ pipenv shell --fancy
+ ```
+
+3. If neither works, use `pipenv run` instead:
+ ```bash
+ $ pipenv run python
+ ```
+
+### Package Index Issues
+
+#### Issue: Package Not Found
+
+If a package can't be found:
+
+1. Verify the package name is correct
+2. Check that the package exists on the specified index
+3. Ensure you have proper authentication for private repositories
+4. Try installing with verbose output:
+ ```bash
+ $ pipenv install package-name --verbose
+ ```
+
+#### Issue: Authentication Problems with Private Repositories
+
+If you're having authentication issues with private repositories:
+
+1. Check your credentials
+2. Ensure environment variables are properly set
+3. Verify URL encoding for special characters in credentials
+4. Test access to the repository outside of Pipenv
+
+## Advanced Troubleshooting
+
+### Debugging Dependency Resolution
+
+For complex dependency resolution issues:
+
+```bash
+$ PIPENV_RESOLVER_DEBUG=1 pipenv install
+```
+
+This shows detailed information about the dependency resolution process, including which packages are being considered and why certain versions are being selected or rejected.
+
+### Analyzing Lock File Changes
+
+To understand what changed in your lock file:
+
+```bash
+$ git diff Pipfile.lock
+```
+
+Look for:
+- Version changes
+- New or removed dependencies
+- Changes in hashes
+- Changes in markers or requirements
+
+### Inspecting the Virtual Environment
+
+To inspect the packages installed in your virtual environment:
+
+```bash
+# List all installed packages
+$ pipenv run pip list
+
+# Show details for a specific package
+$ pipenv run pip show package-name
+
+# Check for outdated packages
+$ pipenv update --outdated
+```
+
+### Checking for Conflicting Dependencies
+
+To identify conflicting dependencies:
+
+```bash
+# Show the dependency graph
+$ pipenv graph
+
+# Show reverse dependencies (what depends on a package)
+$ pipenv graph --reverse
+```
+
+Look for packages that appear multiple times with different version constraints.
+
+### Debugging Path and Environment Issues
+
+If you suspect path or environment issues:
+
+```bash
+# Show the Python interpreter path
+$ pipenv --py
+
+# Show environment variables
+$ pipenv --envs
+
+# Run a command with verbose output
+$ PIPENV_VERBOSE=1 pipenv run python -c "import sys; print(sys.path)"
+```
+
+## Preventive Measures
+
+### Regular Maintenance
+
+Perform regular maintenance to prevent issues:
+
+1. Keep Pipenv updated:
+ ```bash
+ $ pip install --user --upgrade pipenv
+ ```
+
+2. Regularly update dependencies:
+ ```bash
+ $ pipenv update
+ ```
+
+3. Scan for security vulnerabilities:
+ ```bash
+ $ pipenv scan
+ ```
+
+### Best Practices for Avoiding Issues
+
+1. **Use specific version constraints** for critical dependencies
+2. **Commit both Pipfile and Pipfile.lock** to version control
+3. **Use the `--deploy` flag** in production environments
+4. **Regularly clean unused packages**:
+ ```bash
+ $ pipenv clean
+ ```
+5. **Document your environment setup** in your project's README
+6. **Use a consistent Python version** across development and production
+7. **Set up CI/CD pipelines** to catch issues early
+
+## Creating Reproducible Bug Reports
+
+When reporting issues to the Pipenv maintainers:
+
+1. **Include the `--support` output**:
+ ```bash
+ $ pipenv --support
+ ```
+
+2. **Provide a minimal reproducible example**:
+ - Simplified Pipfile
+ - Steps to reproduce
+ - Expected vs. actual behavior
+
+3. **Include relevant logs**:
+ - Use `--verbose` or `PIPENV_DEBUG=1`
+ - Include complete error messages
+
+4. **Specify your environment**:
+ - Operating system and version
+ - Python version
+ - Pipenv version
+
+## Conclusion
+
+Diagnosing issues with Pipenv often involves understanding the underlying dependency resolution process, virtual environment management, and Python environment configuration. By using the diagnostic tools and following the troubleshooting steps in this guide, you can resolve most common Pipenv issues.
+
+Remember that Pipenv is a tool that combines pip, virtualenv, and Pipfile to simplify Python dependency management. Understanding how these components interact can help you diagnose and resolve issues more effectively.
+
+If you encounter persistent issues that aren't covered in this guide, consider reaching out to the Pipenv community through:
+- [GitHub Issues](https://github.com/pypa/pipenv/issues)
+- [PyPA Discussions](https://discuss.python.org/c/packaging/14)
+- [Stack Overflow](https://stackoverflow.com/questions/tagged/pipenv)
diff --git a/docs/docker.md b/docs/docker.md
new file mode 100644
index 0000000000..db22ce9b40
--- /dev/null
+++ b/docs/docker.md
@@ -0,0 +1,634 @@
+# Using Pipenv with Docker
+
+This guide provides comprehensive instructions for integrating Pipenv with Docker, including best practices, optimization techniques, and example configurations for different scenarios.
+
+## Docker and Pipenv: Core Concepts
+
+Docker containers provide isolated, reproducible environments for applications, while Pipenv manages Python dependencies. When used together, they create a powerful workflow for Python application deployment.
+
+### Why Use Pipenv with Docker?
+
+- **Dependency consistency**: Ensure the same packages are installed in development and production
+- **Reproducible builds**: Lock files guarantee identical environments across deployments
+- **Security**: Hash verification prevents supply chain attacks
+- **Simplified workflow**: Manage dependencies with a familiar tool inside containers
+
+## Basic Docker Integration
+
+### Simple Dockerfile Example
+
+Here's a basic Dockerfile that uses Pipenv:
+
+```dockerfile
+FROM python:3.10-slim
+
+# Install pipenv
+RUN pip install pipenv
+
+# Set working directory
+WORKDIR /app
+
+# Copy Pipfile and Pipfile.lock
+COPY Pipfile Pipfile.lock ./
+
+# Install dependencies
+RUN pipenv install --deploy --system
+
+# Copy application code
+COPY . .
+
+# Run the application
+CMD ["python", "app.py"]
+```
+
+This approach:
+1. Starts with a Python base image
+2. Installs Pipenv
+3. Copies dependency files
+4. Installs dependencies system-wide
+5. Copies application code
+6. Runs the application
+
+### Key Flags for Docker Environments
+
+- `--system`: Installs packages to the system Python instead of creating a virtual environment
+- `--deploy`: Ensures the Pipfile.lock is up-to-date and fails if it isn't
+- `--ignore-pipfile`: Uses only the lock file for installation, ignoring the Pipfile
+
+### System Installation vs. Virtual Environments in Docker
+
+Docker containers provide isolated environments, which raises the question: should you use `--system` to install packages globally, or create a virtual environment inside the container?
+
+**Using `--system` (Recommended for most Docker use cases)**
+
+- Simpler setup with no nested isolation
+- Smaller image size (no virtualenv overhead)
+- Packages are directly accessible without activation
+- Works well with `pipenv run` for executing scripts defined in Pipfile
+- Best for single-application containers following the "one process per container" principle
+
+**Using a Virtual Environment**
+
+- Provides an extra layer of isolation from system Python packages
+- Useful if your container runs multiple Python applications or system tools that depend on Python
+- Preferred when extending base images that have Python-based system utilities (e.g., `add-apt-repository` in Ubuntu)
+- Consider this approach if you use `apt-get install python3-*` packages alongside your application
+
+For most production containers that run a single Python application, `--system` is the simpler and more efficient choice. The concerns about breaking system Python tools (raised in older guidance) are less relevant when:
+- Your container runs only your application
+- You're using slim/minimal base images
+- You're not installing Python-based system packages via apt/yum
+
+## Optimized Docker Builds
+
+### Multi-Stage Builds
+
+Multi-stage builds create smaller, more secure images by separating the build environment from the runtime environment:
+
+```dockerfile
+FROM python:3.10-slim AS builder
+
+# Install pipenv
+RUN pip install pipenv
+
+# Set working directory
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Install dependencies
+RUN pipenv install --deploy --system
+
+FROM python:3.10-slim
+
+# Set working directory
+WORKDIR /app
+
+# Copy installed packages from builder stage
+COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
+COPY --from=builder /usr/local/bin /usr/local/bin
+
+# Copy application code
+COPY . .
+
+# Run as non-root user
+RUN useradd -m appuser
+USER appuser
+
+# Run the application
+CMD ["python", "app.py"]
+```
+
+This approach:
+1. Uses a builder stage to install dependencies
+2. Copies only the necessary files to the final image
+3. Runs the application as a non-root user
+4. Results in a smaller, more secure image
+
+### Layer Caching Optimization
+
+To take advantage of Docker's layer caching and speed up builds:
+
+```dockerfile
+FROM python:3.10-slim
+
+# Install pipenv
+RUN pip install pipenv
+
+# Set working directory
+WORKDIR /app
+
+# Copy dependency files only
+COPY Pipfile Pipfile.lock ./
+
+# Install dependencies
+RUN pipenv install --deploy --system
+
+# Copy application code (changes more frequently)
+COPY . .
+
+# Run the application
+CMD ["python", "app.py"]
+```
+
+This separates dependency installation from code copying, so dependencies are only reinstalled when Pipfile or Pipfile.lock change.
+
+## Development vs. Production Configurations
+
+### Development Dockerfile
+
+For development environments, you might want to include development dependencies:
+
+```dockerfile
+FROM python:3.10-slim
+
+# Install pipenv
+RUN pip install pipenv
+
+# Set working directory
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Install dependencies including development packages
+RUN pipenv install --dev --system
+
+# Copy application code
+COPY . .
+
+# Run the development server
+CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
+```
+
+### Production Dockerfile
+
+For production, focus on security and minimal image size:
+
+```dockerfile
+FROM python:3.10-slim AS builder
+
+# Install pipenv and dependencies
+RUN pip install pipenv
+
+# Set working directory
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Install only production dependencies
+RUN pipenv install --deploy --system
+
+FROM python:3.10-slim
+
+# Set working directory
+WORKDIR /app
+
+# Copy installed packages from builder stage
+COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
+COPY --from=builder /usr/local/bin /usr/local/bin
+
+# Copy application code
+COPY . .
+
+# Create and use non-root user
+RUN useradd -m appuser
+USER appuser
+
+# Set production environment variables
+ENV PYTHONUNBUFFERED=1 \
+ PYTHONDONTWRITEBYTECODE=1 \
+ PYTHONPATH=/app
+
+# Run the application with gunicorn (for web applications)
+CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:8000", "--workers", "4"]
+```
+
+## Docker Compose Integration
+
+### Basic Docker Compose Example
+
+```yaml
+version: '3.8'
+
+services:
+ web:
+ build: .
+ ports:
+ - "8000:8000"
+ volumes:
+ - .:/app
+ environment:
+ - DATABASE_URL=postgresql://postgres:postgres@db:5432/app
+ depends_on:
+ - db
+
+ db:
+ image: postgres:14
+ volumes:
+ - postgres_data:/var/lib/postgresql/data
+ environment:
+ - POSTGRES_PASSWORD=postgres
+ - POSTGRES_USER=postgres
+ - POSTGRES_DB=app
+
+volumes:
+ postgres_data:
+```
+
+### Development Environment with Hot Reload
+
+```yaml
+version: '3.8'
+
+services:
+ web:
+ build:
+ context: .
+ dockerfile: Dockerfile.dev
+ ports:
+ - "8000:8000"
+ volumes:
+ - .:/app
+ environment:
+ - DEBUG=True
+ - DATABASE_URL=postgresql://postgres:postgres@db:5432/app
+ depends_on:
+ - db
+ command: python manage.py runserver 0.0.0.0:8000
+
+ db:
+ image: postgres:14
+ volumes:
+ - postgres_data:/var/lib/postgresql/data
+ environment:
+ - POSTGRES_PASSWORD=postgres
+ - POSTGRES_USER=postgres
+ - POSTGRES_DB=app
+
+volumes:
+ postgres_data:
+```
+
+## Advanced Docker Techniques
+
+### Using Project-Local Virtual Environments
+
+For some workflows, you might want to use a project-local virtual environment:
+
+```dockerfile
+FROM python:3.10-slim
+
+# Install pipenv
+RUN pip install pipenv
+
+# Set working directory
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Create a project-local virtual environment
+ENV PIPENV_VENV_IN_PROJECT=1
+RUN pipenv install --deploy
+
+# Copy application code
+COPY . .
+
+# Run the application using the virtual environment
+CMD ["./.venv/bin/python", "app.py"]
+```
+
+### Handling Different Python Versions
+
+If your application requires a specific Python version:
+
+```dockerfile
+FROM python:3.10-slim
+
+# Install pipenv
+RUN pip install pipenv
+
+# Set working directory
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Install dependencies
+RUN pipenv install --deploy --system --python 3.10
+
+# Copy application code
+COPY . .
+
+# Run the application
+CMD ["python", "app.py"]
+```
+
+### Using Custom Package Indexes
+
+For private packages or custom indexes:
+
+```dockerfile
+FROM python:3.10-slim
+
+# Install pipenv
+RUN pip install pipenv
+
+# Set working directory
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Set environment variables for private repository authentication
+ARG PRIVATE_REPO_USERNAME
+ARG PRIVATE_REPO_PASSWORD
+ENV PIP_EXTRA_INDEX_URL=https://${PRIVATE_REPO_USERNAME}:${PRIVATE_REPO_PASSWORD}@private-repo.example.com/simple
+
+# Install dependencies
+RUN pipenv install --deploy --system
+
+# Copy application code
+COPY . .
+
+# Run the application
+CMD ["python", "app.py"]
+```
+
+## Security Best Practices
+
+### Running as Non-Root User
+
+Always run your application as a non-root user:
+
+```dockerfile
+FROM python:3.10-slim
+
+# Install pipenv and dependencies
+RUN pip install pipenv
+
+# Set working directory
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Install dependencies
+RUN pipenv install --deploy --system
+
+# Copy application code
+COPY . .
+
+# Create and use non-root user
+RUN useradd -m appuser && \
+ chown -R appuser:appuser /app
+USER appuser
+
+# Run the application
+CMD ["python", "app.py"]
+```
+
+### Handling Secrets Securely
+
+Use build arguments and environment variables for secrets:
+
+```dockerfile
+FROM python:3.10-slim
+
+# Install pipenv
+RUN pip install pipenv
+
+# Set working directory
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Use build arguments for secrets (only available during build)
+ARG API_KEY
+ENV API_KEY=${API_KEY}
+
+# Install dependencies
+RUN pipenv install --deploy --system
+
+# Copy application code
+COPY . .
+
+# Run the application
+CMD ["python", "app.py"]
+```
+
+Then build with:
+
+```bash
+$ docker build --build-arg API_KEY=your-secret-key -t your-image .
+```
+
+For runtime secrets, use environment variables or Docker secrets.
+
+### Scanning for Vulnerabilities
+
+Integrate security scanning into your Docker workflow:
+
+```dockerfile
+FROM python:3.10-slim AS builder
+
+# Install pipenv
+RUN pip install pipenv
+
+# Set working directory
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Install dependencies
+RUN pipenv install --deploy --system
+
+# Scan for vulnerabilities
+RUN pipenv scan
+
+FROM python:3.10-slim
+
+# Set working directory
+WORKDIR /app
+
+# Copy installed packages from builder stage
+COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
+COPY --from=builder /usr/local/bin /usr/local/bin
+
+# Copy application code
+COPY . .
+
+# Run the application
+CMD ["python", "app.py"]
+```
+
+## CI/CD Integration
+
+### GitHub Actions Example
+
+```yaml
+name: Build and Push Docker Image
+
+on:
+ push:
+ branches: [ main ]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v2
+
+ - name: Login to DockerHub
+ uses: docker/login-action@v2
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Build and push
+ uses: docker/build-push-action@v4
+ with:
+ context: .
+ push: true
+ tags: yourusername/yourapp:latest
+```
+
+### GitLab CI Example
+
+```yaml
+stages:
+ - build
+ - test
+ - deploy
+
+build:
+ stage: build
+ image: docker:20.10.16
+ services:
+ - docker:20.10.16-dind
+ script:
+ - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
+ - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
+
+test:
+ stage: test
+ image: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
+ script:
+ - python -m pytest
+
+deploy:
+ stage: deploy
+ image: docker:20.10.16
+ services:
+ - docker:20.10.16-dind
+ script:
+ - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
+ - docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest
+ - docker push $CI_REGISTRY_IMAGE:latest
+```
+
+## Troubleshooting
+
+### Common Issues and Solutions
+
+#### Permission Denied Errors
+
+If you encounter permission issues:
+
+```dockerfile
+# Add this to your Dockerfile
+RUN pip install --user pipenv
+ENV PATH="/root/.local/bin:${PATH}"
+```
+
+#### Package Installation Failures
+
+For packages with system dependencies:
+
+```dockerfile
+FROM python:3.10-slim
+
+# Install system dependencies
+RUN apt-get update && \
+ apt-get install -y --no-install-recommends \
+ build-essential \
+ libpq-dev \
+ && rm -rf /var/lib/apt/lists/*
+
+# Install pipenv
+RUN pip install pipenv
+
+# Continue with your Dockerfile...
+```
+
+#### Slow Builds
+
+To speed up builds:
+
+```dockerfile
+# Use a specific pip version
+RUN pip install --upgrade pip==22.2.2 pipenv==2022.8.5
+
+# Use pip cache
+ENV PIP_CACHE_DIR=/var/cache/pip
+
+# Install with multiple workers
+RUN pipenv install --deploy --system --extra-pip-args="--use-feature=fast-deps"
+```
+
+## Best Practices
+
+1. **Use multi-stage builds** to create smaller, more secure images
+
+2. **Separate dependency installation from code copying** to leverage Docker's layer caching
+
+3. **Run applications as non-root users** to improve security
+
+4. **Use `--deploy` flag** to ensure Pipfile.lock is up-to-date
+
+5. **Use `--system` for single-application containers** to install dependencies system-wide, or use a virtual environment if your container runs multiple Python applications
+
+6. **Include only necessary files** in your Docker image
+
+7. **Set appropriate environment variables** like `PYTHONUNBUFFERED=1` for better logging
+
+8. **Scan for vulnerabilities** as part of your build process
+
+9. **Use build arguments** for build-time configuration
+
+10. **Use environment variables or Docker secrets** for runtime configuration
+
+## Conclusion
+
+Integrating Pipenv with Docker creates a powerful workflow for Python application deployment. By following the best practices and examples in this guide, you can create efficient, secure, and reproducible Docker images for your Python applications.
+
+Remember that Docker and Pipenv are both tools that help with reproducibility and dependency management. When used together correctly, they complement each other and provide a robust solution for Python application deployment.
diff --git a/docs/faq.md b/docs/faq.md
new file mode 100644
index 0000000000..6b9a324292
--- /dev/null
+++ b/docs/faq.md
@@ -0,0 +1,441 @@
+# Frequently Asked Questions
+
+This document answers common questions about Pipenv, its usage, and how it compares to other tools.
+
+## General Questions
+
+### What is Pipenv?
+
+Pipenv is a Python dependency management tool that combines pip, virtualenv, and Pipfile into a single unified interface. It creates and manages virtual environments for your projects automatically, while also maintaining a `Pipfile` for package requirements and a `Pipfile.lock` for deterministic builds.
+
+### Why should I use Pipenv instead of pip?
+
+While pip is excellent for installing Python packages, Pipenv offers several advantages:
+
+1. **Automatic virtualenv management**: Creates and manages virtual environments for you
+2. **Dependency resolution**: Resolves dependencies and sub-dependencies
+3. **Lock file**: Generates a `Pipfile.lock` with exact versions and hashes for deterministic builds
+4. **Development vs. production dependencies**: Separates dev dependencies from production
+5. **Security features**: Checks for vulnerabilities and verifies hashes
+6. **Environment variable management**: Automatically loads `.env` files
+
+### How does Pipenv compare to Poetry?
+
+Both Pipenv and Poetry are modern Python dependency management tools, but they have different focuses:
+
+**Pipenv**:
+- Focuses on application development
+- Simpler, more straightforward approach
+- Officially recommended by Python Packaging Authority (PyPA)
+- Better integration with pip and virtualenv
+
+**Poetry**:
+- Focuses on both application and library development
+- Includes package building and publishing features
+- Has its own dependency resolver
+- More opinionated about project structure
+
+Choose Pipenv if you want a straightforward tool for application development that integrates well with the existing Python ecosystem. Choose Poetry if you're developing libraries or need its additional packaging features.
+
+### Is Pipenv still actively maintained?
+
+Yes, Pipenv is actively maintained by the Python Packaging Authority (PyPA) and a community of contributors. You can check the [GitHub repository](https://github.com/pypa/pipenv) for recent activity.
+
+## Installation and Setup
+
+### Why can't I find the `pipenv` command after installation?
+
+If you installed Pipenv with `pip install --user pipenv`, the executable might not be in your PATH. You need to add the user site-packages binary directory to your PATH:
+
+**On Linux/macOS**:
+```bash
+# Find the user base binary directory
+$ python -m site --user-base
+/home/username/.local
+
+# Add to PATH (add this to your ~/.bashrc or ~/.zshrc)
+$ export PATH="$HOME/.local/bin:$PATH"
+```
+
+**On Windows**:
+```powershell
+# Find the user site-packages directory
+> python -m site --user-site
+C:\Users\Username\AppData\Roaming\Python\Python39\site-packages
+
+# Add the Scripts directory to PATH (replace 'site-packages' with 'Scripts')
+# Add C:\Users\Username\AppData\Roaming\Python\Python39\Scripts to your PATH
+```
+
+### Should I install Pipenv globally or per user?
+
+It's recommended to install Pipenv per user with `pip install --user pipenv`. This avoids potential permission issues and conflicts with system packages.
+
+### Can I use Pipenv with multiple Python versions?
+
+Yes, you can specify which Python version to use when creating a virtual environment:
+
+```bash
+$ pipenv --python 3.9
+```
+
+You can also specify the Python version in your Pipfile:
+
+```toml
+[requires]
+python_version = "3.9"
+```
+
+## Usage
+
+### Where does Pipenv store virtual environments?
+
+By default, Pipenv stores virtual environments in a centralized location:
+
+- **On Linux/macOS**: `~/.local/share/virtualenvs/`
+- **On Windows**: `%USERPROFILE%\.virtualenvs\`
+
+The virtual environment name is derived from the project directory name and a hash of the full path.
+
+### How can I store the virtual environment in my project directory?
+
+Set the `PIPENV_VENV_IN_PROJECT` environment variable:
+
+```bash
+$ export PIPENV_VENV_IN_PROJECT=1
+$ pipenv install
+```
+
+This creates a `.venv` directory in your project.
+
+### How do I activate the virtual environment?
+
+```bash
+$ pipenv shell
+```
+
+This spawns a new shell with the virtual environment activated. You can exit this shell with `exit` or Ctrl+D.
+
+Alternatively, you can run commands in the virtual environment without activating it:
+
+```bash
+$ pipenv run python script.py
+```
+
+### What's the difference between `pipenv install` and `pipenv sync`?
+
+- `pipenv install`: Installs packages specified in the Pipfile, updates the Pipfile.lock if necessary, and installs the packages.
+- `pipenv sync`: Installs packages exactly as specified in the Pipfile.lock without updating it.
+
+Use `pipenv install` during development when you want to add or update packages. Use `pipenv sync` in production or CI/CD pipelines when you want to ensure exact package versions are installed.
+
+### What's the difference between `pipenv update` and `pipenv upgrade`?
+
+- `pipenv update`: Updates the lock file and installs the updated packages.
+- `pipenv upgrade`: Updates only the lock file without installing the packages.
+
+### How do I install development dependencies?
+
+```bash
+# Install a package as a development dependency
+$ pipenv install pytest --dev
+
+# Install all dependencies including development dependencies
+$ pipenv install --dev
+```
+
+### How do I generate a requirements.txt file?
+
+```bash
+$ pipenv requirements > requirements.txt
+```
+
+To include development dependencies:
+
+```bash
+$ pipenv requirements --dev > requirements.txt
+```
+
+## Pipfile and Pipfile.lock
+
+### What is the difference between Pipfile and Pipfile.lock?
+
+- **Pipfile**: A human-readable file that specifies your project's dependencies with version constraints. It's meant to be edited by humans.
+- **Pipfile.lock**: A machine-generated file that contains exact versions and hashes of all dependencies (including sub-dependencies). It ensures deterministic builds and should not be edited manually.
+
+### Should I commit both Pipfile and Pipfile.lock to version control?
+
+Yes, you should commit both files:
+
+- **Pipfile**: Contains your direct dependencies and version constraints
+- **Pipfile.lock**: Ensures everyone using your project gets the exact same dependencies
+
+### What does "Pipfile.lock out of date" mean?
+
+This message appears when your Pipfile has been modified since the last time Pipfile.lock was generated. Run `pipenv lock` to update the lock file.
+
+### Can I manually edit Pipfile.lock?
+
+No, you should never manually edit Pipfile.lock. It's a machine-generated file that contains precise information about your dependencies. Use Pipenv commands to modify it.
+
+## Dependency Management
+
+### How do I specify version constraints?
+
+Pipenv supports various version specifiers:
+
+```toml
+[packages]
+requests = "*" # Any version
+flask = "==2.0.1" # Exact version
+django = ">=3.2.0" # Minimum version
+numpy = ">=1.20.0,<2.0.0" # Version range
+pandas = "~=1.3.0" # Compatible release (>=1.3.0,<1.4.0)
+```
+
+### How do I install a package from a Git repository?
+
+```bash
+$ pipenv install -e git+https://github.com/requests/requests.git#egg=requests
+```
+
+Or in your Pipfile:
+
+```toml
+[packages]
+requests = {git = "https://github.com/requests/requests.git", ref = "master"}
+```
+
+### How do I install a local package in development mode?
+
+```bash
+$ pipenv install -e ./path/to/package
+```
+
+Or in your Pipfile:
+
+```toml
+[packages]
+my-package = {path = "./path/to/package", editable = true}
+```
+
+### How do I resolve dependency conflicts?
+
+If you encounter dependency conflicts:
+
+1. Use `pipenv graph` to visualize dependencies and identify conflicts
+2. Try relaxing version constraints in your Pipfile
+3. Use `pipenv lock --clear` to clear the cache and try again
+4. Consider using custom package categories to manage conflicting dependencies
+
+## Performance
+
+### Why is Pipenv slow?
+
+Dependency resolution can be computationally intensive, especially for projects with many dependencies. To improve performance:
+
+1. Use a local PyPI mirror or cache
+2. Skip lock file generation during development with `PIPENV_SKIP_LOCK=1`
+3. Use `pipenv sync` instead of `pipenv install` when you just need to install packages
+4. Optimize your Pipfile by removing unnecessary constraints
+
+### How can I speed up Pipenv operations?
+
+```bash
+# Skip lock file generation during development
+$ export PIPENV_SKIP_LOCK=1
+$ pipenv install package-name
+
+# Use a local PyPI mirror
+$ export PIPENV_PYPI_MIRROR=https://pypi.tuna.tsinghua.edu.cn/simple
+
+# Clear the cache if it's gotten large
+$ pipenv lock --clear
+```
+
+## Environment Variables and Configuration
+
+### How do I use .env files with Pipenv?
+
+Create a `.env` file in your project directory:
+
+```
+# .env
+DEBUG=True
+DATABASE_URL=sqlite:///dev.db
+```
+
+Pipenv automatically loads these variables when you use `pipenv shell` or `pipenv run`.
+
+### How do I configure Pipenv?
+
+Pipenv can be configured through environment variables. For example:
+
+```bash
+# Store virtualenvs in the project directory
+$ export PIPENV_VENV_IN_PROJECT=1
+
+# Skip lock file generation during development
+$ export PIPENV_SKIP_LOCK=1
+
+# Use a custom Pipfile location
+$ export PIPENV_PIPFILE=/path/to/Pipfile
+```
+
+See the [Configuration](configuration.md) page for a complete list of options.
+
+## Troubleshooting
+
+### Why can't Pipenv find my Pipfile?
+
+Pipenv looks for a Pipfile in the current directory and parent directories. Make sure you're in the correct directory or specify the Pipfile location:
+
+```bash
+$ export PIPENV_PIPFILE=/path/to/Pipfile
+```
+
+### How do I fix "No module named X" errors?
+
+This usually means the package isn't installed in your virtual environment. Try:
+
+```bash
+$ pipenv install X
+```
+
+If the package is already in your Pipfile, try:
+
+```bash
+$ pipenv update X
+```
+
+### How do I fix virtualenv creation failures?
+
+If virtualenv creation fails:
+
+1. Ensure you have permissions to write to the virtualenv directory
+2. Try creating the virtualenv in the project directory: `PIPENV_VENV_IN_PROJECT=1`
+3. Specify the Python version explicitly: `pipenv --python 3.9`
+4. Check for conflicting environment variables: `pipenv --support`
+
+### How do I completely reset my environment?
+
+To start fresh:
+
+```bash
+# Remove the virtual environment
+$ pipenv --rm
+
+# Clear the cache
+$ pipenv lock --clear
+
+# Create a new environment
+$ pipenv install
+```
+
+## Integration with Other Tools
+
+### How do I use Pipenv with Docker?
+
+In your Dockerfile:
+
+```dockerfile
+FROM python:3.9-slim
+
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Install pipenv and dependencies
+RUN pip install pipenv && \
+ pipenv install --system --deploy
+
+# Copy application code
+COPY . .
+
+# Run the application
+CMD ["python", "app.py"]
+```
+
+### How do I use Pipenv with VS Code?
+
+1. Find your virtualenv path:
+ ```bash
+ $ pipenv --venv
+ ```
+
+2. In VS Code, press Ctrl+Shift+P and select "Python: Select Interpreter"
+
+3. Choose "Enter interpreter path..." and paste the path to the Python executable in your virtualenv (add `/bin/python` on Linux/macOS or `\Scripts\python.exe` on Windows to the path)
+
+### How do I use Pipenv with PyCharm?
+
+1. Find your virtualenv path:
+ ```bash
+ $ pipenv --venv
+ ```
+
+2. In PyCharm, go to Settings β Project β Python Interpreter
+
+3. Click the gear icon β Add β Existing Environment
+
+4. Browse to the Python executable in your virtualenv
+
+### How do I use Pipenv in CI/CD pipelines?
+
+In your CI/CD configuration:
+
+```yaml
+# Example GitHub Actions workflow
+steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.9'
+ - name: Install pipenv
+ run: pip install pipenv
+ - name: Verify Pipfile.lock
+ run: pipenv verify
+ - name: Install dependencies
+ run: pipenv install --dev
+ - name: Run tests
+ run: pipenv run pytest
+```
+
+## Security
+
+### How does Pipenv help with security?
+
+Pipenv enhances security in several ways:
+
+1. **Hash verification**: Pipfile.lock includes hashes for all packages, which are verified during installation
+2. **Vulnerability scanning**: `pipenv scan` checks for known security vulnerabilities
+3. **Dependency pinning**: Exact versions in Pipfile.lock prevent unexpected updates
+4. **Encourages updates**: Makes it easy to keep dependencies up-to-date
+
+### How do I check for security vulnerabilities?
+
+```bash
+$ pipenv scan
+```
+
+This command checks your dependencies against the PyUp Safety database of known vulnerabilities.
+
+## Miscellaneous
+
+### Can I use Pipenv for library development?
+
+While Pipenv is primarily designed for application development, you can use it for library development. However, you'll still need to maintain a `setup.py` or `pyproject.toml` file for distribution.
+
+For library development, you might consider Poetry, which has better support for building and publishing packages.
+
+### How do I contribute to Pipenv?
+
+See the [Contributing Guide](dev/contributing.md) for information on how to contribute to Pipenv.
+
+### Where can I get help with Pipenv?
+
+- [Official Documentation](https://pipenv.pypa.io/)
+- [GitHub Issues](https://github.com/pypa/pipenv/issues)
+- [Stack Overflow](https://stackoverflow.com/questions/tagged/pipenv)
+- [Python Packaging User Guide](https://packaging.python.org/)
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 0000000000..b029f9ca07
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,123 @@
+# Pipenv: Python Development Workflow for Humans
+
+[](https://pypi.python.org/pypi/pipenv) [](https://pypi.python.org/pypi/pipenv) [](https://pypi.python.org/pypi/pipenv)
+
+## What is Pipenv?
+
+**Pipenv** is a Python virtualenv management tool that combines pip, virtualenv, and Pipfile into a single unified interface. It creates and manages virtual environments for your projects automatically, while also maintaining a `Pipfile` for package requirements and a `Pipfile.lock` for deterministic builds.
+
+*Linux, macOS, and Windows are all first-class citizens in Pipenv.*
+
+## Why Use Pipenv?
+
+Pipenv solves several critical problems in the Python development workflow:
+
+- **Simplified Dependency Management**: No need to use `pip` and `virtualenv` separatelyβthey work together seamlessly.
+- **Deterministic Builds**: The `Pipfile.lock` ensures that the exact same environment can be reproduced across different systems.
+- **Security First**: Package hashes are documented in the lock file and verified during installation, preventing supply chain attacks.
+- **Dependency Visibility**: Easily visualize your dependency graph with `pipenv graph`.
+- **Environment Isolation**: Each project gets its own isolated virtual environment, preventing dependency conflicts.
+- **Development Workflow Integration**: Support for local customizations with `.env` files and development vs. production dependencies.
+- **Latest Dependency Versions**: Encourages the use of up-to-date dependencies to minimize security vulnerabilities.
+
+## Key Features
+
+- **Deterministic Builds**: Generates and checks file hashes for locked dependencies.
+- **Python Version Management**: Automatically installs required Python version when `pyenv` or `asdf` is available.
+- **Project-Centric Workflow**: Automatically finds your project home by looking for a `Pipfile`.
+- **Automatic Environment Creation**: Creates a virtualenv in a standard location when one doesn't exist.
+- **Simplified Package Management**: Automatically adds/removes packages to a `Pipfile` when they are installed or uninstalled.
+- **Environment Variable Management**: Automatically loads `.env` files to support customization and overrides.
+- **Package Categories**: Support for organizing dependencies into different groups beyond just default and development packages.
+
+## Quick Start
+
+### Installation
+
+The recommended way to install pipenv on most platforms is to install from PyPI using `pip`:
+
+```bash
+$ pip install --user pipenv
+```
+
+For more detailed installation instructions, see the [Installing Pipenv](installation) chapter.
+
+### Basic Usage
+
+Create a new project:
+
+```bash
+$ mkdir my_project && cd my_project
+$ pipenv install
+```
+
+Install packages:
+
+```bash
+$ pipenv install requests
+```
+
+Create a Python file (e.g., `main.py`):
+
+```python
+import requests
+
+response = requests.get('https://httpbin.org/ip')
+print(f'Your IP is {response.json()["origin"]}')
+```
+
+Run your script:
+
+```bash
+$ pipenv run python main.py
+```
+
+Activate the virtual environment:
+
+```bash
+$ pipenv shell
+```
+
+## Pipenv Documentation
+
+```{toctree}
+---
+caption: Pipenv Documentation
+maxdepth: 2
+---
+installation
+quick_start
+faq
+migrating
+pipfile
+cli
+commands
+configuration
+virtualenv
+workflows
+best_practices
+security
+troubleshooting
+specifiers
+indexes
+credentials
+shell
+docker
+scripts
+pylock
+advanced
+diagnose
+changelog
+```
+
+## Contribution Guides
+
+```{toctree}
+---
+caption: Contributing to Pipenv
+maxdepth: 2
+---
+dev/contributing
+```
+
+β¨π°β¨
diff --git a/docs/index.rst b/docs/index.rst
deleted file mode 100644
index 329a2a3825..0000000000
--- a/docs/index.rst
+++ /dev/null
@@ -1,125 +0,0 @@
-.. pipenv documentation master file, created by
- sphinx-quickstart on Mon Jan 30 13:28:36 2017.
- You can adapt this file completely to your liking, but it should at least
- contain the root `toctree` directive.
-
-Pipenv: Python Dev Workflow for Humans
-======================================
-
-.. image:: https://img.shields.io/pypi/v/pipenv.svg
- :target: https://pypi.python.org/pypi/pipenv
-
-.. image:: https://img.shields.io/pypi/l/pipenv.svg
- :target: https://pypi.python.org/pypi/pipenv
-
-.. image:: https://img.shields.io/pypi/pyversions/pipenv.svg
- :target: https://pypi.python.org/pypi/pipenv
-
-.. image:: https://img.shields.io/badge/Say%20Thanks!-π¦-1EAEDB.svg
- :target: https://saythanks.io/to/kennethreitz
-
----------------
-
-**Pipenv** βΒ the officially recommended Python packaging tool from `Python.org `_, free (as in freedom).
-
-Pipenv is a tool that aims to bring the best of all packaging worlds (bundler, composer, npm, cargo, yarn, etc.) to the Python world. *Windows is a firstβclass citizen, in our world.*
-
-It automatically creates and manages a virtualenv for your projects, as well as adds/removes packages from your ``Pipfile`` as you install/uninstall packages. It also generates the everβimportant ``Pipfile.lock``, which is used to produce deterministic builds.
-
-
-.. raw:: html
-
-
-
-The problems that Pipenv seeks to solve are multi-faceted:
-
-- You no longer need to use ``pip`` and ``virtualenv`` separately. They work together.
-- Managing a ``requirements.txt`` file `can be problematic `_, so Pipenv uses the upcoming ``Pipfile`` and ``Pipfile.lock`` instead, which is superior for basic use cases.
-- Hashes are used everywhere, always. Security. Automatically expose security vulnerabilities.
-- Give you insight into your dependency graph (e.g. ``$ pipenv graph``).
-- Streamline development workflow by loading ``.env`` files.
-
-
-Install Pipenv Today!
----------------------
-
-::
-
- $ pip install pipenv
- β¨π°β¨
-
-If you have excellent taste, there's also a `fancy installation method `_.
-
-.. toctree::
- :maxdepth: 2
-
- install
-
-User Testimonials
------------------
-
-**Jannis Leidel**, former pip maintainerβ
- *Pipenv is the porcelain I always wanted to build for pip. It fits my brain and mostly replaces virtualenvwrapper and manual pip calls for me. Use it.*
-
-**Justin Myles Holmes**β
- *Pipenv is finally an abstraction meant to engage the mind instead of merely the filesystem.*
-
-**Isaac Sanders**β
- *Pipenv is literally the best thing about my day today. Thanks, Kenneth!*
-
-β€ Pipenv Features
------------------
-
-- Enables truly *deterministic builds*, while easily specifying *only what you want*.
-- Generates and checks file hashes for locked dependencies.
-- Automatically install required Pythons, if ``pyenv`` is available.
-- Automatically finds your project home, recursively, by looking for a ``Pipfile``.
-- Automatically generates a ``Pipfile``, if one doesn't exist.
-- Automatically creates a virtualenv in a standard location.
-- Automatically adds/removes packages to a ``Pipfile`` when they are un/installed.
-- Automatically loads ``.env`` files, if they exist.
-
-The main commands are ``install``, ``uninstall``, and ``lock``, which generates a ``Pipfile.lock``. These are intended to replace ``$ pip install`` usage, as well as manual virtualenv management (to activate a virtualenv, run ``$ pipenv shell``).
-
-Basic Concepts
-//////////////
-
-- A virtualenv will automatically be created, when one doesn't exist.
-- When no parameters are passed to ``install``, all packages ``[packages]`` specified will be installed.
-- To initialize a Python 3 virtual environment, run ``$ pipenv --three``.
-- To initialize a Python 2 virtual environment, run ``$ pipenv --two``.
-- Otherwise, whatever virtualenv defaults to will be the default.
-
-
-
-Other Commands
-//////////////
-
-- ``graph`` will show you a dependency graph, of your installed dependencies.
-- ``shell`` will spawn a shell with the virtualenv activated.
-- ``run`` will run a given command from the virtualenv, with any arguments forwarded (e.g. ``$ pipenv run python``).
-- ``check`` checks for security vulnerabilities and asserts that PEP 508 requirements are being met by the current environment.
-
-
-Further Documentation Guides
-----------------------------
-
-.. toctree::
- :maxdepth: 2
-
- basics
- advanced
-
-β€ Pipenv Usage
---------------
-
-.. click:: pipenv:cli
- :prog: pipenv
- :show-nested:
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
diff --git a/docs/indexes.md b/docs/indexes.md
new file mode 100644
index 0000000000..38deda3792
--- /dev/null
+++ b/docs/indexes.md
@@ -0,0 +1,314 @@
+# Package Indexes
+
+This guide explains how to work with Python package indexes in Pipenv, including using alternative indexes, private repositories, and security considerations.
+
+## Understanding Package Indexes
+
+A package index is a repository of Python packages that can be installed using pip or Pipenv. The default and most widely used index is the [Python Package Index (PyPI)](https://pypi.org), but you may need to use alternative or additional indexes in certain situations.
+
+## Configuring Package Sources
+
+### Default PyPI Source
+
+By default, Pipenv uses PyPI as the source for packages. This is defined in your `Pipfile`:
+
+```toml
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+```
+
+### Adding Additional Sources
+
+You can add additional package sources to your `Pipfile`:
+
+```toml
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[[source]]
+url = "https://custom-index.example.com/simple"
+verify_ssl = true
+name = "custom"
+```
+
+Each source must have:
+- A unique `name` identifier
+- A valid `url` pointing to a package repository
+- A `verify_ssl` setting (set to `false` only if absolutely necessary)
+
+## Index-Restricted Packages
+
+Starting with Pipenv version `2022.3.23`, all packages are mapped to a single package index for security reasons. This means that each package must be explicitly associated with a specific index.
+
+### Specifying Package Index
+
+To install a package from a specific index, you must match the name of the index:
+
+```toml
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[[source]]
+url = "https://download.pytorch.org/whl/cu113/"
+verify_ssl = true
+name = "pytorch"
+
+[packages]
+requests = "*" # From default PyPI index
+torch = {version = "*", index = "pytorch"} # From PyTorch index
+```
+
+### Installing from a Specific Index
+
+You can specify the index when installing a package:
+
+```bash
+$ pipenv install torch --index=pytorch
+```
+
+You can also specify the index by URL, and Pipenv will add it to the `Pipfile` with a generated name (or reuse an existing name if the URL already exists):
+
+```bash
+$ pipenv install torch --index=https://download.pytorch.org/whl/cu113/
+```
+
+```{note}
+In prior versions of Pipenv, you could use `--extra-index-urls` to search multiple indexes without specifying which package came from which index. This functionality was deprecated in favor of index-restricted packages for security reasons.
+```
+
+## Security Considerations
+
+### Dependency Confusion Attacks
+
+The index restriction feature was implemented to protect against dependency confusion attacks. This type of attack occurs when:
+
+1. A private package is hosted on a private index
+2. An attacker publishes a malicious package with the same name on a public index
+3. The package manager searches the public index before the private one
+4. The malicious package is installed instead of the legitimate private package
+
+By requiring explicit index specification for each package, Pipenv prevents this attack vector.
+
+### Using Private Indexes Securely
+
+When using private package repositories:
+
+1. Always use HTTPS URLs with SSL verification enabled
+2. Use environment variables for authentication credentials
+3. Explicitly specify which packages come from which index
+4. Consider using a private mirror of PyPI that includes both public and private packages
+
+## Using PyPI Mirrors
+
+If you need to use a mirror of PyPI (for example, due to network restrictions or performance reasons), you can use the `--pypi-mirror` option:
+
+```bash
+$ pipenv install --pypi-mirror https://mirrors.aliyun.com/pypi/simple/
+```
+
+This will replace the default PyPI URL with the specified mirror for that command.
+
+You can also set a default mirror using an environment variable:
+
+```bash
+$ export PIPENV_PYPI_MIRROR=https://mirrors.aliyun.com/pypi/simple/
+$ pipenv install requests
+```
+
+## Alternative Default Index
+
+If you want to use an alternative index as your default (instead of PyPI), simply omit PyPI from your sources:
+
+```toml
+[[source]]
+url = "https://custom-index.example.com/simple"
+verify_ssl = true
+name = "custom"
+```
+
+```{warning}
+When omitting PyPI, your alternative index must contain all the packages you need, including all dependencies. If a package or dependency is not available on your custom index, installation will fail.
+```
+
+## Working with Private Repositories
+
+### Basic Authentication
+
+For private repositories that require authentication, you can include credentials in the URL:
+
+```toml
+[[source]]
+url = "https://username:password@private-repo.example.com/simple"
+verify_ssl = true
+name = "private"
+```
+
+However, it's better to use environment variables for credentials:
+
+```toml
+[[source]]
+url = "https://${USERNAME}:${PASSWORD}@private-repo.example.com/simple"
+verify_ssl = true
+name = "private"
+```
+
+Set the environment variables before running Pipenv:
+
+```bash
+$ export USERNAME=myuser
+$ export PASSWORD=mypassword
+$ pipenv install
+```
+
+### Token Authentication
+
+For repositories that use token authentication:
+
+```toml
+[[source]]
+url = "https://${API_TOKEN}@private-repo.example.com/simple"
+verify_ssl = true
+name = "private"
+```
+
+### Self-Signed Certificates
+
+If your private repository uses a self-signed SSL certificate, you have two options:
+
+1. Add the certificate to your system's trusted certificates (recommended)
+2. Disable SSL verification (use with caution):
+
+```toml
+[[source]]
+url = "https://private-repo.example.com/simple"
+verify_ssl = false
+name = "private"
+```
+
+```{warning}
+Disabling SSL verification is a security risk and should only be done in controlled environments where you trust the network and the repository.
+```
+
+## Multi-Source Installation
+
+### The `install_search_all_sources` Option
+
+In some organizations, not everyone has access to all package sources. For these cases, Pipenv provides an option to search all configured sources when installing from a lock file:
+
+```toml
+[pipenv]
+install_search_all_sources = true
+```
+
+With this option enabled, `pipenv install` and `pipenv sync` will search all configured sources for packages, but only during installation. The lock file will still require each package to be resolved from a single index.
+
+```{note}
+This feature should be used with caution, as it bypasses some of the security benefits of index-restricted packages. Only use it when necessary and in trusted environments.
+```
+
+## Advanced Index Configuration
+
+### Specifying Index in Pipfile
+
+You can specify which packages come from which index directly in your `Pipfile`:
+
+```toml
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[[source]]
+url = "https://private-repo.example.com/simple"
+verify_ssl = true
+name = "private"
+
+[packages]
+requests = "*" # From PyPI
+private-package = {version = "*", index = "private"} # From private repo
+```
+
+### Using Multiple Private Repositories
+
+You can use multiple private repositories in the same project:
+
+```toml
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[[source]]
+url = "https://repo1.example.com/simple"
+verify_ssl = true
+name = "repo1"
+
+[[source]]
+url = "https://repo2.example.com/simple"
+verify_ssl = true
+name = "repo2"
+
+[packages]
+requests = "*" # From PyPI
+package1 = {version = "*", index = "repo1"} # From repo1
+package2 = {version = "*", index = "repo2"} # From repo2
+```
+
+## Troubleshooting
+
+### Package Not Found
+
+If a package can't be found:
+
+1. Verify the package name is correct
+2. Check that the package exists on the specified index
+3. Ensure you have proper authentication for private repositories
+4. Try installing with verbose output for more information:
+ ```bash
+ $ pipenv install package-name --verbose
+ ```
+
+### Authentication Issues
+
+If you're having authentication problems:
+
+1. Check that your credentials are correct
+2. Ensure environment variables are properly set
+3. Verify that your credentials have access to the repository
+4. Check for special characters in your credentials that might need URL encoding
+5. If using a system credential manager (e.g. Windows Credential Manager), set `PIPENV_KEYRING_PROVIDER=subprocess` to enable keyring-based credential lookup. See [Credentials](credentials.md) for details.
+
+### SSL Certificate Issues
+
+If you encounter SSL certificate errors:
+
+1. Update your CA certificates
+2. Verify the repository's SSL certificate is valid
+3. If using a self-signed certificate, add it to your trusted certificates
+4. Only as a last resort, consider disabling SSL verification
+
+## Best Practices
+
+1. **Use index restrictions** for all packages to prevent dependency confusion attacks
+
+2. **Use environment variables for credentials** instead of hardcoding them in your `Pipfile`
+
+3. **Always enable SSL verification** when possible
+
+4. **Specify explicit versions** for packages from private repositories to ensure reproducibility
+
+5. **Consider using a private PyPI mirror** that includes both public and private packages
+
+6. **Regularly audit your dependencies** and their sources for security vulnerabilities
+
+7. **Document your custom indexes** in your project's README or documentation
+
+## Conclusion
+
+Properly configuring package indexes in Pipenv is essential for security and reproducibility. By understanding how to work with multiple indexes and private repositories, you can safely manage dependencies while protecting your project from supply chain attacks.
diff --git a/docs/install.rst b/docs/install.rst
deleted file mode 100644
index 3bec89dd7f..0000000000
--- a/docs/install.rst
+++ /dev/null
@@ -1,253 +0,0 @@
-.. _virtualenvironments-ref:
-
-Pipenv & Virtual Environments
-=============================
-
-.. image:: https://farm3.staticflickr.com/2943/33485660921_dfc0494739_k_d.jpg
-
-This tutorial walks you through installing and using Python packages.
-
-It will show you how to install and use the necessary tools and make strong
-recommendations on best practices. Keep in mind that Python is used for a great
-many different purposes, and precisely how you want to manage your dependencies
-may change based on how you decide to publish your software. The guidance
-presented here is most directly applicable to the development and deployment of
-network services (including web applications), but is also very well suited to
-managing development and testing environments for any kind of project.
-
-.. Note:: This guide is written for Python 3, however, these instructions
- should work fine on Python 2.7βif you are still using it, for some reason.
-
-
-β€ Make sure you've got Python & pip
-------------------------------------
-
-Before you go any further, make sure you have Python and that it's available
-from your command line. You can check this by simply running:
-
-.. code-block:: bash
-
- $ python --version
-
-You should get some output like ``3.6.2``. If you do not have Python, please
-install the latest 3.x version from `python.org`_ or refer to the
-`Installing Python`_ section of *The Hitchhiker's Guide to Python*.
-
-.. Note:: If you're newcomer and you get an error like this:
-
- .. code-block:: python
-
- >>> python
- Traceback (most recent call last):
- File "", line 1, in
- NameError: name 'python' is not defined
-
- It's because this command is intended to be run in a *shell* (also called
- a *terminal* or *console*). See the Python for Beginners
- `getting started tutorial`_ for an introduction to using your operating
- system's shell and interacting with Python.
-
-Additionally, you'll need to make sure you have :ref:`pip` available. You can
-check this by running:
-
-.. code-block:: bash
-
- $ pip --version
- pip 9.0.1
-
-If you installed Python from source, with an installer from `python.org`_, or
-via `Homebrew`_ you should already have pip. If you're on Linux and installed
-using your OS package manager, you may have to `install pip `_ separately.
-
-.. _getting started tutorial: https://opentechschool.github.io/python-beginners/en/getting_started.html#what-is-python-exactly
-.. _python.org: https://python.org
-.. _Homebrew: https://brew.sh
-.. _Installing Python: http://docs.python-guide.org/en/latest/starting/installation/
-
-
-β€ Installing Pipenv
--------------------
-
-:ref:`Pipenv` is a dependency manager for Python projects. If you're familiar
-with Node.js' `npm`_ or Ruby's `bundler`_, it is similar in spirit to those
-tools. While :ref:`pip` can install Python packages, Pipenv is recommended as
-it's a higher-level tool that simplifies dependency management for common use
-cases.
-
-Use ``pip`` to install Pipenv:
-
-.. code-block:: python
-
- $ pip install --user pipenv
-
-
-
-.. Note:: This does a `user installation`_ to prevent breaking any system-wide
- packages. If ``pipenv`` isn't available in your shell after installation,
- you'll need to add the `user base`_'s binary directory to your ``PATH``.
-
- On Linux and macOS you can find the user base binary directory by running
- ``python -m site --user-base`` and adding ``bin`` to the end. For example,
- this will typically print ``~/.local`` (with ``~`` expanded to the
- absolute path to your home directory) so you'll need to add
- ``~/.local/bin`` to your ``PATH``. You can set your ``PATH`` permanently by
- `modifying ~/.profile`_.
-
- On Windows you can find the user base binary directory by running
- ``py -m site --user-site`` and replacing ``site-packages`` with
- ``Scripts``. For example, this could return
- ``C:\Users\Username\AppData\Roaming\Python36\site-packages`` so you would
- need to set your ``PATH`` to include
- ``C:\Users\Username\AppData\Roaming\Python36\Scripts``. You can set your
- user ``PATH`` permanently in the `Control Panel`_. You may need to log
- out for the ``PATH`` changes to take effect.
-
-.. _npm: https://www.npmjs.com/
-.. _bundler: http://bundler.io/
-.. _user base: https://docs.python.org/3/library/site.html#site.USER_BASE
-.. _user installation: https://pip.pypa.io/en/stable/user_guide/#user-installs
-.. _modifying ~/.profile: https://stackoverflow.com/a/14638025
-.. _Control Panel: https://msdn.microsoft.com/en-us/library/windows/desktop/bb776899(v=vs.85).aspx
-
-β€ Installing packages for your project
---------------------------------------
-
-Pipenv manages dependencies on a per-project basis. To install packages,
-change into your project's directory (or just an empty directory for this
-tutorial) and run:
-
-.. code-block:: bash
-
- $ cd myproject
- $ pipenv install requests
-
-Pipenv will install the excellent `Requests`_ library and create a ``Pipfile``
-for you in your project's directory. The :ref:`Pipfile` is used to track which
-dependencies your project needs in case you need to re-install them, such as
-when you share your project with others. You should get output similar to this
-(although the exact paths shown will vary):
-
-.. code-block:: text
-
- Creating a Pipfile for this project...
- Creating a virtualenv for this project...
- Using base prefix '/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6'
- New python executable in ~/.local/share/virtualenvs/tmp-agwWamBd/bin/python3.6
- Also creating executable in ~/.local/share/virtualenvs/tmp-agwWamBd/bin/python
- Installing setuptools, pip, wheel...done.
-
- Virtualenv location: ~/.local/share/virtualenvs/tmp-agwWamBd
- Installing requests...
- Collecting requests
- Using cached requests-2.18.4-py2.py3-none-any.whl
- Collecting idna<2.7,>=2.5 (from requests)
- Using cached idna-2.6-py2.py3-none-any.whl
- Collecting urllib3<1.23,>=1.21.1 (from requests)
- Using cached urllib3-1.22-py2.py3-none-any.whl
- Collecting chardet<3.1.0,>=3.0.2 (from requests)
- Using cached chardet-3.0.4-py2.py3-none-any.whl
- Collecting certifi>=2017.4.17 (from requests)
- Using cached certifi-2017.7.27.1-py2.py3-none-any.whl
- Installing collected packages: idna, urllib3, chardet, certifi, requests
- Successfully installed certifi-2017.7.27.1 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22
-
- Adding requests to Pipfile's [packages]...
- P.S. You have excellent taste! β¨ π° β¨
-
-.. _Requests: https://python-requests.org
-
-
-β€ Using installed packages
---------------------------
-
-Now that Requests is installed you can create a simple ``main.py`` file to
-use it:
-
-.. code-block:: python
-
- import requests
-
- response = requests.get('https://httpbin.org/ip')
-
- print('Your IP is {0}'.format(response.json()['origin']))
-
-Then you can run this script using ``pipenv run``:
-
-.. code-block:: bash
-
- $ pipenv run python main.py
-
-You should get output similar to this:
-
-.. code-block:: text
-
- Your IP is 8.8.8.8
-
-Using ``$ pipenv run`` ensures that your installed packages are available to
-your script. It's also possible to spawn a new shell that ensures all commands
-have access to your installed packages with ``$ pipenv shell``.
-
-
-β€ Next steps
-------------
-
-Congratulations, you now know how to install and use Python packages! β¨ π° β¨
-
-.. _proper_installation:
-
-β€ Fancy Installation of Pipenv
-==============================
-
-To install pipenv in a fancy way, we recommend using `pipsi `_.
-
-Pipsi is a powerful tool which allows you to install Python scripts into isolated virtual environments.
-
-To install pipsi, first run this::
-
- $ curl https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py | python
-
-Follow the instructions, you'll have to update your ``PATH``.
-
-Then, simply run::
-
- $ pipsi install pew
- $ pipsi install pipenv
-
-To upgrade pipenv at any time::
-
- $ pipsi upgrade pipenv
-
-
-This will install both ``pipenv`` and ``pew`` (one of our dependencies) in an isolated virtualenv, so it doesn't interfere with the rest of your Python installation!
-
-
-.. _pragmatic_installation:
-
-β€ Pragmatic Installation of Pipenv
-==================================
-
-If you have a working installation of pip, and maintain certain "toolchain" type Python modules as global utilities in your user enviornment, pip `user installs `_ allow for installation into your home directory. Note that due to interaction between dependencies, you should limit tools installed in this way to basic building blocks for a Python workflow like virtualenv, pipenv, tox, and similar software.
-
-To install::
-
- $ pip install --user pipenv
-
-For more information see the `user installs documentation `_, but to add the installed cli tools from a pip user install to your path, add the output of::
-
- $ python -c "import site; import os; print(os.path.join(site.USER_BASE, 'bin'))"
-
-To upgrade pipenv at any time::
-
- $ pip install --user --upgrade pipenv
-
-.. _crude_installation:
-
-β€ Crude Installation of Pipenv
-==============================
-
-If you don't even have pip installed, you can use this crude installation method, which will bootstrap your whole system::
-
- $ curl https://raw.githubusercontent.com/kennethreitz/pipenv/master/get-pipenv.py | python
-
-Congratulations, you now have pip and Pipenv installed!
-
diff --git a/docs/installation.md b/docs/installation.md
new file mode 100644
index 0000000000..dd07b3cfab
--- /dev/null
+++ b/docs/installation.md
@@ -0,0 +1,433 @@
+# Installing Pipenv
+
+This guide provides comprehensive instructions for installing Pipenv on various platforms and environments. Follow the approach that best suits your system and requirements.
+
+## Prerequisites
+
+Before installing Pipenv, ensure you have Python and pip available on your system.
+
+### Verifying Python Installation
+
+Check that Python is installed and available from your command line:
+
+```bash
+$ python --version
+Python 3.10.4
+```
+
+You should see output showing your Python version. If you don't have Python installed, download and install the latest version from [python.org](https://python.org).
+
+### Verifying pip Installation
+
+Ensure pip is available:
+
+```bash
+$ pip --version
+pip 22.1.2
+```
+
+If pip is not installed, you can install it following the [pip installation guide](https://pip.pypa.io/en/stable/installation/).
+
+## Installing on Windows
+
+Windows is a first-class platform for Pipenv. The recommended installation method on
+Windows is **pipx**, which installs Pipenv in an isolated environment and makes the
+`pipenv` command available system-wide.
+
+### Recommended: pipx (Windows)
+
+1. **Install pipx** (requires Python 3.7+):
+ ```powershell
+ > python -m pip install --user pipx
+ > python -m pipx ensurepath
+ ```
+ Close and reopen your terminal so the updated `PATH` takes effect.
+
+2. **Install Pipenv via pipx:**
+ ```powershell
+ > pipx install pipenv
+ ```
+
+3. **Verify the installation:**
+ ```powershell
+ > pipenv --version
+ ```
+
+### Alternative: pip install (Windows)
+
+If you prefer not to use pipx, you can install Pipenv with pip:
+
+```powershell
+> pip install pipenv
+```
+
+If the `pipenv` command is not found afterwards, add the Python Scripts directory to
+your `PATH`:
+
+1. Find the Scripts directory:
+ ```powershell
+ > python -m site --user-site
+ C:\Users\Username\AppData\Roaming\Python\Python311\site-packages
+ ```
+2. Replace `site-packages` with `Scripts` in that path.
+3. Add it to your `PATH` via **System β Advanced system settings β Environment Variables**.
+
+```{note}
+Unlike Linux and macOS, `pip install --user` on Windows places the `pipenv` executable
+under `%APPDATA%\Python\PythonXY\Scripts\`. Make sure this directory is on your `PATH`
+or use pipx to avoid this manual step entirely.
+```
+
+## Installation Methods
+
+### Recommended: Isolated Virtual Environment Installation
+
+Modern Python installations (Python 3.11+ on recent Linux distributions like Ubuntu 24.04, Fedora 38+) enforce [PEP 668](https://peps.python.org/pep-0668/), which prevents installing packages with `pip install --user`. The recommended approach is to install Pipenv in its own isolated virtual environment.
+
+#### Option 1: Dedicated Pipenv Virtual Environment (Recommended)
+
+Create a dedicated virtual environment for pipenv that auto-activates in your shell:
+
+```bash
+# Create a dedicated venv for pipenv
+$ python3 -m venv ~/.pipenv-venv
+
+# Install pipenv in this venv
+$ ~/.pipenv-venv/bin/pip install pipenv
+
+# Add to your shell configuration (~/.bashrc, ~/.zshrc, or ~/.profile)
+$ echo 'export PIPENV_IGNORE_VIRTUALENVS=1' >> ~/.bashrc
+$ echo 'export PATH="$HOME/.pipenv-venv/bin:$PATH"' >> ~/.bashrc
+
+# Reload your shell
+$ source ~/.bashrc
+```
+
+The `PIPENV_IGNORE_VIRTUALENVS=1` setting ensures pipenv still creates and manages separate virtual environments for your projects.
+
+#### Option 2: Per-Project Bootstrap
+
+For CI/CD or when you want pipenv isolated per-project:
+
+```bash
+$ python3 -m venv .venv
+$ source .venv/bin/activate # On Windows: .venv\Scripts\activate
+$ pip install pipenv
+$ pipenv install
+```
+
+### Legacy: User Installation
+
+On older systems that don't enforce PEP 668, you can still use user installation:
+
+```bash
+$ pip install --user pipenv
+```
+
+```{warning}
+This method no longer works on modern Linux distributions (Ubuntu 24.04+, Fedora 38+) due to PEP 668. Use the isolated virtual environment approach above instead.
+```
+
+### Adding Pipenv to PATH
+
+If you used the legacy `--user` installation, you may need to add the user site-packages binary directory to your PATH.
+
+#### On Linux and macOS
+
+Find the user base binary directory:
+
+```bash
+$ python -m site --user-base
+/home/username/.local
+```
+
+Add the `bin` directory to your PATH by adding this line to your shell configuration file (e.g., `~/.bashrc`, `~/.zshrc`, or `~/.profile`):
+
+```bash
+export PATH="$HOME/.local/bin:$PATH"
+```
+
+Then reload your shell configuration:
+
+```bash
+$ source ~/.bashrc # or ~/.zshrc, ~/.profile, etc.
+```
+
+#### On Windows
+
+Find the user site-packages directory:
+
+```powershell
+> python -m site --user-site
+C:\Users\Username\AppData\Roaming\Python\Python310\site-packages
+```
+
+Replace `site-packages` with `Scripts` in the path, and add it to your PATH environment variable:
+
+1. Press `Win + X` and select "System"
+2. Click "Advanced system settings"
+3. Click "Environment Variables"
+4. Under "User variables", select "Path" and click "Edit"
+5. Add the path (e.g., `C:\Users\Username\AppData\Roaming\Python\Python310\Scripts`)
+6. Click "OK" to save changes
+
+You may need to restart your terminal or computer for the PATH changes to take effect.
+
+### Alternative: System-Wide Installation
+
+If you have administrator privileges and want to install Pipenv system-wide:
+
+```bash
+# On Linux/macOS
+$ sudo pip install pipenv
+
+# On Windows (in an Administrator command prompt)
+> pip install pipenv
+```
+
+```{warning}
+System-wide installation is not recommended for most users as it can lead to conflicts with your system package manager.
+```
+
+### Using Package Managers
+
+#### macOS with Homebrew
+
+```bash
+$ brew install pipenv
+```
+
+```{note}
+Homebrew installation is discouraged because it works better to install pipenv using pip on macOS.
+```
+
+#### Debian/Ubuntu
+
+```bash
+$ sudo apt update
+$ sudo apt install pipenv
+```
+
+#### FreeBSD
+
+```bash
+$ pkg install py39-pipenv
+```
+
+#### Gentoo
+
+```bash
+$ sudo emerge pipenv
+```
+
+#### Void Linux
+
+```bash
+$ sudo xbps-install -S python3-pipenv
+```
+
+### Using pipx
+
+[pipx](https://pypa.github.io/pipx/) is a tool to install and run Python applications in isolated environments:
+
+```bash
+# Install pipx
+$ pip install --user pipx
+$ python -m pipx ensurepath
+
+# Install Pipenv using pipx
+$ pipx install pipenv
+```
+
+This is a good alternative to the `--user` installation method, especially if you use multiple Python command-line tools.
+
+### Using Python Module
+
+You can also run Pipenv as a Python module:
+
+```bash
+$ python -m pip install pipenv
+$ python -m pipenv
+```
+
+This approach is useful when you have multiple Python versions installed and want to ensure you're using a specific one.
+
+## Verifying Installation
+
+After installation, verify that Pipenv is working correctly:
+
+```bash
+$ pipenv --version
+pipenv, version 2022.5.2
+```
+
+If you see the version number, Pipenv is installed correctly.
+
+## Upgrading Pipenv
+
+To upgrade an existing Pipenv installation:
+
+```bash
+# User installation
+$ pip install --user --upgrade pipenv
+
+# System-wide installation
+$ sudo pip install --upgrade pipenv
+
+# Homebrew
+$ brew upgrade pipenv
+
+# pipx
+$ pipx upgrade pipenv
+```
+
+## Installing Specific Versions
+
+If you need a specific version of Pipenv:
+
+```bash
+$ pip install --user pipenv==2022.1.8
+```
+
+## Installation in Virtual Environments
+
+You can install Pipenv inside a virtual environment, although this is less common:
+
+```bash
+$ python -m venv pipenv-venv
+$ source pipenv-venv/bin/activate # On Windows: pipenv-venv\Scripts\activate
+(pipenv-venv) $ pip install pipenv
+```
+
+## Docker Installation
+
+For Docker environments, you can install Pipenv in your Dockerfile:
+
+```dockerfile
+FROM python:3.10-slim
+
+# Install pipenv
+RUN pip install pipenv
+
+# Set working directory
+WORKDIR /app
+
+# Copy Pipfile and Pipfile.lock
+COPY Pipfile Pipfile.lock ./
+
+# Install dependencies
+RUN pipenv install --system --deploy
+
+# Copy application code
+COPY . .
+
+# Run the application
+CMD ["python", "app.py"]
+```
+
+## CI/CD Installation
+
+For continuous integration environments:
+
+```yaml
+# GitHub Actions example
+name: Python CI
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up Python
+ uses: actions/setup-python@v4
+ with:
+ python-version: '3.10'
+ - name: Install pipenv
+ run: |
+ python -m pip install --upgrade pip
+ pip install pipenv
+ - name: Install dependencies
+ run: |
+ pipenv install --dev
+ - name: Run tests
+ run: |
+ pipenv run pytest
+```
+
+## Troubleshooting
+
+### Command Not Found
+
+If you get a "command not found" error after installation:
+
+1. Check if Pipenv is installed in your user site-packages:
+ ```bash
+ $ python -m pipenv --version
+ ```
+
+2. If that works, add the user site-packages bin directory to your PATH as described above.
+
+3. Try restarting your terminal or computer.
+
+### Permission Errors
+
+If you encounter permission errors during installation:
+
+1. Use the `--user` flag to install in your home directory:
+ ```bash
+ $ pip install --user pipenv
+ ```
+
+2. If using sudo, ensure you're using it correctly:
+ ```bash
+ $ sudo pip install pipenv
+ ```
+
+3. Check file permissions in your installation directories.
+
+### Python Version Compatibility
+
+Pipenv requires Python 3.7 or newer. If you're using an older version, you'll need to upgrade Python first.
+
+### pip Not Found
+
+If pip is not found:
+
+1. Install pip:
+ ```bash
+ # Download get-pip.py
+ $ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
+
+ # Install pip
+ $ python get-pip.py --user
+ ```
+
+2. Ensure pip is in your PATH.
+
+## Best Practices
+
+1. **Use isolated virtual environment installation** on modern systems to avoid PEP 668 restrictions.
+
+2. **Keep Pipenv updated** to benefit from the latest features and bug fixes.
+
+3. **Set `PIPENV_IGNORE_VIRTUALENVS=1`** if you install pipenv in a dedicated venv, so it still manages project-specific environments.
+
+4. **Add Pipenv to your project's development setup instructions** to ensure all developers use the same environment.
+
+5. **Use version control** for your `Pipfile` and `Pipfile.lock` to ensure consistent environments across your team.
+
+## Next Steps
+
+Now that you have Pipenv installed, you can:
+
+1. Create a new project: `pipenv --python 3.10`
+2. Install packages: `pipenv install requests`
+3. Activate the environment:
+ - Spawn a subshell: `pipenv shell`
+ - Or activate in current shell: `eval $(pipenv activate)`
+4. Run commands: `pipenv run python script.py`
+
+For more detailed usage instructions, see the [Quick Start Guide](quick_start.md) and [Commands Reference](commands.md).
diff --git a/docs/locking.md b/docs/locking.md
new file mode 100644
index 0000000000..6fbea3c454
--- /dev/null
+++ b/docs/locking.md
@@ -0,0 +1,391 @@
+# Locking Dependencies
+
+Dependency locking is a critical feature of Pipenv that ensures consistent, reproducible environments across development, testing, and production systems. This guide explains how Pipenv's locking mechanism works and how to use it effectively.
+
+## Understanding Dependency Locking
+
+### What is a Lock File?
+
+The `Pipfile.lock` is a JSON file that contains:
+
+1. **Exact versions** of all direct and transitive dependencies
+2. **Cryptographic hashes** for each package to verify integrity
+3. **Metadata** about the environment and sources
+4. **Dependency markers** for platform-specific packages
+
+This ensures that everyone using your project gets exactly the same dependencies, preventing "works on my machine" problems.
+
+### Why Use Lock Files?
+
+- **Deterministic builds**: Ensures the same packages are installed every time
+- **Security**: Verifies package integrity through hash checking
+- **Dependency resolution**: Captures the complete dependency graph, including sub-dependencies
+- **Reproducibility**: Makes it easy to recreate the exact environment on any system
+
+## Creating and Updating Lock Files
+
+### Generating a Lock File
+
+Pipenv automatically creates a `Pipfile.lock` file when you install packages:
+
+```bash
+$ pipenv install requests
+```
+
+To explicitly generate or update the entire lock file based on your current `Pipfile`:
+
+```bash
+$ pipenv lock
+```
+
+This command:
+1. Resolves all dependencies specified in your `Pipfile`
+2. Determines compatible versions for all packages
+3. Calculates hashes for each package
+4. Writes the complete dependency graph to `Pipfile.lock`
+
+### Updating Specific Dependencies
+
+To update a specific package in your lock file:
+
+```bash
+$ pipenv upgrade requests
+```
+
+This updates only the specified package and its dependencies in the lock file without installing them.
+
+To update and install the package:
+
+```bash
+$ pipenv update requests
+```
+
+### Viewing the Current Lock Status
+
+To see the currently locked dependencies:
+
+```bash
+$ pipenv graph
+```
+
+Example output:
+
+```
+requests==2.28.1
+ - certifi [required: >=2017.4.17, installed: 2022.6.15]
+ - charset-normalizer [required: >=2.0.0,<2.1.0, installed: 2.0.12]
+ - idna [required: >=2.5,<4, installed: 3.3]
+ - urllib3 [required: >=1.21.1,<1.27, installed: 1.26.10]
+```
+
+## Installing from Lock Files
+
+### Basic Installation
+
+To install all dependencies exactly as specified in the lock file:
+
+```bash
+$ pipenv sync
+```
+
+This command installs the exact versions from `Pipfile.lock` without updating the lock file.
+
+### Development vs. Production
+
+For development environments, including development dependencies:
+
+```bash
+$ pipenv sync --dev
+```
+
+For production environments, using only production dependencies:
+
+```bash
+$ pipenv sync
+```
+
+### Deployment Scenarios
+
+In deployment or CI/CD pipelines, use the `--deploy` flag to ensure the lock file is up-to-date:
+
+```bash
+$ pipenv install --deploy
+```
+
+This will fail if the `Pipfile.lock` is out of date or doesn't exist, preventing accidental use of incorrect dependencies.
+
+## Lock File Verification
+
+### Verifying Lock File Integrity
+
+To verify that your lock file is up-to-date with your `Pipfile`:
+
+```bash
+$ pipenv verify
+```
+
+This is useful in CI/CD pipelines to ensure the lock file has been properly updated after changes to the `Pipfile`.
+
+### Handling Hash Verification Failures
+
+If you encounter hash verification failures:
+
+```bash
+$ pipenv install --ignore-pipfile
+```
+
+This forces Pipenv to use the lock file and ignore the `Pipfile`, which can help diagnose whether the issue is with the lock file or the `Pipfile`.
+
+## Advanced Locking Features
+
+### Locking with Pre-release Versions
+
+To include pre-release versions in your lock file:
+
+```bash
+$ pipenv lock --pre
+```
+
+### Locking for Specific Python Versions
+
+To generate a lock file for a specific Python version:
+
+```bash
+$ pipenv lock --python 3.9
+```
+
+### Locking Specific Package Categories
+
+To lock only specific package categories:
+
+```bash
+$ pipenv lock --categories="docs,tests"
+```
+
+### Clearing the Cache
+
+If you encounter issues with dependency resolution:
+
+```bash
+$ pipenv lock --clear
+```
+
+This clears Pipenv's cache and forces a fresh resolution of all dependencies.
+
+## Lock File Structure
+
+The `Pipfile.lock` is a JSON file with the following structure:
+
+```json
+{
+ "_meta": {
+ "hash": {
+ "sha256": ""
+ },
+ "pipfile-spec": 6,
+ "requires": {
+ "python_version": "3.9"
+ },
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "requests": {
+ "hashes": [
+ "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b",
+ "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"
+ ],
+ "index": "pypi",
+ "version": "==2.28.1"
+ },
+ "urllib3": {
+ "hashes": [
+ "sha256:8298d6d56d39be0e3bc13c1c97d133f9b45d797169a0e7e64a9e85268445e93b",
+ "sha256:879ba4d1e89654d9769ce13121e0f94310ea32e8d2f8cf587b77c08bbcdb30d6"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
+ "version": "==1.26.10"
+ }
+ },
+ "develop": {
+ "pytest": {
+ "hashes": [
+ "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c",
+ "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"
+ ],
+ "index": "pypi",
+ "version": "==7.1.2"
+ }
+ }
+}
+```
+
+Key sections:
+- `_meta`: Contains metadata about the lock file
+- `default`: Production dependencies
+- `develop`: Development dependencies
+- Custom categories: Any additional package categories you've defined
+
+## Multi-Platform Considerations
+
+### Platform-Specific Lock Files
+
+`Pipfile.lock` is generated based on the **current platform** where `pipenv lock` is run.
+This means:
+
+- Package hashes included in the lock file are only those for wheels/sdists compatible
+ with the platform and Python version used during locking.
+- If your team develops on macOS but deploys to Linux, the lock file generated on macOS
+ may include different hashes than one generated on Linux (especially for packages with
+ platform-specific binary wheels).
+
+This is expected behavior, but it is important to be aware of when working across multiple
+platforms or operating systems.
+
+### Working Across Multiple Platforms
+
+If your project runs on multiple platforms (e.g., developers on Windows/macOS and
+production on Linux), consider these strategies:
+
+**Option 1: Lock on the target platform**
+
+Generate the `Pipfile.lock` on the same platform (or a Docker container matching it) as
+your production environment:
+
+```bash
+# Lock inside a Linux container
+$ docker run --rm -v $(pwd):/app -w /app python:3.11-slim \
+ sh -c "pip install pipenv && pipenv lock"
+```
+
+**Option 2: Use `PIPENV_VENV_IN_PROJECT` with CI/CD**
+
+Generate the lock file in CI on your target platform and commit it to version control,
+ensuring all developers install with `pipenv sync` instead of re-locking locally.
+
+**Option 3: Use `--extra-pip-args` for cross-platform wheels**
+
+For packages that need specific platform wheels, you can use pip's `--platform` flag
+during installation (but not during locking):
+
+```bash
+$ pipenv install --extra-pip-args="--platform=manylinux2014_x86_64 --only-binary=:all:"
+```
+
+```{note}
+Native cross-platform lock file generation (a single `Pipfile.lock` with hashes for
+all target platforms) is not currently supported by Pipenv. This is a known limitation.
+If this is a hard requirement, consider generating separate lock files per platform in
+CI and selecting the appropriate one at deploy time.
+```
+
+## Best Practices
+
+### Version Control
+
+Always commit both `Pipfile` and `Pipfile.lock` to version control. The lock file ensures that everyone on your team and your deployment pipeline uses the exact same dependencies.
+
+### Regular Updates
+
+Regularly update your dependencies to get security fixes and improvements:
+
+```bash
+# Check for outdated packages
+$ pipenv update --outdated
+
+# Update all packages
+$ pipenv update
+```
+
+### Lock File Review
+
+When updating dependencies, review the changes in the lock file to understand the impact:
+
+```bash
+# After updating, check what changed
+$ git diff Pipfile.lock
+```
+
+### CI/CD Integration
+
+In your CI/CD pipeline:
+
+```bash
+# Verify the lock file is up-to-date
+$ pipenv verify
+
+# Install dependencies from the lock file
+$ pipenv sync
+```
+
+### Handling Conflicts
+
+If you encounter dependency conflicts:
+
+1. Use `pipenv graph` to visualize dependencies and identify conflicts
+2. Try relaxing version constraints in your `Pipfile`
+3. Use `pipenv lock --clear` to clear the cache and try again
+4. Consider using custom package categories to manage conflicting dependencies
+
+## Troubleshooting
+
+### Common Issues
+
+#### Lock File Out of Date
+
+If you see "Pipfile.lock out of date":
+
+```bash
+$ pipenv lock
+```
+
+#### Dependency Resolution Failures
+
+If Pipenv can't resolve dependencies:
+
+```bash
+# Try with verbose output
+$ pipenv lock --verbose
+
+# Clear the cache and try again
+$ pipenv lock --clear
+```
+
+#### Hash Mismatch Errors
+
+If you encounter hash verification failures:
+
+```bash
+# Regenerate the lock file
+$ pipenv lock
+
+# Or force installation from the lock file
+$ pipenv install --ignore-pipfile
+```
+
+### Helpful Commands
+
+#### Passing Additional Arguments to pip
+
+You can supply additional arguments to pip during locking:
+
+```bash
+$ pipenv lock --extra-pip-args="--use-feature=truststore --proxy=127.0.0.1"
+```
+
+#### Debugging Lock Issues
+
+For detailed debugging information:
+
+```bash
+$ PIPENV_VERBOSE=1 pipenv lock
+```
+
+## Conclusion
+
+Locking dependencies with Pipenv is a powerful way to ensure consistent, reproducible environments. By understanding and using Pipenv's locking mechanism effectively, you can avoid many common dependency management issues and ensure your projects run reliably across different environments.
diff --git a/docs/migrating.md b/docs/migrating.md
new file mode 100644
index 0000000000..e0ccc27617
--- /dev/null
+++ b/docs/migrating.md
@@ -0,0 +1,431 @@
+# Migrating to Pipenv
+
+This guide provides step-by-step instructions for migrating to Pipenv from other Python dependency management tools. Whether you're coming from requirements.txt, pip, conda, or other tools, this guide will help you transition smoothly.
+
+## Migrating from requirements.txt
+
+The `requirements.txt` file is a common way to specify Python dependencies. Pipenv provides a straightforward path to migrate from requirements.txt.
+
+### Basic Migration
+
+1. Navigate to your project directory:
+ ```bash
+ $ cd your-project
+ ```
+
+2. Import your requirements.txt file:
+ ```bash
+ $ pipenv install -r requirements.txt
+ ```
+
+ This command:
+ - Creates a new virtual environment if one doesn't exist
+ - Creates a Pipfile with your dependencies
+ - Installs all packages from requirements.txt
+
+3. Verify the generated Pipfile:
+ ```bash
+ $ cat Pipfile
+ ```
+
+4. Generate a lock file:
+ ```bash
+ $ pipenv lock
+ ```
+
+5. Test that everything works:
+ ```bash
+ $ pipenv run python your_script.py
+ ```
+
+### Handling Development Dependencies
+
+If you have separate requirements files for development and production:
+
+1. Import production dependencies:
+ ```bash
+ $ pipenv install -r requirements.txt
+ ```
+
+2. Import development dependencies:
+ ```bash
+ $ pipenv install -r dev-requirements.txt --dev
+ ```
+
+### Handling Complex Requirements Files
+
+For requirements files with complex constraints or comments:
+
+1. Import the basic requirements:
+ ```bash
+ $ pipenv install -r requirements.txt
+ ```
+
+2. Review the Pipfile and adjust as needed:
+ - Remove unnecessary constraints
+ - Add missing constraints
+ - Organize dependencies logically
+
+3. For packages with complex installation options, you may need to add them manually:
+ ```bash
+ $ pipenv install package-name
+ ```
+
+4. Regenerate the lock file:
+ ```bash
+ $ pipenv lock
+ ```
+
+### Example: Converting a Django Project
+
+```bash
+# Start with a Django project using requirements.txt
+$ cd django-project
+
+# Import production requirements
+$ pipenv install -r requirements.txt
+
+# Import development requirements
+$ pipenv install -r requirements-dev.txt --dev
+
+# Review and adjust the Pipfile
+$ nano Pipfile
+
+# Generate the lock file
+$ pipenv lock
+
+# Test that Django works
+$ pipenv run python manage.py runserver
+```
+
+## Migrating from pip
+
+If you've been using pip directly without requirements.txt files, you'll need to identify your dependencies first.
+
+### Identifying Current Dependencies
+
+1. List installed packages:
+ ```bash
+ $ pip freeze > requirements.txt
+ ```
+
+2. Review the requirements.txt file and remove packages that aren't direct dependencies of your project.
+
+3. Follow the steps in the "Migrating from requirements.txt" section above.
+
+### Alternative Approach: Fresh Start
+
+If your environment has many packages and it's hard to identify direct dependencies:
+
+1. Create a new Pipenv environment:
+ ```bash
+ $ mkdir temp-project
+ $ cd temp-project
+ $ pipenv --python 3.x # Use your current Python version
+ ```
+
+2. Install your main dependencies one by one:
+ ```bash
+ $ pipenv install django
+ $ pipenv install requests
+ # etc.
+ ```
+
+3. Install development dependencies:
+ ```bash
+ $ pipenv install pytest --dev
+ $ pipenv install black --dev
+ # etc.
+ ```
+
+4. Copy the Pipfile and Pipfile.lock to your original project:
+ ```bash
+ $ cp Pipfile Pipfile.lock /path/to/original/project/
+ $ cd /path/to/original/project/
+ $ pipenv install
+ ```
+
+## Migrating from virtualenv/venv
+
+If you're using virtualenv or venv with pip:
+
+1. Activate your existing virtual environment:
+ ```bash
+ $ source venv/bin/activate # or equivalent for your OS
+ ```
+
+2. Generate a requirements file:
+ ```bash
+ $ pip freeze > requirements.txt
+ ```
+
+3. Deactivate the virtual environment:
+ ```bash
+ $ deactivate
+ ```
+
+4. Initialize Pipenv and import requirements:
+ ```bash
+ $ pipenv install -r requirements.txt
+ ```
+
+5. Optionally, remove the old virtual environment:
+ ```bash
+ $ rm -rf venv/ # Use appropriate command for your OS
+ ```
+
+## Migrating from Poetry
+
+Poetry is another modern Python dependency management tool. Migrating from Poetry to Pipenv requires a few steps.
+
+### Basic Migration
+
+1. Export Poetry dependencies to requirements.txt:
+ ```bash
+ $ poetry export -f requirements.txt --output requirements.txt
+ $ poetry export -f requirements.txt --dev --output dev-requirements.txt
+ ```
+
+2. Initialize Pipenv and import requirements:
+ ```bash
+ $ pipenv install -r requirements.txt
+ $ pipenv install -r dev-requirements.txt --dev
+ ```
+
+3. Review the Pipfile and adjust as needed:
+ ```bash
+ $ nano Pipfile
+ ```
+
+4. Generate the lock file:
+ ```bash
+ $ pipenv lock
+ ```
+
+### Handling Poetry-Specific Features
+
+Some Poetry features don't have direct equivalents in Pipenv:
+
+1. **Scripts**: Poetry's `[tool.poetry.scripts]` can be converted to Pipenv's `[scripts]` section.
+
+2. **Package building**: If you're developing a library, you'll still need a `setup.py` or `pyproject.toml` for distribution.
+
+3. **Extra dependencies**: Convert Poetry's extras to Pipenv's package options.
+
+ Poetry:
+ ```toml
+ [tool.poetry.extras]
+ docs = ["sphinx"]
+ ```
+
+ Pipenv:
+ ```toml
+ [packages]
+ your-package = {path = ".", extras = ["docs"]}
+ ```
+
+## Migrating from Conda
+
+Conda is a package manager that handles both Python and non-Python packages. Migrating from Conda to Pipenv requires some additional steps.
+
+### Basic Migration
+
+1. Export Conda environment to a file:
+ ```bash
+ $ conda env export --from-history > environment.yml
+ ```
+
+2. Extract Python packages from the environment file:
+ ```bash
+ $ grep -v "prefix:" environment.yml | grep -v "^name:" > conda_env.yml
+ ```
+
+3. Convert Conda packages to pip requirements (you may need to do this manually):
+ ```bash
+ # Create a requirements.txt file with Python packages from conda_env.yml
+ ```
+
+4. Initialize Pipenv and import requirements:
+ ```bash
+ $ pipenv install -r requirements.txt
+ ```
+
+### Handling Non-Python Dependencies
+
+Conda often manages non-Python dependencies that Pipenv can't handle. For these:
+
+1. Document the non-Python dependencies separately.
+
+2. Consider using Docker to manage system-level dependencies.
+
+3. For development, you might need to install these dependencies using your system package manager.
+
+## Migrating from pipenv-setup
+
+If you're using pipenv-setup to maintain both Pipfile and setup.py:
+
+1. Keep your setup.py or convert it to pyproject.toml.
+
+2. Use Pipenv for development dependencies and environment management.
+
+3. Continue to use pip/setuptools for package distribution.
+
+## Best Practices After Migration
+
+After migrating to Pipenv, follow these best practices:
+
+### 1. Clean Up Old Files
+
+Remove old dependency management files that are no longer needed:
+
+```bash
+$ rm -f requirements.txt dev-requirements.txt requirements-dev.txt
+```
+
+Keep setup.py or pyproject.toml if you're developing a library.
+
+### 2. Update Documentation
+
+Update your project documentation to reflect the new workflow:
+
+- Installation instructions
+- Development setup
+- Contribution guidelines
+
+### 3. Update CI/CD Pipelines
+
+Update your continuous integration and deployment pipelines:
+
+```yaml
+# Example GitHub Actions workflow
+steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.10'
+ - name: Install pipenv
+ run: pip install pipenv
+ - name: Install dependencies
+ run: pipenv install --dev
+ - name: Run tests
+ run: pipenv run pytest
+```
+
+### 4. Commit Both Pipfile and Pipfile.lock
+
+Ensure both files are committed to version control:
+
+```bash
+$ git add Pipfile Pipfile.lock
+$ git commit -m "Migrate to Pipenv"
+```
+
+### 5. Review and Optimize Dependencies
+
+After migration, review your dependencies:
+
+1. Remove unnecessary dependencies:
+ ```bash
+ $ pipenv uninstall unnecessary-package
+ ```
+
+2. Update outdated packages:
+ ```bash
+ $ pipenv update --outdated
+ $ pipenv update
+ ```
+
+3. Check for security vulnerabilities:
+ ```bash
+ $ pipenv scan
+ ```
+
+## Common Migration Issues and Solutions
+
+### Issue: Dependency Resolution Conflicts
+
+**Problem**: Pipenv can't resolve dependencies due to conflicts.
+
+**Solution**:
+1. Identify conflicting dependencies:
+ ```bash
+ $ pipenv graph
+ ```
+2. Relax version constraints in your Pipfile.
+3. Try clearing the cache:
+ ```bash
+ $ pipenv lock --clear
+ ```
+
+### Issue: Missing System Dependencies
+
+**Problem**: Packages with C extensions fail to install due to missing system dependencies.
+
+**Solution**:
+1. Install required system packages:
+ ```bash
+ # Ubuntu/Debian
+ $ sudo apt-get install build-essential python3-dev
+
+ # macOS
+ $ xcode-select --install
+ ```
+2. Consider using a Docker container with all required system dependencies.
+
+### Issue: Different Package Versions
+
+**Problem**: Pipenv resolves to different package versions than your previous tool.
+
+**Solution**:
+1. Specify exact versions in your Pipfile:
+ ```toml
+ [packages]
+ requests = "==2.28.1"
+ ```
+2. Use `pipenv install --ignore-pipfile` to install exactly what's in the lock file.
+
+### Issue: Private Repositories
+
+**Problem**: Can't access private repositories.
+
+**Solution**:
+1. Configure additional sources in your Pipfile:
+ ```toml
+ [[source]]
+ name = "private"
+ url = "https://private-repo.example.com/simple"
+ verify_ssl = true
+ ```
+2. Use environment variables for authentication:
+ ```bash
+ $ export PIP_EXTRA_INDEX_URL=https://user:password@private-repo.example.com/simple
+ ```
+
+## Migration Checklist
+
+Use this checklist to ensure a successful migration:
+
+- [ ] Export dependencies from existing tool
+- [ ] Initialize Pipenv environment
+- [ ] Import dependencies into Pipenv
+- [ ] Review and adjust the Pipfile
+- [ ] Generate Pipfile.lock
+- [ ] Test that the application works
+- [ ] Update documentation
+- [ ] Update CI/CD pipelines
+- [ ] Commit Pipfile and Pipfile.lock to version control
+- [ ] Remove old dependency files
+- [ ] Train team members on Pipenv workflow
+
+## Conclusion
+
+Migrating to Pipenv provides several benefits:
+
+- Simplified dependency management
+- Deterministic builds with lock files
+- Better security through hash verification
+- Improved development workflow
+
+While the migration process requires some effort, the long-term benefits make it worthwhile for most Python projects.
+
+If you encounter issues during migration, refer to the [Troubleshooting](troubleshooting.md) guide or seek help from the Pipenv community.
diff --git a/docs/pipfile.md b/docs/pipfile.md
new file mode 100644
index 0000000000..1660dd97a7
--- /dev/null
+++ b/docs/pipfile.md
@@ -0,0 +1,612 @@
+# Pipfile & Pipfile.lock
+
+Pipenv uses two files to manage project dependencies: `Pipfile` and `Pipfile.lock`. This document explains their purpose, structure, and best practices for working with them.
+
+## Overview
+
+| File | Purpose | Managed By | Format |
+|------|---------|------------|--------|
+| `Pipfile` | Declares top-level project dependencies and constraints | Developers | [TOML](https://toml.io/en/latest) |
+| `Pipfile.lock` | Records exact versions and hashes of all resolved dependencies | Pipenv automatically | JSON |
+
+Both files should be committed to version control to ensure consistent environments across development and deployment.
+
+## Pipfile
+
+The `Pipfile` is a human-readable, TOML-formatted file that declares your project's dependencies. It replaces the traditional `requirements.txt` file with a more powerful and flexible format.
+
+### Pipfile Structure
+
+A typical `Pipfile` contains the following sections:
+
+```toml
+[[source]]
+# Package sources (PyPI, private repositories, etc.)
+
+[packages]
+# Production dependencies
+
+[dev-packages]
+# Development dependencies
+
+[requires]
+# Python version requirements
+
+[scripts]
+# Custom script definitions
+
+[pipenv]
+# Pipenv configuration directives
+
+[custom-category]
+# Custom package categories (e.g., docs, tests)
+```
+
+### Source Section
+
+The `[[source]]` section defines where packages should be downloaded from:
+
+```toml
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+# You can specify multiple sources
+[[source]]
+url = "https://private-repo.example.com/simple"
+verify_ssl = true
+name = "private"
+```
+
+### Packages Section
+
+The `[packages]` section lists production dependencies:
+
+```toml
+[packages]
+# Simple version specification
+requests = "*" # Any version
+flask = "==2.0.1" # Exact version
+numpy = ">=1.20.0,<2.0.0" # Version range
+pandas = "~=1.3.0" # Compatible release
+
+# Extended syntax with additional options
+django = {version = ">=3.2", extras = ["bcrypt"]}
+sentry-sdk = {version = ">=1.0.0", extras = ["flask"]}
+
+# Git repositories
+flask-login = {git = "https://github.com/maxcountryman/flask-login.git", ref = "master"}
+my-package = {git = "ssh://git@github.com/bob/my-package.git", ref = "main"}
+
+# Local paths (relative filesystem path)
+my-package = { path = "./path/to/local/package" }
+
+# Remote file URLs (wheel or sdist hosted over HTTP/HTTPS)
+my-package = { file = "https://example.com/packages/my-package-1.0.tar.gz" }
+
+# Platform-specific dependencies
+gunicorn = {version = "*", markers = "sys_platform == 'linux'"}
+waitress = {version = "*", markers = "sys_platform == 'win32'"}
+
+# Index-specific packages
+private-package = {version = "*", index = "private"}
+```
+
+Local path dependencies use the `path` attribute, and remote file URL dependencies
+use the `file` attribute.
+
+**`path`** β a relative (or absolute) filesystem path to a local package directory
+or archive:
+
+By default, Pipenv performs a standard (non-editable) installation:
+
+```toml
+[packages]
+my-package = { path = "./path/to/local/package" }
+```
+
+To install the package in development (editable) mode (`pipenv install -e ./my-package`):
+
+```toml
+[packages]
+my-package = { path = "./my-package", editable = true }
+```
+
+Editable installs mirror `pip install -e` behavior and reflect changes to
+the source immediately. Pipenv writes `{ path = "./my-package", editable = true }`
+when you run `pipenv install -e ./my-package`.
+
+> **Compatibility note**: Older Pipfiles may store the same entry without the
+> `./` prefix (e.g. `path = "my-package"`) or without the `editable = true`
+> flag. Both forms are still accepted β Pipenv normalises them internally.
+> Older Pipenv versions also implicitly treated every path dependency as
+> editable; newer versions require `editable = true` to be explicit.
+
+**`file`** β an HTTP or HTTPS URL pointing to a remote wheel (`.whl`) or source
+distribution (`.tar.gz`, `.zip`):
+
+```toml
+[packages]
+my-package = { file = "https://example.com/packages/my-package-1.0.tar.gz" }
+```
+
+> **`path` vs `file`**: use `path` for local filesystem locations (directories or
+> archives on disk) and `file` for remote HTTP/HTTPS URLs. Running
+> `pipenv install -e ./my-package` always writes
+> `{ path = "./my-package", editable = true }` to your Pipfile.
+
+### Development Packages Section
+
+The `[dev-packages]` section lists dependencies needed only for development:
+
+```toml
+[dev-packages]
+pytest = ">=6.0.0"
+black = "==21.5b2"
+mypy = "*"
+sphinx = {version = ">=4.0.0", extras = ["docs"]}
+```
+
+#### Pinning a Package in `dev-packages` That Is Also a Production Dependency
+
+If a package is required by a production dependency (listed under `[packages]`) *and*
+you also pin it explicitly in `[dev-packages]`, the resolver treats both sections as
+part of a single unified dependency graph. The production dependency's constraints
+take precedence when they conflict.
+
+For example:
+
+```toml
+[packages]
+apispec = "*" # apispec depends on `packaging` (any version)
+
+[dev-packages]
+packaging = "==21.3" # Pinned to an older version
+```
+
+Here, `packaging` will be resolved to whatever version satisfies `apispec`'s
+requirement (e.g. `==22.0`), **not** necessarily `==21.3`. No resolution error
+is raised because `apispec = "*"` allows any version of `packaging`.
+
+```{note}
+This is intentional behaviour: Pipenv uses a single resolver for all categories and
+there is only one installed version of each package per environment. To enforce a
+specific version, add the pin to `[packages]` as well, or tighten the constraint on
+the package that requires it (e.g. `apispec = {version = "*", dependencies = {packaging = "==21.3"}}`
+is not valid Pipfile syntax; instead use `pipenv install "packaging==21.3"` so the
+pin appears in `[packages]`).
+```
+
+### Python Version Requirements
+
+The `[requires]` section specifies Python version constraints:
+
+```toml
+[requires]
+python_version = "3.9" # Requires Python 3.9.x
+# OR
+python_full_version = "3.9.6" # Requires exactly Python 3.9.6
+```
+
+### Custom Scripts
+
+The `[scripts]` section defines shortcuts for common commands:
+
+```toml
+[scripts]
+start = "python app.py"
+test = "pytest tests/"
+lint = "flake8 ."
+docs = "sphinx-build -b html docs/ docs/_build"
+```
+
+You can run these scripts using `pipenv run `.
+
+### Pipenv Directives
+
+The `[pipenv]` section controls Pipenv's behavior:
+
+```toml
+[pipenv]
+allow_prereleases = true # Allow pre-release versions
+cool-down-period = "30d" # Only resolve packages uploaded at least N days ago
+disable_pip_input = true # Prevent pipenv from asking for input
+install_search_all_sources = true # Search all sources when installing from lock
+sort_pipfile = true # Sort packages alphabetically
+```
+
+#### `cool-down-period`
+
+Restricts the resolver to package versions that were uploaded to the index at least
+the specified number of days ago. This gives newly-published releases time to be
+vetted by the community before they are automatically pulled into your project.
+
+The value must be a string in `d` format (e.g. `"30d"` for 30 days). Internally,
+pipenv computes a cutoff datetime in UTC (`now - N days`) and passes that cutoff to
+pip's uploaded-prior-to filtering. Pip also supports duration-style values such as
+`P30D`, but pipenv's behavior here is based on a concrete cutoff timestamp. This is
+only effective against indexes that expose upload-time metadata as described in the
+[Simple Repository API](https://packaging.python.org/en/latest/specifications/simple-repository-api/).
+When the index does not provide upload-time metadata (e.g. most private mirrors) the
+setting is accepted but has no filtering effect.
+
+```toml
+[pipenv]
+cool-down-period = "30d" # ignore any release uploaded in the last 30 days
+```
+
+### Custom Package Categories
+
+You can define custom package categories beyond the standard `packages` and `dev-packages`:
+
+```toml
+[docs]
+sphinx = ">=4.0.0"
+sphinx-rtd-theme = "*"
+
+[tests]
+pytest = "*"
+pytest-cov = "*"
+```
+
+## Pipfile.lock
+
+The `Pipfile.lock` file is automatically generated by Pipenv when you run `pipenv lock` or when you install/uninstall packages. It contains:
+
+1. Exact versions of all direct and transitive dependencies
+2. Cryptographic hashes for each package
+3. Package metadata and requirements
+
+### Pipfile.lock Structure
+
+```json
+{
+ "_meta": {
+ "hash": {
+ "sha256": ""
+ },
+ "pipfile-spec": 6,
+ "requires": {
+ "python_version": "3.9"
+ },
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ // Production dependencies and their sub-dependencies
+ "package-name": {
+ "hashes": [
+ "sha256:hash1",
+ "sha256:hash2"
+ ],
+ "index": "pypi",
+ "version": "==1.2.3"
+ },
+ // ...
+ },
+ "develop": {
+ // Development dependencies and their sub-dependencies
+ // ...
+ },
+ "docs": {
+ // Custom category dependencies
+ // ...
+ }
+}
+```
+
+### Package Categories in Pipfile.lock
+
+Note the naming difference between Pipfile and Pipfile.lock:
+
+- `[packages]` in Pipfile corresponds to `"default"` in Pipfile.lock
+- `[dev-packages]` in Pipfile corresponds to `"develop"` in Pipfile.lock
+- Custom categories use the same name in both files
+
+## Best Practices
+
+### Version Specifiers
+
+Choose appropriate version specifiers based on your needs:
+
+| Specifier | Example | Meaning |
+|-----------|---------|---------|
+| `*` | `requests = "*"` | Any version (not recommended for production) |
+| `==` | `flask = "==2.0.1"` | Exact version |
+| `>=` | `django = ">=3.2"` | Minimum version |
+| `<=` | `numpy = "<=1.20.0"` | Maximum version |
+| `>=,<` | `pandas = ">=1.3.0,<2.0.0"` | Version range |
+| `~=` | `pytest = "~=6.2.0"` | Compatible release (equivalent to `>=6.2.0,<6.3.0`) |
+
+For production environments, it's recommended to use specific version constraints to ensure reproducibility.
+
+### Dependency Management Workflow
+
+1. **Initial setup**: Create a `Pipfile` with your top-level dependencies
+ ```bash
+ $ pipenv install requests flask
+ $ pipenv install pytest --dev
+ ```
+
+2. **Lock dependencies**: Generate a `Pipfile.lock` with exact versions
+ ```bash
+ $ pipenv lock
+ ```
+
+3. **Install from lock**: Install the exact versions from `Pipfile.lock`
+ ```bash
+ $ pipenv sync
+ ```
+
+4. **Update dependencies**: Update to newer versions when needed
+ ```bash
+ $ pipenv update
+ ```
+
+### Importing from requirements.txt
+
+If you're migrating from a project that uses `requirements.txt`, you can import it:
+
+```bash
+$ pipenv install -r requirements.txt
+```
+
+This will create a `Pipfile` and install all packages from the requirements file.
+
+### Generating requirements.txt
+
+You can generate a `requirements.txt` file from your `Pipfile.lock`:
+
+```bash
+$ pipenv requirements > requirements.txt
+```
+
+This is useful for environments that don't support Pipenv directly.
+
+### Security Considerations
+
+The `Pipfile.lock` includes cryptographic hashes for each package, which are verified during installation. This prevents supply chain attacks where a malicious package could be substituted.
+
+For CI/CD deployments:
+
+1. Use `pipenv verify` to ensure the lock file is up-to-date
+2. Use `pipenv install --deploy` to fail if the lock file is out of sync
+3. Never run commands that modify the lock file in CI/CD (like `lock`, `update`, or `upgrade`)
+
+## Advanced Usage
+
+### Package Markers
+
+You can use [PEP 508](https://www.python.org/dev/peps/pep-0508/) markers to specify environment-specific dependencies:
+
+```toml
+[packages]
+gunicorn = {version = "*", markers = "sys_platform == 'linux'"}
+waitress = {version = "*", markers = "sys_platform == 'win32'"}
+colorama = {version = "*", markers = "python_version >= '3.7'"}
+```
+
+Pipenv also supports shorthand keys for common markers. These are equivalent to using the full `markers` syntax:
+
+```toml
+[packages]
+# Shorthand form β these marker keys are recognized directly:
+gunicorn = {version = "*", sys_platform = "== 'linux'"}
+arm-optimized = {version = "*", platform_machine = "== 'arm64'"}
+```
+
+All [PEP 508 environment marker](https://peps.python.org/pep-0508/#environment-markers) keys are supported, including `sys_platform`, `platform_machine`, `platform_system`, `os_name`, `python_version`, `python_full_version`, `platform_python_implementation`, and `implementation_name`.
+
+For more details and architecture-specific examples, see [Platform-Specific Dependencies](specifiers.md#platform-specific-dependencies).
+
+### Package Extras
+
+Many packages provide optional features as "extras":
+
+```toml
+[packages]
+requests = {version = "*", extras = ["socks", "security"]}
+django = {version = "*", extras = ["bcrypt"]}
+```
+
+### Git Dependencies
+
+You can install packages directly from Git repositories.
+It supports both HTTPS and SSH URLs.
+SSH is generally preferred for private repositories, as they can require SSH authentication.
+
+```toml
+[packages]
+flask-login = {git = "https://github.com/maxcountryman/flask-login.git", ref = "master"}
+custom-package = {git = "https://github.com/user/repo.git", editable = true}
+my-private-package = {git = "ssh://git@github.com/bob/my-package.git", ref = "main"}
+```
+
+### Local and Remote File Dependencies
+
+For local development of packages, use the `path` attribute with a filesystem path:
+
+```toml
+[packages]
+my-package = { path = "./path/to/package" }
+```
+
+This performs a regular (non-editable) installation.
+
+To install in development (editable) mode:
+
+```toml
+[packages]
+my-package = { path = "./path/to/package", editable = true }
+```
+
+The `editable` flag installs the package in development mode, so changes to the source code are immediately reflected.
+
+> If `editable` is omitted, Pipenv will perform a standard installation
+> instead of a development install.
+
+For packages hosted at a remote URL (wheel or sdist), use the `file` attribute:
+
+```toml
+[packages]
+my-package = { file = "https://example.com/packages/my-package-1.0-py3-none-any.whl" }
+```
+
+> **`path` vs `file`**: use `path` for local filesystem locations and `file` for
+> remote HTTP/HTTPS URLs. Running `pipenv install -e .` always writes
+> `{ path = ".", editable = true }` to your Pipfile.
+
+#### Migrating from older Pipfile formats
+
+Older Pipenv versions wrote editable local installs without the `./` prefix or
+(in some releases) using the `file` key instead of `path`:
+
+```toml
+# Older format β still accepted by Pipenv
+my-package = { path = "my-package", editable = true }
+```
+
+These are equivalent to the canonical modern form:
+
+```toml
+# Modern canonical form β written by current Pipenv
+my-package = { path = "./my-package", editable = true }
+```
+
+Pipenv normalises both forms at install and lock time, so no manual migration
+is required. If you want your Pipfile to reflect the current canonical format,
+simply run `pipenv install -e ./my-package` again and Pipenv will rewrite the
+entry.
+
+#### Editable installs and build isolation
+
+By default, pip builds each package in an isolated environment. When you have
+many editable local packages that share the same build dependencies (e.g.
+`setuptools`), this results in those dependencies being installed once per
+package, which can be slow.
+
+Setting `PIP_NO_BUILD_ISOLATION=0` (or `--no-build-isolation` in
+`PIPENV_EXTRA_PIP_ARGS`) tells pip to reuse the virtual environment for all
+builds. **However, this introduces a race condition when pipenv installs
+packages in parallel**: if `setuptools` (or another build backend) is being
+upgraded at the same time as an editable package is being built, the build can
+fail with a `BackendUnavailable` error.
+
+Recommended mitigations:
+
+1. **Use named categories to stage build dependencies first.** Install build
+ backends (e.g. `setuptools`, `wheel`) in a dedicated category and sync that
+ category before the main packages:
+
+ ```toml
+ [build-deps]
+ setuptools = "*"
+ wheel = "*"
+ ```
+
+ ```bash
+ pipenv sync --categories="build-deps packages"
+ ```
+
+2. **Pin your build backend version** in `[packages]` so it is never upgraded
+ in parallel with an editable install:
+
+ ```toml
+ [packages]
+ setuptools = "*"
+ my-editable-pkg = { path = "./my-editable-pkg", editable = true }
+ ```
+
+ Because named (non-editable) packages are installed before editable ones in
+ the same category, `setuptools` will always be present and stable before
+ `my-editable-pkg` is built.
+
+3. **Keep `PIP_NO_BUILD_ISOLATION=1`** (the default) unless you have a
+ compelling performance reason. Isolated builds are slower but immune to
+ the race condition described above.
+
+## Troubleshooting
+
+### Lock File Hash Mismatch
+
+If you see an error about the Pipfile.lock hash not matching:
+
+```
+Pipfile.lock out of date, update it with "pipenv lock" or "pipenv update".
+```
+
+This means your `Pipfile` has been modified since the last time `Pipfile.lock` was generated. Run `pipenv lock` to update the lock file.
+
+### Dependency Resolution Failures
+
+If Pipenv can't resolve dependencies:
+
+1. Try clearing the cache: `pipenv lock --clear`
+2. Check for conflicting version requirements
+3. Consider relaxing version constraints in your Pipfile
+4. Use `pipenv install --verbose` to see detailed resolution information
+
+### Manually Editing Files
+
+- **Pipfile**: Safe to edit manually, but follow TOML syntax rules
+- **Pipfile.lock**: Do not edit manually; always use Pipenv commands to modify
+
+### Editable Install Fails with `BackendUnavailable` (build isolation disabled)
+
+**Symptom**: When `PIP_NO_BUILD_ISOLATION=0` is set and you have multiple
+editable packages, `pipenv sync` fails with an error like:
+
+```
+pipenv.patched.pip._vendor.pyproject_hooks._impl.BackendUnavailable:
+ ImportError: The 'importlib_metadata' package is required; normally this is
+ bundled with this package so if you get this warning, consult the packager
+ of your distribution.
+```
+
+**Cause**: Pipenv installs packages in parallel. With build isolation
+disabled, all packages share the same virtual environment for building. If
+`setuptools` (or another build backend) is being upgraded in one thread while
+another thread is trying to use it to build an editable package, the build
+backend can fail mid-import.
+
+**Solutions** (in order of preference):
+
+1. **Restore build isolation** (`PIP_NO_BUILD_ISOLATION=1`, the default).
+ Each package gets its own clean build environment so there is no race
+ condition. Accept the extra install time as a trade-off for reliability.
+
+2. **Stage build dependencies with named categories** so they are always
+ installed before packages that need them:
+
+ ```toml
+ [build-deps]
+ setuptools = "*"
+ wheel = "*"
+
+ [packages]
+ my-editable-pkg = { path = "./my-editable-pkg", editable = true }
+ ```
+
+ ```bash
+ pipenv sync --categories="build-deps packages"
+ ```
+
+3. **Include build backends in `[packages]`** so they are installed (as
+ non-editable, named packages) before the editable packages in the same
+ category. Pipenv installs all non-editable packages before editable ones
+ within a single category:
+
+ ```toml
+ [packages]
+ setuptools = "*"
+ my-editable-pkg = { path = "./my-editable-pkg", editable = true }
+ ```
+
+See [Editable installs and build isolation](#editable-installs-and-build-isolation)
+in the Advanced Usage section for a fuller explanation.
diff --git a/docs/pylock.md b/docs/pylock.md
new file mode 100644
index 0000000000..83b1a45581
--- /dev/null
+++ b/docs/pylock.md
@@ -0,0 +1,169 @@
+# PEP 751 pylock.toml Support
+
+Pipenv supports [PEP 751](https://peps.python.org/pep-0751/) pylock.toml files, which provide a standardized format for recording Python dependencies to enable installation reproducibility.
+
+## What is pylock.toml?
+
+The pylock.toml file is a standardized lock file format introduced in PEP 751. It is designed to be:
+
+- Human-readable and machine-generated
+- Secure by default (includes file hashes)
+- Able to support both single-use and multi-use lock files
+- Compatible across different Python packaging tools
+
+## Using pylock.toml with Pipenv
+
+Pipenv can automatically detect and use pylock.toml files in your project. When both a Pipfile.lock and a pylock.toml file exist, Pipenv will prioritize the pylock.toml file.
+
+### Reading pylock.toml Files
+
+When you run commands like `pipenv install` or `pipenv sync`, Pipenv will check for a pylock.toml file in your project directory. If found, it will use the dependencies specified in the pylock.toml file instead of Pipfile.lock.
+
+Pipenv looks for pylock.toml files in the following order:
+1. A file named `pylock.toml` in the project directory
+2. A file matching the pattern `pylock.*.toml` in the project directory
+
+### Example pylock.toml File
+
+Here's a simplified example of a pylock.toml file:
+
+```toml
+lock-version = '1.0'
+environments = ["sys_platform == 'win32'", "sys_platform == 'linux'", "sys_platform == 'darwin'"]
+requires-python = '>=3.8'
+extras = []
+dependency-groups = ['dev']
+default-groups = ['default']
+created-by = 'pipenv'
+
+[[packages]]
+name = 'requests'
+version = '2.28.1'
+requires-python = '>=3.7'
+index = 'https://pypi.org/simple/'
+
+[[packages.wheels]]
+name = 'requests-2.28.1-py3-none-any.whl'
+upload-time = '2022-07-13T14:00:00Z'
+url = 'https://files.pythonhosted.org/packages/ca/91/6d9b8ccacd0412c08820f72cebaa4f0c61441f4AE7b7338a82051330d70/requests-2.28.1-py3-none-any.whl'
+size = 61805
+hashes = {sha256 = 'b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7'}
+
+[[packages]]
+name = 'pytest'
+version = '7.0.0'
+marker = "'dev' in dependency_groups"
+index = 'https://pypi.org/simple/'
+```
+
+## Benefits of Using pylock.toml
+
+- **Standardization**: pylock.toml is a standardized format that can be used by multiple Python packaging tools.
+- **Security**: pylock.toml includes file hashes by default, making it more secure against supply chain attacks.
+- **Flexibility**: pylock.toml supports extras and dependency groups for multi-use lock files.
+- **Interoperability**: pylock.toml can be used by different tools, reducing vendor lock-in.
+- **Auditability**: Packages include their index URL for SBOM generation.
+
+## Writing pylock.toml Files
+
+Pipenv can generate pylock.toml files alongside Pipfile.lock files. To enable this feature, add the following to your Pipfile:
+
+```toml
+[pipenv]
+use_pylock = true
+```
+
+With this setting, whenever Pipenv updates the Pipfile.lock file (e.g., when running `pipenv lock`), it will also generate a pylock.toml file in the same directory.
+
+You can also specify a custom name for the pylock.toml file:
+
+```toml
+[pipenv]
+use_pylock = true
+pylock_name = "dev" # This will generate pylock.dev.toml
+```
+
+## CLI Commands
+
+Pipenv provides a `pylock` command for managing pylock.toml files:
+
+### Generate pylock.toml from Pipfile.lock
+
+```bash
+pipenv pylock --generate
+```
+
+### Generate pylock.toml from pyproject.toml
+
+Create a pylock.toml skeleton from your pyproject.toml dependencies (PEP 621/735):
+
+```bash
+pipenv pylock --from-pyproject
+```
+
+**Note:** This creates a skeleton file with declared dependencies. Package versions and hashes need to be resolved by running `pipenv lock`.
+
+### Validate pylock.toml
+
+```bash
+pipenv pylock --validate
+```
+
+### Custom Output Path
+
+```bash
+pipenv pylock --generate --output /path/to/pylock.toml
+```
+
+### Custom Dependency Groups
+
+Specify which dependency groups should be used for develop packages:
+
+```bash
+pipenv pylock --generate --dev-groups "dev,test,docs"
+```
+
+## pyproject.toml Support
+
+Pipenv can read dependencies from `pyproject.toml` files following PEP 621 and PEP 735:
+
+- `[project.dependencies]` - Main project dependencies
+- `[project.optional-dependencies]` - Optional dependencies (extras)
+- `[dependency-groups]` - Dependency groups (PEP 735)
+
+This allows you to use `pyproject.toml` as your primary dependency specification while generating standardized pylock.toml files.
+
+## Marker Evaluation
+
+Pipenv supports PEP 751 marker syntax for extras and dependency groups:
+
+- `'name' in extras` - Include package when extra is enabled
+- `'name' in dependency_groups` - Include package when dependency group is enabled
+
+Example:
+
+```toml
+[[packages]]
+name = 'pytest'
+version = '7.0.0'
+marker = "'dev' in dependency_groups"
+```
+
+## Features
+
+### Implemented
+
+- β Core pylock.toml format (read/write)
+- β Bidirectional conversion with Pipfile.lock
+- β Package index tracking (`packages.index`)
+- β Extras and dependency groups
+- β Marker evaluation for filtering packages
+- β CLI commands for generation and validation
+- β pyproject.toml dependency reading
+
+### Future Enhancements
+
+- VCS package support (`packages.vcs`)
+- Local directory support (`packages.directory`)
+- Direct archive support (`packages.archive`)
+- Attestation identities support
diff --git a/docs/quick_start.md b/docs/quick_start.md
new file mode 100644
index 0000000000..b9e27541ec
--- /dev/null
+++ b/docs/quick_start.md
@@ -0,0 +1,338 @@
+# Pipenv Quick Start Guide
+
+This guide will help you get started with Pipenv quickly. It covers installation, basic usage, and common workflows to help you become productive with Pipenv in minutes.
+
+## Installation
+
+### Install Pipenv
+
+```bash
+# Install for the current user
+$ pip install --user pipenv
+```
+
+Verify the installation:
+
+```bash
+$ pipenv --version
+pipenv, version 2024.0.0
+```
+
+If the command isn't found, you may need to add the user site-packages bin directory to your PATH. See the [Installation](installation.md) page for detailed instructions.
+
+## Creating a New Project
+
+### Initialize a New Project
+
+```bash
+# Create a project directory
+$ mkdir my_project
+$ cd my_project
+
+# Initialize a Pipenv environment
+$ pipenv install
+```
+
+This creates a `Pipfile` in your project directory and a virtual environment for your project.
+
+### Specify Python Version
+
+To use a specific Python version:
+
+```bash
+$ pipenv --python 3.10
+```
+
+## Managing Dependencies
+
+### Installing Packages
+
+```bash
+# Install a package
+$ pipenv install requests
+
+# Install a package with version constraint
+$ pipenv install "django>=4.0.0"
+
+# Install a development dependency
+$ pipenv install pytest --dev
+```
+
+### Viewing Installed Packages
+
+```bash
+# Show dependency graph
+$ pipenv graph
+
+# List installed packages
+$ pipenv run pip list
+```
+
+### Uninstalling Packages
+
+```bash
+# Uninstall a package
+$ pipenv uninstall requests
+```
+
+## Using Your Environment
+
+### Activating the Environment
+
+```bash
+# Activate the virtual environment
+$ pipenv shell
+
+# Now you're in the virtual environment
+(my_project) $ python --version
+Python 3.10.0
+
+# Exit the environment
+(my_project) $ exit
+```
+
+### Running Commands
+
+Without activating the environment:
+
+```bash
+# Run a Python script
+$ pipenv run python app.py
+
+# Run a command
+$ pipenv run pytest
+```
+
+## Working with Pipfiles
+
+### Understanding the Pipfile
+
+After installing packages, your `Pipfile` will look something like this:
+
+```toml
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+requests = "*"
+django = ">=4.0.0"
+
+[dev-packages]
+pytest = "*"
+
+[requires]
+python_version = "3.10"
+```
+
+### Locking Dependencies
+
+Generate a `Pipfile.lock` with exact versions and hashes:
+
+```bash
+$ pipenv lock
+```
+
+### Installing from Pipfile.lock
+
+Install the exact versions specified in `Pipfile.lock`:
+
+```bash
+$ pipenv sync
+```
+
+This is useful for deployment or when you want to ensure exact package versions.
+
+## Common Workflows
+
+### Development Workflow
+
+```bash
+# Clone a repository
+$ git clone https://github.com/example/project.git
+$ cd project
+
+# Install dependencies including development packages
+$ pipenv install --dev
+
+# Activate environment
+$ pipenv shell
+
+# Run tests
+$ pytest
+
+# Add a new dependency
+$ pipenv install new-package
+```
+
+### Deployment Workflow
+
+```bash
+# Ensure Pipfile.lock is up-to-date
+$ pipenv lock
+
+# Install only production dependencies
+$ pipenv install --deploy
+```
+
+### Checking for Security Vulnerabilities
+
+```bash
+# Scan for security vulnerabilities
+$ pipenv scan
+```
+
+## Environment Variables
+
+### Using .env Files
+
+Create a `.env` file in your project directory:
+
+```
+# .env
+DEBUG=True
+API_KEY=your_secret_key
+```
+
+Pipenv automatically loads these variables when you use `pipenv shell` or `pipenv run`.
+
+Access them in your Python code:
+
+```python
+import os
+
+debug = os.environ.get("DEBUG")
+api_key = os.environ.get("API_KEY")
+```
+
+## Project Examples
+
+### Web Application with Django
+
+```bash
+# Create project
+$ mkdir django_project
+$ cd django_project
+
+# Initialize with Python 3.10
+$ pipenv --python 3.10
+
+# Install Django
+$ pipenv install django
+
+# Create Django project
+$ pipenv run django-admin startproject mysite .
+
+# Run development server
+$ pipenv run python manage.py runserver
+```
+
+### Data Science Project
+
+```bash
+# Create project
+$ mkdir data_analysis
+$ cd data_analysis
+
+# Install data science packages
+$ pipenv install numpy pandas matplotlib jupyter
+
+# Start Jupyter notebook
+$ pipenv run jupyter notebook
+```
+
+### CLI Tool
+
+```bash
+# Create project
+$ mkdir cli_tool
+$ cd cli_tool
+
+# Install dependencies
+$ pipenv install click
+
+# Create main.py
+$ echo 'import click
+
+@click.command()
+@click.option("--name", default="World", help="Who to greet")
+def hello(name):
+ """Simple CLI tool that greets you."""
+ click.echo(f"Hello, {name}!")
+
+if __name__ == "__main__":
+ hello()' > main.py
+
+# Run the tool
+$ pipenv run python main.py --name Friend
+Hello, Friend!
+```
+
+## Tips and Tricks
+
+### Locate the Virtual Environment
+
+```bash
+# Show virtualenv location
+$ pipenv --venv
+/home/user/.local/share/virtualenvs/my_project-a1b2c3d4
+```
+
+### Locate the Python Interpreter
+
+```bash
+# Show Python interpreter path
+$ pipenv --py
+/home/user/.local/share/virtualenvs/my_project-a1b2c3d4/bin/python
+```
+
+### Generate requirements.txt
+
+```bash
+# Generate requirements.txt from Pipfile.lock
+$ pipenv requirements > requirements.txt
+```
+
+### Store Virtualenv in Project Directory
+
+```bash
+# Set environment variable
+$ export PIPENV_VENV_IN_PROJECT=1
+
+# Install dependencies
+$ pipenv install
+
+# The virtualenv is now in .venv in your project directory
+```
+
+### Custom Script Shortcuts
+
+Add custom scripts to your Pipfile:
+
+```toml
+[scripts]
+start = "python app.py"
+test = "pytest"
+lint = "flake8"
+```
+
+Run them with:
+
+```bash
+$ pipenv run start
+$ pipenv run test
+```
+
+## Next Steps
+
+Now that you're familiar with the basics of Pipenv, you can explore more advanced topics:
+
+- [Detailed Commands Reference](commands.md)
+- [Pipfile Format](pipfile.md)
+- [Best Practices](best_practices.md)
+- [Workflows](workflows.md)
+- [Configuration](configuration.md)
+- [Troubleshooting](troubleshooting.md)
+
+For a complete reference of all Pipenv features, check out the [full documentation](index.md).
diff --git a/docs/requirements.txt b/docs/requirements.txt
index a14ace82b5..27389f19dc 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,29 +1,16 @@
-alabaster==0.7.10
-Babel==2.5.0
-certifi==2017.7.27.1
-chardet==3.0.4
-click==6.7
-docutils==0.14
-first==2.0.1
-idna==2.6
-imagesize==0.7.1
-Jinja2==2.9.6
-MarkupSafe==1.0
-pbr==3.1.1
-pew==0.1.26
-pip-tools==1.9.0
+imagesize>=1.4.1
+Jinja2>=3.1.4
+MarkupSafe>=2.1.5
+myst-parser[linkify]>=4.0.0
-e .
-Pygments==2.2.0
-pythonz-bd==1.11.4
-pytz==2017.2
-requests==2.12.0
-resumable-urlretrieve==0.1.5
-semver==2.7.8
-six==1.10.0
-snowballstemmer==1.2.1
-Sphinx==1.6.3
-sphinx-click==1.0.3
-sphinxcontrib-websupport==1.0.1
-urllib3==1.22
-virtualenv==15.1.0
-virtualenv-clone==0.2.6
+pytz>=2024.1
+requests>=2.32.0
+snowballstemmer>=2.2.0
+Sphinx>=8.1.3
+sphinxcontrib-spelling>=8.0.0
+sphinxcontrib-websupport>=2.0.0
+urllib3>=2.2.1
+virtualenv>=20.25.0
+virtualenv-clone>=0.5.7
+certifi>=2024.2.2
+idna>=3.6
diff --git a/docs/scripts.md b/docs/scripts.md
new file mode 100644
index 0000000000..394ad4da71
--- /dev/null
+++ b/docs/scripts.md
@@ -0,0 +1,396 @@
+# Custom Script Shortcuts in Pipenv
+
+This guide covers how to define and use custom script shortcuts in Pipenv, including basic and advanced usage patterns, best practices, and troubleshooting tips.
+
+## Understanding Pipenv Scripts
+
+Pipenv allows you to define custom script shortcuts in your `Pipfile`, providing a convenient way to run common commands within your project's virtual environment. These shortcuts can simplify development workflows, standardize commands across team members, and document common operations.
+
+## Basic Script Definition
+
+### Defining Simple Scripts
+
+You can define scripts in the `[scripts]` section of your `Pipfile`:
+
+```toml
+[scripts]
+start = "python app.py"
+test = "pytest"
+lint = "flake8 ."
+format = "black ."
+```
+
+Each script consists of a name (the key) and a command (the value) that will be executed in the context of your virtual environment.
+
+### Running Scripts
+
+To run a script, use the `pipenv run` command followed by the script name:
+
+```bash
+$ pipenv run start
+```
+
+This executes the command `python app.py` within your project's virtual environment, even if you haven't activated the shell first.
+
+### Passing Arguments to Scripts
+
+You can pass additional arguments to your scripts:
+
+```bash
+$ pipenv run test tests/test_api.py -v
+```
+
+This appends the arguments to the command defined in your script, resulting in `pytest tests/test_api.py -v` in this example.
+
+## Advanced Script Definitions
+
+### Extended Script Syntax
+
+For more complex scripts, you can use the extended syntax with a dictionary:
+
+```toml
+[scripts]
+start = {cmd = "python app.py"}
+```
+
+This is functionally equivalent to the simple syntax but allows for additional options.
+
+### Calling Python Functions
+
+You can call Python functions directly from your scripts using the `call` option:
+
+```toml
+[scripts]
+my_function = {call = "package.module:function()"}
+my_function_with_args = {call = "package.module:function('arg1', 'arg2')"}
+```
+
+When you run `pipenv run my_function`, Pipenv will import the specified module and call the function.
+
+### Combining Commands
+
+You can combine multiple commands using shell syntax:
+
+```toml
+[scripts]
+setup = "mkdir -p data logs && touch .env && echo 'Setup complete'"
+```
+
+For more complex combinations, consider using platform-specific syntax:
+
+```toml
+[scripts]
+# Unix-like systems
+build_and_run = "npm run build && python app.py"
+
+# Windows
+build_and_run_win = "npm run build & python app.py"
+```
+
+### Environment-Specific Scripts
+
+You can define scripts that set environment variables using standard shell syntax:
+
+```toml
+[scripts]
+dev = "FLASK_ENV=development FLASK_DEBUG=1 flask run"
+prod = "FLASK_ENV=production gunicorn app:app"
+```
+
+```{note}
+**Important Limitation**: Inline environment variable assignment (like `VAR=value command`) works because the entire command string is passed to the shell. However, more complex shell features like command substitution (`$(command)`) or environment variable expansion within the script definition may not work as expected.
+
+This is because Pipenv parses the script command and executes it directly, rather than always passing it through a full shell interpreter.
+```
+
+### Setting Environment Variables for Scripts
+
+For more reliable environment variable handling, use one of these approaches:
+
+#### Using .env Files (Recommended)
+
+Create a `.env` file in your project directory:
+
+```
+# .env
+PROJECT_DIR=/path/to/project
+FLASK_ENV=development
+```
+
+Pipenv automatically loads these variables before running scripts:
+
+```toml
+[scripts]
+dev = "flask run"
+```
+
+#### Using Extended Script Syntax with env
+
+You can also define environment variables directly in the script definition using the extended table syntax. However, note that these values are static and cannot use shell expansion:
+
+```toml
+[scripts.dev]
+cmd = "flask run"
+env = {FLASK_ENV = "development", DEBUG = "1"}
+```
+
+#### Calling Shell Scripts
+
+For complex scripts that require shell features, call an external shell script:
+
+```toml
+[scripts]
+dev = "bash scripts/dev.sh"
+```
+
+Then in `scripts/dev.sh`:
+```bash
+#!/bin/bash
+export PROJECT_DIR="$(pipenv --where)"
+python "$PROJECT_DIR/src/main.py"
+```
+
+## Listing Available Scripts
+
+To see all available scripts defined in your `Pipfile`, use the `pipenv scripts` command:
+
+```bash
+$ pipenv scripts
+command script
+start python app.py
+test pytest
+lint flake8 .
+format black .
+```
+
+This provides a convenient way to discover available commands, especially in projects you're not familiar with.
+
+## Common Script Patterns
+
+### Web Development
+
+```toml
+[scripts]
+server = "python manage.py runserver"
+migrations = "python manage.py makemigrations"
+migrate = "python manage.py migrate"
+shell = "python manage.py shell"
+```
+
+### Data Science
+
+```toml
+[scripts]
+notebook = "jupyter notebook"
+lab = "jupyter lab"
+preprocess = "python scripts/preprocess_data.py"
+train = "python scripts/train_model.py"
+```
+
+### Testing and Quality Assurance
+
+```toml
+[scripts]
+test = "pytest"
+test_cov = "pytest --cov=app tests/"
+lint = "flake8 ."
+type_check = "mypy ."
+format = "black ."
+check_format = "black --check ."
+security = "pipenv scan"
+```
+
+### Build and Deployment
+
+```toml
+[scripts]
+build = "python setup.py build"
+dist = "python setup.py sdist bdist_wheel"
+publish = "twine upload dist/*"
+docs = "mkdocs build"
+serve_docs = "mkdocs serve"
+```
+
+## Integration with Other Tools
+
+### npm-style Scripts
+
+If you're familiar with npm scripts, you can create similar workflows:
+
+```toml
+[scripts]
+start = "python app.py"
+dev = "python app.py --debug"
+build = "python build.py"
+postbuild = "python scripts/post_build.py"
+```
+
+### Make-style Tasks
+
+You can emulate Makefile targets:
+
+```toml
+[scripts]
+all = "pipenv run clean && pipenv run build"
+build = "python setup.py build"
+clean = "rm -rf build/ dist/ *.egg-info"
+install = "pip install -e ."
+```
+
+### CI/CD Integration
+
+Define scripts that can be used in CI/CD pipelines:
+
+```toml
+[scripts]
+ci_test = "pytest --junitxml=test-results.xml"
+ci_lint = "flake8 . --output-file=flake8.txt"
+ci_type_check = "mypy . --txt-report reports"
+```
+
+## Best Practices
+
+### Script Organization
+
+1. **Group related scripts** with consistent naming conventions:
+ ```toml
+ [scripts]
+ test = "pytest"
+ test_cov = "pytest --cov=app"
+ test_watch = "ptw"
+ ```
+
+2. **Use prefixes** for different categories of scripts:
+ ```toml
+ [scripts]
+ db_migrate = "alembic upgrade head"
+ db_rollback = "alembic downgrade -1"
+ db_reset = "alembic downgrade base"
+ ```
+
+3. **Document complex scripts** with comments in your README or documentation.
+
+### Script Composition
+
+1. **Keep scripts focused** on a single responsibility
+2. **Compose complex workflows** from simpler scripts
+3. **Consider platform compatibility** for scripts that need to run on different operating systems
+
+### Security Considerations
+
+1. **Avoid hardcoding secrets** in scripts; use environment variables instead
+2. **Be cautious with scripts** that modify data or perform destructive actions
+3. **Consider adding confirmation prompts** for dangerous operations:
+ ```toml
+ [scripts]
+ dangerous_reset = "python -c \"input('Are you sure? [y/N] ') == 'y' or exit(1)\" && python reset_database.py"
+ ```
+
+## Troubleshooting
+
+### Common Issues
+
+#### Script Not Found
+
+If you get "Command 'script-name' not found":
+- Verify the script is defined in your `Pipfile`
+- Check for typos in the script name
+- Ensure you're in the correct project directory
+
+#### Script Execution Fails
+
+If a script fails to execute:
+- Run with `pipenv run --verbose script-name` for more information
+- Check if all required packages are installed
+- Verify the command works when run directly in the virtual environment
+
+#### Path-Related Issues
+
+If your script can't find files or executables:
+- Use absolute paths or paths relative to the project root
+- Set the working directory explicitly in your script
+- Print the current directory (`import os; print(os.getcwd())`) for debugging
+
+### Platform-Specific Considerations
+
+#### Windows-Specific Issues
+
+On Windows:
+- Use double quotes inside script commands if you need quotes
+- Replace Unix-style path separators (`/`) with Windows-style (`\\`) or use raw strings
+- Use `&&` for command chaining in CMD or `;&` in PowerShell
+
+#### Unix-Specific Issues
+
+On Unix-like systems:
+- Ensure script files have executable permissions if they're being called directly
+- Use single quotes for strings that contain double quotes
+- Consider using shebang lines in script files
+
+## Advanced Examples
+
+### Dynamic Script Generation
+
+You can generate scripts dynamically using Python:
+
+```python
+# build_scripts.py
+import toml
+
+# Load existing Pipfile
+with open("Pipfile", "r") as f:
+ pipfile = toml.load(f)
+
+# Ensure scripts section exists
+if "scripts" not in pipfile:
+ pipfile["scripts"] = {}
+
+# Add scripts for each module
+modules = ["users", "products", "orders"]
+for module in modules:
+ pipfile["scripts"][f"test_{module}"] = f"pytest tests/{module}"
+ pipfile["scripts"][f"lint_{module}"] = f"flake8 app/{module}"
+
+# Write updated Pipfile
+with open("Pipfile", "w") as f:
+ toml.dump(pipfile, f)
+```
+
+### Complex Script Examples
+
+#### Database Management Script
+
+```toml
+[scripts]
+db_setup = {cmd = "python -c \"from app import db; db.create_all()\""}
+db_seed = "python scripts/seed_database.py"
+db_migrate = "flask db migrate -m 'Auto-migration'"
+db_upgrade = "flask db upgrade"
+db_downgrade = "flask db downgrade"
+db_reset = "pipenv run db_downgrade && pipenv run db_upgrade && pipenv run db_seed"
+```
+
+#### Development Workflow Script
+
+```toml
+[scripts]
+dev = {cmd = "concurrently \"pipenv run backend\" \"pipenv run frontend\""}
+backend = "flask run --port=5000"
+frontend = "cd frontend && npm start"
+setup = "pipenv install && cd frontend && npm install"
+```
+
+#### Deployment Script
+
+```toml
+[scripts]
+deploy = {cmd = "pipenv run test && pipenv run build && pipenv run publish"}
+build = "python setup.py sdist bdist_wheel"
+publish = "twine upload dist/*"
+```
+
+## Conclusion
+
+Custom script shortcuts in Pipenv provide a powerful way to standardize and simplify common development tasks. By defining scripts in your `Pipfile`, you can create a consistent interface for project-specific commands, improve developer productivity, and document important workflows.
+
+Whether you're using simple command shortcuts or complex function calls, Pipenv scripts help create a more streamlined and maintainable development environment for Python projects.
diff --git a/docs/security.md b/docs/security.md
new file mode 100644
index 0000000000..09d3fc9d19
--- /dev/null
+++ b/docs/security.md
@@ -0,0 +1,412 @@
+# Security with Pipenv
+
+This guide covers security best practices when using Pipenv, including vulnerability scanning, hash verification, dependency management, and other security considerations.
+
+## Security Features in Pipenv
+
+Pipenv includes several built-in security features that help protect your projects from supply chain attacks and other security vulnerabilities.
+
+### Hash Verification
+
+Pipenv automatically generates cryptographic hashes for all packages in your `Pipfile.lock`. These hashes are verified during installation to ensure that the packages haven't been tampered with.
+
+```json
+{
+ "requests": {
+ "hashes": [
+ "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b",
+ "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"
+ ],
+ "index": "pypi",
+ "version": "==2.28.1"
+ }
+}
+```
+
+When you run `pipenv install`, Pipenv verifies that the downloaded packages match these hashes, protecting against:
+
+- Man-in-the-middle attacks
+- Compromised package repositories
+- Malicious package substitution
+
+### Vulnerability Scanning
+
+Pipenv includes the [safety](https://github.com/pyupio/safety) package, which scans your dependencies for known security vulnerabilities.
+
+```bash
+$ pipenv check --scan
+```
+
+This command checks your dependencies against the PyUp Safety database of known vulnerabilities and alerts you to any issues.
+
+Example output:
+
+```
+Scanning dependencies for security vulnerabilities...
+Vulnerability found in django version 2.2.0
+Vulnerability ID: 38449
+Affected spec: <2.2.24
+ADVISORY: Django 2.2.x before 2.2.24 allows QuerySet.order_by SQL injection if order_by is untrusted input.
+CVE-2021-33203
+For more information, please visit https://pyup.io/v/38449/742
+
+Scan was completed. 1 vulnerability was found.
+```
+
+### Deterministic Builds
+
+The `Pipfile.lock` ensures that everyone working on your project gets the exact same versions of all dependencies, including sub-dependencies. This prevents "works on my machine" problems and ensures consistent behavior across environments.
+
+## Security Best Practices
+
+### 1. Keep Dependencies Up to Date
+
+Regularly update your dependencies to get the latest security fixes:
+
+```bash
+# Check for outdated packages
+$ pipenv update --outdated
+
+# Update all packages
+$ pipenv update
+```
+
+For production systems, test updates thoroughly before deployment.
+
+### 2. Use the `--deploy` Flag in Production
+
+When installing dependencies in production environments, use the `--deploy` flag:
+
+```bash
+$ pipenv install --deploy
+```
+
+This ensures that your `Pipfile.lock` is up-to-date and fails if it isn't, preventing accidental use of outdated or insecure dependencies.
+
+### 3. Regularly Scan for Vulnerabilities
+
+Make vulnerability scanning a regular part of your development workflow:
+
+```bash
+$ pipenv check --scan
+```
+
+Consider integrating this into your CI/CD pipeline to catch vulnerabilities automatically.
+
+### 4. Pin Dependencies Appropriately
+
+For applications, pin dependencies to specific versions to ensure consistency and prevent unexpected updates:
+
+```toml
+[packages]
+requests = "==2.28.1"
+flask = "==2.0.1"
+```
+
+For libraries, use more flexible version constraints to allow compatibility with other packages:
+
+```toml
+[packages]
+requests = ">=2.27.0,<3.0.0"
+```
+
+### 5. Commit Both Pipfile and Pipfile.lock
+
+Always commit both `Pipfile` and `Pipfile.lock` to version control. The lock file contains the exact versions and hashes of all dependencies, ensuring consistent and secure builds.
+
+### 6. Use Private Package Repositories Securely
+
+When using private package repositories, ensure they're accessed securely:
+
+```toml
+[[source]]
+name = "private"
+url = "https://private-repo.example.com/simple"
+verify_ssl = true
+```
+
+Use environment variables for credentials rather than hardcoding them:
+
+```bash
+$ export PIP_EXTRA_INDEX_URL=https://${USERNAME}:${PASSWORD}@private-repo.example.com/simple
+```
+
+### 7. Isolate Development and Production Dependencies
+
+Keep development dependencies separate from production dependencies:
+
+```bash
+# Install a development dependency
+$ pipenv install pytest --dev
+```
+
+In production, install only production dependencies:
+
+```bash
+$ pipenv install --deploy
+```
+
+## Vulnerability Management
+
+### Understanding Vulnerability Reports
+
+When `pipenv check --scan` identifies vulnerabilities, it provides information to help you assess the risk:
+
+- **Vulnerability ID**: A unique identifier for the vulnerability
+- **Affected spec**: The version range affected by the vulnerability
+- **Advisory**: A description of the vulnerability
+- **CVE**: The Common Vulnerabilities and Exposures identifier
+- **More information**: A link to detailed information about the vulnerability
+
+### Addressing Vulnerabilities
+
+When vulnerabilities are found, you have several options:
+
+1. **Update the affected package**:
+ ```bash
+ $ pipenv update vulnerable-package
+ ```
+
+2. **Pin to a non-vulnerable version**:
+ ```toml
+ [packages]
+ vulnerable-package = "==2.0.1" # A version without the vulnerability
+ ```
+
+3. **Ignore specific vulnerabilities** (use with caution):
+ ```bash
+ $ pipenv check --scan --ignore 38449
+ ```
+
+4. **Apply patches or workarounds** as recommended in the vulnerability advisory.
+
+### Vulnerability Notification
+
+For automated vulnerability notifications:
+
+1. Set up [PyUp.io](https://pyup.io/) to monitor your dependencies.
+2. Configure GitHub's Dependabot alerts if your code is hosted on GitHub.
+3. Use a third-party security scanning service like Snyk or Sonatype.
+
+## Supply Chain Security
+
+### Understanding Supply Chain Attacks
+
+Supply chain attacks target the dependencies your project relies on. These can include:
+
+- Typosquatting attacks (malicious packages with names similar to popular packages)
+- Dependency confusion attacks
+- Compromised package maintainer accounts
+- Malicious code inserted into legitimate packages
+
+### Mitigating Supply Chain Risks
+
+1. **Use hash verification**:
+ Pipenv's hash verification in `Pipfile.lock` protects against many supply chain attacks.
+
+2. **Audit new dependencies**:
+ Before adding a new dependency, evaluate:
+ - Is it actively maintained?
+ - Does it have a good security track record?
+ - How many dependencies does it bring in?
+ - Is it widely used and reviewed by the community?
+
+3. **Consider vendoring critical dependencies**:
+ For mission-critical applications, consider vendoring (including the source code directly in your project) key dependencies.
+
+4. **Use a private package index**:
+ For high-security environments, maintain a private package index with vetted packages.
+
+## Security in CI/CD Pipelines
+
+### Secure Pipeline Configuration
+
+In your CI/CD pipeline:
+
+```yaml
+# Example GitHub Actions workflow
+name: Security Checks
+
+on:
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+ schedule:
+ - cron: '0 0 * * 0' # Weekly scan
+
+jobs:
+ security:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.10'
+ - name: Install pipenv
+ run: pip install pipenv
+ - name: Install dependencies
+ run: pipenv install --dev
+ - name: Verify Pipfile.lock
+ run: pipenv verify
+ - name: Security scan
+ run: pipenv check --scan
+```
+
+### Preventing Lock File Tampering
+
+To prevent tampering with your lock file:
+
+1. Verify the lock file hash in CI/CD:
+ ```bash
+ $ pipenv verify
+ ```
+
+2. Use signed commits in your version control system.
+
+3. Implement branch protection rules requiring code review before merging.
+
+## Environment Variable Security
+
+### Secure .env File Usage
+
+Pipenv automatically loads environment variables from `.env` files. To use them securely:
+
+1. **Never commit .env files to version control**:
+ ```bash
+ # .gitignore
+ .env
+ ```
+
+2. **Provide a template**:
+ ```bash
+ # .env.example (safe to commit)
+ DATABASE_URL=postgresql://user:password@localhost/dbname
+ SECRET_KEY=your-secret-key-here
+ ```
+
+3. **Use different .env files for different environments**:
+ ```bash
+ $ PIPENV_DOTENV_LOCATION=.env.production pipenv shell
+ ```
+
+### Handling Sensitive Data
+
+For sensitive data like API keys and passwords:
+
+1. Use environment variables instead of hardcoding values.
+
+2. Consider using a secrets management service like HashiCorp Vault, AWS Secrets Manager, or Azure Key Vault.
+
+3. For local development, use `.env` files but keep them out of version control.
+
+## Docker Security
+
+When using Pipenv with Docker:
+
+### Secure Dockerfile
+
+```dockerfile
+FROM python:3.10-slim AS builder
+
+WORKDIR /app
+
+# Copy dependency files
+COPY Pipfile Pipfile.lock ./
+
+# Install pipenv and dependencies
+RUN pip install --no-cache-dir pipenv && \
+ pipenv install --deploy --system && \
+ pip uninstall -y pipenv virtualenv-clone virtualenv
+
+# Use a smaller base image for the final image
+FROM python:3.10-slim
+
+WORKDIR /app
+
+# Copy only the installed packages from the builder stage
+COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages
+COPY --from=builder /usr/local/bin /usr/local/bin
+
+# Copy application code
+COPY . .
+
+# Run as non-root user
+RUN useradd -m appuser
+USER appuser
+
+# Run the application
+CMD ["python", "app.py"]
+```
+
+### Docker Security Best Practices
+
+1. Use multi-stage builds to reduce image size and attack surface.
+2. Run containers as a non-root user.
+3. Scan container images for vulnerabilities using tools like Trivy or Docker Scout.
+4. Use the `--deploy` flag to ensure consistent dependencies.
+5. Don't store secrets in Docker images.
+
+## Advanced Security Topics
+
+### Auditing Direct and Transitive Dependencies
+
+View your complete dependency graph:
+
+```bash
+$ pipenv graph
+```
+
+This helps you understand all the packages your project depends on, including transitive dependencies (dependencies of your dependencies).
+
+### Custom Security Policies
+
+For organizations with specific security requirements:
+
+1. Create a custom security policy that defines:
+ - Approved and prohibited packages
+ - Version pinning requirements
+ - Vulnerability handling procedures
+
+2. Implement custom checks in your CI/CD pipeline.
+
+3. Consider using tools like `pip-audit` or `safety` with custom vulnerability databases.
+
+### Air-Gapped Environments
+
+For environments without internet access:
+
+1. Download packages and their dependencies on a connected system:
+ ```bash
+ $ pipenv lock -r > requirements.txt
+ $ pip download -r requirements.txt -d ./packages
+ ```
+
+2. Transfer the packages directory to the air-gapped environment.
+
+3. Install from the local directory:
+ ```bash
+ $ pip install --no-index --find-links=./packages -r requirements.txt
+ ```
+
+## Security Incident Response
+
+If you discover a security vulnerability in a package:
+
+1. **Isolate**: Temporarily remove or isolate the affected component if possible.
+
+2. **Report**: Report the vulnerability to the package maintainers through their preferred channel (often GitHub issues or a security email).
+
+3. **Mitigate**: Apply temporary workarounds or patches as needed.
+
+4. **Update**: Once a fix is available, update to the patched version.
+
+5. **Document**: Document the incident and response for future reference.
+
+## Conclusion
+
+Pipenv provides powerful tools to help secure your Python projects, but security requires ongoing attention. By following these best practices, you can significantly reduce the risk of security vulnerabilities in your projects.
+
+Remember that security is a continuous process, not a one-time task. Regularly update dependencies, scan for vulnerabilities, and stay informed about security best practices in the Python ecosystem.
+
+For more information on Python security in general, refer to the [Python Security documentation](https://python-security.readthedocs.io/).
diff --git a/docs/shell.md b/docs/shell.md
new file mode 100644
index 0000000000..602f3cb684
--- /dev/null
+++ b/docs/shell.md
@@ -0,0 +1,416 @@
+# Shell Integration and Environment Management
+
+This guide covers Pipenv's shell integration features, environment variable management, and best practices for configuring your development environment.
+
+## Shell Integration
+
+Pipenv provides robust shell integration that allows you to work within your project's virtual environment seamlessly.
+
+### Activating the Virtual Environment
+
+To activate your project's virtual environment, use the `shell` command:
+
+```bash
+$ pipenv shell
+```
+
+This spawns a new shell subprocess with the virtual environment activated. You'll notice your shell prompt changes to indicate the active environment:
+
+```bash
+(project-a1b2c3) $
+```
+
+To exit the virtual environment and return to your normal shell, simply type:
+
+```bash
+$ exit
+```
+
+or press `Ctrl+D`.
+
+### Shell Activation Modes
+
+Pipenv supports two shell activation modes:
+
+1. **Compatibility Mode** (default): Uses a simpler approach that works in most shell environments
+2. **Fancy Mode**: Uses more advanced shell features for a better experience in properly configured shells
+
+To use fancy mode:
+
+```bash
+$ pipenv shell --fancy
+```
+
+### Running Commands Without Activation
+
+If you don't want to activate the full shell, you can run individual commands within the virtual environment:
+
+```bash
+$ pipenv run python script.py
+$ pipenv run pytest
+```
+
+This is particularly useful for one-off commands or in CI/CD pipelines.
+
+## Environment Variable Management
+
+### Automatic Loading of .env Files
+
+Pipenv automatically loads environment variables from `.env` files in your project directory when you use `pipenv shell` or `pipenv run`. This feature helps you manage environment-specific configuration without hardcoding values in your code.
+
+A typical `.env` file might look like this:
+
+```
+# .env
+DEBUG=True
+DATABASE_URL=postgresql://user:password@localhost/dbname
+SECRET_KEY=your-secret-key-here
+API_KEY=1234567890abcdef
+```
+
+When you run a command with Pipenv, these variables are automatically loaded:
+
+```bash
+$ pipenv run python
+Loading .env environment variables...
+Python 3.10.4 (default, Mar 23 2022, 17:29:05)
+[GCC 9.4.0] on linux
+Type "help", "copyright", "credits" or "license" for more information.
+>>> import os
+>>> os.environ['DEBUG']
+'True'
+>>> os.environ['DATABASE_URL']
+'postgresql://user:password@localhost/dbname'
+```
+
+### Variable Expansion in .env Files
+
+You can use variable expansion in your `.env` files using the `${VARNAME}` syntax:
+
+```
+# .env
+HOME_DIR=${HOME}
+CONFIG_PATH=${HOME_DIR}/.config/myapp
+LOG_DIR=${HOME_DIR}/logs
+```
+
+This allows you to define variables in terms of other variables, including system environment variables:
+
+```bash
+$ pipenv run python -c "import os; print(os.environ['CONFIG_PATH'])"
+Loading .env environment variables...
+/home/user/.config/myapp
+```
+
+### Custom .env File Location
+
+If your `.env` file is located in a different path or has a different name, you can specify its location:
+
+```bash
+$ PIPENV_DOTENV_LOCATION=/path/to/custom/.env pipenv shell
+```
+
+Or set it permanently in your shell configuration:
+
+```bash
+# Add to ~/.bashrc or ~/.zshrc
+export PIPENV_DOTENV_LOCATION=/path/to/custom/.env
+```
+
+### Disabling .env Loading
+
+In some cases, you might want to prevent Pipenv from loading `.env` files:
+
+```bash
+$ PIPENV_DONT_LOAD_ENV=1 pipenv shell
+```
+
+This is useful when you want to use system environment variables instead of those defined in the `.env` file.
+
+## Shell Completion
+
+Pipenv supports tab completion for commands, options, and arguments via
+[argcomplete](https://kislyuk.github.io/argcomplete/).
+
+### Installation
+
+Shell completion is an optional feature. Install it alongside pipenv:
+
+```bash
+pip install "pipenv[completion]"
+```
+
+Or install `argcomplete` separately:
+
+```bash
+pip install argcomplete
+```
+
+### Activation
+
+#### Bash
+
+Add the following line to your `~/.bashrc` (or `~/.bash_profile` on macOS):
+
+```bash
+eval "$(register-python-argcomplete pipenv)"
+```
+
+Then reload your shell:
+
+```bash
+source ~/.bashrc
+```
+
+#### Zsh
+
+Add to your `~/.zshrc`:
+
+```zsh
+autoload -U bashcompinit
+bashcompinit
+eval "$(register-python-argcomplete pipenv)"
+```
+
+Then reload:
+
+```zsh
+source ~/.zshrc
+```
+
+#### Fish
+
+```fish
+register-python-argcomplete --shell fish pipenv | source
+```
+
+To make it permanent, add the line above to `~/.config/fish/config.fish`.
+
+#### Global activation (all argcomplete-enabled tools at once)
+
+If you use multiple tools that support argcomplete, you can activate completion
+for all of them in one step:
+
+```bash
+activate-global-python-argcomplete
+```
+
+This installs a shell hook that handles any package that calls
+`argcomplete.autocomplete()`.
+
+### Verifying completion works
+
+After reloading your shell, type `pipenv ` and press `Tab` β you should see the
+list of available subcommands. Pressing `Tab` again after a partial subcommand
+name (e.g. `pipenv ins`) completes it to `pipenv install`.
+
+#### Git Bash (Windows)
+
+Git Bash supports bash completion. Add to your `~/.bashrc` (typically
+`C:\Users\\.bashrc`):
+
+```bash
+eval "$(register-python-argcomplete pipenv)"
+```
+
+Then restart Git Bash or run `source ~/.bashrc`.
+
+### Migrating from pipenv < 2026.5.0
+
+In older versions of pipenv (before 2026.5.0), shell completion was powered by
+Click and activated with the `_PIPENV_COMPLETE` environment variable:
+
+```bash
+# OLD method β no longer works in pipenv >= 2026.5.0
+eval "$(_PIPENV_COMPLETE=bash_source pipenv)" # bash
+eval "$(_PIPENV_COMPLETE=zsh_source pipenv)" # zsh
+_PIPENV_COMPLETE=fish_source pipenv | source # fish
+```
+
+Starting with pipenv 2026.5.0, shell completion uses
+[argcomplete](https://kislyuk.github.io/argcomplete/) instead. **Replace** the
+lines above with the `register-python-argcomplete` commands shown in the
+[Activation](#activation) section and make sure the `argcomplete` package is
+installed (`pip install "pipenv[completion]"`).
+
+### Troubleshooting
+
+If completion is not working:
+
+1. **Confirm argcomplete is installed** in the same environment as pipenv:
+ ```bash
+ pip show argcomplete
+ ```
+
+2. **Verify the activation line** is present in your shell startup file and
+ that the file is being sourced for interactive sessions.
+
+3. **Restart your shell** completely (not just `source`) if the hook was
+ recently added.
+
+4. **Check for errors** by running the registration command directly:
+ ```bash
+ register-python-argcomplete pipenv
+ ```
+ It should print a shell function definition without errors.
+
+5. **If you see a migration message** about `_PIPENV_COMPLETE`, you are using
+ the old activation method. See [Migrating from pipenv < 2026.5.0](#migrating-from-pipenv--202650)
+ above.
+
+## Best Practices for Shell Configuration
+
+### Proper PATH Configuration
+
+A common issue with shell integration is improper PATH configuration. Many shell configurations add to the PATH in every subshell, which can cause problems with virtual environments.
+
+The correct approach is to set environment variables like PATH only during login sessions, not in every subshell:
+
+#### Fish Shell
+
+```fish
+# ~/.config/fish/config.fish
+if status --is-login
+ set -gx PATH /usr/local/bin $PATH
+end
+```
+
+#### Bash/Zsh
+
+```bash
+# ~/.bashrc or ~/.zshrc
+if [[ -z $PIPENV_ACTIVE ]]; then
+ export PATH=/usr/local/bin:$PATH
+fi
+```
+
+### Environment-Specific Configuration
+
+For different environments (development, staging, production), use separate `.env` files:
+
+```bash
+# Development
+$ PIPENV_DOTENV_LOCATION=.env.development pipenv shell
+
+# Staging
+$ PIPENV_DOTENV_LOCATION=.env.staging pipenv shell
+
+# Production
+$ PIPENV_DOTENV_LOCATION=.env.production pipenv shell
+```
+
+### Security Considerations
+
+1. **Never commit `.env` files to version control**. Add them to your `.gitignore`:
+ ```
+ # .gitignore
+ .env
+ .env.*
+ ```
+
+2. **Provide a template** for required environment variables:
+ ```
+ # .env.example (safe to commit)
+ DEBUG=
+ DATABASE_URL=
+ SECRET_KEY=
+ ```
+
+3. **Use different variables for different environments** to prevent accidental use of development settings in production.
+
+## Advanced Shell Integration
+
+### Custom Scripts in Pipfile
+
+You can define custom scripts in your Pipfile for common tasks:
+
+```toml
+[scripts]
+start = "python app.py"
+test = "pytest"
+lint = "flake8 ."
+```
+
+Then run them with:
+
+```bash
+$ pipenv run start
+$ pipenv run test
+```
+
+### Shell Hooks
+
+Some shells support hooks that can automatically activate virtual environments when entering a directory:
+
+#### Direnv Integration
+
+[direnv](https://direnv.net/) is a tool that can automatically load/unload environment variables based on the current directory:
+
+```bash
+# .envrc
+layout pipenv
+```
+
+This automatically activates the Pipenv environment when entering the directory.
+
+#### Zsh Autoenv
+
+For zsh users, [zsh-autoenv](https://github.com/Tarrasch/zsh-autoenv) can automatically activate/deactivate environments:
+
+```bash
+# .autoenv.zsh
+pipenv shell
+```
+
+```bash
+# .autoenv_leave.zsh
+exit
+```
+
+## Troubleshooting Shell Integration
+
+### Shell Activation Issues
+
+If `pipenv shell` doesn't work correctly:
+
+1. **Check your shell configuration** for conflicts with Pipenv
+2. **Try compatibility mode** (the default) if fancy mode doesn't work
+3. **Use `pipenv run`** as an alternative to shell activation
+
+### Environment Variable Problems
+
+If environment variables aren't being loaded correctly:
+
+1. **Check your `.env` file syntax** for errors
+2. **Verify the file location** is correct
+3. **Ensure the file is readable** by your user
+4. **Check for conflicting environment variables** in your shell
+
+### Shell Completion Issues
+
+See the [Troubleshooting](#troubleshooting) section under *Shell Completion* above.
+
+## Using Python-Dotenv
+
+Pipenv uses [python-dotenv](https://github.com/theskumar/python-dotenv) internally to load `.env` files. For more advanced usage, you can use this library directly in your code:
+
+```python
+# app.py
+from dotenv import load_dotenv
+import os
+
+# Load .env file manually (Pipenv does this automatically)
+load_dotenv()
+
+# Access environment variables
+debug = os.environ.get("DEBUG", "False") == "True"
+database_url = os.environ["DATABASE_URL"]
+```
+
+This gives you more control over how environment variables are loaded and used in your application.
+
+## Conclusion
+
+Pipenv's shell integration and environment variable management features provide a powerful way to manage your Python development environment. By understanding and using these features effectively, you can create a more productive and secure development workflow.
+
+Remember to follow best practices for shell configuration and environment variable management to avoid common issues and ensure a smooth experience with Pipenv.
diff --git a/docs/specifiers.md b/docs/specifiers.md
new file mode 100644
index 0000000000..637d12f3e0
--- /dev/null
+++ b/docs/specifiers.md
@@ -0,0 +1,464 @@
+# Version Specifiers
+
+This guide explains how to specify versions of packages and Python interpreters in Pipenv, including syntax, best practices, and advanced usage patterns.
+
+## Package Version Specifiers
+
+Pipenv uses the same version specifier format as pip, following [PEP 440](https://www.python.org/dev/peps/pep-0440/) standards. These specifiers allow you to control exactly which versions of packages are installed.
+
+### Basic Version Specifiers
+
+| Specifier | Example | Meaning |
+|-----------|---------|---------|
+| `==` | `requests==2.28.1` | Exact version |
+| `>=` | `requests>=2.20.0` | Minimum version |
+| `<=` | `requests<=2.30.0` | Maximum version |
+| `>` | `requests>2.0.0` | Greater than version |
+| `<` | `requests<3.0.0` | Less than version |
+| `!=` | `requests!=2.29.0` | Not equal to version |
+| `~=` | `requests~=2.28.0` | Compatible release (equivalent to `>=2.28.0,<2.29.0`) |
+| `*` | `requests==*` | Any version (not recommended for production) |
+
+### Combining Version Specifiers
+
+You can combine specifiers to create version ranges:
+
+```bash
+# Install any version between 2.20.0 and 3.0.0
+$ pipenv install "requests>=2.20.0,<3.0.0"
+```
+
+```{note}
+The use of double quotes around the package and version specification (i.e. `"requests>=2.20.0,<3.0.0"`) is highly recommended to avoid issues with shell interpretation, especially on Unix-based systems.
+```
+
+### Compatible Release Operator
+
+The `~=` operator (compatible release) is particularly useful:
+
+```bash
+# Install version 2.28.* (>=2.28.0,<2.29.0)
+$ pipenv install "requests~=2.28.0"
+
+# Install version 2.* (>=2.0.0,<3.0.0)
+$ pipenv install "requests~=2.0"
+```
+
+This ensures you get bug fixes (micro version updates) but not potentially breaking changes (major or minor version updates, depending on how you specify it).
+
+### Wildcard Versions
+
+While not recommended for production, you can use wildcards:
+
+```bash
+# Install the latest version
+$ pipenv install "requests==*"
+# or simply
+$ pipenv install requests
+```
+
+### Pre-release Versions
+
+By default, Pipenv doesn't install pre-release versions. To include them:
+
+```bash
+# Command line flag
+$ pipenv install --pre "requests>=2.0.0"
+
+# Or in Pipfile
+# [pipenv]
+# allow_prereleases = true
+```
+
+## Python Version Specifiers
+
+### Specifying Python Version for a Project
+
+You can specify which Python version to use when creating a virtual environment:
+
+```bash
+# Use Python 3
+$ pipenv --python 3
+
+# Use Python 3.10 specifically
+$ pipenv --python 3.10
+
+# Use a specific Python executable
+$ pipenv --python /usr/local/bin/python3.10
+```
+
+This creates a `Pipfile` with a `[requires]` section:
+
+```toml
+[requires]
+python_version = "3.10"
+```
+
+### Python Version vs. Full Version
+
+You can specify either a Python version or a full version:
+
+```toml
+# In your Pipfile
+[requires]
+python_version = "3.10" # Any 3.10.x version
+```
+
+Or for more specific control:
+
+```toml
+# In your Pipfile
+[requires]
+python_full_version = "3.10.4" # Exactly Python 3.10.4
+```
+
+```{warning}
+**`python_version` only accepts an exact version string**, such as `"3.10"` or `"3"`.
+It does **not** accept version range specifiers like `">= 3.6"` or `"~= 3.9"`.
+
+If you write `python_version = ">= 3.6"`, Pipenv will warn that the required Python
+version was not found and may behave unexpectedly:
+
+ Warning: Python >= 3.6 was not found on your system...
+ Warning: Your Pipfile requires python_version >= 3.6, but you are using 3.9.2 (...)
+
+To express a minimum Python requirement, simply set the lowest version you support
+as the exact `python_version` (e.g. `python_version = "3.9"`). If you need
+a fully exact pin, use `python_full_version` instead (e.g. `python_full_version = "3.9.7"`).
+```
+
+### Python Version Selection Logic
+
+When you run `pipenv install` without specifying a Python version:
+
+1. Pipenv checks the `[requires]` section in the `Pipfile`
+2. If `python_full_version` is specified, it tries to use that exact version
+3. If `python_version` is specified, it tries to find a compatible version
+4. If neither is specified, it uses the default Python interpreter
+
+## Advanced Version Specifiers
+
+### VCS Dependencies
+
+You can install packages directly from version control systems:
+
+```bash
+# From a Git repository
+$ pipenv install -e git+https://github.com/requests/requests.git@v2.31.0#egg=requests
+```
+
+The format follows this pattern:
+
+```
++:////@#egg=
+```
+
+Where:
+- `` can be `git`, `bzr`, `svn`, or `hg`
+- `` can be `http`, `https`, `ssh`, or `file`
+- `@` is optional and specifies a specific branch, tag, or commit
+
+This will be reflected in your `Pipfile`:
+
+```toml
+[packages]
+requests = {editable = true, git = "https://github.com/requests/requests.git", ref = "v2.31.0"}
+```
+
+### Local Path Dependencies
+
+You can install packages from a local path using the `path` attribute:
+
+```bash
+# Install a local package in editable mode
+$ pipenv install -e ./path/to/package
+
+# Install the current directory as an editable package
+$ pipenv install -e .
+```
+
+This will be reflected in your `Pipfile`:
+
+```toml
+[packages]
+my-package = {editable = true, path = "./path/to/package"}
+# or, for the current directory:
+my-package = {editable = true, path = "."}
+```
+
+To install a local package without editable mode:
+
+```bash
+$ pipenv install ./path/to/package
+```
+
+```toml
+[packages]
+my-package = {path = "./path/to/package"}
+```
+
+### Remote File URL Dependencies
+
+You can install packages directly from a remote URL (wheel or source distribution)
+using the `file` attribute:
+
+```bash
+$ pipenv install https://example.com/packages/my-package-1.0.tar.gz
+```
+
+This will be reflected in your `Pipfile`:
+
+```toml
+[packages]
+my-package = {file = "https://example.com/packages/my-package-1.0.tar.gz"}
+```
+
+> **`path` vs `file`**: use `path` for local filesystem locations (e.g., `.` or
+> `./libs/my-package`) and `file` for remote HTTP/HTTPS URLs.
+
+### Platform-Specific Dependencies
+
+You can specify that a package should only be installed on certain platforms using [PEP 508](https://www.python.org/dev/peps/pep-0508/) markers:
+
+```bash
+# Install pywinusb only on Windows
+$ pipenv install "pywinusb ; sys_platform == 'win32'"
+```
+
+This will be reflected in your `Pipfile`:
+
+```toml
+[packages]
+pywinusb = {version = "*", markers = "sys_platform == 'win32'"}
+```
+
+#### Shorthand Marker Keys
+
+In addition to the full `markers` syntax, Pipenv supports shorthand keys for common markers directly in Pipfile entries:
+
+```toml
+[packages]
+# These two forms are equivalent:
+pywinusb = {version = "*", markers = "sys_platform == 'win32'"}
+pywinusb = {version = "*", sys_platform = "== 'win32'"}
+
+# Platform-specific using platform_machine:
+special-arm-lib = {version = "*", platform_machine = "== 'arm64'"}
+
+# macOS-only dependency:
+pyobjc = {version = "*", sys_platform = "== 'darwin'"}
+```
+
+Any key from the [PEP 508 environment markers](https://peps.python.org/pep-0508/#environment-markers) can be used as a shorthand.
+
+#### Platform Markers and Locking
+
+```{important}
+When `pipenv lock` runs, pip resolves **all** packages in your `Pipfile`, regardless of
+platform markers. If a package with a `sys_platform == 'win32'` marker is listed and
+pip cannot find a matching distribution for it on your current platform (e.g. Linux),
+you may see an error like:
+
+ ERROR: No matching distribution found for pywin32
+
+This happens because pip's resolver attempts to download metadata for all listed packages
+and some Windows-only packages do not publish distributions for Linux/macOS.
+
+**Workaround:** Ensure the package supports all platforms at the *metadata* level, or
+split Windows-specific packages into a separate Pipfile or category. For packages that
+truly have no Linux/macOS releases at all, consider managing them outside of Pipenv for
+the non-Windows environments.
+```
+
+#### Architecture-Specific Dependencies
+
+Use the `platform_machine` marker to target specific CPU architectures:
+
+```toml
+[packages]
+# Only install on ARM64 (e.g., Apple Silicon Macs, ARM Linux)
+arm-optimized = {version = "*", platform_machine = "== 'arm64'"}
+
+# Only install on x86_64 systems
+x86-optimized = {version = "*", platform_machine = "== 'x86_64'"}
+
+# macOS on Apple Silicon only
+macos-arm = {version = "*", markers = "sys_platform == 'darwin' and platform_machine == 'arm64'"}
+```
+
+Common `platform_machine` values:
+- `x86_64` β 64-bit Intel/AMD (Linux, macOS)
+- `arm64` β ARM 64-bit (Apple Silicon macOS)
+- `aarch64` β ARM 64-bit (Linux)
+- `AMD64` β 64-bit Intel/AMD (Windows)
+
+> **Note:** `platform_machine` controls *whether* a package is installed based on the
+> current machine's architecture. It does not control *which wheel variant* pip selects
+> (e.g., it cannot force pip to choose a `universal2` wheel over an `arm64` wheel).
+> To install a specific wheel file, use the `file` or `path` attribute instead β see
+> [Local and Remote File Dependencies](pipfile.md#local-and-remote-file-dependencies).
+
+### Python Version-Specific Dependencies
+
+You can specify dependencies that are only needed for certain Python versions:
+
+```toml
+[packages]
+typing = {version = ">=3.6.2", markers = "python_version < '3.5'"}
+dataclasses = {version = ">=0.8", markers = "python_version < '3.7'"}
+```
+
+### Complex Markers
+
+You can use complex logical expressions in markers:
+
+```toml
+[packages]
+unittest2 = {version = ">=1.0,<3.0", markers = "python_version < '2.7.9' or (python_version >= '3.0' and python_version < '3.4')"}
+```
+
+Common markers include:
+- `python_version`: Python version in 'X.Y' format
+- `python_full_version`: Python version in 'X.Y.Z' format
+- `sys_platform`: Platform name (e.g., 'win32', 'linux', 'darwin')
+- `platform_machine`: Machine type (e.g., 'x86_64', 'arm64', 'aarch64', 'AMD64')
+- `platform_system`: Operating system name (e.g., 'Linux', 'Darwin', 'Windows')
+- `platform_python_implementation`: Python implementation (e.g., 'CPython', 'PyPy')
+- `os_name`: Name of the operating system (e.g., 'posix', 'nt')
+
+### Package Extras
+
+Many packages provide optional features as "extras":
+
+```bash
+# Install requests with the 'security' and 'socks' extras
+$ pipenv install "requests[security,socks]"
+```
+
+This will be reflected in your `Pipfile`:
+
+```toml
+[packages]
+requests = {version = "*", extras = ["security", "socks"]}
+```
+
+## Package Categories
+
+Pipenv supports organizing dependencies into different categories beyond the standard `packages` and `dev-packages`.
+
+### Defining Custom Categories
+
+In your `Pipfile`:
+
+```toml
+[packages]
+requests = "*"
+
+[dev-packages]
+pytest = "*"
+
+[docs]
+sphinx = "*"
+sphinx-rtd-theme = "*"
+
+[tests]
+pytest-cov = "*"
+```
+
+### Installing Specific Categories
+
+```bash
+# Install a package in a specific category
+$ pipenv install sphinx --categories="docs"
+
+# Install all packages from specific categories
+$ pipenv install --categories="docs,tests"
+```
+
+### Locking Specific Categories
+
+```bash
+# Lock only specific categories
+$ pipenv lock --categories="docs,tests"
+```
+
+## Best Practices
+
+### For Applications
+
+For applications, use specific versions to ensure stability:
+
+```toml
+[packages]
+# Exact version for critical dependencies
+requests = "==2.28.1"
+# Compatible release for less critical dependencies
+flask = "~=2.0.1"
+# Version range for flexible dependencies
+urllib3 = ">=1.26.0,<2.0.0"
+```
+
+### For Libraries
+
+For libraries, use more flexible version constraints:
+
+```toml
+[packages]
+# Minimum version only
+requests = ">=2.20.0"
+# Upper bound to prevent incompatible versions
+urllib3 = "<2.0.0"
+```
+
+### Security Considerations
+
+- Regularly update dependencies to get security fixes
+- Use `pipenv scan` to check for vulnerabilities
+- Avoid using `*` or very loose constraints in production
+- Consider using hash verification with `pipenv lock`
+
+### Dependency Resolution
+
+When specifying versions, consider:
+
+1. **Compatibility**: Ensure your constraints don't conflict with other packages
+2. **Flexibility**: Overly strict constraints can make dependency resolution difficult
+3. **Security**: Too loose constraints might introduce vulnerabilities
+4. **Stability**: Balance between getting updates and maintaining stability
+
+## Troubleshooting
+
+### Common Issues
+
+#### Version Conflict Resolution
+
+If you encounter version conflicts:
+
+```bash
+# Try with verbose output to see the conflict
+$ pipenv install --verbose
+
+# Try relaxing version constraints
+# Instead of requests==2.28.1, try requests~=2.28.0
+```
+
+#### No Matching Distribution Found
+
+If pip can't find a matching distribution:
+
+1. Check that the version exists on PyPI
+2. Verify your version specifier syntax
+3. Consider if you need pre-release versions (`--pre`)
+
+#### Dependency Resolution Failures
+
+If Pipenv can't resolve dependencies:
+
+```bash
+# Clear the cache and try again
+$ pipenv lock --clear
+```
+
+## Conclusion
+
+Understanding version specifiers is crucial for effective dependency management with Pipenv. By using the right specifiers, you can balance stability, security, and flexibility in your Python projects.
diff --git a/docs/spelling_wordlist.txt b/docs/spelling_wordlist.txt
new file mode 100644
index 0000000000..219984ec6b
--- /dev/null
+++ b/docs/spelling_wordlist.txt
@@ -0,0 +1,87 @@
+appdir
+ascii
+asdf
+backport
+bashrc
+bundler
+canonicalized
+cmder
+Cmder
+codebase
+Conda
+CPython
+cygwin
+Deduplicate
+Devops
+eval
+filesystem
+Homebrew
+ini
+installable
+Integrations
+io
+js
+json
+Linuxbrew
+lockfile
+macOS
+Makefile
+manpage
+metadata
+mingw
+misconfiguration
+misconfigured
+msys
+natively
+npm
+parallelization
+parsers
+pathlib
+pexpect
+pipenv
+Pipenv
+Pipfile
+Pipfiles
+piptools
+powershell
+Powershell
+pre
+py
+pyenv
+pypi
+PyPI
+pythonfinder
+resolvers
+runtime
+runtimes
+sayers
+scandir
+sha
+stateful
+subdirectory
+subprocess
+subprocesses
+subshell
+supervisord
+tox
+Tox
+tracebacks
+triaging
+txt
+unicode
+uninstallation
+unnesting
+untrusted
+url
+urls
+UTF
+vcs
+vendored
+Vendored
+venv
+virtualenv
+virtualenvs
+Virtualenv
+Virtualenvs
+zsh
+zshrc
diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md
new file mode 100644
index 0000000000..50ab8310e9
--- /dev/null
+++ b/docs/troubleshooting.md
@@ -0,0 +1,624 @@
+# Pipenv Troubleshooting Guide
+
+This guide provides solutions for common issues you might encounter when using Pipenv. Each section addresses a specific problem area with detailed explanations and step-by-step solutions.
+
+## Installation Issues
+
+### Pipenv Not Found After Installation
+
+**Problem**: You've installed Pipenv, but the `pipenv` command isn't recognized.
+
+**Solution**:
+
+1. Check if Pipenv was installed in user mode:
+ ```bash
+ $ python -m pipenv --version
+ ```
+
+2. If that works, add the user site-packages binary directory to your PATH:
+
+ **On Linux/macOS**:
+ ```bash
+ # Find the user base binary directory
+ $ python -m site --user-base
+ /home/username/.local
+
+ # Add to PATH (add this to your ~/.bashrc or ~/.zshrc)
+ $ export PATH="$HOME/.local/bin:$PATH"
+ ```
+
+ **On Windows**:
+ ```powershell
+ # Find the user site-packages directory
+ > python -m site --user-site
+ C:\Users\Username\AppData\Roaming\Python\Python39\site-packages
+
+ # Add the Scripts directory to PATH (replace 'site-packages' with 'Scripts')
+ # Add C:\Users\Username\AppData\Roaming\Python\Python39\Scripts to your PATH
+ ```
+
+3. Restart your terminal or run `source ~/.bashrc` (or equivalent) to apply changes.
+
+### Permission Errors During Installation
+
+**Problem**: You encounter permission errors when installing Pipenv.
+
+**Solution**:
+
+1. Use the `--user` flag to install in your home directory:
+ ```bash
+ $ pip install --user pipenv
+ ```
+
+2. If you need a system-wide installation, use sudo (not recommended):
+ ```bash
+ $ sudo pip install pipenv
+ ```
+
+3. Consider using a user-managed Python installation like pyenv or conda.
+
+## Virtual Environment Issues
+
+### Virtual Environment Creation Fails
+
+**Problem**: Pipenv fails to create a virtual environment.
+
+**Solution**:
+
+1. Check Python availability:
+ ```bash
+ $ python --version
+ ```
+
+2. Ensure you have permissions to write to the virtualenv directory:
+ ```bash
+ # Try creating the virtualenv in the project directory
+ $ export PIPENV_VENV_IN_PROJECT=1
+ $ pipenv install
+ ```
+
+3. Check for conflicting environment variables:
+ ```bash
+ $ pipenv --support
+ ```
+
+4. Try specifying the Python version explicitly:
+ ```bash
+ $ pipenv --python 3.10
+ ```
+
+5. Install virtualenv separately if needed:
+ ```bash
+ $ pip install virtualenv
+ $ export PIPENV_VIRTUALENV=$(which virtualenv)
+ $ pipenv install
+ ```
+
+### Can't Find or Activate Virtual Environment
+
+**Problem**: Pipenv can't find or activate the virtual environment.
+
+**Solution**:
+
+1. Check if the virtual environment exists:
+ ```bash
+ $ pipenv --venv
+ ```
+
+2. If it doesn't exist, create it:
+ ```bash
+ $ pipenv install
+ ```
+
+3. If it exists but can't be activated, try recreating it:
+ ```bash
+ $ pipenv --rm
+ $ pipenv install
+ ```
+
+4. Check for path issues in the virtual environment:
+ ```bash
+ $ pipenv --py
+ ```
+
+### Shell Activation Problems
+
+**Problem**: `pipenv shell` doesn't work correctly.
+
+**Solution**:
+
+1. Try compatibility mode:
+ ```bash
+ $ pipenv shell
+ ```
+
+2. Check your shell configuration files for conflicts.
+
+3. Try with the `--fancy` flag:
+ ```bash
+ $ pipenv shell --fancy
+ ```
+
+4. If all else fails, use `pipenv run` instead:
+ ```bash
+ $ pipenv run python
+ ```
+
+## Dependency Management Issues
+
+### Lock File Generation Fails
+
+**Problem**: `pipenv lock` fails to generate a lock file.
+
+**Solution**:
+
+1. Check for conflicting dependencies in your Pipfile:
+ ```bash
+ $ pipenv graph
+ ```
+
+2. Clear the cache and try again:
+ ```bash
+ $ pipenv lock --clear
+ ```
+
+3. Try with verbose output to see what's happening:
+ ```bash
+ $ pipenv lock --verbose
+ ```
+
+4. Check for incompatible version specifiers:
+ ```bash
+ # Example of conflicting requirements
+ # package-a requires package-c>=2.0.0
+ # package-b requires package-c<2.0.0
+ ```
+
+5. For complex dependency trees, increase the maximum depth:
+ ```bash
+ $ export PIPENV_MAX_DEPTH=20
+ $ pipenv lock
+ ```
+
+### Hash Mismatch Errors
+
+**Problem**: You see "Hash mismatch" or "Pipfile.lock is out of date" errors.
+
+**Solution**:
+
+1. Update the lock file:
+ ```bash
+ $ pipenv lock
+ ```
+
+2. If you're in a deployment context and want to fail rather than update:
+ ```bash
+ $ pipenv install --deploy
+ ```
+
+3. If you're sure your Pipfile.lock is correct, you can force installation:
+ ```bash
+ $ pipenv install --ignore-pipfile
+ ```
+
+4. For persistent issues, try clearing the cache:
+ ```bash
+ $ pipenv lock --clear
+ ```
+
+### Package Installation Failures
+
+**Problem**: Packages fail to install with errors.
+
+**Solution**:
+
+1. Check for network issues:
+ ```bash
+ $ ping pypi.org
+ ```
+
+2. Try increasing the timeout:
+ ```bash
+ $ export PIPENV_TIMEOUT=60
+ $ pipenv install
+ ```
+
+3. Check if the package exists and the version is correct:
+ ```bash
+ $ pip search package-name # Note: pip search is deprecated
+ # Or visit https://pypi.org/project/package-name/
+ ```
+
+4. For packages with C extensions, ensure you have the necessary build tools:
+ ```bash
+ # On Ubuntu/Debian
+ $ sudo apt-get install build-essential python3-dev
+
+ # On macOS
+ $ xcode-select --install
+
+ # On Windows
+ # Install Visual C++ Build Tools
+ ```
+
+5. Try installing with verbose output:
+ ```bash
+ $ pipenv install package-name --verbose
+ ```
+
+### Package Names with Dots or Special Characters
+
+**Problem**: Installing packages with dots in their names (e.g., `mach.py`, `zope.interface`) fails with resolution errors.
+
+**Cause**: The shell may interpret the dot as a path separator or file extension before passing the argument to pipenv.
+
+**Solution**: Enclose package names containing dots or special characters in quotes:
+
+```bash
+# This may fail:
+$ pipenv install mach.py
+
+# Use quotes instead:
+$ pipenv install "mach.py"
+```
+
+In your Pipfile, package names with dots should also be quoted:
+
+```toml
+[packages]
+"mach.py" = "*"
+"zope.interface" = ">=5.0"
+```
+
+### Dependency Resolution Conflicts
+
+**Problem**: Pipenv can't resolve dependencies due to conflicts.
+
+**Solution**:
+
+1. Visualize the dependency graph:
+ ```bash
+ $ pipenv graph
+ ```
+
+2. Identify conflicting requirements and adjust version constraints in your Pipfile.
+
+3. Try relaxing version constraints if appropriate:
+ ```toml
+ # Instead of
+ package = "==1.2.3"
+
+ # Try
+ package = ">=1.2.0,<2.0.0"
+ ```
+
+4. For complex conflicts, try installing dependencies one by one to identify the problematic package.
+
+5. Consider using custom package categories to manage conflicting dependencies.
+
+## Performance Issues
+
+### Slow Installation or Lock Generation
+
+**Problem**: Pipenv operations are very slow.
+
+**Solution**:
+
+1. Use a local PyPI mirror or cache:
+ ```bash
+ $ export PIPENV_PYPI_MIRROR=https://pypi.tuna.tsinghua.edu.cn/simple
+ ```
+
+2. Skip lock file generation during development:
+ ```bash
+ $ export PIPENV_SKIP_LOCK=1
+ $ pipenv install package-name
+ ```
+ **Note**: Remember to run `pipenv lock` before committing changes.
+
+3. Use `pipenv sync` instead of `pipenv install` when you just need to install packages:
+ ```bash
+ $ pipenv sync
+ ```
+
+4. Optimize your Pipfile by removing unnecessary constraints.
+
+5. Consider using a faster resolver:
+ ```bash
+ $ pip install pipenv-faster
+ $ pipenv-faster install
+ ```
+
+### High Memory Usage
+
+**Problem**: Pipenv uses excessive memory, especially during lock file generation.
+
+**Solution**:
+
+1. Simplify your dependency tree if possible.
+
+2. Increase available memory or use a machine with more resources for lock file generation.
+
+3. Break down complex projects into smaller components with separate Pipfiles.
+
+4. Try clearing the cache before operations:
+ ```bash
+ $ pipenv lock --clear
+ ```
+
+## Path and Location Issues
+
+### Wrong Python Version Used
+
+**Problem**: Pipenv uses a different Python version than expected.
+
+**Solution**:
+
+1. Specify the Python version explicitly:
+ ```bash
+ $ pipenv --python 3.10
+ ```
+
+2. Check which Python is being used:
+ ```bash
+ $ pipenv run which python
+ $ pipenv run python --version
+ ```
+
+3. If using pyenv, ensure it's properly configured:
+ ```bash
+ $ pyenv versions
+ $ pyenv local 3.10.0
+ $ pipenv install
+ ```
+
+4. Set the Python version in your Pipfile:
+ ```toml
+ [requires]
+ python_version = "3.10"
+ ```
+
+### Pipfile Not Found
+
+**Problem**: Pipenv can't find the Pipfile.
+
+**Solution**:
+
+1. Check if you're in the correct directory:
+ ```bash
+ $ ls -la | grep Pipfile
+ ```
+
+2. Create a new Pipfile if needed:
+ ```bash
+ $ pipenv install
+ ```
+
+3. Specify a custom Pipfile location:
+ ```bash
+ $ export PIPENV_PIPFILE=/path/to/Pipfile
+ $ pipenv install
+ ```
+
+4. Check if the Pipfile has the correct format and is valid TOML.
+
+### Virtualenv Path Too Long
+
+**Problem**: The virtualenv path is too long, causing issues on Windows.
+
+**Solution**:
+
+1. Use a custom virtualenv name:
+ ```bash
+ $ export PIPENV_CUSTOM_VENV_NAME=myproject
+ $ pipenv install
+ ```
+
+2. Store the virtualenv in the project directory:
+ ```bash
+ $ export PIPENV_VENV_IN_PROJECT=1
+ $ pipenv install
+ ```
+
+3. Move your project to a shorter path.
+
+## Integration Issues
+
+### IDE Integration Problems
+
+**Problem**: Your IDE doesn't recognize the Pipenv virtual environment.
+
+**Solution**:
+
+1. Find the path to the virtualenv:
+ ```bash
+ $ pipenv --venv
+ ```
+
+2. Configure your IDE to use this path:
+ - **VS Code**: Add to settings.json:
+ ```json
+ {
+ "python.defaultInterpreterPath": "/path/to/virtualenv/bin/python"
+ }
+ ```
+ - **PyCharm**: Settings β Project β Python Interpreter β Add β Existing Environment β Select the python executable from the virtualenv
+
+3. For VS Code, install the Python extension and select the interpreter.
+
+4. For some IDEs, creating the virtualenv in the project directory helps:
+ ```bash
+ $ export PIPENV_VENV_IN_PROJECT=1
+ $ pipenv install
+ ```
+
+### CI/CD Pipeline Issues
+
+**Problem**: Pipenv doesn't work correctly in CI/CD pipelines.
+
+**Solution**:
+
+1. Use non-interactive mode:
+ ```bash
+ $ export PIPENV_NOSPIN=1
+ $ export PIPENV_QUIET=1
+ $ export PIPENV_YES=1
+ ```
+
+2. Ensure the lock file is up-to-date before the pipeline runs:
+ ```bash
+ $ pipenv verify
+ ```
+
+3. Use `--deploy` to fail if the lock file is out of date:
+ ```bash
+ $ pipenv install --deploy
+ ```
+
+4. Cache the virtualenv between runs if possible.
+
+5. For Docker-based CI, consider installing directly to the system:
+ ```bash
+ $ pipenv install --system --deploy
+ ```
+
+## Environment Variable and Configuration Issues
+
+### .env File Not Loaded
+
+**Problem**: Environment variables from .env files aren't being loaded.
+
+**Solution**:
+
+1. Check if the .env file exists in the project directory:
+ ```bash
+ $ ls -la .env
+ ```
+
+2. Ensure the file has the correct format:
+ ```
+ # .env file
+ KEY=VALUE
+ ```
+
+3. Specify a custom .env file location:
+ ```bash
+ $ export PIPENV_DOTENV_LOCATION=/path/to/.env
+ $ pipenv shell
+ ```
+
+4. Check if .env loading is disabled:
+ ```bash
+ $ export PIPENV_DONT_LOAD_ENV=0
+ $ pipenv shell
+ ```
+
+5. Verify the environment variables are loaded:
+ ```bash
+ $ pipenv shell
+ $ python -c "import os; print(os.environ.get('KEY'))"
+ ```
+
+### Configuration Conflicts
+
+**Problem**: Conflicting configuration settings cause unexpected behavior.
+
+**Solution**:
+
+1. Check all active environment variables:
+ ```bash
+ $ pipenv --support
+ ```
+
+2. Look for conflicting settings in:
+ - Environment variables
+ - pip configuration files
+ - .env files
+
+3. Reset to default settings:
+ ```bash
+ # Unset all PIPENV_ environment variables
+ $ unset $(env | grep PIPENV_ | cut -d= -f1)
+ ```
+
+4. Start with minimal configuration and add settings one by one.
+
+## Upgrading and Migration Issues
+
+### Upgrading Pipenv
+
+**Problem**: Issues after upgrading Pipenv.
+
+**Solution**:
+
+1. Check the changelog for breaking changes:
+ ```bash
+ $ pip install pipenv==latest
+ $ pipenv --version
+ ```
+
+2. Clear the cache after upgrading:
+ ```bash
+ $ pipenv --clear
+ ```
+
+3. Recreate the virtual environment:
+ ```bash
+ $ pipenv --rm
+ $ pipenv install
+ ```
+
+4. If problems persist, try a clean installation:
+ ```bash
+ $ pip uninstall -y pipenv
+ $ pip install pipenv
+ ```
+
+### Migrating from requirements.txt
+
+**Problem**: Issues when migrating from requirements.txt to Pipenv.
+
+**Solution**:
+
+1. Import requirements.txt carefully:
+ ```bash
+ $ pipenv install -r requirements.txt
+ ```
+
+2. Review the generated Pipfile and adjust as needed:
+ ```bash
+ $ cat Pipfile
+ ```
+
+3. Remove overly strict version constraints if appropriate.
+
+4. Separate development dependencies:
+ ```bash
+ $ pipenv install pytest --dev
+ ```
+
+5. Generate a lock file:
+ ```bash
+ $ pipenv lock
+ ```
+
+## Getting Help
+
+If you're still experiencing issues:
+
+1. Generate detailed environment information:
+ ```bash
+ $ pipenv --support
+ ```
+
+2. Check the [Pipenv GitHub issues](https://github.com/pypa/pipenv/issues) for similar problems.
+
+3. Include the following when asking for help:
+ - Pipenv version: `pipenv --version`
+ - Python version: `python --version`
+ - Operating system and version
+ - The command you ran and the full error output
+ - The output of `pipenv --support`
+ - Your Pipfile (with sensitive information removed)
+
+4. For security vulnerabilities, follow the [security policy](https://github.com/pypa/pipenv/security/policy).
diff --git a/docs/virtualenv.md b/docs/virtualenv.md
new file mode 100644
index 0000000000..a5b7ec7a5b
--- /dev/null
+++ b/docs/virtualenv.md
@@ -0,0 +1,379 @@
+# Virtual Environments
+
+This guide explains how Pipenv manages virtual environments, including customization options, best practices, and troubleshooting tips.
+
+## Understanding Virtual Environments
+
+### What is a Virtual Environment?
+
+A virtual environment is an isolated Python environment that allows you to install packages for a specific project without affecting your system Python installation or other projects. This isolation helps prevent dependency conflicts and ensures reproducible environments.
+
+### How Pipenv Uses Virtual Environments
+
+Pipenv automatically creates and manages virtual environments for your projects. When you run `pipenv install` for the first time in a project, Pipenv:
+
+1. Creates a new virtual environment for your project
+2. Installs the specified packages into that environment
+3. Creates a `Pipfile` and `Pipfile.lock` to track dependencies
+
+## Virtual Environment Location
+
+### Default Location
+
+By default, Pipenv stores virtual environments in a centralized location:
+
+- **On Linux/macOS**: `~/.local/share/virtualenvs/`
+- **On Windows**: `%USERPROFILE%\.virtualenvs\`
+
+The virtual environment name is derived from the project directory name plus a hash of the full path to ensure uniqueness. For example, a project in `/home/user/projects/myproject` might have a virtual environment named `myproject-a1b2c3d4`.
+
+### Finding Your Virtual Environment
+
+To find the path to your project's virtual environment:
+
+```bash
+$ pipenv --venv
+/home/user/.local/share/virtualenvs/myproject-a1b2c3d4
+```
+
+To find the Python interpreter path:
+
+```bash
+$ pipenv --py
+/home/user/.local/share/virtualenvs/myproject-a1b2c3d4/bin/python
+```
+
+## Customizing Virtual Environment Location
+
+### Project-Local Virtual Environments
+
+You can tell Pipenv to create the virtual environment in your project directory by setting the `PIPENV_VENV_IN_PROJECT` environment variable:
+
+```bash
+$ export PIPENV_VENV_IN_PROJECT=1
+$ pipenv install
+```
+
+This creates a `.venv` directory in your project, making it easier to find and manage.
+
+```{note}
+**Automatic .venv Detection**: If a `.venv` directory already exists in your project directory, Pipenv will automatically use it as the virtual environment location, even if `PIPENV_VENV_IN_PROJECT` is not set. This allows for seamless integration with projects that already have a `.venv` directory created by other tools (like `python -m venv .venv`).
+```
+
+Benefits of project-local virtual environments:
+- Easier to locate and manage
+- Self-contained project directory
+- Better for version control (though you should still add `.venv` to your `.gitignore`)
+- Useful for containerized environments
+
+### Custom Virtual Environment Directory
+
+You can specify a custom location for all virtual environments by setting the `WORKON_HOME` environment variable:
+
+```bash
+$ export WORKON_HOME=~/my-virtualenvs
+$ pipenv install
+```
+
+This is useful if you want to store all virtual environments in a specific directory.
+
+### Custom Virtual Environment Name
+
+You can specify a custom name for your virtual environment by setting the `PIPENV_CUSTOM_VENV_NAME` environment variable:
+
+```bash
+$ export PIPENV_CUSTOM_VENV_NAME=myproject-env
+$ pipenv install
+```
+
+This overrides the default naming scheme and uses your specified name instead.
+
+## Managing Virtual Environments
+
+### Activating the Virtual Environment
+
+To activate the virtual environment:
+
+```bash
+$ pipenv shell
+```
+
+This spawns a new shell with the virtual environment activated. You can exit this shell with `exit` or Ctrl+D.
+
+Alternatively, you can run commands in the virtual environment without activating it:
+
+```bash
+$ pipenv run python script.py
+```
+
+### Deactivating the Virtual Environment
+
+If you're in a shell created by `pipenv shell`, you can deactivate the virtual environment by exiting the shell:
+
+```bash
+$ exit
+```
+
+### Removing the Virtual Environment
+
+To remove the virtual environment:
+
+```bash
+$ pipenv --rm
+```
+
+This deletes the virtual environment but leaves your `Pipfile` and `Pipfile.lock` intact.
+
+## Virtual Environment Naming
+
+### Default Naming Scheme
+
+The default virtual environment name follows this pattern:
+
+```
+{project_name}-{hash}
+```
+
+Where:
+- `{project_name}` is the name of your project directory
+- `{hash}` is a hash of the full path to your project
+
+For example, a project in `/home/user/projects/myproject` might have a virtual environment named `myproject-a1b2c3d4`.
+
+### Character Handling
+
+Dangerous characters (i.e., ``$!*@"``, as well as space, line feed, carriage return, and tab) in the project name are converted to underscores in the virtual environment name.
+
+## Moving or Renaming Projects
+
+When you move or rename a project directory, Pipenv can no longer find the associated
+virtual environment because the virtual environment name includes a hash of the full
+project path. After a move or rename, `pipenv --venv` will report an error and
+`pipenv shell` / `pipenv run` will fail.
+
+### Recommended Workflow for Moving/Renaming
+
+Follow these steps **before** moving or renaming your project directory:
+
+1. Remove the virtual environment:
+ ```bash
+ $ pipenv --rm
+ ```
+
+2. Move or rename your project directory.
+
+3. Recreate the virtual environment in the new location:
+ ```bash
+ $ cd /path/to/new/location
+ $ pipenv install
+ ```
+
+This ensures that Pipenv creates a new virtual environment with the correct path hash.
+
+### Recovery: Already Moved Without `pipenv --rm`
+
+If you have already moved or renamed your project directory without first removing the
+virtual environment, the old virtualenv is now orphaned. Follow these steps to recover:
+
+1. **Navigate to the new project location:**
+ ```bash
+ $ cd /path/to/new/location
+ ```
+
+2. **Recreate the virtual environment** (Pipenv will create a fresh one for the new path):
+ ```bash
+ $ pipenv install
+ ```
+ This reads your existing `Pipfile` (and `Pipfile.lock` if present) and creates a
+ correctly named virtual environment for the new path.
+
+3. **Clean up the orphaned virtual environment** (optional, to reclaim disk space):
+ ```bash
+ # List all virtualenvs to find the orphaned one
+ $ ls ~/.local/share/virtualenvs/ # Linux/macOS
+ $ ls %USERPROFILE%\.virtualenvs\ # Windows
+
+ # Remove it (replace with the orphaned environment's name)
+ $ rm -rf ~/.local/share/virtualenvs/
+ ```
+
+```{tip}
+To avoid this issue entirely, set `PIPENV_VENV_IN_PROJECT=1` in your shell
+configuration. This places the virtual environment in a `.venv` directory **inside**
+your project, so it always moves with the project directory and the path hash
+problem does not arise.
+```
+
+## Using Different Python Versions
+
+### Specifying Python Version
+
+You can specify which Python version to use when creating a virtual environment:
+
+```bash
+$ pipenv --python 3.10
+```
+
+This creates a virtual environment using Python 3.10.
+
+### Using pyenv with Pipenv
+
+If you have [pyenv](https://github.com/pyenv/pyenv) installed, Pipenv can automatically use it to find and install the required Python version:
+
+```bash
+$ pipenv --python 3.10
+```
+
+If Python 3.10 isn't installed, Pipenv will prompt you to install it with pyenv.
+
+### Using asdf with Pipenv
+
+Similarly, if you have [asdf](https://asdf-vm.com/) installed with the Python plugin, Pipenv can use it to find and install the required Python version.
+
+## Advanced Configuration
+
+### Environment Variables
+
+Several environment variables affect how Pipenv manages virtual environments:
+
+| Variable | Description | Default |
+|----------|-------------|---------|
+| `PIPENV_VENV_IN_PROJECT` | Create virtualenv in project directory | `0` (disabled) |
+| `WORKON_HOME` | Custom directory for virtual environments | Platform-specific |
+| `PIPENV_CUSTOM_VENV_NAME` | Custom name for the virtual environment | None |
+| `PIPENV_PYTHON` | Path to Python executable to use | System default |
+| `PIPENV_IGNORE_VIRTUALENVS` | Ignore active virtual environments | `0` (disabled) |
+
+### Shell Configuration
+
+For the best experience with `pipenv shell`, ensure your shell configuration only sets environment variables like `PATH` during login sessions, not during every subshell spawn.
+
+For example, in fish:
+
+```fish
+if status --is-login
+ set -gx PATH /usr/local/bin $PATH
+end
+```
+
+In bash or zsh, you might use:
+
+```bash
+if [[ -z $PIPENV_ACTIVE ]]; then
+ export PATH=/usr/local/bin:$PATH
+fi
+```
+
+## Troubleshooting
+
+### Virtual Environment Not Found
+
+If Pipenv can't find your virtual environment:
+
+1. Check if the virtual environment exists:
+ ```bash
+ $ pipenv --venv
+ ```
+
+2. If it doesn't exist, create it:
+ ```bash
+ $ pipenv install
+ ```
+
+3. If you've moved or renamed your project, follow the steps in the "Moving or Renaming Projects" section.
+
+### Shell Activation Issues
+
+If `pipenv shell` doesn't work correctly:
+
+1. Try compatibility mode (the default):
+ ```bash
+ $ pipenv shell
+ ```
+
+2. If that doesn't work, try fancy mode:
+ ```bash
+ $ pipenv shell --fancy
+ ```
+
+3. If neither works, use `pipenv run` instead:
+ ```bash
+ $ pipenv run python
+ ```
+
+### Python Version Issues
+
+If Pipenv uses the wrong Python version:
+
+1. Specify the Python version explicitly:
+ ```bash
+ $ pipenv --python 3.10
+ ```
+
+2. Check your `Pipfile` for the required Python version:
+ ```toml
+ [requires]
+ python_version = "3.10"
+ ```
+
+3. If using pyenv, ensure the required Python version is installed:
+ ```bash
+ $ pyenv versions
+ $ pyenv install 3.10.4
+ ```
+
+## Best Practices
+
+### Version Control
+
+- Add `.venv/` to your `.gitignore` if using project-local virtual environments
+- Commit both `Pipfile` and `Pipfile.lock` to version control
+- Don't commit the virtual environment itself
+
+### Project Organization
+
+- Consider using project-local virtual environments (`PIPENV_VENV_IN_PROJECT=1`) for better organization
+- Use a consistent approach across all your projects
+- Document your virtual environment setup in your project's README
+
+### CI/CD Integration
+
+In CI/CD pipelines:
+
+```yaml
+# Example GitHub Actions workflow
+steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.10'
+ - name: Install pipenv
+ run: pip install pipenv
+ - name: Install dependencies
+ run: pipenv install --deploy
+ - name: Run tests
+ run: pipenv run pytest
+```
+
+### Docker Integration
+
+When using Pipenv with Docker, consider using project-local virtual environments:
+
+```dockerfile
+FROM python:3.10-slim
+
+WORKDIR /app
+
+COPY Pipfile Pipfile.lock ./
+
+RUN pip install pipenv && \
+ PIPENV_VENV_IN_PROJECT=1 pipenv install --deploy
+
+COPY . .
+
+CMD ["pipenv", "run", "python", "app.py"]
+```
+
+## Conclusion
+
+Pipenv's virtual environment management simplifies Python project setup and dependency isolation. By understanding how Pipenv creates and manages virtual environments, you can ensure consistent, reproducible environments for your Python projects.
diff --git a/docs/workflows.md b/docs/workflows.md
new file mode 100644
index 0000000000..9782d789a2
--- /dev/null
+++ b/docs/workflows.md
@@ -0,0 +1,389 @@
+# Pipenv Workflows
+
+This document outlines common workflows and patterns for using Pipenv effectively in your Python projects. Each workflow includes step-by-step instructions and practical examples.
+
+## Project Setup Workflows
+
+### Starting a New Project
+
+```bash
+# Create a new project directory
+$ mkdir myproject
+$ cd myproject
+
+# Initialize a new Pipenv environment with a specific Python version
+$ pipenv --python 3.10
+
+# Install your first packages
+$ pipenv install requests flask
+```
+
+### Working with Existing Projects
+
+```bash
+# Clone a repository
+$ git clone https://github.com/example/project.git
+$ cd project
+
+# Install from Pipfile.lock (recommended for deployment or when collaborating)
+$ pipenv install --deploy
+
+# Or install from Pipfile (for development, allowing resolution of new dependencies)
+$ pipenv install
+```
+
+### Converting from requirements.txt
+
+```bash
+# If you have an existing requirements.txt file
+$ pipenv install -r requirements.txt
+
+# Review the generated Pipfile and edit as needed
+$ cat Pipfile
+
+# Lock the dependencies
+$ pipenv lock
+```
+
+## Development Workflows
+
+### Daily Development Cycle
+
+```bash
+# Activate the virtual environment
+$ pipenv shell
+
+# Work on your project...
+# When you need a new package:
+$ pipenv install package-name
+
+# For development-only packages:
+$ pipenv install pytest --dev
+
+# Run your application or tests
+$ python app.py
+$ pytest
+```
+
+### Using the Run Command
+
+Instead of activating the shell, you can use the `run` command to execute commands in the virtual environment:
+
+```bash
+# Run a Python script
+$ pipenv run python app.py
+
+# Run tests
+$ pipenv run pytest
+
+# Run a custom script defined in your Pipfile
+$ pipenv run start
+```
+
+### Managing Development vs. Production Dependencies
+
+```bash
+# Install a production dependency
+$ pipenv install flask
+
+# Install a development dependency
+$ pipenv install pytest --dev
+
+# Install all dependencies (including dev) for development
+$ pipenv install --dev
+
+# Install only production dependencies for deployment
+$ pipenv install --deploy
+```
+
+## Dependency Management Workflows
+
+### Updating Dependencies
+
+```bash
+# Check for outdated packages
+$ pipenv update --outdated
+
+# Update all packages to their latest versions
+$ pipenv update
+
+# Update specific packages
+$ pipenv update requests flask
+```
+
+### Upgrading Dependencies (Lock File Only)
+
+```bash
+# Update the lock file for a specific package without installing
+$ pipenv upgrade requests
+
+# Then install the updated dependencies when ready
+$ pipenv sync
+```
+
+### Visualizing Dependencies
+
+```bash
+# Show dependency graph
+$ pipenv graph
+
+# Show a more concise output
+$ pipenv graph --bare
+```
+
+### Cleaning Up Dependencies
+
+```bash
+# Remove packages not in Pipfile.lock
+$ pipenv clean
+
+# Preview what would be removed
+$ pipenv clean --dry-run
+```
+
+## Deployment Workflows
+
+### Preparing for Deployment
+
+```bash
+# Ensure Pipfile.lock is up-to-date
+$ pipenv lock
+
+# Verify the lock file is in sync with Pipfile
+$ pipenv verify
+
+# Generate a requirements.txt file for environments that don't support Pipfile
+$ pipenv requirements > requirements.txt
+```
+
+### Deploying to Production
+
+```bash
+# On your production server, install only what's in the lock file
+$ pipenv install --deploy
+
+# For systems that don't support virtual environments
+$ pipenv install --system --deploy
+```
+
+### Continuous Integration
+
+```bash
+# In your CI pipeline, verify the lock file is up-to-date
+$ pipenv verify
+
+# Install dependencies
+$ pipenv install --dev
+
+# Run tests
+$ pipenv run pytest
+```
+
+## Security Workflows
+
+### Checking for Vulnerabilities
+
+```bash
+# Check for security vulnerabilities
+$ pipenv scan
+
+# Output in JSON format for integration with other tools
+$ pipenv scan --output json
+```
+
+### Generating Requirements with Hashes
+
+```bash
+# Generate requirements.txt with hashes for secure deployments
+$ pipenv requirements --hash > requirements.txt
+```
+
+## Environment Management
+
+### Working with .env Files
+
+Create a `.env` file in your project directory:
+
+```
+# .env file
+DEBUG=True
+DATABASE_URL=sqlite:///dev.db
+SECRET_KEY=your-secret-key
+```
+
+Pipenv will automatically load these environment variables when you use `pipenv shell` or `pipenv run`.
+
+### Locating Project Resources
+
+```bash
+# Find the project root
+$ pipenv --where
+
+# Find the virtualenv location
+$ pipenv --venv
+
+# Find the Python interpreter path
+$ pipenv --py
+```
+
+## Advanced Workflows
+
+### Working with Multiple Package Categories
+
+```bash
+# Define custom package categories in your Pipfile
+# [packages]
+# requests = "*"
+#
+# [dev-packages]
+# pytest = "*"
+#
+# [docs]
+# sphinx = "*"
+#
+# [tests]
+# pytest-cov = "*"
+
+# Install specific categories
+$ pipenv install --categories="docs,tests"
+
+# Generate requirements for specific categories
+$ pipenv requirements --categories="docs" > docs-requirements.txt
+```
+
+### Using Pipenv with Docker
+
+```dockerfile
+# Dockerfile
+FROM python:3.10-slim
+
+WORKDIR /app
+
+# Copy Pipfile and Pipfile.lock
+COPY Pipfile Pipfile.lock ./
+
+# Install pipenv and dependencies
+RUN pip install pipenv && \
+ pipenv install --system --deploy
+
+# Copy application code
+COPY . .
+
+CMD ["python", "app.py"]
+```
+
+### Git Integration Best Practices
+
+```bash
+# Always commit both Pipfile and Pipfile.lock
+$ git add Pipfile Pipfile.lock
+$ git commit -m "Update dependencies"
+
+# After pulling changes that include dependency updates
+$ pipenv install
+```
+
+## Upgrading the Python Version
+
+When you want to move a project from one Python version to another (e.g., from 3.9 to
+3.11), follow these steps to ensure a clean upgrade.
+
+### Step-by-Step Python Version Upgrade
+
+1. **Install the new Python version** on your system (via pyenv, asdf, your OS package
+ manager, or python.org):
+ ```bash
+ # Using pyenv
+ $ pyenv install 3.11
+ ```
+
+2. **Remove the current virtual environment** so Pipenv can create a fresh one:
+ ```bash
+ $ pipenv --rm
+ ```
+
+3. **Update the `[requires]` section** in your `Pipfile` to the new version:
+ ```toml
+ [requires]
+ python_version = "3.11"
+ ```
+
+4. **Recreate the virtual environment** with the new Python version:
+ ```bash
+ $ pipenv --python 3.11
+ ```
+
+5. **Re-lock and install all dependencies** to regenerate `Pipfile.lock` for the new
+ Python version:
+ ```bash
+ $ pipenv lock
+ $ pipenv sync --dev
+ ```
+
+6. **Verify the upgrade:**
+ ```bash
+ $ pipenv run python --version
+ Python 3.11.x
+ ```
+
+### Quick Reference
+
+```bash
+$ pipenv --rm
+# Edit Pipfile: python_version = "3.11"
+$ pipenv --python 3.11
+$ pipenv lock
+$ pipenv sync --dev
+```
+
+```{note}
+Do **not** edit `Pipfile.lock` by hand to change the Python version. Always re-run
+`pipenv lock` after updating `[requires]` so that the lock file is regenerated with
+the correct platform markers and package versions for the new interpreter.
+```
+
+## Troubleshooting Workflows
+
+### Resolving Dependency Conflicts
+
+```bash
+# Clear the cache and try again
+$ pipenv lock --clear
+
+# Install with verbose output to see what's happening
+$ pipenv install --verbose
+```
+
+### Recreating the Virtual Environment
+
+```bash
+# Remove the current virtualenv
+$ pipenv --rm
+
+# Create a fresh environment
+$ pipenv install
+```
+
+### Checking Environment Information
+
+```bash
+# Get detailed environment information for bug reports
+$ pipenv --support
+```
+
+## Workflow Cheat Sheet
+
+| Task | Command |
+|------|---------|
+| Create new project | `pipenv --python 3.10` |
+| Install packages | `pipenv install [package]` |
+| Install dev packages | `pipenv install [package] --dev` |
+| Activate environment | `pipenv shell` |
+| Run a command | `pipenv run [command]` |
+| Update all packages | `pipenv update` |
+| Update specific package | `pipenv update [package]` |
+| Generate requirements.txt | `pipenv requirements > requirements.txt` |
+| Check security | `pipenv scan` |
+| Show dependency graph | `pipenv graph` |
+| Remove environment | `pipenv --rm` |
+| Find project/virtualenv | `pipenv --where` / `pipenv --venv` |
diff --git a/examples/Pipfile b/examples/Pipfile
index 7c0d434681..d88673974b 100644
--- a/examples/Pipfile
+++ b/examples/Pipfile
@@ -1,11 +1,17 @@
[[source]]
-url = "https://pypi.python.org/simple"
+url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
-requests = "*"
-
+requests = ">=2.32.0"
+urllib3 = ">=2.7.0"
+certifi = ">=2024.2.2"
+idna = ">=3.15"
+charset-normalizer = ">=3.3.2"
[dev-packages]
-pytest = "*"
+pytest = ">=7.4.0"
+
+[requires]
+python_version = "3.11"
diff --git a/examples/Pipfile.lock b/examples/Pipfile.lock
index 50dfd6c804..511035922e 100644
--- a/examples/Pipfile.lock
+++ b/examples/Pipfile.lock
@@ -1,27 +1,16 @@
{
"_meta": {
"hash": {
- "sha256": "8d14434df45e0ef884d6c3f6e8048ba72335637a8631cc44792f52fd20b6f97a"
+ "sha256": "edff3c36826f984dacc94d24141b4fc9895c9b8568f16fb67deeea60631ec1a6"
},
- "host-environment-markers": {
- "implementation_name": "cpython",
- "implementation_version": "3.6.1",
- "os_name": "posix",
- "platform_machine": "x86_64",
- "platform_python_implementation": "CPython",
- "platform_release": "16.7.0",
- "platform_system": "Darwin",
- "platform_version": "Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64",
- "python_full_version": "3.6.1",
- "python_version": "3.6",
- "sys_platform": "darwin"
+ "pipfile-spec": 6,
+ "requires": {
+ "python_version": "3.11"
},
- "pipfile-spec": 5,
- "requires": {},
"sources": [
{
"name": "pypi",
- "url": "https://pypi.python.org/simple",
+ "url": "https://pypi.org/simple",
"verify_ssl": true
}
]
@@ -29,54 +18,218 @@
"default": {
"certifi": {
"hashes": [
- "sha256:54a07c09c586b0e4c619f02a5e94e36619da8e2b053e20f594348c0611803704",
- "sha256:40523d2efb60523e113b44602298f0960e900388cf3bb6043f645cf57ea9e3f5"
+ "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa",
+ "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"
],
- "version": "==2017.7.27.1"
+ "index": "pypi",
+ "markers": "python_version >= '3.7'",
+ "version": "==2026.2.25"
},
- "chardet": {
+ "charset-normalizer": {
"hashes": [
- "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691",
- "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"
+ "sha256:06a7e86163334edfc5d20fe104db92fcd666e5a5df0977cb5680a506fe26cc8e",
+ "sha256:0c173ce3a681f309f31b87125fecec7a5d1347261ea11ebbb856fa6006b23c8c",
+ "sha256:0e28d62a8fc7a1fa411c43bd65e346f3bce9716dc51b897fbe930c5987b402d5",
+ "sha256:0e901eb1049fdb80f5bd11ed5ea1e498ec423102f7a9b9e4645d5b8204ff2815",
+ "sha256:11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f",
+ "sha256:150b8ce8e830eb7ccb029ec9ca36022f756986aaaa7956aad6d9ec90089338c0",
+ "sha256:172985e4ff804a7ad08eebec0a1640ece87ba5041d565fff23c8f99c1f389484",
+ "sha256:197c1a244a274bb016dd8b79204850144ef77fe81c5b797dc389327adb552407",
+ "sha256:1ae6b62897110aa7c79ea2f5dd38d1abca6db663687c0b1ad9aed6f6bae3d9d6",
+ "sha256:1cf0a70018692f85172348fe06d3a4b63f94ecb055e13a00c644d368eb82e5b8",
+ "sha256:1ed80ff870ca6de33f4d953fda4d55654b9a2b340ff39ab32fa3adbcd718f264",
+ "sha256:22c6f0c2fbc31e76c3b8a86fba1a56eda6166e238c29cdd3d14befdb4a4e4815",
+ "sha256:231d4da14bcd9301310faf492051bee27df11f2bc7549bc0bb41fef11b82daa2",
+ "sha256:259695e2ccc253feb2a016303543d691825e920917e31f894ca1a687982b1de4",
+ "sha256:2a24157fa36980478dd1770b585c0f30d19e18f4fb0c47c13aa568f871718579",
+ "sha256:2b1a63e8224e401cafe7739f77efd3f9e7f5f2026bda4aead8e59afab537784f",
+ "sha256:2bd9d128ef93637a5d7a6af25363cf5dec3fa21cf80e68055aad627f280e8afa",
+ "sha256:2e1d8ca8611099001949d1cdfaefc510cf0f212484fe7c565f735b68c78c3c95",
+ "sha256:2ef7fedc7a6ecbe99969cd09632516738a97eeb8bd7258bf8a0f23114c057dab",
+ "sha256:2f7fdd9b6e6c529d6a2501a2d36b240109e78a8ceaef5687cfcfa2bbe671d297",
+ "sha256:30f445ae60aad5e1f8bdbb3108e39f6fbc09f4ea16c815c66578878325f8f15a",
+ "sha256:31215157227939b4fb3d740cd23fe27be0439afef67b785a1eb78a3ae69cba9e",
+ "sha256:34315ff4fc374b285ad7f4a0bf7dcbfe769e1b104230d40f49f700d4ab6bbd84",
+ "sha256:3516bbb8d42169de9e61b8520cbeeeb716f12f4ecfe3fd30a9919aa16c806ca8",
+ "sha256:3778fd7d7cd04ae8f54651f4a7a0bd6e39a0cf20f801720a4c21d80e9b7ad6b0",
+ "sha256:39f5068d35621da2881271e5c3205125cc456f54e9030d3f723288c873a71bf9",
+ "sha256:404a1e552cf5b675a87f0651f8b79f5f1e6fd100ee88dc612f89aa16abd4486f",
+ "sha256:419a9d91bd238052642a51938af8ac05da5b3343becde08d5cdeab9046df9ee1",
+ "sha256:423fb7e748a08f854a08a222b983f4df1912b1daedce51a72bd24fe8f26a1843",
+ "sha256:4482481cb0572180b6fd976a4d5c72a30263e98564da68b86ec91f0fe35e8565",
+ "sha256:461598cd852bfa5a61b09cae2b1c02e2efcd166ee5516e243d540ac24bfa68a7",
+ "sha256:47955475ac79cc504ef2704b192364e51d0d473ad452caedd0002605f780101c",
+ "sha256:48696db7f18afb80a068821504296eb0787d9ce239b91ca15059d1d3eaacf13b",
+ "sha256:4be9f4830ba8741527693848403e2c457c16e499100963ec711b1c6f2049b7c7",
+ "sha256:4d1d02209e06550bdaef34af58e041ad71b88e624f5d825519da3a3308e22687",
+ "sha256:4f41da960b196ea355357285ad1316a00099f22d0929fe168343b99b254729c9",
+ "sha256:517ad0e93394ac532745129ceabdf2696b609ec9f87863d337140317ebce1c14",
+ "sha256:51fb3c322c81d20567019778cb5a4a6f2dc1c200b886bc0d636238e364848c89",
+ "sha256:5273b9f0b5835ff0350c0828faea623c68bfa65b792720c453e22b25cc72930f",
+ "sha256:530d548084c4a9f7a16ed4a294d459b4f229db50df689bfe92027452452943a0",
+ "sha256:530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9",
+ "sha256:54fae94be3d75f3e573c9a1b5402dc593de19377013c9a0e4285e3d402dd3a2a",
+ "sha256:572d7c822caf521f0525ba1bce1a622a0b85cf47ffbdae6c9c19e3b5ac3c4389",
+ "sha256:58c948d0d086229efc484fe2f30c2d382c86720f55cd9bc33591774348ad44e0",
+ "sha256:5d11595abf8dd942a77883a39d81433739b287b6aa71620f15164f8096221b30",
+ "sha256:5f8ddd609f9e1af8c7bd6e2aca279c931aefecd148a14402d4e368f3171769fd",
+ "sha256:5feb91325bbceade6afab43eb3b508c63ee53579fe896c77137ded51c6b6958e",
+ "sha256:60c74963d8350241a79cb8feea80e54d518f72c26db618862a8f53e5023deaf9",
+ "sha256:613f19aa6e082cf96e17e3ffd89383343d0d589abda756b7764cf78361fd41dc",
+ "sha256:659a1e1b500fac8f2779dd9e1570464e012f43e580371470b45277a27baa7532",
+ "sha256:695f5c2823691a25f17bc5d5ffe79fa90972cc34b002ac6c843bb8a1720e950d",
+ "sha256:69dd852c2f0ad631b8b60cfbe25a28c0058a894de5abb566619c205ce0550eae",
+ "sha256:6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2",
+ "sha256:71be7e0e01753a89cf024abf7ecb6bca2c81738ead80d43004d9b5e3f1244e64",
+ "sha256:74119174722c4349af9708993118581686f343adc1c8c9c007d59be90d077f3f",
+ "sha256:74a2e659c7ecbc73562e2a15e05039f1e22c75b7c7618b4b574a3ea9118d1557",
+ "sha256:7504e9b7dc05f99a9bbb4525c67a2c155073b44d720470a148b34166a69c054e",
+ "sha256:79090741d842f564b1b2827c0b82d846405b744d31e84f18d7a7b41c20e473ff",
+ "sha256:7a6967aaf043bceabab5412ed6bd6bd26603dae84d5cb75bf8d9a74a4959d398",
+ "sha256:7bda6eebafd42133efdca535b04ccb338ab29467b3f7bf79569883676fc628db",
+ "sha256:7edbed096e4a4798710ed6bc75dcaa2a21b68b6c356553ac4823c3658d53743a",
+ "sha256:7f9019c9cb613f084481bd6a100b12e1547cf2efe362d873c2e31e4035a6fa43",
+ "sha256:802168e03fba8bbc5ce0d866d589e4b1ca751d06edee69f7f3a19c5a9fe6b597",
+ "sha256:80d0a5615143c0b3225e5e3ef22c8d5d51f3f72ce0ea6fb84c943546c7b25b6c",
+ "sha256:82060f995ab5003a2d6e0f4ad29065b7672b6593c8c63559beefe5b443242c3e",
+ "sha256:836ab36280f21fc1a03c99cd05c6b7af70d2697e374c7af0b61ed271401a72a2",
+ "sha256:8761ac29b6c81574724322a554605608a9960769ea83d2c73e396f3df896ad54",
+ "sha256:87725cfb1a4f1f8c2fc9890ae2f42094120f4b44db9360be5d99a4c6b0e03a9e",
+ "sha256:899d28f422116b08be5118ef350c292b36fc15ec2daeb9ea987c89281c7bb5c4",
+ "sha256:8bc5f0687d796c05b1e28ab0d38a50e6309906ee09375dd3aff6a9c09dd6e8f4",
+ "sha256:8bea55c4eef25b0b19a0337dc4e3f9a15b00d569c77211fa8cde38684f234fb7",
+ "sha256:8e5a94886bedca0f9b78fecd6afb6629142fd2605aa70a125d49f4edc6037ee6",
+ "sha256:90ca27cd8da8118b18a52d5f547859cc1f8354a00cd1e8e5120df3e30d6279e5",
+ "sha256:92734d4d8d187a354a556626c221cd1a892a4e0802ccb2af432a1d85ec012194",
+ "sha256:947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69",
+ "sha256:95b52c68d64c1878818687a473a10547b3292e82b6f6fe483808fb1468e2f52f",
+ "sha256:97d0235baafca5f2b09cf332cc275f021e694e8362c6bb9c96fc9a0eb74fc316",
+ "sha256:9ca4c0b502ab399ef89248a2c84c54954f77a070f28e546a85e91da627d1301e",
+ "sha256:9cc4fc6c196d6a8b76629a70ddfcd4635a6898756e2d9cac5565cf0654605d73",
+ "sha256:9cc6e6d9e571d2f863fa77700701dae73ed5f78881efc8b3f9a4398772ff53e8",
+ "sha256:a056d1ad2633548ca18ffa2f85c202cfb48b68615129143915b8dc72a806a923",
+ "sha256:a26611d9987b230566f24a0a125f17fe0de6a6aff9f25c9f564aaa2721a5fb88",
+ "sha256:a4474d924a47185a06411e0064b803c68be044be2d60e50e8bddcc2649957c1f",
+ "sha256:a4ea868bc28109052790eb2b52a9ab33f3aa7adc02f96673526ff47419490e21",
+ "sha256:a9e68c9d88823b274cf1e72f28cb5dc89c990edf430b0bfd3e2fb0785bfeabf4",
+ "sha256:aa9cccf4a44b9b62d8ba8b4dd06c649ba683e4bf04eea606d2e94cfc2d6ff4d6",
+ "sha256:ab30e5e3e706e3063bc6de96b118688cb10396b70bb9864a430f67df98c61ecc",
+ "sha256:ac2393c73378fea4e52aa56285a3d64be50f1a12395afef9cce47772f60334c2",
+ "sha256:ad8faf8df23f0378c6d527d8b0b15ea4a2e23c89376877c598c4870d1b2c7866",
+ "sha256:b35b200d6a71b9839a46b9b7fff66b6638bb52fc9658aa58796b0326595d3021",
+ "sha256:b3694e3f87f8ac7ce279d4355645b3c878d24d1424581b46282f24b92f5a4ae2",
+ "sha256:b4ff1d35e8c5bd078be89349b6f3a845128e685e751b6ea1169cf2160b344c4d",
+ "sha256:bbc8c8650c6e51041ad1be191742b8b421d05bbd3410f43fa2a00c8db87678e8",
+ "sha256:bc72863f4d9aba2e8fd9085e63548a324ba706d2ea2c83b260da08a59b9482de",
+ "sha256:bf625105bb9eef28a56a943fec8c8a98aeb80e7d7db99bd3c388137e6eb2d237",
+ "sha256:c2274ca724536f173122f36c98ce188fd24ce3dad886ec2b7af859518ce008a4",
+ "sha256:c45a03a4c69820a399f1dda9e1d8fbf3562eda46e7720458180302021b08f778",
+ "sha256:c8ae56368f8cc97c7e40a7ee18e1cedaf8e780cd8bc5ed5ac8b81f238614facb",
+ "sha256:c907cdc8109f6c619e6254212e794d6548373cc40e1ec75e6e3823d9135d29cc",
+ "sha256:ca0276464d148c72defa8bb4390cce01b4a0e425f3b50d1435aa6d7a18107602",
+ "sha256:cd5e2801c89992ed8c0a3f0293ae83c159a60d9a5d685005383ef4caca77f2c4",
+ "sha256:d08ec48f0a1c48d75d0356cea971921848fb620fdeba805b28f937e90691209f",
+ "sha256:d1a2ee9c1499fc8f86f4521f27a973c914b211ffa87322f4ee33bb35392da2c5",
+ "sha256:d5f5d1e9def3405f60e3ca8232d56f35c98fb7bf581efcc60051ebf53cb8b611",
+ "sha256:d60377dce4511655582e300dc1e5a5f24ba0cb229005a1d5c8d0cb72bb758ab8",
+ "sha256:d73beaac5e90173ac3deb9928a74763a6d230f494e4bfb422c217a0ad8e629bf",
+ "sha256:d7de2637729c67d67cf87614b566626057e95c303bc0a55ffe391f5205e7003d",
+ "sha256:dad6e0f2e481fffdcf776d10ebee25e0ef89f16d691f1e5dee4b586375fdc64b",
+ "sha256:dda86aba335c902b6149a02a55b38e96287157e609200811837678214ba2b1db",
+ "sha256:df01808ee470038c3f8dc4f48620df7225c49c2d6639e38f96e6d6ac6e6f7b0e",
+ "sha256:e1f6e2f00a6b8edb562826e4632e26d063ac10307e80f7461f7de3ad8ef3f077",
+ "sha256:e25369dc110d58ddf29b949377a93e0716d72a24f62bad72b2b39f155949c1fd",
+ "sha256:e3c701e954abf6fc03a49f7c579cc80c2c6cc52525340ca3186c41d3f33482ef",
+ "sha256:e5bcc1a1ae744e0bb59641171ae53743760130600da8db48cbb6e4918e186e4e",
+ "sha256:e68c14b04827dd76dcbd1aeea9e604e3e4b78322d8faf2f8132c7138efa340a8",
+ "sha256:e8aeb10fcbe92767f0fa69ad5a72deca50d0dca07fbde97848997d778a50c9fe",
+ "sha256:e985a16ff513596f217cee86c21371b8cd011c0f6f056d0920aa2d926c544058",
+ "sha256:ecbbd45615a6885fe3240eb9db73b9e62518b611850fdf8ab08bd56de7ad2b17",
+ "sha256:ee4ec14bc1680d6b0afab9aea2ef27e26d2024f18b24a2d7155a52b60da7e833",
+ "sha256:ef5960d965e67165d75b7c7ffc60a83ec5abfc5c11b764ec13ea54fbef8b4421",
+ "sha256:f0cdaecd4c953bfae0b6bb64910aaaca5a424ad9c72d85cb88417bb9814f7550",
+ "sha256:f1ce721c8a7dfec21fcbdfe04e8f68174183cf4e8188e0645e92aa23985c57ff",
+ "sha256:f50498891691e0864dc3da965f340fada0771f6142a378083dc4608f4ea513e2",
+ "sha256:f5ea69428fa1b49573eef0cc44a1d43bebd45ad0c611eb7d7eac760c7ae771bc",
+ "sha256:f61aa92e4aad0be58eb6eb4e0c21acf32cf8065f4b2cae5665da756c4ceef982",
+ "sha256:f6e4333fb15c83f7d1482a76d45a0818897b3d33f00efd215528ff7c51b8e35d",
+ "sha256:f820f24b09e3e779fe84c3c456cb4108a7aa639b0d1f02c28046e11bfcd088ed",
+ "sha256:f98059e4fcd3e3e4e2d632b7cf81c2faae96c43c60b569e9c621468082f1d104",
+ "sha256:fcce033e4021347d80ed9c66dcf1e7b1546319834b74445f561d2e2221de5659"
],
- "version": "==3.0.4"
+ "index": "pypi",
+ "markers": "python_version >= '3.7'",
+ "version": "==3.4.6"
},
"idna": {
"hashes": [
- "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4",
- "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f"
+ "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8",
+ "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc"
],
- "version": "==2.6"
+ "index": "pypi",
+ "markers": "python_version >= '3.8'",
+ "version": "==3.15"
},
"requests": {
"hashes": [
- "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b",
- "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"
+ "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b",
+ "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652"
],
- "version": "==2.18.4"
+ "index": "pypi",
+ "markers": "python_version >= '3.10'",
+ "version": "==2.33.0"
},
"urllib3": {
"hashes": [
- "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b",
- "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"
+ "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c",
+ "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897"
],
- "version": "==1.22"
+ "index": "pypi",
+ "markers": "python_version >= '3.10'",
+ "version": "==2.7.0"
}
},
"develop": {
- "py": {
+ "iniconfig": {
"hashes": [
- "sha256:2ccb79b01769d99115aa600d7eed99f524bf752bba8f041dc1c184853514655a",
- "sha256:0f2d585d22050e90c7d293b6451c83db097df77871974d90efd5a30dc12fcde3"
+ "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730",
+ "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"
],
- "version": "==1.4.34"
+ "markers": "python_version >= '3.10'",
+ "version": "==2.3.0"
+ },
+ "packaging": {
+ "hashes": [
+ "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4",
+ "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==26.0"
+ },
+ "pluggy": {
+ "hashes": [
+ "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3",
+ "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==1.6.0"
+ },
+ "pygments": {
+ "hashes": [
+ "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f",
+ "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2.20.0"
},
"pytest": {
"hashes": [
- "sha256:b84f554f8ddc23add65c411bf112b2d88e2489fd45f753b1cae5936358bdf314",
- "sha256:f46e49e0340a532764991c498244a60e3a37d7424a532b3ff1a6a7653f1a403a"
+ "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9",
+ "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c"
],
- "version": "==3.2.2"
+ "index": "pypi",
+ "markers": "python_version >= '3.10'",
+ "version": "==9.0.3"
}
}
}
diff --git a/examples/Pipfile.with_pylock b/examples/Pipfile.with_pylock
new file mode 100644
index 0000000000..62cec7a062
--- /dev/null
+++ b/examples/Pipfile.with_pylock
@@ -0,0 +1,21 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+requests = "*"
+
+[dev-packages]
+pytest = "*"
+
+[requires]
+python_version = "3.8"
+
+[pipenv]
+# Enable pylock.toml generation
+use_pylock = true
+
+# Optional: Specify a custom name for the pylock file
+# This will generate pylock.dev.toml instead of pylock.toml
+# pylock_name = "dev"
diff --git a/examples/pylock.toml b/examples/pylock.toml
new file mode 100644
index 0000000000..e60b108e9b
--- /dev/null
+++ b/examples/pylock.toml
@@ -0,0 +1,83 @@
+# Example pylock.toml file for PEP 751
+# This demonstrates the pylock.toml format supported by Pipenv
+
+lock-version = '1.0'
+environments = ["sys_platform == 'win32'", "sys_platform == 'linux'", "sys_platform == 'darwin'"]
+requires-python = '>=3.8'
+extras = ['crypto']
+dependency-groups = ['dev', 'test']
+default-groups = ['default']
+created-by = 'pipenv'
+
+# Main dependencies (always installed)
+[[packages]]
+name = 'requests'
+version = '2.28.1'
+requires-python = '>=3.7'
+index = 'https://pypi.org/simple/'
+
+[[packages.wheels]]
+name = 'requests-2.28.1-py3-none-any.whl'
+upload-time = '2022-07-13T14:00:00Z'
+url = 'https://files.pythonhosted.org/packages/ca/91/6d9b8ccacd0412c08820f72cebaa4f0c61441f4AE7b7338a82051330d70/requests-2.28.1-py3-none-any.whl'
+size = 61805
+hashes = {sha256 = 'b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7'}
+
+[[packages]]
+name = 'urllib3'
+version = '1.26.12'
+requires-python = '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4'
+index = 'https://pypi.org/simple/'
+
+[[packages.wheels]]
+name = 'urllib3-1.26.12-py2.py3-none-any.whl'
+upload-time = '2022-09-08T14:30:00Z'
+url = 'https://files.pythonhosted.org/packages/6f/de/5be2e3eed8426f871b170663333a0f627fc2924cc386cd41a2d2d3f1699/urllib3-1.26.12-py2.py3-none-any.whl'
+size = 141862
+hashes = {sha256 = 'b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997'}
+
+[[packages]]
+name = 'certifi'
+version = '2022.9.24'
+index = 'https://pypi.org/simple/'
+
+[[packages.wheels]]
+name = 'certifi-2022.9.24-py3-none-any.whl'
+upload-time = '2022-09-24T18:00:00Z'
+url = 'https://files.pythonhosted.org/packages/1d/38/fa96a426e0c0e68aabc68e896584b83ad1eec779265a028e156ce509630/certifi-2022.9.24-py3-none-any.whl'
+size = 161915
+hashes = {sha256 = '0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14'}
+
+# Development dependency (only when 'dev' group is enabled)
+[[packages]]
+name = 'pytest'
+version = '7.2.0'
+requires-python = '>=3.7'
+marker = "'dev' in dependency_groups or 'test' in dependency_groups"
+index = 'https://pypi.org/simple/'
+
+[[packages.wheels]]
+name = 'pytest-7.2.0-py3-none-any.whl'
+upload-time = '2022-11-12T10:00:00Z'
+url = 'https://files.pythonhosted.org/packages/ab/cd/pytest-7.2.0-py3-none-any.whl'
+size = 312500
+hashes = {sha256 = '1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'}
+
+# Optional dependency for 'crypto' extra
+[[packages]]
+name = 'cryptography'
+version = '40.0.0'
+requires-python = '>=3.7'
+marker = "'crypto' in extras"
+index = 'https://pypi.org/simple/'
+
+[[packages.wheels]]
+name = 'cryptography-40.0.0-py3-none-any.whl'
+upload-time = '2023-03-20T08:00:00Z'
+url = 'https://files.pythonhosted.org/packages/ef/gh/cryptography-40.0.0-py3-none-any.whl'
+size = 654321
+hashes = {sha256 = 'abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890'}
+
+[tool.pipenv]
+generated_from = "Pipfile.lock"
+generation_date = "2025-04-25T04:20:00Z"
diff --git a/get-pipenv.py b/get-pipenv.py
old mode 100755
new mode 100644
index 75e31d2969..f283e0484c
--- a/get-pipenv.py
+++ b/get-pipenv.py
@@ -1,12 +1,11 @@
#!/usr/bin/env python
-
-# Note, this script is based off of https://bootstrap.pypa.io/get-pip.py
#
# Hi There!
+#
# You may be wondering what this giant blob of binary data here is, you might
# even be worried that we're up to something nefarious (good for you for being
# paranoid!). This is a base85 encoding of a zip file, this zip file contains
-# an entire copy of pip.
+# an entire copy of pip (version 24.2).
#
# Pip is a thing that installs packages, pip itself is a package that someone
# might want to install, especially if they're looking to run this get-pip.py
@@ -18,169 +17,110 @@
# doesn't do things correctly and has weird edge cases, or compress pip itself
# down into a single file.
#
-# If you're wondering how this is created, it is using an invoke task located
-# in tasks/generate.py called "installer". It can be invoked by using
-# ``invoke generate.installer``.
+# If you're wondering how this is created, it is generated using
+# `scripts/generate.py` in https://github.com/pypa/get-pip.
+
+import sys
+
+this_python = sys.version_info[:2]
+min_version = (3, 8)
+if this_python < min_version:
+ message_parts = [
+ "This script does not work on Python {}.{}.".format(*this_python),
+ "The minimum supported Python version is {}.{}.".format(*min_version),
+ "Please use https://bootstrap.pypa.io/pip/{}.{}/get-pip.py instead.".format(
+ *this_python
+ ),
+ ]
+ print("ERROR: " + " ".join(message_parts))
+ sys.exit(1)
-# Note, this get-pip.py installer is modified to meet pipenv's needs.
import os.path
import pkgutil
import shutil
-import sys
-import struct
import tempfile
+import argparse
+import importlib
+from base64 import b85decode
-# Useful for very coarse version differentiation.
-PY2 = sys.version_info[0] == 2
-PY3 = sys.version_info[0] == 3
-if PY3:
- iterbytes = iter
-else:
- def iterbytes(buf):
- return (ord(byte) for byte in buf)
+def include_setuptools(args):
+ """
+ Install setuptools only if absent, not excluded and when using Python <3.12.
+ """
+ cli = not args.no_setuptools
+ env = not os.environ.get("PIP_NO_SETUPTOOLS")
+ absent = not importlib.util.find_spec("setuptools")
+ python_lt_3_12 = this_python < (3, 12)
+ return cli and env and absent and python_lt_3_12
-try:
- from base64 import b85decode
-except ImportError:
- _b85alphabet = (b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- b"abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~")
- def b85decode(b):
- _b85dec = [None] * 256
- for i, c in enumerate(iterbytes(_b85alphabet)):
- _b85dec[c] = i
+def include_wheel(args):
+ """
+ Install wheel only if absent, not excluded and when using Python <3.12.
+ """
+ cli = not args.no_wheel
+ env = not os.environ.get("PIP_NO_WHEEL")
+ absent = not importlib.util.find_spec("wheel")
+ python_lt_3_12 = this_python < (3, 12)
+ return cli and env and absent and python_lt_3_12
- padding = (-len(b)) % 5
- b = b + b'~' * padding
- out = []
- packI = struct.Struct('!I').pack
- for i in range(0, len(b), 5):
- chunk = b[i:i + 5]
- acc = 0
- try:
- for c in iterbytes(chunk):
- acc = acc * 85 + _b85dec[c]
- except TypeError:
- for j, c in enumerate(iterbytes(chunk)):
- if _b85dec[c] is None:
- raise ValueError(
- 'bad base85 character at position %d' % (i + j)
- )
- raise
- try:
- out.append(packI(acc))
- except struct.error:
- raise ValueError('base85 overflow in hunk starting at byte %d'
- % i)
- result = b''.join(out)
- if padding:
- result = result[:-padding]
- return result
+def determine_pip_install_arguments():
+ pre_parser = argparse.ArgumentParser()
+ pre_parser.add_argument("--no-setuptools", action="store_true")
+ pre_parser.add_argument("--no-wheel", action="store_true")
+ pre, args = pre_parser.parse_known_args()
+ args.append("pip")
-def bootstrap(tmpdir=None):
- # Import pip so we can use it to install pip and maybe setuptools too
- import pip
- from pip.commands.install import InstallCommand
- from pip.req import InstallRequirement
+ if include_setuptools(pre):
+ args.append("setuptools")
- # Wrapper to provide default certificate with the lowest priority
- class CertInstallCommand(InstallCommand):
- def parse_args(self, args):
- # If cert isn't specified in config or environment, we provide our
- # own certificate through defaults.
- # This allows user to specify custom cert anywhere one likes:
- # config, environment variable or argv.
- if not self.parser.get_default_values().cert:
- self.parser.defaults["cert"] = cert_path # calculated below
- return super(CertInstallCommand, self).parse_args(args)
+ if include_wheel(pre):
+ args.append("wheel")
- pip.commands_dict["install"] = CertInstallCommand
+ args.append("pipenv")
+ return ["install", "--upgrade", "--force-reinstall"] + args
- implicit_pip = True
- implicit_setuptools = True
- implicit_wheel = True
- # Check if the user has requested us not to install setuptools
- if "--no-setuptools" in sys.argv or os.environ.get("PIP_NO_SETUPTOOLS"):
- args = [x for x in sys.argv[1:] if x != "--no-setuptools"]
- implicit_setuptools = False
- else:
- args = sys.argv[1:]
+def monkeypatch_for_cert(tmpdir):
+ """Patches `pip install` to provide default certificate with the lowest priority.
- # Check if the user has requested us not to install wheel
- if "--no-wheel" in args or os.environ.get("PIP_NO_WHEEL"):
- args = [x for x in args if x != "--no-wheel"]
- implicit_wheel = False
+ This ensures that the bundled certificates are used unless the user specifies a
+ custom cert via any of pip's option passing mechanisms (config, env-var, CLI).
- # We only want to implicitly install setuptools and wheel if they don't
- # already exist on the target platform.
- if implicit_setuptools:
- try:
- import setuptools # noqa
- implicit_setuptools = False
- except ImportError:
- pass
- if implicit_wheel:
- try:
- import wheel # noqa
- implicit_wheel = False
- except ImportError:
- pass
+ A monkeypatch is the easiest way to achieve this, without messing too much with
+ the rest of pip's internals.
+ """
+ from pip._internal.commands.install import InstallCommand
- # We want to support people passing things like 'pip<8' to get-pip.py which
- # will let them install a specific version. However because of the dreaded
- # DoubleRequirement error if any of the args look like they might be a
- # specific for one of our packages, then we'll turn off the implicit
- # install of them.
- for arg in args:
- try:
- req = InstallRequirement.from_line(arg)
- except:
- continue
+ # We want to be using the internal certificates.
+ cert_path = os.path.join(tmpdir, "cacert.pem")
+ with open(cert_path, "wb") as cert:
+ cert.write(pkgutil.get_data("pip._vendor.certifi", "cacert.pem"))
- if implicit_pip and req.name == "pip":
- implicit_pip = False
- elif implicit_setuptools and req.name == "setuptools":
- implicit_setuptools = False
- elif implicit_wheel and req.name == "wheel":
- implicit_wheel = False
+ install_parse_args = InstallCommand.parse_args
- # Add any implicit installations to the end of our args
- if implicit_pip:
- args += ["pip"]
- if implicit_setuptools:
- args += ["setuptools"]
- if implicit_wheel:
- args += ["wheel"]
+ def cert_parse_args(self, args):
+ if not self.parser.get_default_values().cert:
+ # There are no user provided cert -- force use of bundled cert
+ self.parser.defaults["cert"] = cert_path # calculated above
+ return install_parse_args(self, args)
- # Pipenv modifications here.
- args += ["pipenv"]
+ InstallCommand.parse_args = cert_parse_args
- delete_tmpdir = False
- try:
- # Create a temporary directory to act as a working directory if we were
- # not given one.
- if tmpdir is None:
- tmpdir = tempfile.mkdtemp()
- delete_tmpdir = True
- # We need to extract the SSL certificates from requests so that they
- # can be passed to --cert
- cert_path = os.path.join(tmpdir, "cacert.pem")
- with open(cert_path, "wb") as cert:
- cert.write(pkgutil.get_data("pip._vendor.requests", "cacert.pem"))
+def bootstrap(tmpdir):
+ monkeypatch_for_cert(tmpdir)
- # Execute the included pip and use it to install the latest pip and
- # setuptools from PyPI
- sys.exit(pip.main(["install", "--upgrade"] + args))
- finally:
- # Remove our temporary directory
- if delete_tmpdir and tmpdir:
- shutil.rmtree(tmpdir, ignore_errors=True)
+ # Execute the included pip and use it to install the latest pip and
+ # any user-requested packages from PyPI.
+ from pip._internal.cli.main import main as pip_entry_point
+
+ args = determine_pip_install_arguments()
+ sys.exit(pip_entry_point(args))
def main():
@@ -206,19863 +146,28284 @@ def main():
DATA = b"""
-P)h>@6aWAK2mm&gW=RK-r8gW8002}h000jF003}la4%n9X>MtBUtcb8d8JxybK5o&{;pqv$n}tHC^l~
-I+Mavrq?0()%%qLSNv=2JXgHJzNr)+u1xVRS+y8#M3xEJc+D&`xG$ILLcd^)g_Juxq^hK-W7fVro!OK
-0X56!kJCu>>lSemZerjK`FeKt4O?bX9-iiWDY7!DYHK31t|U{{>
-PE#tZP_+VteGhH)eTGzMZy!aHJ(Q?6Cjc(3MQ0lIm@hktf`o4axNvVCTc)Ts4@VJ>@!hh%K`|2$iKE+
-HHx+6sw#7#MJW!3g|Y$%N)ur)tC3;}#CBEQ7CdI~xY=+?Ot(T=34r+9E$`%6N}j>;=NFf=Z&^bu!zEv
-3t>Ua&1Gxq!8;Ps7soN%ES($^#>_e*>Ru`El;Z0c`kR05XmE3{WT9s{ZCofrE;qGp;vO#hcs@DjeDR$
-tn@v;IglI6VSWzNghfplGqI!0gHwP<*5k}E|s-0tgq2{VgAu^rc%*@
-7HRg@?*fSPs9ypVK;PZfg`L*{@Wh4H}=)J&0S$#2!{sXR907wMxwCB>Zm0$&8dG^t{{SFIu9BwcKPai
-iS)37*53oHqWOqTV)O3RPrz%ERGmE0Tun4O(ssPA=8(oYCvxpzPymKk}-Q$?RIdE=IK(@bmxe)jVQYH
-8{VWs)8KiU3x%fE5{sAyYgujXSqq0M!Jcq(%y4NcRLa4k(bC--&}_#|G%=iwT(weU1)OKQ+;gdjz%u)
-oWwP6Kw|to?PIw?Km1kAC7Ms_kh)WuY*}FOiLCVc@zRudBQ9tsceu3uNfZ`pomDWvf`>KU^QgE|jC3f
-JeGPP6hUu>U2ZL8-0vz>6l;DW>Cpc;OqR~k!*C(#5^E>jBZX2(m7SL-6X;oqX)fNgKHx<25fw`lciam
-T?0Sq;<*0efo>>~_mb!wtQ8FET)G{S3%GLx;TuGy_0I*8^0_3ZXQ@aNJf0K2y8VP7S+U1FD)Lc1YZU5
-_=?sZ~~HXI3ze#a`M|s-Y_t#noGnybn*-wS~M*gQeu&v6y8yuxLY!d!A
-F!&;`Rs^bRcsWT^vka6lXVZTrPm;4Ks2igbSlrx(sRT^p6}=17w9Ix8?jmITqsTRyjGrANWtnsTD|j$
-Y4h<5(QWgT)wb!BhII2*G}|zk1yNsG$GkHLdlf5Gzaat{Tc>$@p`
-a+TwY7Wli;y;&R%LORzm+XNlE7>Vmn1j*;EP+Vbf#*@tWz5o0+$?;>TN2)pj76eCD51u1o>jxO7Rd+T
-^~TVJZ5V=f+fUt3~2+X?Q3%F77oSob@jkBylRQqf|H}cxNlq|euM|+Co9)Srn2x(&;r3@IQS4AF!H7F
-o8r-xn-D4>d|PI6qlSXmJ;9W|=O@}p6HPuvOHX05>OET{SlFW?YMVB^bOj7$3}o2vCc*b=Na9ht-RL`cQj!G22J9&fIo^m$3
-29+HJ>nF|s8yA0n&;d{IKJHp=j(V~BT0>~4G)GPEMc(VQAuvRl`;M6?1>952}1Ot5I~#MYk0Kxxi3Ah
-q0z)s{+ML0+{{$39}{osGDzV+%G3gnJXTS9DXfMe;)R!F^lZ>b%Fq4=Wdfk4}wCzJh`hBBYO~_dq4)E
-TcmM7`3(}e7h%A3)V?v$2PKRYqb~CG)@>9bn8D8{C!mRaF*M5$oJ*5h{7A4fUSurLlk|Ge9Dj35F+Yz8R+C*ftDqF;u_LZHS<>zfUP3#rrKI%~GDOrn(Geb3oa;V;xkn21A-6!o~;5)IrK3&>Lg$n
-YELmLl9n0XsGIFkW7P7W+cQbn<5G`uwYfk^6+2P*{9yc*!NCRzAqXJB#nGfJ}B!NvFOOhTfndqX%NMl
-ise-9(t=Sm&iY#gz#t1Fx4SUsz^%mm(E_;OVNHrzq3|yB|Hrue#yvyr>(@~yJ^SpJ4
-OF^(;kKyNZ_T@JUlux=BG5cWr9_}dO9aCTQY^g^RyvVq;_ugniS6F79aaVdkZH1IkocB$7G|e~a`MGK
-!XEswYXIAV1vyQFCC0F2wxgx`n?t@Ug!osc^vn#KqIIKVLe-1_p#*HV3aVasg00W
->1$}ndUjF>@ZB-R2u;rQ+EVZ$_M+hh_d^Rb?NSN{|#E
-&S)jskXLv=z{g*0oLz4Y%3MIH@hdj)++w_Ub=yY}Mo-b#g03!^1v$ME6ew7%D``6|eh~C_r=)A@uzIJ
-N=ON&A!*ch(O)=3CM}bncF8OaorQ9gI$?Nhg|T|4M#Y5=A{BwMaNvm<)f~Zvmpdn?c=+yAoeAhSb@87
-TMqdtzY}KDV&{B5+UyK14KGjFsSQCzTOv4hWZCpoO%X5b5|_B(AtRH1E(COJCKK$k!;-T@)v_JO?!To
-)%RJsP6QFy)qYW9u%;pS0F>J1x>2t;K8GzcH^9$#>PBA1lHjmwg*|^KH_x<*S
-=isHyhr3Ego`XEQrC#p5F9cRF;-Fkfs^?iV@3$}~Bb~8GHljaVSWu|(Mo1&i*{s&u@{2
-vB>ipRBhNi?@MIwmShkyR`VyPj6zz!LsnP`&@S*HQQ=7(&M}FoqXi;>q5?XVgA32$|3zK777d8C`@``
-Q>eL*?-`xmZezko^TratE%IrW;s|5rr@c=|$CA9;DDD_s0Y6IRO)eAR$E8qZkc2N%#@nudxO>zHZlhN
-2jBVZNHhBtEQG^Dy!P2rftr_IL518vqjU9{%mWwnSm9`zqI)V0jtcq>J>%|@n$Up{%CyZ>kbt$0eh+HnBqyweJn0Mr=_SB26a5@YX!F%-Jxjf(olZ*omrcHoC;?4Se^vyEI1TC~oScxJA
-ydY*9ir{^bUp|3fq&=IMai&S)*AlSmHC7Z!cjNpdQ`)7^W##r$<8wz4V*m_)V>32#VR*ohWuXOIH=
-sMUKJ;SFsX7PGyqBJzH9agmUcR4tm!(8=?0d&g_`7e6Mm)jWmUWC$m06TLbvadj&v
-W2y^Z;Zu-6cO2gdsaIxnc_KJlF8^$0_h`_YKC!7uSl|V7|pGHx0EY)4x)chSpS2a^%2D$kE08mQ<1QY
--O00;m!mS#yyNu*^n0RR9<0ssIH0001RX>c!JUu|J&ZeL$6aCu#kPfx=z48`yL6qa^qhepR4X$Ov65%
-(yx$r_O+A$C>v?Xk0z4RXq#_nz%vY>qQ1WfxkqQ3~9gVkXcZ82v&-nOOFrzI{72-zy%~$-fkObx$UHf
-Pxf%%rxUd8a|66~GLQ3R8vL7cRBF~PDAlJ+)moR4V01a?*}x!0kg`h%(L#G~Xb*s9h+(`5M8UCb&3ZG
-qcoGOQp;VW#N-&4rFgQZvZ8g0VLYnU307k(&=&*eVS1J1Pdg6a5y1w?^{XcI6_WR=6a(m`zGIdXf614
-yQS7FS(g!rYKD_V)ETsH=luY{RzM;)7bdFi;y4^T@31QY-O00;m!mS#zU7>o5o4FCX!E&u=$0001RX>
-c!MVRL0;Z*6U1Ze%WSdCeMYkJ~o#`~C_-MPNDSC{2p%hXssYvX9niy1Up%+rwf(&=PH{ktLOsyz49S-
-*1KwiJ~NLdg$W}Br8!f!{NM#WDo@JndIc8*lt;#kT_#f&ImpVp0SF<-=eP4oXa2xj#i@B5=vKfRSQlj
-Nw;MoD#Dhs$m)ty{eE<0#WEu?*t`{uDItC9)H?fWAWIpD}6Jz1HSc9wXX0B~C5viTIHdBUG
-8z!i%>vNb=)LD9lwMa&eMg%fp-Q_vdW=q?pi%`%?vT9l-C%(H?e4dt}F;Zg#T7KT5?yzI~o-?PLBaz+
--ptXP(*na_kM#Ejg*tp4B;Iq);Y4EmMeyR@j~`#Q~%(^RP8X)C8FF197BNLTnYN#p9I$XDsQg87Jbcsty96bJg;U%%|k^yG|c|#i^F%)%Dqri_5zk`u=Y5
-;gp^(t_{x7w4E0$I%_6OcqzCxkr`R@ik6~S&q$6d&C>sH3PRm@xRH@=yYK{71_J}~(Fov0iSj3d0bl5
-j3$!U3Z+QIi=;(-25FWVIoZL^0?k5j0j+23^=2oW>aQQ)vg_P!O3$6%uaHO2q8ckR%f8lX8JyuddAi%
-#Ua<1NM36A0pY|;c)03+utlX?gyqp}j5Z6%C{0e`BFU%v*|1+^uxoM1+}V_b*;_(0r*uOLpOd0J5#N}
-jD|B!w7(0+_2A3}5)uhDbj?!Ysda{9&TloE#IR5UH20!%R?B@O|<^k{5D9UXai#Fr3ab8ZLe6p{=Zz0
-QaDkhdw4t61o8hszVXrtL1o5IHzSBpS{mu?XgHL0R=^AQpA*cfL3MzWglCJPe;w8B4HeQKH$sY%a@Im
-r!CqS)>tHwo1)GV0?Q*N$dalc)h3nZova}dlnp8jssU;&3pJo;RBC8e9>uIoE9FPww97BVbCe<)mrVk
-ZCh;v&4xL5Ky7P6G@D5n6HXJ-R=YnOH{RRTY?KEu$iMH$`H#($>aM+Q&18L}LsIGoo4x10tA+1DcH=X
-G$Tdu<_F|t#sGmUW@!^RBqaV1hN=jgICQl(oCKB(RtUoyC`);48%D`OCC=3y`Ibi-X($O!*NzZ7X6T2
-UxmNGPC>U{h6PFrD`3q$|<`CmdX)jWvy=y3(`@G=Gs&^C*G8N>R|X>=Xu|O9-+okFh}66ta?Y3tNd=f
-&=MMS6_}XeFx5vaS{V0MDLirTGluqiHhcEW;JNDL2wt#MRn|1hZ27TQ9fPmwUsxZ1C!p|e1Q5Zg*-wK
-B3-4Bl=$FW3W|3=2jIeBy3(__YWJcGG{pWaEqtGbI2NKJi8wWB^_URR<3Y
-k(YH2p-{dA+jYpulE)CMz&?UkuYgp5g@feKK_+}zuaUZ{B^X(y8IM|vfvKtGPW>HHD`0om(?PS#Zy@?
-jPuTVEz|`E}wr{$w8YHP?%ZyY0luC3ds^x+nK2YNYu$oGL9f%;%9AONxv50hT?>TaIT~w;=1pnsG2ms?IwmnX%0kp6#2wo?A_d2h$Yz#Ny
-8QTNmt*H4QDJQy$#J|$z_V$T*hsPPNrA~ZrF|!Wldfl)Wj?SumPZ%M3}gxDi_JJs5WYkiS8ibV(FOcW_Za2SDQ
-Z4Bc|%N4c4B3{?DD!NUIm}C3Zet!gi{Y?=28}>3im9d;*k`35k+2
-;R1ySivda|oxZ7Mj^&?cpG%G6cWQ@_*Ce#SKK5e#eX|QM)LLHAkDsArvJQr~)5x3l%DFiO;pjVDu}Gb
-%%>j-6|P(=Fg!iT=>gR6bDfwtsr^tJBez(8|VKh`DgY(gQp+$$S1
-fH5==&@-?t@ZG0YW*kkiF4ux3ob1u|G-5>F5q;7?4C|y=sRMz>G|Pr)C88)T8%nG#s{{V;?E6L<@a@;
-9?buIR4CAfn?d9p^F{#8JtJ^hKO&qMGgusvPif0Jzwn3~n+P-n{wXjo|82T!~B`}S6K&+4v&v&T+*5P
-eaWQnF74R$`Z*XwGrrEx#GT3peKOS-tYy1Sh`;BMWU$sj3J`br87AG{u>clPt*=JtlZJGot4UTC6Z(%
-mlVP#f;r%&`C({O;HbRf`q$4EO=f%m5}t?Uf^mv{DT;R03JHhv*6lhw$b1ZrBu$o%e*(fv!x2wq+Jy5YzVOwQZXP{$~?U54d`oj!W%3HE&P
-^ABgo1mtGTvf2MNZ9FUp88L)Cbj&f3IdaqhXeLoPI+f~dE04L|+{rmlILcdXk<~b
-p0&lacu7YiI*jeB7ESzJyOnPWV>QM3M~+au!<*UOR%y(Jf;;bxgmbyz}9{z}H56R
-Dl9dT#o@hb?KJ9Js
-nxpgPK-f8rw`apPk{oN~e_?b@<1L3;L}yU7GhCE4YSlfv2WeHI_pXzSb5gZZ7cdTAZBRe6gqdy+Fsbm
-2s#7CJad_{o<(gFL*l^gMTae*Tt$Nvuqw3uG#1>=5efWP2?nHOR{@BiZaCxvHyM
-VF#?l{_Ks%H2Nh_|ok(%Xbe$ecUVJtCH8im~DKH)U;-Rv51SEMZvs;{qA{km&mhbQiZrp3c}X(%&RgsKik=5
-UnXXOXu2&h8Xrz*Z2NpH+{w{dmi|EL^a@*Lo&he@V~jQ1y)Vet5@dxs|}OTMnZ!xAzZ5XiEizZlu9Zy
-XxFpMq2k!+4afU_>JZl{M0~DnUuR~V_ZmL^q07v`Fx
-0iVsk2kZ>AISVhm30$Ds&jM8VH{4SBodsn-__A5s2JF^sPO1k{Q_a;}$-_o$lj0GCGejTjf#l(%M6Dg
->7LH)cwG@snz2^)JpG^w9QKLfpgZ++46J)sB#@xy-ejXGpMRYOvF7nJJ;DTHn8=;}#?*f+<^0D`z{mdb^RlwdZ-?#AkkffWC`D@l}Z;Yr#9i{xu@Y*t~u0f^@DFJ$KPaSxA-@kLs3
-ZDY)Qj@3TdOu`W26Kn&JP6JByWn2Gn^a>oGtduj)ARb%(|q5HXU0M8-3b%Eu>KTm*NC+NPq7qI>dP)h
->@6aWAK2mm&gW=X57{yU}&007}A000pH003}la4%wEb7gR0a&u*JE^v9BT5WIKxDo#DUqP%9NJ`i0C5
-L`7>O<4K+!-h?!J+9F#}&8|cbBy!3M94by`ulUGklRqNozZ21kSEB9L@~q<(Z*ZtJUABVnlSBiuC_A{)0gN)M*(x{6D+COf7J&1Az{S{I
-7{&Mq!43Sh{kXp2s=Eq^Q|BR62rycA6bTvNIF_m|r*#cGWYZ!=g?)>J9-MKY~Vzp%RdBxFN1@J;;z<+
-mVlt63Gj&aREz-~;bShpRc0e+Ib~IWV~q;4yn3CtFXCpN2Ef(RIxFifzGtc*}KBq>9zsHF-_t4%B=7`
-r(M5+(!6wX?b=6tcA|l^h%QrBedqbmR01)^?u-%o1I`sl~+uak{bsecvhg9qNi!-6;M-2!7QYP&?jQ+vyj
-`6(6%BC(-d}6`NhEI8kaSW_?i&NRW-xqsoJ~LvnI7@claq=6PE9;Nt#@3QM9Wos~qS%;pY^(_FFo$J8
-9rx*@4!*k(Vk@O3(VH4NU1t~MK5+AwEs5N^7zLhS}6Mz;VYOmUEc!6Y5wE)>N;HgAq8zg19`(dZ!fEY~8|sLoY
-ZDzY2-UxdjN=#DM8h4rN;SU&G@p}S1|Zq6@xr64T5
-Kd0t=VwYPA^CdtsKkzXpOr4wom=iwZ*e@?~ZA&`$YWsX~cl+x5q>Suqg+wc_-HSj}@C{3b70$keOlR^
-D;zjd;w`O&&x|(b2efQH$u=>`nY>pl{j^OrdR{?5ocOTf6_O(_q%w2%KBes1H2opf~0+j8Qk?g&J>^7
-%=F(L18$Upax8{uD%n}dFsOe-e<HS7=*(Q(v{8Un*0idAwK1RC@-u|p0x@SUhW^xlJzrK_bG9QleEVXT6^qL!l$5M;
-EaejJXGCD(RYqJuO6T3Ho%&tLrgMLqg?>EuIPQ75A7YwAD339HBITZy4=$Vy8{5$L(hL
-oV>FZ4ubX_{Okx(E3dvdygcSHPgC2G@0+>lQcGVUMfm5mMU{=g+1XXL-pqqT*z!o}|g)&|ZGutN@K9%(kqOXm4PDzeLR3BWWR3CHzt;261sLi3h8%GodOv}Ynu0_M`8X
-4KO9AXo@oLt{CBMq@8j!f(qCJsg=a^e`;vl2?#Pkvm#kIx>tO4NgX7
-6)*}9oNTGuhtMNX2-_+MF6*CoKxu*lqxYYG{dD_t@#*#-ACuX^!dXQe42y~#TEHKRSRw3XFEO2>&2Um
-ij?5xQ+Mdiv?CQuX7KhQ8E}Sc&UDDb7EDN`QoOjiu=5au_kVHZ)u=GW~J%jk6o*2lWXh-!PvJnWO(%|
-(1;x}^n_A?}X0r0;Z00r904ji2{#10&f#!iZ(CvlC)0ViX`G_?!tI?09P8atItYPm77n&6_MYJFOa4k1f+<$vQnPJpV%Kk5U5Wp$ci@4ZzW%7hS!B2F%civg`r
->SETCAurYE09H^|I{RA$tW$}Q(q&odE9NsR$_w@i|V)XYlXkRSk9RQChS4L??%vA-_1kr7v&S*k->B|
-cFAn+|@Zmq%1RL4pjO+ZLjH7bWdu!QnWvD3i|8$h060XH`=Ddv5ZMHmya4T!iCCOOwaJQ!ZMw+RcPL@
-!IjZ(_koEda66EISihm*j1J4r+c!*^4E9Qb2$Eg!A|`%R*7!fde-^vd7_mSF=a&NeEYTkh~2y=T|pl*qDHEd(E3n
-WL)6<-C#?dW>cSlht?0A`#7+LZHwJ2I#VCTc&JW)02qy$rp!yicdcpVn+~edgi~N&cr(voIGf>Z&*HK
-vqFEK1)jq-0G97>2+TFcUxDzB~g<}*mC4jo?KtK7I?{Xk$udIv0i(XH40cd95-Xp5SYKM^z0PRRyJxn
-AZ=|Vli4}fFw3op^9Cd^7V*375oaQcC0^D)DDtBiL8Gzd3n(IhLN_A$J=vER0cPVs9g`c^NEUY(oxi{
-ms(*Z9Ng*>*U(x78*}IzIA=SL3TZ%i|yF|q&E<2fVzXNIqOYUDHRSCziq2P{jL1A;15g|L1doez
-zK+5wR@x($gSQC>iV<-_^?wU$kadY-mo@_E6_*5tpw$D50Va=Zu1m*v@XQq;4E;nRHyoWLnV#{qe9hA
-JW;GqKy$vo~MLj(~B5kY`yQ84<&*2c5A!QZ)LT}?}tCWX0BPG)cy^E47d<>W_Gxl;wUnwXQ+WAG;R
-OSJh4?X-cZj^f5dI!JE<2+h{_xRvCTBSkEe<$FoPj4g!7{^S(8C`b4#uD=w5y-zxMI4eYGA(rlEObxh
-{~^_ovPu-310jNh0F(<)(;VX?pVvr#k+MtEN3&go@6YWh2;MUWeJl+rx#d&CN>|`D}+tW^yS=19{nwINd07g#2`ib0*&6fJt-e&OO5T@w~J
-XO7RVL`m?ShBbD&?BG8gT5)kqspZLrGO*<(7x2uURQ!w_quGV-|SJ-1c0BZjW*|0r5aDe^!l7~HmE{7
-$91za{?z5?;zz-PM?;9nD}y^Nuyhd=%=aPWk{^Bl;Vd5j0iH-ijjDtES)gVDIMCj=SDtyxEZ{fNnJCY@Y^+6;dL$c%gE^B|4>T<1
-QY-O00;m!mS#yynKB`M5&!^NKmY&{0001RX>c!NZDen7bZKvHb1ras%{yyv<2aJv{VNCs4cU9PdS(}W
-hYL1`%O;ub;AXmmBr`X--iAQSw9SnyX+sEE+8vC7QL`j8=
-I$mwCQT#0QvGD{0C?%#|)y&@Y<~(35V~LT31J7R#zq#Ud7&Ea1Po-U@))sL@U
-KPn`6ag8Rb-58~x@?=aR%t5qrYh@3$hj%=woxg6k9gd&EwZL8bK`~q{y?srdtpJ^kL&zE2)sq6OvT;L
-H#fIecX#Q#s~>Nswr^xdKFPWOq8hslP$tpELVb3S#v=iLKa}-GHWy{l)MY*u%T1GJO`fiSHn~bSumhQ
-=>T{O23)OcQWjfb|thZAF;x)HMrB7?6@=3q!rd+6gdpFyg>%K29Gsz^i-9O)5-KH1k7w@jp%j?^zFm;
-wzHOScKep1`$+$3vh)~cI#cYpig{oC~2`Q5v#yU}O_VktKAL8Z*Hl;n84V!{zg>&Yo$j~v5)Zxyhs0I
-BeaEXw&`RMyY{nk>X@CO}l$4IGq)gk+(!hQ&25+d&hHShiN#LrMxK&(nFU^F_+q#^E)!W9;YI`?65I6kKW}=b+pOxIye
-IRnH6%qDrbQ=p9c1fSwf40|y=_p8{Lt#&w1DV8>TTS($AzG~;|1>xDZ5e)O4_)X^pmWBK$mQqdK|!*iegG@uq@$Rg!?gKrr1%@R7
-A`lzs2#-HGOiMki~Yqk#L3?nJI&vOukK;tl)N{h!k=gH-5M+){!C&(NrPqp;a;Su@((QrcK?dZVH`
-%vmaz`l!sK$t?0Hb$S2UG*Bx|$(BVX_in2y7s^U@CWw8M>FCJyBQ46s5)8gTcdUzlvOTB7qvRMgtOr|
-5)daeH2YQPU5q0I!4hxUIW5VNw#w;Y?|eyns~;6G4)ku>HdWgsc12WYV8wI;{p{1BlQ^g22
-Mnz6H2y&}8gxYxj~IW0^A6(wONT#>9pdk`JxfmSe7F@6IrUjLbXI^dsyU3rUl|D+8KB^|yp(`rrXWbR
-`5FrPS}SI93ecK0cmq{gEXaK?#ebjQzQ2C|b}FuJZ$I2Ju#4O4`|FGIA4OiSRxmDvMEcB3kR(797;;2
-yzzDPw^kcTvxpH4%p1IRgC;j&Z%oH5$v#65II`YU8-9Q7PE`<|p4mNN{Fdq&%;01<47eKPZXZjMP0^E
-G_K)x7Fa3{AYXY?Jg(Lw#KPG(h?pSOoaYDQxMEc}*cTPZ}K9;_VuLLJ>zD$~m?kc?LZ?TYpejji~ID)
-SVBsi(z%exm*aS{|_x{PZLuUD?!{Jc2`*+ED|2=C?7ndPnTv_{jbwKkH4q5kp6e9+nN*jvd8E+Cu3Y10ju#%7Sf&!+6`vyp+R@fBz=XJ)mEZ
-FQ&{M6l08N?(PMagCop`aAX_P$Lt`3PRLDl5S)f{9+=re(7d5zpg^&ZL7fVftP&BM$0Bw_add#if(?5
-}e2HWZ4}^KpRcdV@T6Y5O}e9P7-;sIk~02nKdvGs
-(lW6qoEeW4Sl?ZHvSgb8L>@>4NXCGsO!msgvPx!w%{!
-hlAeE7Wck6zm#1=M$Rr)38bKKPebHo2R(E%$63A}-Iv8=DD)^4WSS#(IJdBACSS(?nPJ?|cFtI3^Ira
-x!L-u$3LR162+nK7Il30xr7w2N$VycEP$sjN+AhLM@J~VOb#=e#GrQs4ck^*zZ9?19Wrsli+BNNI|Ktw5{{QgwU*
-xY4i+6^JlfKG=F)d=^zf-^z-eH1KMDUD=~Ug9sB2LooH9lF^zYY@yEkSV!R;+nE^JKA}Y1f;
-mfY@@YQRSC9_eV1BQrP1IxY=Mrju$G0*N!?uCh&SK;Av9-X76?Iq=K0O_M1abcg4`*w0Ckm7PcHQWy~
-Y5FHTwp_aG&&6Gc~nLJDMHQO{8*Qg3pK@r4s-&`xHUXiGzw`pO#_nT;U?f9)tX;EMsU<#mO5(!p7b*@
-D7?hiV#&iX-dQ$GpfrJTWZxU1(@dGWE)+MtoOM%Y`2_`xfqxpH}`9O%=ns=U`PxxrqDGn%LmGWG-3w6
-c(It}x_B^5KulnOl4YlYWCBN|G~%c@EcqbzFn8pk2lllr@5Ck)HjIaMvEfZX-x;(IpE%T1-k~E>CdA?0Zi
-c#(e1|(`hytK_?a6Y4X7W5;G!K4M9hKcWgLiZ&M*G!{OwgV;6ix6(H#d~9CL&Yfg>>^Zw9kz1C0I6`0
-&0q^E5!%5g%q6Olqx5(;O$g9X-R*JB0T^nU~PLqw%{BclYnlf4Vxt6Bjhq4}7tO3!$d63xgB?s8HIcZHK;-Fi?3aYioZ${n={^BbVx>C$B9aqyqN_^P_#MTi}`V=ui6pJdua^$lHD?7Y7?0a&gf8ja(e
-c(_0!mL1zULz_SY($=&GPAtA=jp2{syJa9;Wq*fim}>n_Slu+2
-62+RbrGoUtYDr|ei_585}IVzh@tTO41w1zeiJfFI_&0v$mlk
-S4E57dv+rw%gkIA@1IKD>Vng|7LsNYD*=PZfXRZzqdOMW&^VOZKXITH4z6uy6d**T5wu9*V8j#hS`=wvpf6QI~n{$W7mU0vaILi9(xaU$C
-M$7@(O+B*?_Sibrc_PW#XWYF<7W(!~sc6!Xp`qy87Jw??9C`!oP#n=}H5R5FN(NXk0+ZZuU
-!KrF&>P=pr0N*e_=|9^HKn+GG_E<2{ZqOLF0UfS8K%D<~yk4H>O2%AgFIQS=Sk*M-GY?cyDs*oy?a@}
-5LoUIB3~&hM`-aq~<02r|vr|G0|94xo$RjOUhEs*r(SA81>%J=%9>l3^rvvnF{)6vXhqPvxb=
-@hU`)+a7HfJ40km?p(*C;)M0Q%w^-PZSt;XcPdXM7#S?L!WvT)tt~B)4;uQ9Ix-VO?ur*LrK{h>%Fsl-FR4gWHo}w}wFAo`Ld922t+NNVS>
->j}{4o+|Be$ShbdK%Tq_EoBO{DbBk2dW1lopRJY2qK8qk@Nne^b#5&c<&qeC$*F(+b}Jy??y$-8kvOA
-%j#mL9@pJkObMAw|*h;K8YJh*bv&T#AQHBg`V7zK$FIyFBn9Y-RwccIH;!$e8i|9ZZG!HW#HQt1Sb}<
-k!Y>|h>loS3Bi3wBl?%&`Fsp-CDzJBhm;Lu0S|Dij@1wV8aRr*X#U`+cvx6KwO}gU)BnX8^N7npoG>`
-~^Fb5Cxfb#WzvJ1Qk*Cq#&ptTlKKH~1-5SqF2YaG`wm_u2vqzpk9e)A`pX`oXn%OARq!r(19p(s6a`C
-d6@uYpc7{Gm5y_LPKKxw&kOW1ohU9dVv$AyX&!$Q+zcn9^EgPXws&;ZdOqV4D(j`eS!WW8!RV&?*cP9
-Iz4+SMaF0rRiqNV5T>#;DVU=MnyIA|b0-Ft^|WJD(z%ky&LS#l9QKWxj+bgHs~#MGoSuVV@@P%kup0E`C|nm5VqnM$N(C@6>A?1P(L
-}lvap`41Y{DHYvFnk{pXAo0ZSlXlIxHps!`6-`%xFSzJbg$nvK7x<)}K{bx>jf(R
-?e8?Aski-5Tw&@EJF}j<0iHJF_!LP0{lumQ(3KazVE0vBm-WtK3R}nVxo^f^p;Z95b1ZU4G-xk730M0
-UbGZbNV!m}mojPlVv(L<0{{GFsp2~T)P)U-+;?;ggmTwbBF(zY4Da+u&*t5H^h!D;=y9V*z7?S;09Ei
-R$yo31P6sT`3rD(9IQLBudVhmDgpIxPxqL)^YPOpVJR9jqfllEwZr-qhgiu!5$|w3FGP2_n5Y5WfT
-G#bLkXKYzwIv%oaFG^77Hg$Q9#oa3{SP?e4x96!aFTBo+RGsWC+8ObsO^9<~{=Mk0AGSMQB()?kl-p@
-V;})IRm-_W0w`nC^%~=z~RdfcM8Wml|~pjJ8Eqx=AOjWXNh%Dr~71WiNc0Ncke2?BXzitnO|oFGzi~k
->?P03YjiBH+~MjH`4paew?IO!B<^)e0_+_>K%`QVt)5H8C*nQ~VYO57R7qKMnITqJA+*886XFG9n4~U
-y7>AFTz)bLCN8+eLNNMTl>!UL*Q$5uGgvf800|GJ|z-7HtL&qU-I;Q_K85yU^-
-soA3e?JKl5_cf4F-8zJ==J{iUfgy>GBJ+dDZQER60OpD8cy2Lu(n9(1pm#7jh}+W+b+Lj7Eo4dR2nQL
-BgQb1n@J`84`FI;ut5-;UVwzGoO6)=9pA-CePuPl%w3aKM^{PqV(jEMV8(>w9lUU%mw~*5t#Y4((~-L
-W9Zf4xcBQ_ug0hi${sDq-Hv3_v>QxR#j;}7u9l^mrL_?ov&rH-ALQEvY$3Z+AOMiZNAsid{QeM&3@b3E{$Ao7I
-`5L4w`y~)@vd&=fxMl|O(RaJ@$f@l<_i3R3?gGiQ$v1IwE
-z7K`W0l{=>*`vnxUGvKpP2zSX|1G4mEgw-eZPPATK=t-s&N45Cw2t@ih~YMAg@YgAe@$}NeiGMJfs;-
-#fwy}e#q52ZRV@4>$=KhVY|KAzB%pQ(W;tPk=hh_BX66jsMk#`zXmK%7T;1ccx@bvAo7pFfyPoDqz-Sbyxr>|d~O~oAM-L3(JIm|dw?QB
-z5bE(uMm`NgwvTPD~8a7n2X*W$(6)
-Ksvd6AhOXV2fgfAjA3>z8NA*^AR3!fs3026NLEKf@;KA<^ch#dm;YQKi|Nx?0vijBisQdHC>blb7C9i
-fW#E`{<^IH3u3M5`L}I`byTcKwX#Xxor#|dwV?C(y+|1>HC~uUdL&cZW>uznBS&KKILbyh2On$iI$it+RO+8Q2{X?s
-!Zs#b0yWs(KU}agVyveWSclo^8(;wL*)4{<(k|2{OAd}C>NLYlMAV%JFo1!LyKmjgp{}c@*;qXJ5q`UXxuQssHB42@mKY}dl
-Ac9LQl@Lr)Dviy$%SYYFea>h*+dgoUZc^7e!m5AQxB>W+kbspsumkF-w~i#{OWD
-9_6f5WIZ|-A4Z4(d>FyAG>LfHrr;!ZM1ri`H5*AO`OKC0}8nYyhtSBn4VT
-J2!x>gZZ1TP$;Sh>4Hh)T^KhJtbB25&PEN%5*&Bj7KDJPHbut8ie!HhfP-Jnxu|XSeoq?efs3ZWn*;?
-x6<)Q)sP)HCIg}jypbzJ0SS~xxNr`HY890YfM{M!rL6GWl>OgNuJuu(jUf3ET}^2R!cJsaIl(9jUKpi
-=vTcbI+}Y5y%;)d%8Pg&i6x{s_`k{U0p%XUcul5ZkS8Aq_d$2=QdO!W{kVVKaDeAY6rJIp?r
-*pFm6{av^K1Q!)R!dPIt#su186Q6fn;t?I>Y1D
-$U4&xJ8LE@`(Bbu2AoGWSb%M6ThHUC+;*WziF=(;0Et+V=O#u9dkCTo+`XKtiwH*8e=(>kLfCbYZ0cN
-+#%iaj*qxq)wf!LM|#8W95-T>UQ6^%looWLnqbd?t7z_-=xYcYSj6P6btK=`vk@goKAN8JVs23l_2XyW~j$-x%BM*xc{IBB;YUcDP#~@jfE4fuC=%8y3LtAHFq)Le&U@7zOs&$%|)})V&sSm_p`vuIR
-1W1)PNfLo}TucQxhU*O)J`A>_8orM0TUcK19$
-Mzvzv^o8^zPA=?bx1~8rla&Ogw!&+{IT+d{d0laxF(Z$TuqEiaG{fQnk=I?P$zI!zKS0M1?$@$^q3wN
-+HJs2P%ss(*C0f?ruZ(JOPhSt*fn5f$N(_mBV+~Fv0MUrMl
-HH&r09zc#m+t!z1_~w4_>s53y}g4i6{~FWJT+oT-b#GwNgQU}E?Pz~VSFlu3fnN3P+`X(D)TA9x0
-^y~sr5PH8l9h(zBfNKMyAnd%G2lm3G{
-cy(K-UUcS5ggXvLn|OvM*pT-~JgQcYYV_9vK6S%Bn7VJ*@b3K9>&DRMf{34|}LIBeFNv?KxabL&v;fe
-=IyplMyT%N5ZZc(Y9l3(Vah_zX>;rd0{X`NVHdaNy%$8T91T=D^1pu`MeMgabtZ7gh_M+pH>~&;;Ka7
-%V*dcpwm8$=m~lI~51aEz}%u0t`_&rod1)ckF)q_C$11>Ac*upf=tcKo1pIf8wDCginXB7L_9e<@?W!s>Ok%Q
-+oYlSK~QMuSBjuU2F-3noj81bM$v3c*TIueu=kMq>gcO}6X0Zc1>N_A-qux?FLKfdPTEyFU*J#4h){;
-%k~OZ*6!*q*-LSXgfzr|>!R#x5vx(Svi9sfM+|3uZF>yI&{~m#do0p^h1XeQ5FmH1*l(dLG^!EAa8KZ
-Fc4#pZCdl>c8f422YSuUFuw6{~G^kcun%TzUoKWK_UdqX_G>Bqo|bJhZVXiEcdOzYVwBl80}Dul`P)p)ww;wUZ|fR0y1bS1mO=m+=@h36kv9~sA=*%)+5v?|Dmqk
-iMh}32UO_M&S}mxT0vj%J)PkkPoj?+}*n!8x^k7FNHWO6>DHopYz^%3p0MG#<-7ikflBHgmWGBq0vP2@^Gq3ds#fY6$ss#1X5@cWU+X|7T
-EwSXQ5=h&XuB6Hv*)2bMzy15Tq?I0LWhoa`IH0fePMMEwU3kFZgJz#Ni9EDAHv->Psn~(Ej@Y|FWUI-
-H{JCg1mJ2t*1|u<23B-i;TnxEb(Er@pfH+&tPDI
-CFdUftVQb{;ezw($raOGEAPl=qo+oZPsQnL`Y;J&3E&duq=#VRfLXrtP*<>@<`g?#vZ>CsEM8O&wtT(_AelZlDTS70$;{xjVhv*!UHyYDy87p$?_PAS*Qy%RbsUMf47-J*5WS>Y*JYU)40YDk>bbqg#{sVh~jG13l(t~)BcfXyK5v+USg&OzQrvea-2!MeFLL7(M+Zw5RXvvlct|JbfY?Q!N*NBT)+z3Zbp?(Vt`8O%!
-*BQ?n;Ucs7AZ*V%m$1_k3LnM@jl+v=q97KTd!qps^fq&uJd`YemDvYk}OhGX(vbVlixW-AVChnG>#aMePq&Czl3;Qp-B+eC9_$DwWm$D-&(=z18t+I9f4w^v?+{4-kG?Pz>EMGw!+a$}5KoO
-a;}2NI|iu36Vc0_a7`x?Rgj$C$W<@`e*c@D=M&j~_h}@87-zmsmN_ZX~jpqFg+-QrHaDnMuQsuW`-mD
--;C4Vau{2_QA>(5(X|X7|vPtvPZBXGi5*FNY{`6h(-oI%4NEcCp(*S>ktz^|4+sh#oBP{pg7bZINboi
-1tIpyE}4L9fF^T!XciUCKuru$~B2{#=oO2_NGP3%fLbzNQwpI`*8H}kuB=MK9ij
-kLi0-_sI9NHY*tmKt;KyV##7Sd;I8qkg|5-ER$fI_%YkK~Z7a8=OSd=qYyH(D`FFY6;JFt+T^uI891o
-*!l9@^Fou0174hz#GYCH#-3VIEMp-z+Nxw+|((P;EX*=Pqsrx{U@)8_jc`4yu}Os*SY*!S7$G>5H=p?h+id?`HY&3_^&+6K$~*l3ANT
-*)mZ5P@kU<+WWeq`%Q09|V3gq^7^rZ@0;ysWEs6Fr{9udSn5H7MQ{cR~4R2yGTE
--YccKtdMKg}LE5i=d1^T0pv*fZ;~jeG4CMHDOexLB7enpv7qG~tNar#d|MjnUn&Hvd&zIOW#3Y{rpKq
-09H6FEq#iVzXZSni`7d05zUs~~{06eLr4Div2|GE!xzqF$KTU#}97!L;NtTW7SCtC2*U{PR!@+Rt$gH
-w^%WRF4dKzx7t=O3OQgDOYjk+~k|RQ%CNQO!OS_w3bO=?oQYL$s|EHnXF_l(I>ca!F5&c|Z2Q-KY#jy
-(vjXEywk2JVE`x@MmD8*ok}GE?U55NwY}rNOJ)5^>7~bUc57YMlmQ#Cje4L%yevYEHD%C5R=#ufS))b
-#+ka7)Ld(EaL~yc%JId(Q5%32)#Lw&kk5Z5mH8{epCE%klhet;zzz?)Kl&m%PY-{&nEdru+l`e6A6tq
-j^JMO9sa2*|HcC4gvfgg0_RNiH8X^`am+RX)^;53HcXb^*U1U3l`+Xi4q?pwC
-&}!3H2w;0JSbY5~u&*7JIDUv-+t`&`Z}6&uDhqjcRF_r@W@AQj$-*dF)C3#$dU0`(
-*T&s-@T))uPcv7&@AC=o(j6tAf5n+C8i%Sn$-9AS9+pWJ;J!@j)_BqQyk)`aN)~Lt&*}J=6Wc?Zna*d
-ZJdk;EXo8S;w&Q#1{F2oCQe>1lEPG)WVl*PNl;WlgrixuUbBN%SzISm&Z9I$MSI3`p|&1G)_N$f$I#9M|p=-(I4YPQ7>udQ(D!A-Y+s3uG-ya(&pEp@Z)7m=FMCGvL1ddFURS(-HR`+iM
->54>v~m-&7bwQO^qBV#EV?DQIsr?!a%!66ZN}oP@1o25${dBjNUd;1SVxF(bkxQGV#Jj`Kn%Y|5*+6G
-diNEoXc^i}UiBY@Lw!kZQNDwr|1u
-Io!^hEW{UiNvy9rkkb5@-o9nHP{HiMKyZwyIfHX*)%hdGJR5>ro(m3%p0amiEb&
-t>VuUupgik{LcB>q)k-i|pm^k#Nu7^1phIplzVIxe=*P5ZrA|)$NpAHg>u*hV4s^uyrhr#wN-JScrVW
-@qJdqJP1c}LIkT~d$I_c^T=<$59z_{_Xe2M2u!G-(Aoc*eN7VGIxKD^@Wqf%JDbBBC}4S-A663%e9+)Z8@-vzrgZ*+$NDE
-FDgDrL##-cE_2C=5ffVQxJ36Pm67j+bt{nIgnH;809UV~xUPjdauJ
-AEdyVy4kh?y9&U-?%DywhKe!n4*SsLp(R?*v=TWfQBf^+K(H8esaD(zoVMh+3RVHBcD)0DnXcQ^S~2>
-3l)*;!g93UUsM5g*!f-t-4qnT^Fv#+(=JU4JX8aBSJb#g98JZ5J`tiBB!Gy(#4g%}|k&$6Z83s&>byU
-TqF$%IpzHGr7={vF9|4^KvyUBeNqYtFa=S~40U+X|A=yV4dVX2jyC@Lo$5MCkmF(m!Ga7&m&INS?16x
-dF3y=k^Ry8Qh!**$oH{JeFRe%CDafG|g@IFm^ktZ)j)V);wH*$IOe{+{!se2$)|Jzs-~OB{V5pk)Rj^
-qTa_gc*rSV`XVT1$TGyfG{yM&A2e`G6lIsr&&3_y0hmnRrbz)2dr87H?enJWQICRt5K(Mv}Eu&{)I2Oc^<=Y+ScP)`)t+F{+i?1y9DCpVP8a
-VhD7*&HMy?BZw8ktL?kYgSy5j|9skxq9w7k))9w24pOL2?dUNQH^L6Aw;|cKDuf=pIBF$In1SUxF1mg
-YULmJp|rUMnjX_$G}JZ9%vsp?J_xQm(kd5NOloN{>SW!nEab=1eh{IzzhR6I@nDP-)8Kr*8a6uL8iRl
-APA@0Kn1%<9WD5K%r)nv5L9C@?M-HgnEJZ6p~l*In^&7H$7Z@5S(p5BTxD$NdH~kzGp(Jl69tcaD6s)
-=Cum3C1No>z*d>oiWnoA83T_B&&oJk&=9R4k%=f?0N$S9CMUH~4!tp}Y0qQ#wg!Ro#rmLl2O9LEi
-vo&~cn&)b-;KWoP&lu4g9{0^1WvHm?5;(+qk}RuXE4X{_jLDzN_UQ2$p`
-EID%P6`s~3}yxhp4dq=9>eG}FcZZ}@b!R5O9#|8AcFm%|@T4+14_b<;f6WY<()o*tm&9w0B5o2FRJ^+
-^#9X7kJ6zpx*8(iQ%R?~3Mj@&-~d>*~@j{VHuW?O$|cW*YBDVTc6{?x!fh3WhuLI_Ij4bE5w#%K%BO_-mdUZN{Cf2q39_-`Uul3@SM)oF(ygI~(lrBU_^_W{v88jarbZouxG{A}byla
-ZyB%fEEzES>MN-=}K3Bo<^qo3_=;9g$l+B{ls&h2SmY=#noYEWjq!Cf;@K9^pL*62ELU^&5ic9`Z*;|
-=Y_KTv9QyaN@K(t^6TuLHF-Kq^-s1rNO%#`Q
-K{@dO^*L2lfyS0++KFwbV~7)?UMgLDmPT1j)nZcrf;3t2j1FAWuJ+cC+}5ufVO#tMuK~ZDsi16mbV=*
-k)oHT^QBRa<#mPBrp2P8`Lcl8+4qaHxE$IpoGdaB;eD|3Syt=B4R=oRD5AMCN
-!5^cDI+Q@j++-&XS5kmqH5uNfmg~{^vID
-OJy9Ao@WrS$z;VJS`U=PH$nT%&e*brPdJvB+Mc#e?v3=eNtT$|b1HWE!+ajNJ?Jk9XBeuBCQ*7Fu=U}
-?IiLrfm+ThyWCY1azUM!y?OB;y?O?p|p9r(uqTo;CWk{Cy$63Csm{#lHIBTb1d;&q_tQn;|C4p`ZO@m
-)uG@aWIfob|Q$fF-jk+tNYsS*7|EFz81vT0L0Zy=38W>N_uyZJa~>y-J$y8mbRt_lBwQu^7|+Rj@$gk
-G>bvMdCgB#Gq>Q(H*+a*qi<*m~k4V6aCv>qt?Hb%V2U>nLeSZ=?_@zPXQ>d)9!AMHNYchl$+l52=?eb
-9>Cjut(le`^E#*8`M@ne*k7LoeyDWPd8rfenD*-RfH7i=nsZ|s=N|XOvx!)KVBqrtzH~s>G~<0ey)yv
-pM-i<3a=Oq_1$0k;e0E0P92%l#c88n7{PiCW!s>+3SR}7j+Sxdm({-s@Pk12=(*~6n*KU%zjwVik%i-
-Ss_&%^-r(JAGhcg14gTBE`@vNvFhVY}iJFFlyi2+#={g(1$)t2Xiw=HEttj43b()KdP5^BTqQ5KTV
-EK#{p(lOuce)nk^7Bvd0`!I?dOAIOda5%d+O4-@qBQ)EpcQ%B5erl9X^Su6a)7FAg;oitsAlis~S9xK?h|p&f`(ZaU#j(-e2cjEbhkr480z+BY2S27W0yOe^Hn?k^j5!|en+s
-rvsi2h-7i>%9b{?@SXj{|=E%!7mDEx~%Eml3M6>nyCPB9p);TZuVC-Ij>M81h<7ytkI=DU|ZL#XpIVv
-lsIxMG)T$`<5vD&*Pn1Se%!yK|DNL0ts753Tk8MlOU;O>Z2Tm#Qa7#77*x>Y*hK(`R~sxEW4=rRsKeQ
-L3#S5z6m689*w>=#q^fb1=<{3MJ`oTE3y-NlrHMU!`;y1QKPlZzy~V#wa8_bQGYE`sdC>WU&iX*OYbB
-V8rUH_`ARH-KlE!~OxppX9g>=d-Fd1jVg#q$_Y%d9BMD#fxeq7j03PaBT1H2?j-FDs*_C%Z>T=9t;yL
-a}4ik!ns?90^}ik4VT=~?%G!E*j&!8$Zw_V5&{TLPoE{II^3-)$D2+j
-!;l{bb+)GhVPzd@2K)|2i8fdJJ#}pB**iBVm`O?5R3?D{;oWno9V-|DtG0;4nQ!x#64F2pp{d<4Yf3M
-kpr^&y^#P>C?gErgt_%Vn-yQgVLgV+-_*Z}Js#^x9j7n>LrWxu0s15A!JKHBhjVFH2Gl}LSF#2X|kyw
-DisI*qEY)}O%y;mgwgaV~>r=JeQyuG4Pp)XwyPILAjQHcdt{I=b^^u3bEa9}RTwC~9@+1VW!z0LqRsizJ>tJPu?OWtR7^O|PQ(7K2KO3*`yxQbbZ`om0)3rb=T{i=F0DceZy2aOMrtGp;M%hkREdCH{=x*gbF^5g621FZpgfh5R3&M4G9L$R<=`Z8?Apo4I!^X5Go^w^NWz!|H~=YG`|J0
-01Efewa=f*tRaG2O0ve5n?$@uO%gf98W1@;uTjNFLRVvDjv(#i}YRrxp
-vL^TN7P$fdVgRjNgJz6j%Vsa$Do=Idd}Mrtz_YgjIp`>}AUP_iCf=wiCqDwA3__4=`%Lq_l~_ZJrzNh
-ZA)pL8*I&bnda@@RG;@PdP{rB`H0sQNqdx}JG!d?~X`(&xcMZR=p+oifVF>|j8omD6S|bZc_k=oh2^7
-qgW)XZWr5rPIrbKL23LYg?Igc(jGX5_eM5!R`M~Y$=vXtjLNet?)46S9^?f>aR*Wl`B)W
-m%lrF?5}mEK1t_Q*xs|9Sl7FzLBb|UMN;^qqsl+x|5_W~vV^|CAg$${gCM!o9EJeYuT-KWhFCZwgOw0A_=o-6*>aOzil
-{LJr_5<9l7AHiHK@b+n*3}Lb`RuXtr1QxKdH6njQ2SSz%$KPYY9`dwx>Uh*J)U-%WIlT37k0Hsh}TU`=EIi7v1nUbEExO6qUBN
-JRlO4!n{JSTqZ32aW67JHE^WFWj@TDPOLu%Z%+#wevAdj8C|O1fem8^ZpH`b8kLiGCtogTc_87o8cZp
-io-e+ereR*~!PiikPIu6OFB9i~V5-X`Q)Lo))Fqvldu31d3B?YN?Fm`7qYim=nfobJ~le1(i!N7E?Gj
-U}oeuWP~%i~&wiTy&rEceLp)k-Hwhdn5>wW-8n{k<4wcBdT5O0dEqGlp5_UZ@BsQmecfpz>H^6tMyxv
-}9vSE=gcirqIS9tKw#SAR!omYrq#W0V(Kxr6{)agA!lgd~R%{ib6=4MAO&6CRHdoJ6&$3;wpnT4=~^(
-V}?}a$dxS%5E(hL)t5R6AWd7SQD6czoMOTN(KGFs0ug1l$mE_jvW4=n2-Q;K6!!wGyl+-e2X%$oQ*J=
-w589+*5lxGr7S6;ywj9HtRemvE;*ZnoHCQU>4YU52e*6x7xE*4gXh8EkQ|)1y~Ln;6LLceU!jCK3NewZ4y
-ve?aSsvmxHi3b=P)l3o+K7C#)`8?czWKWc4<-;5JSo*P6rGae|6YsfR)a(B}ZE8%%E3f{_XQAoZZ@o&
-hd;n3Oh7Z*rGy;s|D!i0c5t3Th>BBfZ#k7sWmDw7j3NigfgJ_FZ@8fh}_cheZeL7+hw6P^}_#df~i1m
-1ob$W4UF41b+pbC=X#8K8{&Rcqv${HaD(4oWEQ}kUZV#*Ya>(TOUS<`VFgYB1K1c*A*mmP%8(_4$}qj
-wJT+)o{A=Qg$Xn`T*bw`H#;*d^?m%i3Ejq=vSF94FFr7eTl~5QHzegJ9lcgj@)&dO~TZJUuDUd5sDl~_+g$zUsh(yOjSui2tm`?3?;m(i6SG8Z(=d#x3B+!
-*t(*AR^$>)GX~)$Bwq`Nd`bH%R{Q-yliScJ}@ErxC@FeIL!jQjw;57P09;MzFj`RfL1zfXFCy0H~dUf
-Pnjnr6