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/.envrc b/.envrc
deleted file mode 100644
index c55a5c0815..0000000000
--- a/.envrc
+++ /dev/null
@@ -1 +0,0 @@
-export PIPENV_DONT_EAT_EDITABLES=1
\ No newline at end of file
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/ci.yaml b/.github/workflows/ci.yaml
new file mode 100644
index 0000000000..887fcf52e6
--- /dev/null
+++ b/.github/workflows/ci.yaml
@@ -0,0 +1,154 @@
+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@v4
+ - uses: actions/setup-python@v5
+ 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@v4
+ - uses: actions/setup-python@v5
+ 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:
+ name: ${{matrix.os}} / ${{ matrix.python-version }}
+ needs: lint
+ runs-on: ${{ matrix.os }}-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ python-version: [3.9, "3.10", 3.11, 3.12, 3.13]
+ os: [MacOS, Ubuntu, Windows]
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up Python ${{ matrix.python-version }}
+ uses: actions/setup-python@v5
+ 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 .[safety] --upgrade
+ pipenv install --deploy --dev --python=${{ matrix.python-version }}
+ - name: Run pypiserver without pipenv (Python 3.9-3.11)
+ run: |
+ python -m pip install gunicorn pypiserver==2.3.2
+ python -m pypiserver --version
+ python -m pypiserver run -v --host=0.0.0.0 --port=8080 --hash-algo=sha256 --disable-fallback ./tests/pypi/ ./tests/fixtures &
+ if: (contains(matrix.os, 'Ubuntu') || contains(matrix.os, 'macOS')) && (startsWith(matrix.python-version, '3.9') || startsWith(matrix.python-version, '3.10') || startsWith(matrix.python-version, '3.11'))
+ - name: Run pypiserver with pipenv (Python 3.12+)
+ run: |
+ pipenv run pypi-server --version
+ pipenv run pypi-server run -v --host=0.0.0.0 --port=8080 --hash-algo=sha256 --disable-fallback ./tests/pypi/ ./tests/fixtures &
+ if: (contains(matrix.os, 'Ubuntu') || contains(matrix.os, 'macOS')) && (startsWith(matrix.python-version, '3.12') || startsWith(matrix.python-version, '3.13'))
+ - name: Run pypiserver without pipenv on Windows (Python 3.9-3.11)
+ run: |
+ python -m pip install waitress pypiserver==2.3.2
+ python -m pypiserver --version
+ cmd /c start pypi-server run -v --host=0.0.0.0 --port=8080 --hash-algo=sha256 --disable-fallback ./tests/pypi/ ./tests/fixtures
+ if: contains(matrix.os, 'Windows') && (startsWith(matrix.python-version, '3.9') || startsWith(matrix.python-version, '3.10') || startsWith(matrix.python-version, '3.11'))
+ - name: Run pypiserver with pipenv on Windows (Python 3.12+)
+ 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 ./tests/pypi/ ./tests/fixtures
+ if: contains(matrix.os, 'Windows') && (startsWith(matrix.python-version, '3.12') || startsWith(matrix.python-version, '3.13'))
+ - 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
+
+ build:
+ name: Build Package
+ needs: lint
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v5
+ 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..337b1dd191
--- /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@v4
+
+ - 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@v4
+ 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 pipenv 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/.github/workflows/ruff.yml b/.github/workflows/ruff.yml
new file mode 100644
index 0000000000..bdc471cf1f
--- /dev/null
+++ b/.github/workflows/ruff.yml
@@ -0,0 +1,15 @@
+# https://beta.ruff.rs
+name: ruff
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+ workflow_dispatch:
+jobs:
+ ruff:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - run: pip install --user ruff
+ - run: ruff check --output-format=github .
diff --git a/.gitignore b/.gitignore
index 1e06ed9eb8..73443fa55b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,13 +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
\ No newline at end of file
+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/.isort.cfg b/.isort.cfg
new file mode 100644
index 0000000000..f238bf7ea1
--- /dev/null
+++ b/.isort.cfg
@@ -0,0 +1,2 @@
+[settings]
+profile = black
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000000..c6bc871eba
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,63 @@
+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
+ - 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
+ args: [--fix, --exit-non-zero-on-fix]
+
+- repo: https://github.com/psf/black
+ rev: 24.8.0
+ hooks:
+ - id: black
+
+- 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 c5ff493d3c..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-language: python
-python:
- - "2.7"
- - "3.4"
- - "3.5"
- - "3.6"
- # - "3.7-dev"
- # - "pypy"
- # - "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 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..478fa468c3
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,2354 @@
+2025.0.1 (2025-05-02)
+=====================
+2025.0.2 2025.0.1 (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/HISTORY.txt b/HISTORY.txt
index fe58e7c733..122f3ab595 100644
--- a/HISTORY.txt
+++ b/HISTORY.txt
@@ -1,12 +1,590 @@
+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.
+ - Fix self-updating.
+8.2.5:
+ - Fixed bad attribute call on date checks.
+8.2.4:
+ - Enhanced sha messaging — lockfile short shas are now displayed.
+ - Improve Windows unicode output.
+ - General UX and other improvements.
+8.2.3:
+ - Don't show activation instructions when --deploy is used.
+8.2.2:
+ - Improve system pip detection.
+8.2.1:
+ - Enhanced pip resolver — hopefully that won't blow up in our faces.
+ - Fixed file links.
+8.2.0:
+ - Made things nicer.
+8.1.9:
+ - Fix logging bug.
+8.1.8:
+ - Fix dependencies with markers attached. That wasn't easy.
+ - Vendor (patch) pip-tools.
+ - Honor PIP_SRC if it is provided.
+8.1.7:
+ - Update Python 2.x default to 2.7.14.
+ - Deploy mode aborts if Python version doesn't match.
+8.1.6:
+ - Abort when Python installation appears to fail.
+8.1.5:
+ - Update pexcept to fix shellquote issues in subprocesses.
+8.1.4:
+ - Tell users in compatibility mode how to exit the shell.
+ - Updated patched pip's vendored pkg-resources.
+8.1.3:
+ - Further improve patched pip, for crazy setup.py files.
+8.1.2:
+ - chdir option for project, for really stubborn people.
+8.1.1:
+ - Better exception handling when a corrupt virtualenv is being used.
+8.1.0:
+ - Better path handling.
+8.0.9:
+ - Bug when -r is passed in a subdirectory.
+8.0.8:
+ - Add verbose mode to Pip.
+8.0.7:
+ - Fix --skip-lock when verify_ssl = false.
+ - Always quote pip path.
+ - Fix --update.
+8.0.6:
+ - Fix indexes.
+8.0.5:
+ - $ pipenv open :module
+8.0.4:
+ - $ pipenv install --deploy.
+8.0.3:
+ - Improvements to dependency resolution against various versions of Python.
+ - Fix issue with nested directories all containing Pipfiles.
+ - Fix issue with --py when run outside of a project.
+ - Refactoring of virtualenv detection.
+ - Improvements to crayons library.
+ - PIPENV_DOTENV_LOCATION.
+8.0.1:
+ - Fix weird edge case with ramuel.ordereddict.
+8.0.0:
+ - new [pipenv] settings, allows for allows_prereleases=True, automatically set when using install --pre.
+7.9.10:
+ - Use urllib3 directly, for exceptions handling.
+7.9.9:
+ - Fix argument parsing.
+7.9.8:
+ - Fix argument parsing.
+7.9.7:
+ - Fix help printout screen (and update it).
+ - Use urllib3's warning suppression directly.
+7.9.6:
+ - Did you mean?
+7.9.5:
+ - More usage examples in help output.
+7.9.4:
+ - Support for editable extras.
+7.9.3:
+ - Use foreground color instead of white.
+7.9.2:
+ - UX cleanup.
+7.9.1:
+ - Bug fix with indexes.
+7.9.0:
+ - Bug fix with indexes.
+7.8.9:
+ - Fix for Heroku.
+7.8.8:
+ - Make --fancy default for windows users.
+7.8.7:
+ - Make resolver use client python for setup.py egg_info (very fancy).
+ - Fix a nasty windows bug.
+ - add --completion.
+ - add --man.
+7.8.6:
+ - Don't import code automatically, only use -c ..
+7.8.5:
+ - Edge case.
+7.8.4:
+ - Flake8 checking with check --style!
+7.8.3:
+ - $ pipenv check --unused.
+7.8.2:
+ - Fallback to toml parser for absurdly large files.
+7.8.1:
+ - Catch all exceptions in pipreqs.
+7.8.0:
+ - Packaging fix.
+7.7.9:
+ - Ignore bad packages with -c.
+7.7.8:
+ - Minor bug fix.
+7.7.7:
+ - $ pipenv install -c .
+7.7.6:
+ - Fix a very very minor UX bug.
+7.7.5:
+ - No longer eat editables, as pip-tools does it for us now.
+7.7.4:
+ - Install VCS deps into the virtualenv's src directory, not into the current directory.
+7.7.3:
+ - Fix --three on Windows.
+7.7.2:
+ - Bug fixes.
+7.7.1:
+ - Bug fixes.
+ - Improvements to --index support for requirements imports.
+7.7.0:
+ - Improved update caching mechanism.
+ - Only prompt for spelling correction in interactive sessions.
+ - Cleanup -e.
+7.6.9:
+ - 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 install -r requirements.txt --dev` now works.
+7.6.7:
+ - New less-fancy progress bars (for linux users, specifically).
+ - 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 autocorrections as often.
+ - Cleanups.
+ - Don't depend on setuptools anymore.
+7.6.3:
+ - Cleanups.
+7.6.2:
+ - Support for install/lock --pre.
+7.6.1:
+ - Fix a nasty bug.
+7.6.0:
+ - PEP 508 marker support for packages!
+ - Better verbose mode for install.
+ - Fix a nasty bug.
+7.5.1:
+ - Skip the resolver for pinned versions (this comes up a lot).
+ - Maximum subprocesses (configurable) is now 8.
+7.5.0:
+ - Deprecate shell -c mode.
+ - Make a new shell --fancy mode (old default mode).
+ - Introduce PIPENV_SHELL_FANCY.
+ - Introduce `pipenv --envs`.
+7.4.9:
+ - Improvements to PIPENV_DEFAULT_PYTHON_VERSION.
+ - Improvements to auto-suggestions.
+ - Fix nasty bug with failing dependencies.
+7.4.8:
+ - PIPENV_DEFAULT_PYTHON_VERSION
+7.4.7:
+ - install --sequential, for boring people.
+ - PIPENV_DONT_LOAD_ENV.
+ - Fix for prettytoml.
+ - Don't add -e reqs to lockfile, as they're already present.
+7.4.6:
+ - Specify a specific index for a specific dependency.
+7.4.5:
+ - Support for custom indexes!
+ - Random bugfixes.
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 safety now for Python 3.
7.4.3:
- Download/install things concurrently.
7.4.2:
@@ -29,7 +607,7 @@
7.3.5:
- Fix packaging.
7.3.4:
- - An error occured.
+ - An error occurred.
7.3.3:
- Pipenv check now includes security vulnerability disclosures!
7.3.2:
@@ -85,7 +663,7 @@
7.0.3:
- Windows fixes.
7.0.2:
- - Tell pip we're using the requied Python version, with trickery, for dependency resolution.
+ - Tell pip we're using the required Python version, with trickery, for dependency resolution.
- Dev dependencies are now read from a lockfile before default dependencies, so
any mismatches will prefer default to develop.
- Add support for extras_require in Pipfile for vcs urls.
@@ -159,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.
@@ -182,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:
@@ -287,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.
@@ -308,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 fb2c6fed8a..60265d146f 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1 +1,31 @@
-include README.rst LICENSE NOTICES HISTORY.txt pipenv/vendor/safety.zip
+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
+
+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 3755f6ffdf..e518d9421d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,182 @@
-.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
+
+.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:
+ $(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 ./tests/pypi/ ./tests/fixtures
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 118b475073..6c9c811d80 100644
--- a/Pipfile
+++ b/Pipfile
@@ -1,19 +1,41 @@
-[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]
+pipenv = {path = ".", editable = true, extras = ["tests", "dev"]}
+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 = "23.0.*", sys_platform = "== 'linux'"}
+parse = "*"
+importlib-metadata = "*"
+colorama= {version = "*", sys_platform = "== 'win32'"}
+myst-parser = {extras = ["linkify"], version = "*"}
+invoke = "*"
+exceptiongroup = "==1.1.0"
+tomli = "*"
+pyyaml = "==6.0.1"
+build = "*"
twine = "*"
-sphinx-click = "*"
+semver = "*"
+pypiserver = "2.3.2"
+zipp = "==3.21.0"
[packages]
-requests = "*"
-
-
-
+pytz = "*"
+[scripts]
+tests = "bash ./run-tests.sh"
+test = "pytest -vvs"
-[requires]
-python_version = "3.6"
+[pipenv]
+allow_prereleases = true
diff --git a/Pipfile.lock b/Pipfile.lock
new file mode 100644
index 0000000000..0805ac2750
--- /dev/null
+++ b/Pipfile.lock
@@ -0,0 +1,1265 @@
+{
+ "_meta": {
+ "hash": {
+ "sha256": "df09bb53eeffbbc57d8de73d28acc697f5d35483314963afd675f0a00b64806a"
+ },
+ "pipfile-spec": 6,
+ "requires": {},
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "pytz": {
+ "hashes": [
+ "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57",
+ "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"
+ ],
+ "index": "pypi",
+ "version": "==2025.1"
+ }
+ },
+ "develop": {
+ "alabaster": {
+ "hashes": [
+ "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e",
+ "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"
+ ],
+ "markers": "python_version >= '3.10'",
+ "version": "==1.0.0"
+ },
+ "arpeggio": {
+ "hashes": [
+ "sha256:c790b2b06e226d2dd468e4fbfb5b7f506cec66416031fde1441cf1de2a0ba700",
+ "sha256:f7c8ae4f4056a89e020c24c7202ac8df3e2bc84e416746f20b0da35bb1de0250"
+ ],
+ "version": "==2.0.2"
+ },
+ "atomicwrites": {
+ "hashes": [
+ "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"
+ ],
+ "version": "==1.4.1"
+ },
+ "attrs": {
+ "hashes": [
+ "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e",
+ "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==25.1.0"
+ },
+ "babel": {
+ "hashes": [
+ "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d",
+ "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.17.0"
+ },
+ "beautifulsoup4": {
+ "hashes": [
+ "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b",
+ "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16"
+ ],
+ "version": "==4.13.3"
+ },
+ "black": {
+ "hashes": [
+ "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f",
+ "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93",
+ "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11",
+ "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0",
+ "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9",
+ "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5",
+ "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213",
+ "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d",
+ "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7",
+ "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837",
+ "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f",
+ "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395",
+ "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995",
+ "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f",
+ "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597",
+ "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959",
+ "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5",
+ "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb",
+ "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4",
+ "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7",
+ "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd",
+ "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7"
+ ],
+ "version": "==24.3.0"
+ },
+ "build": {
+ "hashes": [
+ "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5",
+ "sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.8'",
+ "version": "==1.2.2.post1"
+ },
+ "certifi": {
+ "hashes": [
+ "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651",
+ "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"
+ ],
+ "markers": "python_version >= '3.6'",
+ "version": "==2025.1.31"
+ },
+ "cffi": {
+ "hashes": [
+ "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8",
+ "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2",
+ "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1",
+ "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15",
+ "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36",
+ "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824",
+ "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8",
+ "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36",
+ "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17",
+ "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf",
+ "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc",
+ "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3",
+ "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed",
+ "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702",
+ "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1",
+ "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8",
+ "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903",
+ "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6",
+ "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d",
+ "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b",
+ "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e",
+ "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be",
+ "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c",
+ "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683",
+ "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9",
+ "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c",
+ "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8",
+ "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1",
+ "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4",
+ "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655",
+ "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67",
+ "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595",
+ "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0",
+ "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65",
+ "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41",
+ "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6",
+ "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401",
+ "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6",
+ "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3",
+ "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16",
+ "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93",
+ "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e",
+ "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4",
+ "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964",
+ "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c",
+ "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576",
+ "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0",
+ "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3",
+ "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662",
+ "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3",
+ "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff",
+ "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5",
+ "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd",
+ "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f",
+ "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5",
+ "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14",
+ "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d",
+ "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9",
+ "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7",
+ "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382",
+ "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a",
+ "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e",
+ "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a",
+ "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4",
+ "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99",
+ "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87",
+ "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"
+ ],
+ "markers": "platform_python_implementation != 'PyPy'",
+ "version": "==1.17.1"
+ },
+ "cfgv": {
+ "hashes": [
+ "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9",
+ "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==3.4.0"
+ },
+ "charset-normalizer": {
+ "hashes": [
+ "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537",
+ "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa",
+ "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a",
+ "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294",
+ "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b",
+ "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd",
+ "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601",
+ "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd",
+ "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4",
+ "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d",
+ "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2",
+ "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313",
+ "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd",
+ "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa",
+ "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8",
+ "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1",
+ "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2",
+ "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496",
+ "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d",
+ "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b",
+ "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e",
+ "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a",
+ "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4",
+ "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca",
+ "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78",
+ "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408",
+ "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5",
+ "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3",
+ "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f",
+ "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a",
+ "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765",
+ "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6",
+ "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146",
+ "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6",
+ "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9",
+ "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd",
+ "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c",
+ "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f",
+ "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545",
+ "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176",
+ "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770",
+ "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824",
+ "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f",
+ "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf",
+ "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487",
+ "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d",
+ "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd",
+ "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b",
+ "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534",
+ "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f",
+ "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b",
+ "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9",
+ "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd",
+ "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125",
+ "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9",
+ "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de",
+ "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11",
+ "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d",
+ "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35",
+ "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f",
+ "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda",
+ "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7",
+ "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a",
+ "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971",
+ "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8",
+ "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41",
+ "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d",
+ "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f",
+ "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757",
+ "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a",
+ "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886",
+ "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77",
+ "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76",
+ "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247",
+ "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85",
+ "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb",
+ "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7",
+ "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e",
+ "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6",
+ "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037",
+ "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1",
+ "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e",
+ "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807",
+ "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407",
+ "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c",
+ "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12",
+ "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3",
+ "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089",
+ "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd",
+ "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e",
+ "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00",
+ "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==3.4.1"
+ },
+ "click": {
+ "hashes": [
+ "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3",
+ "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.6'",
+ "version": "==8.0.3"
+ },
+ "colorama": {
+ "hashes": [
+ "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44",
+ "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6' and sys_platform == 'win32'",
+ "version": "==0.4.6"
+ },
+ "coverage": {
+ "extras": [
+ "toml"
+ ],
+ "hashes": [
+ "sha256:00b2086892cf06c7c2d74983c9595dc511acca00665480b3ddff749ec4fb2a95",
+ "sha256:0533adc29adf6a69c1baa88c3d7dbcaadcffa21afbed3ca7a225a440e4744bf9",
+ "sha256:06097c7abfa611c91edb9e6920264e5be1d6ceb374efb4986f38b09eed4cb2fe",
+ "sha256:07e92ae5a289a4bc4c0aae710c0948d3c7892e20fd3588224ebe242039573bf0",
+ "sha256:0a9d8be07fb0832636a0f72b80d2a652fe665e80e720301fb22b191c3434d924",
+ "sha256:0e549f54ac5f301e8e04c569dfdb907f7be71b06b88b5063ce9d6953d2d58574",
+ "sha256:0ef01d70198431719af0b1f5dcbefc557d44a190e749004042927b2a3fed0702",
+ "sha256:0f16f44025c06792e0fb09571ae454bcc7a3ec75eeb3c36b025eccf501b1a4c3",
+ "sha256:14d47376a4f445e9743f6c83291e60adb1b127607a3618e3185bbc8091f0467b",
+ "sha256:1a936309a65cc5ca80fa9f20a442ff9e2d06927ec9a4f54bcba9c14c066323f2",
+ "sha256:1ceeb90c3eda1f2d8c4c578c14167dbd8c674ecd7d38e45647543f19839dd6ea",
+ "sha256:1f7ffa05da41754e20512202c866d0ebfc440bba3b0ed15133070e20bf5aeb5f",
+ "sha256:200e10beb6ddd7c3ded322a4186313d5ca9e63e33d8fab4faa67ef46d3460af3",
+ "sha256:220fa6c0ad7d9caef57f2c8771918324563ef0d8272c94974717c3909664e674",
+ "sha256:2251fabcfee0a55a8578a9d29cecfee5f2de02f11530e7d5c5a05859aa85aee9",
+ "sha256:2458f275944db8129f95d91aee32c828a408481ecde3b30af31d552c2ce284a0",
+ "sha256:299cf973a7abff87a30609879c10df0b3bfc33d021e1adabc29138a48888841e",
+ "sha256:2b996819ced9f7dbb812c701485d58f261bef08f9b85304d41219b1496b591ef",
+ "sha256:3688b99604a24492bcfe1c106278c45586eb819bf66a654d8a9a1433022fb2eb",
+ "sha256:3a1e465f398c713f1b212400b4e79a09829cd42aebd360362cd89c5bdc44eb87",
+ "sha256:488c27b3db0ebee97a830e6b5a3ea930c4a6e2c07f27a5e67e1b3532e76b9ef1",
+ "sha256:48cfc4641d95d34766ad41d9573cc0f22a48aa88d22657a1fe01dca0dbae4de2",
+ "sha256:4b467a8c56974bf06e543e69ad803c6865249d7a5ccf6980457ed2bc50312703",
+ "sha256:53c56358d470fa507a2b6e67a68fd002364d23c83741dbc4c2e0680d80ca227e",
+ "sha256:5d1095bbee1851269f79fd8e0c9b5544e4c00c0c24965e66d8cba2eb5bb535fd",
+ "sha256:641dfe0ab73deb7069fb972d4d9725bf11c239c309ce694dd50b1473c0f641c3",
+ "sha256:64cbb1a3027c79ca6310bf101014614f6e6e18c226474606cf725238cf5bc2d4",
+ "sha256:66fe626fd7aa5982cdebad23e49e78ef7dbb3e3c2a5960a2b53632f1f703ea45",
+ "sha256:676f92141e3c5492d2a1596d52287d0d963df21bf5e55c8b03075a60e1ddf8aa",
+ "sha256:69e62c5034291c845fc4df7f8155e8544178b6c774f97a99e2734b05eb5bed31",
+ "sha256:704c8c8c6ce6569286ae9622e534b4f5b9759b6f2cd643f1c1a61f666d534fe8",
+ "sha256:78f5243bb6b1060aed6213d5107744c19f9571ec76d54c99cc15938eb69e0e86",
+ "sha256:79cac3390bfa9836bb795be377395f28410811c9066bc4eefd8015258a7578c6",
+ "sha256:7ae6eabf519bc7871ce117fb18bf14e0e343eeb96c377667e3e5dd12095e0288",
+ "sha256:7e39e845c4d764208e7b8f6a21c541ade741e2c41afabdfa1caa28687a3c98cf",
+ "sha256:8161d9fbc7e9fe2326de89cd0abb9f3599bccc1287db0aba285cb68d204ce929",
+ "sha256:8bec2ac5da793c2685ce5319ca9bcf4eee683b8a1679051f8e6ec04c4f2fd7dc",
+ "sha256:959244a17184515f8c52dcb65fb662808767c0bd233c1d8a166e7cf74c9ea985",
+ "sha256:9b148068e881faa26d878ff63e79650e208e95cf1c22bd3f77c3ca7b1d9821a3",
+ "sha256:aa6f302a3a0b5f240ee201297fff0bbfe2fa0d415a94aeb257d8b461032389bd",
+ "sha256:ace9048de91293e467b44bce0f0381345078389814ff6e18dbac8fdbf896360e",
+ "sha256:ad7525bf0241e5502168ae9c643a2f6c219fa0a283001cee4cf23a9b7da75879",
+ "sha256:b01a840ecc25dce235ae4c1b6a0daefb2a203dba0e6e980637ee9c2f6ee0df57",
+ "sha256:b076e625396e787448d27a411aefff867db2bffac8ed04e8f7056b07024eed5a",
+ "sha256:b172f8e030e8ef247b3104902cc671e20df80163b60a203653150d2fc204d1ad",
+ "sha256:b1f097878d74fe51e1ddd1be62d8e3682748875b461232cf4b52ddc6e6db0bba",
+ "sha256:b95574d06aa9d2bd6e5cc35a5bbe35696342c96760b69dc4287dbd5abd4ad51d",
+ "sha256:bda1c5f347550c359f841d6614fb8ca42ae5cb0b74d39f8a1e204815ebe25750",
+ "sha256:cec6b9ce3bd2b7853d4a4563801292bfee40b030c05a3d29555fd2a8ee9bd68c",
+ "sha256:d1a987778b9c71da2fc8948e6f2656da6ef68f59298b7e9786849634c35d2c3c",
+ "sha256:d74c08e9aaef995f8c4ef6d202dbd219c318450fe2a76da624f2ebb9c8ec5d9f",
+ "sha256:e18aafdfb3e9ec0d261c942d35bd7c28d031c5855dadb491d2723ba54f4c3015",
+ "sha256:e216c5c45f89ef8971373fd1c5d8d1164b81f7f5f06bbf23c37e7908d19e8558",
+ "sha256:e695df2c58ce526eeab11a2e915448d3eb76f75dffe338ea613c1201b33bab2f",
+ "sha256:e7575ab65ca8399c8c4f9a7d61bbd2d204c8b8e447aab9d355682205c9dd948d",
+ "sha256:e995b3b76ccedc27fe4f477b349b7d64597e53a43fc2961db9d3fbace085d69d",
+ "sha256:ea31689f05043d520113e0552f039603c4dd71fa4c287b64cb3606140c66f425",
+ "sha256:eb5507795caabd9b2ae3f1adc95f67b1104971c22c624bb354232d65c4fc90b3",
+ "sha256:eb8668cfbc279a536c633137deeb9435d2962caec279c3f8cf8b91fff6ff8953",
+ "sha256:ecea0c38c9079570163d663c0433a9af4094a60aafdca491c6a3d248c7432827",
+ "sha256:f25d8b92a4e31ff1bd873654ec367ae811b3a943583e05432ea29264782dc32c",
+ "sha256:f60a297c3987c6c02ffb29effc70eadcbb412fe76947d394a1091a3615948e2f",
+ "sha256:f973643ef532d4f9be71dd88cf7588936685fdb576d93a79fe9f65bc337d9d73"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==7.6.12"
+ },
+ "cryptography": {
+ "hashes": [
+ "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390",
+ "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41",
+ "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688",
+ "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5",
+ "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1",
+ "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d",
+ "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7",
+ "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843",
+ "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5",
+ "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c",
+ "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a",
+ "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79",
+ "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6",
+ "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181",
+ "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4",
+ "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5",
+ "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562",
+ "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639",
+ "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922",
+ "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3",
+ "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d",
+ "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471",
+ "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd",
+ "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa",
+ "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb",
+ "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699",
+ "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb",
+ "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa",
+ "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0",
+ "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23",
+ "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9",
+ "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615",
+ "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea",
+ "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7",
+ "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308"
+ ],
+ "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'",
+ "version": "==44.0.2"
+ },
+ "distlib": {
+ "hashes": [
+ "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87",
+ "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"
+ ],
+ "version": "==0.3.9"
+ },
+ "docutils": {
+ "hashes": [
+ "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f",
+ "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==0.21.2"
+ },
+ "exceptiongroup": {
+ "hashes": [
+ "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e",
+ "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.7'",
+ "version": "==1.1.0"
+ },
+ "execnet": {
+ "hashes": [
+ "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc",
+ "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.1.1"
+ },
+ "filelock": {
+ "hashes": [
+ "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338",
+ "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==3.17.0"
+ },
+ "flake8": {
+ "hashes": [
+ "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b",
+ "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"
+ ],
+ "version": "==3.9.2"
+ },
+ "flaky": {
+ "hashes": [
+ "sha256:194ccf4f0d3a22b2de7130f4b62e45e977ac1b5ccad74d4d48f3005dcc38815e",
+ "sha256:47204a81ec905f3d5acfbd61daeabcada8f9d4031616d9bcb0618461729699f5"
+ ],
+ "version": "==3.8.1"
+ },
+ "gunicorn": {
+ "hashes": [
+ "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d",
+ "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"
+ ],
+ "markers": "python_version >= '3.7' and sys_platform == 'linux'",
+ "version": "==23.0.0"
+ },
+ "id": {
+ "hashes": [
+ "sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d",
+ "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==1.5.0"
+ },
+ "identify": {
+ "hashes": [
+ "sha256:61491417ea2c0c5c670484fd8abbb34de34cdae1e5f39a73ee65e48e4bb663fc",
+ "sha256:83657f0f766a3c8d0eaea16d4ef42494b39b34629a4b3192a9d020d349b3e255"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2.6.8"
+ },
+ "idna": {
+ "hashes": [
+ "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
+ "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
+ ],
+ "markers": "python_version >= '3.6'",
+ "version": "==3.10"
+ },
+ "imagesize": {
+ "hashes": [
+ "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b",
+ "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==1.4.1"
+ },
+ "importlib-metadata": {
+ "hashes": [
+ "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e",
+ "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.9'",
+ "version": "==8.6.1"
+ },
+ "iniconfig": {
+ "hashes": [
+ "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
+ "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==2.0.0"
+ },
+ "invoke": {
+ "hashes": [
+ "sha256:6ea924cc53d4f78e3d98bc436b08069a03077e6f85ad1ddaa8a116d7dad15820",
+ "sha256:ee6cbb101af1a859c7fe84f2a264c059020b0cb7fe3535f9424300ab568f6bd5"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.6'",
+ "version": "==2.2.0"
+ },
+ "jaraco.classes": {
+ "hashes": [
+ "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd",
+ "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==3.4.0"
+ },
+ "jaraco.context": {
+ "hashes": [
+ "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3",
+ "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==6.0.1"
+ },
+ "jaraco.functools": {
+ "hashes": [
+ "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d",
+ "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==4.1.0"
+ },
+ "jeepney": {
+ "hashes": [
+ "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683",
+ "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"
+ ],
+ "markers": "sys_platform == 'linux'",
+ "version": "==0.9.0"
+ },
+ "jinja2": {
+ "hashes": [
+ "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d",
+ "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==3.1.6"
+ },
+ "keyring": {
+ "hashes": [
+ "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66",
+ "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"
+ ],
+ "markers": "platform_machine != 'ppc64le' and platform_machine != 's390x'",
+ "version": "==25.6.0"
+ },
+ "linkify-it-py": {
+ "hashes": [
+ "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048",
+ "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79"
+ ],
+ "version": "==2.0.3"
+ },
+ "markdown-it-py": {
+ "hashes": [
+ "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1",
+ "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==3.0.0"
+ },
+ "markupsafe": {
+ "hashes": [
+ "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
+ "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30",
+ "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0",
+ "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9",
+ "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396",
+ "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13",
+ "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028",
+ "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca",
+ "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557",
+ "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832",
+ "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0",
+ "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b",
+ "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579",
+ "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a",
+ "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c",
+ "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff",
+ "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c",
+ "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22",
+ "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094",
+ "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb",
+ "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e",
+ "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5",
+ "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a",
+ "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d",
+ "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a",
+ "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b",
+ "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8",
+ "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225",
+ "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c",
+ "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144",
+ "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f",
+ "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87",
+ "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d",
+ "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93",
+ "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf",
+ "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158",
+ "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84",
+ "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb",
+ "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48",
+ "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171",
+ "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c",
+ "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6",
+ "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd",
+ "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d",
+ "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1",
+ "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d",
+ "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca",
+ "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a",
+ "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29",
+ "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe",
+ "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798",
+ "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c",
+ "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8",
+ "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f",
+ "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f",
+ "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a",
+ "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178",
+ "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0",
+ "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79",
+ "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430",
+ "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==3.0.2"
+ },
+ "mccabe": {
+ "hashes": [
+ "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
+ "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
+ ],
+ "version": "==0.6.1"
+ },
+ "mdit-py-plugins": {
+ "hashes": [
+ "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636",
+ "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.4.2"
+ },
+ "mdurl": {
+ "hashes": [
+ "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8",
+ "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==0.1.2"
+ },
+ "mock": {
+ "hashes": [
+ "sha256:4e460e818629b4b173f32d08bf30d3af8123afbb8e04bb5707a1fd4799e503f0",
+ "sha256:7ba87f72ca0e915175596069dbbcc7c75af7b5e9b9bc107ad6349ede0819982f"
+ ],
+ "version": "==5.2.0"
+ },
+ "more-itertools": {
+ "hashes": [
+ "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b",
+ "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==10.6.0"
+ },
+ "mypy-extensions": {
+ "hashes": [
+ "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d",
+ "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"
+ ],
+ "markers": "python_version >= '3.5'",
+ "version": "==1.0.0"
+ },
+ "myst-parser": {
+ "extras": [
+ "linkify"
+ ],
+ "hashes": [
+ "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4",
+ "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d"
+ ],
+ "markers": "python_version >= '3.10'",
+ "version": "==4.0.1"
+ },
+ "nh3": {
+ "hashes": [
+ "sha256:087ffadfdcd497658c3adc797258ce0f06be8a537786a7217649fc1c0c60c293",
+ "sha256:20979783526641c81d2f5bfa6ca5ccca3d1e4472474b162c6256745fbfe31cd1",
+ "sha256:2a5174551f95f2836f2ad6a8074560f261cf9740a48437d6151fd2d4d7d617ab",
+ "sha256:31eedcd7d08b0eae28ba47f43fd33a653b4cdb271d64f1aeda47001618348fde",
+ "sha256:4990e7ee6a55490dbf00d61a6f476c9a3258e31e711e13713b2ea7d6616f670e",
+ "sha256:55823c5ea1f6b267a4fad5de39bc0524d49a47783e1fe094bcf9c537a37df251",
+ "sha256:6141caabe00bbddc869665b35fc56a478eb774a8c1dfd6fba9fe1dfdf29e6efa",
+ "sha256:637d4a10c834e1b7d9548592c7aad760611415fcd5bd346f77fd8a064309ae6d",
+ "sha256:63ca02ac6f27fc80f9894409eb61de2cb20ef0a23740c7e29f9ec827139fa578",
+ "sha256:6ae319f17cd8960d0612f0f0ddff5a90700fa71926ca800e9028e7851ce44a6f",
+ "sha256:6c9c30b8b0d291a7c5ab0967ab200598ba33208f754f2f4920e9343bdd88f79a",
+ "sha256:713d16686596e556b65e7f8c58328c2df63f1a7abe1277d87625dcbbc012ef82",
+ "sha256:818f2b6df3763e058efa9e69677b5a92f9bc0acff3295af5ed013da544250d5b",
+ "sha256:9d67709bc0d7d1f5797b21db26e7a8b3d15d21c9c5f58ccfe48b5328483b685b",
+ "sha256:a5f77e62aed5c4acad635239ac1290404c7e940c81abe561fd2af011ff59f585",
+ "sha256:a772dec5b7b7325780922dd904709f0f5f3a79fbf756de5291c01370f6df0967",
+ "sha256:a7ea28cd49293749d67e4fcf326c554c83ec912cd09cd94aa7ec3ab1921c8283",
+ "sha256:ac7006c3abd097790e611fe4646ecb19a8d7f2184b882f6093293b8d9b887431",
+ "sha256:b3b5c58161e08549904ac4abd450dacd94ff648916f7c376ae4b2c0652b98ff9",
+ "sha256:b8d55ea1fc7ae3633d758a92aafa3505cd3cc5a6e40470c9164d54dff6f96d42",
+ "sha256:bb0014948f04d7976aabae43fcd4cb7f551f9f8ce785a4c9ef66e6c2590f8629",
+ "sha256:d002b648592bf3033adfd875a48f09b8ecc000abd7f6a8769ed86b6ccc70c759",
+ "sha256:d426d7be1a2f3d896950fe263332ed1662f6c78525b4520c8e9861f8d7f0d243",
+ "sha256:fcff321bd60c6c5c9cb4ddf2554e22772bb41ebd93ad88171bbbb6f271255286"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.2.21"
+ },
+ "nodeenv": {
+ "hashes": [
+ "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f",
+ "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"
+ ],
+ "markers": "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.9.1"
+ },
+ "packaging": {
+ "hashes": [
+ "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
+ "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==24.2"
+ },
+ "parse": {
+ "hashes": [
+ "sha256:967095588cb802add9177d0c0b6133b5ba33b1ea9007ca800e526f42a85af558",
+ "sha256:b41d604d16503c79d81af5165155c0b20f6c8d6c559efa66b4b695c3e5a0a0ce"
+ ],
+ "index": "pypi",
+ "version": "==1.20.2"
+ },
+ "parver": {
+ "hashes": [
+ "sha256:2281b187276c8e8e3c15634f62287b2fb6fe0efe3010f739a6bd1e45fa2bf2b2",
+ "sha256:b9fde1e6bb9ce9f07e08e9c4bea8d8825c5e78e18a0052d02e02bf9517eb4777"
+ ],
+ "version": "==0.5"
+ },
+ "pathspec": {
+ "hashes": [
+ "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08",
+ "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.12.1"
+ },
+ "pip": {
+ "hashes": [
+ "sha256:88f96547ea48b940a3a385494e181e29fb8637898f88d88737c5049780f196ea",
+ "sha256:c46efd13b6aa8279f33f2864459c8ce587ea6a1a59ee20de055868d8f7688f7f"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==25.0.1"
+ },
+ "pipenv": {
+ "editable": true,
+ "extras": [
+ "dev",
+ "tests"
+ ],
+ "markers": "python_version >= '3.8'",
+ "path": "."
+ },
+ "platformdirs": {
+ "hashes": [
+ "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907",
+ "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==4.3.6"
+ },
+ "pluggy": {
+ "hashes": [
+ "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
+ "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==1.5.0"
+ },
+ "pre-commit": {
+ "hashes": [
+ "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658",
+ "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.7'",
+ "version": "==2.21.0"
+ },
+ "pycodestyle": {
+ "hashes": [
+ "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068",
+ "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==2.7.0"
+ },
+ "pycparser": {
+ "hashes": [
+ "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
+ "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.22"
+ },
+ "pyenchant": {
+ "hashes": [
+ "sha256:0314d162b7af83adc500f5aff850c91466129363ca8c4d79a8b8d99253346204",
+ "sha256:377a2aaafcb41f871c573c5b74e502dcc6ddba72a62deae7d36dc601a9fcad3d",
+ "sha256:960cbbf4ac99cf9c662308aa9a017ef23017dbea4c8c1e8329978ee4600b3f55",
+ "sha256:ee514d7adf8d0fe39d3a14088f5915953e7fb3bda35092e696fc38f78aabb8b8"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==3.3.0rc1"
+ },
+ "pyflakes": {
+ "hashes": [
+ "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3",
+ "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==2.3.1"
+ },
+ "pygments": {
+ "hashes": [
+ "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f",
+ "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.19.1"
+ },
+ "pypiserver": {
+ "hashes": [
+ "sha256:67c30d2a1a2cea1c4cf6785ddfbce958dc8ee7978e56a54b5f4ebc0c5cb89079",
+ "sha256:d2b16b12a667a9f356f1b022e039d5ad2c33a76986bb2fdb3f18633dbb1afca3"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.6'",
+ "version": "==2.3.2"
+ },
+ "pyproject-hooks": {
+ "hashes": [
+ "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8",
+ "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==1.2.0"
+ },
+ "pytest": {
+ "hashes": [
+ "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820",
+ "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==8.3.5"
+ },
+ "pytest-cov": {
+ "hashes": [
+ "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6",
+ "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.7'",
+ "version": "==4.1.0"
+ },
+ "pytest-timeout": {
+ "hashes": [
+ "sha256:12397729125c6ecbdaca01035b9e5239d4db97352320af155b3f5de1ba5165d9",
+ "sha256:68188cb703edfc6a18fad98dc25a3c61e9f24d644b0b70f33af545219fc7813e"
+ ],
+ "version": "==2.3.1"
+ },
+ "pytest-xdist": {
+ "hashes": [
+ "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7",
+ "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"
+ ],
+ "version": "==3.6.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"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.6'",
+ "version": "==6.0.1"
+ },
+ "readme-renderer": {
+ "hashes": [
+ "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151",
+ "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==44.0"
+ },
+ "requests": {
+ "hashes": [
+ "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
+ "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.32.3"
+ },
+ "requests-toolbelt": {
+ "hashes": [
+ "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6",
+ "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"
+ ],
+ "markers": "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": "python_version >= '3.7'",
+ "version": "==2.0.0"
+ },
+ "rich": {
+ "hashes": [
+ "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098",
+ "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"
+ ],
+ "markers": "python_full_version >= '3.8.0'",
+ "version": "==13.9.4"
+ },
+ "roman-numerals-py": {
+ "hashes": [
+ "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c",
+ "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==3.1.0"
+ },
+ "secretstorage": {
+ "hashes": [
+ "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77",
+ "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"
+ ],
+ "markers": "sys_platform == 'linux'",
+ "version": "==3.3.3"
+ },
+ "semver": {
+ "hashes": [
+ "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746",
+ "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.7'",
+ "version": "==3.0.4"
+ },
+ "setuptools": {
+ "hashes": [
+ "sha256:4880473a969e5f23f2a2be3646b2dfd84af9028716d398e46192f84bc36900d2",
+ "sha256:558e47c15f1811c1fa7adbd0096669bf76c1d3f433f58324df69f3f5ecac4e8f"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==75.8.2"
+ },
+ "snowballstemmer": {
+ "hashes": [
+ "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1",
+ "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"
+ ],
+ "version": "==2.2.0"
+ },
+ "soupsieve": {
+ "hashes": [
+ "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb",
+ "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.6"
+ },
+ "sphinx": {
+ "hashes": [
+ "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348",
+ "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.11'",
+ "version": "==8.2.3"
+ },
+ "sphinx-click": {
+ "hashes": [
+ "sha256:2821c10a68fc9ee6ce7c92fad26540d8d8c8f45e6d7258f0e4fb7529ae8fab49",
+ "sha256:cc67692bd28f482c7f01531c61b64e9d2f069bfcf3d24cbbb51d4a84a749fa48"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.7'",
+ "version": "==4.4.0"
+ },
+ "sphinxcontrib-applehelp": {
+ "hashes": [
+ "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1",
+ "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2.0.0"
+ },
+ "sphinxcontrib-devhelp": {
+ "hashes": [
+ "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad",
+ "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2.0.0"
+ },
+ "sphinxcontrib-htmlhelp": {
+ "hashes": [
+ "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8",
+ "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2.1.0"
+ },
+ "sphinxcontrib-jsmath": {
+ "hashes": [
+ "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178",
+ "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"
+ ],
+ "markers": "python_version >= '3.5'",
+ "version": "==1.0.1"
+ },
+ "sphinxcontrib-qthelp": {
+ "hashes": [
+ "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab",
+ "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2.0.0"
+ },
+ "sphinxcontrib-serializinghtml": {
+ "hashes": [
+ "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331",
+ "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2.0.0"
+ },
+ "sphinxcontrib-spelling": {
+ "hashes": [
+ "sha256:56561c3f6a155b0946914e4de988729859315729dc181b5e4dc8a68fe78de35a",
+ "sha256:95a0defef8ffec6526f9e83b20cc24b08c9179298729d87976891840e3aa3064"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.6'",
+ "version": "==7.7.0"
+ },
+ "stdeb": {
+ "hashes": [
+ "sha256:08c22c9c03b28a140fe3ec5064b53a5288279f22e596ca06b0be698d50c93cf2"
+ ],
+ "version": "==0.10.0"
+ },
+ "tomli": {
+ "hashes": [
+ "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6",
+ "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd",
+ "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c",
+ "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b",
+ "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8",
+ "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6",
+ "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77",
+ "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff",
+ "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea",
+ "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192",
+ "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249",
+ "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee",
+ "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4",
+ "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98",
+ "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8",
+ "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4",
+ "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281",
+ "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744",
+ "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69",
+ "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13",
+ "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140",
+ "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e",
+ "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e",
+ "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc",
+ "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff",
+ "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec",
+ "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2",
+ "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222",
+ "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106",
+ "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272",
+ "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a",
+ "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.8'",
+ "version": "==2.2.1"
+ },
+ "towncrier": {
+ "hashes": [
+ "sha256:013423ee7eed102b2f393c287d22d95f66f1a3ea10a4baa82d298001a7f18af3",
+ "sha256:9343209592b839209cdf28c339ba45792fbfe9775b5f9c177462fd693e127d8d"
+ ],
+ "version": "==24.8.0"
+ },
+ "twine": {
+ "hashes": [
+ "sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384",
+ "sha256:be324f6272eff91d07ee93f251edf232fc647935dd585ac003539b42404a8dbd"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.8'",
+ "version": "==6.1.0"
+ },
+ "typing-extensions": {
+ "hashes": [
+ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
+ "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.8'",
+ "version": "==4.12.2"
+ },
+ "uc-micro-py": {
+ "hashes": [
+ "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a",
+ "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==1.0.3"
+ },
+ "urllib3": {
+ "hashes": [
+ "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df",
+ "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2.3.0"
+ },
+ "virtualenv": {
+ "hashes": [
+ "sha256:fdaabebf6d03b5ba83ae0a02cfe96f48a716f4fae556461d180825866f75b728",
+ "sha256:febddfc3d1ea571bdb1dc0f98d7b45d24def7428214d4fb73cc486c9568cce6a"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==20.29.2"
+ },
+ "waitress": {
+ "hashes": [
+ "sha256:682aaaf2af0c44ada4abfb70ded36393f0e307f4ab9456a215ce0020baefc31f",
+ "sha256:c56d67fd6e87c2ee598b76abdd4e96cfad1f24cacdea5078d382b1f9d7b5ed2e"
+ ],
+ "markers": "python_full_version >= '3.9.0' and sys_platform == 'win32'",
+ "version": "==3.0.2"
+ },
+ "zipp": {
+ "hashes": [
+ "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4",
+ "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.9'",
+ "version": "==3.21.0"
+ }
+ }
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000..ade2f4cf9f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,389 @@
+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
+
+To enable completion in fish, add this to your configuration `~/.config/fish/completions/pipenv.fish`:
+
+ eval (env _PIPENV_COMPLETE=fish_source pipenv)
+
+There is also a [fish plugin](https://github.com/fisherman/pipenv), which will automatically
+activate your subshells for you!
+
+Alternatively, with zsh, add this to your configuration `~/.zshrc`:
+
+ eval "$(_PIPENV_COMPLETE=zsh_source pipenv)"
+
+Alternatively, with bash, add this to your configuration `~/.bashrc` or `~/.bash_profile`:
+
+ eval "$(_PIPENV_COMPLETE=bash_source pipenv)"
+
+Magic shell completions are now enabled!
+
+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 23a9cee8db..0000000000
--- a/README.rst
+++ /dev/null
@@ -1,235 +0,0 @@
-Pipenv: Sacred Marriage of Pipfile, Pip, & Virtualenv
-=====================================================
-
-.. 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 harnesses `Pipfile `_, `Pip `_, and `Virtualenv `_ together in unison to create a single, high-quality tool that is optimized for workflow efficiency and best practices. *Windows is a first–class citizen, in our world.*
-
-Pipenv automatically creates and manages the virtualenvs of your projects, as well as adds/removes packages from your ``Pipfile`` as you install/uninstall packages. The ``lock`` command generates a lockfile (``Pipfile.lock``).
-
-.. 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.*
-
-**Jhon Crypt**—
- *Pipenv is the best thing since pip, thank you!*
-
-**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
-////////////////
-
-Set ``_PIPENV_COMPLETE`` and then source the output of the program. For example, with fish, put this
-in your ``~/.config/fish/completions/pipenv.fish``::
-
- eval (env _PIPENV_COMPLETE=source-fish pipenv)
-
-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.
- --rm Remove the virtualenv.
- --bare Minimal output.
- --three / --two Use Python 3/2 when creating virtualenv.
- --python TEXT Specify which version of Python virtualenv should use.
- -h, --help Show this message then exit.
- -j, --jumbotron An easter egg, effectively.
- --version Show the version and exit.
-
-
- Usage Examples:
- Create a new project using Python 3:
- $ pipenv --three
-
- 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:
- $ pipenv lock
-
- Show a graph of your installed dependencies:
- $ pipenv graph
-
- 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.
- 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 54163ed2cd..0000000000
--- a/appveyor.yml
+++ /dev/null
@@ -1,55 +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"
- TOXENV: "py27"
-
- - PYTHON: "C:\\Python34-x64"
- PYTHON_VERSION: "3.4.x"
- PYTHON_ARCH: "64"
- TOXENV: "py34"
-
- - PYTHON: "C:\\Python35-x64"
- PYTHON_VERSION: "3.5.x"
- PYTHON_ARCH: "64"
- TOXENV: "py35"
-
- - PYTHON: "C:\\Python36-x64"
- PYTHON_VERSION: "3.6.x"
- PYTHON_ARCH: "64"
- TOXENV: "py36"
-
-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:
- - "pytest test_windows/ tests/test_utils.py tests/test_project.py"
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 f0081c5f78..00c88843ca 100644
--- a/docs/_templates/hacks.html
+++ b/docs/_templates/hacks.html
@@ -1,4 +1,5 @@
-
+
+
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/_templates/sidebarintro.html b/docs/_templates/sidebarintro.html
deleted file mode 100644
index 1b4e1f8d95..0000000000
--- a/docs/_templates/sidebarintro.html
+++ /dev/null
@@ -1,54 +0,0 @@
-
- Pipenv is an experimental project that aims to bring the best of all packaging worlds to the Python world. It harnesses Pipfile, pip, and virtualenv into one single toolchain.
-
It features very pretty terminal colors.
-
-
-
Stay Informed
-
Receive updates on new releases and upcoming projects.
- Pipenv is an experimental project that aims to bring the best of all packaging worlds to the Python world. It harnesses Pipfile, pip, and virtualenv into one single toolchain.
+ 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..1382af7f17
--- /dev/null
+++ b/docs/advanced.md
@@ -0,0 +1,352 @@
+# Other topics
+
+This document is current in the process of being broken apart into more granular sections so that we may provide better overall documentation.
+
+## ☤ Supplying additional arguments to pip
+
+There may be cases where you wish to supply additional arguments to pip to be used during the install phase. For example, you may want to enable the pip feature for using [system certificate stores](https://pip.pypa.io/en/latest/topics/https-certificates/#using-system-certificate-stores)
+
+In this case you can supply these additional arguments to `pipenv sync` or `pipenv install` by passing additional
+argument `--extra-pip-args="--use-feature=truststore"`. It is possible to supply multiple arguments in the `--extra-pip-args`. Example usage:
+
+ pipenv sync --extra-pip-args="--use-feature=truststore --proxy=127.0.0.1"
+
+## ☤ Using pipenv for Deployments
+
+You may want to use `pipenv` as part of a deployment process.
+
+You can enforce that your `Pipfile.lock` is in parity with your `Pipfile` by using the `--deploy` flag:
+
+ $ pipenv install --deploy
+
+This will fail a build if the `Pipfile.lock` `_meta` `hash` is out of date from the Pipfile contents.
+
+Or you can install packages exactly as specified in `Pipfile.lock` using the `install` or `sync` command:
+
+ $ pipenv install
+
+ or
+
+ $ pipenv install
+
+Note: Legacy versions of pipenv (prior to pipenv 2024) would relock dependencies when running `pipenv install`. This behavior was changed in pipenv 2024.0.0 to only relock dependencies when supply package specifiers to the `install` command.
+
+ ``pipenv sync`` is nearly equivalent to ``pipenv install`` at this point, except pipenv install provides more functionality for adding and upgrading packages.
+
+You may only wish to verify your `Pipfile.lock` is up-to-date with dependencies specified in the `Pipfile`, without installing:
+
+ $ pipenv verify
+
+The command will perform a verification, and return an exit code `1` when dependency locking is needed. This may be useful for cases when the `Pipfile.lock` file is subject to version control, so this command can be used within your CI/CD pipelines.
+
+### Deploying System Dependencies
+
+You can tell Pipenv to install a Pipfile's contents into its parent system with the `--system` flag:
+
+ $ pipenv install --system
+
+This is useful for managing the system Python, and deployment infrastructure (e.g. Heroku does this).
+
+## ☤ Pipenv and Other Python Distributions
+
+To use Pipenv with a third-party Python distribution (e.g. Anaconda), you simply provide the path to the Python binary:
+
+ $ pipenv install --python=/path/to/python
+
+Anaconda uses Conda to manage packages. To reuse Conda–installed Python packages, use the `--site-packages` flag:
+
+ $ pipenv --python=/path/to/python --site-packages
+
+## ☤ Generating a `requirements.txt`
+
+Sometimes, you would want to generate a requirements file based on your current
+environment, for example to include tooling that only supports requirements.txt.
+You can convert a `Pipfile.lock` into a `requirements.txt`
+file very easily.
+
+Let's take this `Pipfile`:
+
+ [[source]]
+ name = "pypi"
+ url = "https://pypi.org/simple"
+ verify_ssl = true
+
+ [packages]
+ requests = {version="==2.18.4"}
+
+ [dev-packages]
+ pytest = {version="==3.2.3"}
+
+Which generates a `Pipfile.lock` upon completion of running ``pipenv lock``` similar to:
+
+ {
+ "_meta": {
+ "hash": {
+ "sha256": "4b81df812babd4e54ba5a4086714d7d303c1c3f00d725c76e38dd58cbd360f4e"
+ },
+ "pipfile-spec": 6,
+ "requires": {},
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ ... snipped ...
+ "requests": {
+ "hashes": [
+ "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b",
+ "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"
+ ],
+ "index": "pypi",
+ "version": "==2.18.4"
+ },
+ ... snipped ...
+ },
+ "develop": {
+ ... snipped ...
+ "pytest": {
+ "hashes": [
+ "sha256:27fa6617efc2869d3e969a3e75ec060375bfb28831ade8b5cdd68da3a741dc3c",
+ "sha256:81a25f36a97da3313e1125fce9e7bbbba565bc7fec3c5beb14c262ddab238ac1"
+ ],
+ "index": "pypi",
+ "version": "==3.2.3"
+ }
+ ... snipped ...
+ }
+
+Given the `Pipfile.lock` exists, you may generate a set of requirements out of it with the default dependencies:
+
+ $ pipenv requirements
+ -i https://pypi.org/simple
+ certifi==2022.9.24 ; python_version >= '3.6'
+ chardet==3.0.4
+ idna==2.6
+ requests==2.18.4
+ urllib3==1.22
+
+As with other commands, passing `--dev` will include both the default and
+development dependencies:
+
+ $ pipenv requirements --dev
+ -i https://pypi.org/simple
+ colorama==0.4.5 ; sys_platform == 'win32'
+ py==1.11.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
+ pytest==3.2.3
+ setuptools==65.4.1 ; python_version >= '3.7'
+ certifi==2022.9.24 ; python_version >= '3.6'
+ chardet==3.0.4
+ idna==2.6
+ requests==2.18.4
+ urllib3==1.22
+
+If you wish to generate a requirements file with only the development requirements you can do that too, using the `--dev-only` flag:
+
+ $ pipenv requirements --dev-only
+ -i https://pypi.org/simple
+ colorama==0.4.5 ; sys_platform == 'win32'
+ py==1.11.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
+ pytest==3.2.3
+ setuptools==65.4.1 ; python_version >= '3.7'
+
+Adding the `--hash` flag adds package hashes to the output for extra security.
+Adding the `--exclude-markers` flag excludes the markers from the output.
+
+The locked requirements are written to stdout, with shell output redirection
+used to write them to a file:
+
+ $ pipenv requirements > requirements.txt
+ $ pipenv requirements --dev-only > dev-requirements.txt
+ $ cat requirements.txt
+ -i https://pypi.org/simple
+ certifi==2022.9.24 ; python_version >= '3.6'
+ chardet==3.0.4
+ idna==2.6
+ requests==2.18.4
+ urllib3==1.22
+ $ cat dev-requirements.txt
+ -i https://pypi.org/simple
+ colorama==0.4.5 ; sys_platform == 'win32'
+ py==1.11.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
+ pytest==3.2.3
+ setuptools==65.4.1 ; python_version >= '3.7'
+
+If you have multiple categories in your Pipfile and wish to generate
+a requirements file for only some categories, you can do that too,
+using the `--categories` option:
+
+ $ pipenv requirements --categories="tests" > requirements-tests.txt
+ $ pipenv requirements --categories="docs" > requirements-docs.txt
+ $ cat requirements-tests.txt
+ -i https://pypi.org/simple
+ attrs==22.1.0 ; python_version >= '3.5'
+ iniconfig==1.1.1
+ packaging==21.3 ; python_version >= '3.6'
+ pluggy==1.0.0 ; python_version >= '3.6'
+ py==1.11.0 ; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
+ pyparsing==3.0.9 ; python_full_version >= '3.6.8'
+ pytest==7.1.3
+ tomli==2.0.1 ; python_version >= '3.7'
+
+It can be used to specify multiple categories also.
+
+ $ pipenv requirements --categories="tests,docs"
+
+## ☤ Detection of Security Vulnerabilities
+
+Pipenv includes the [safety](https://github.com/pyupio/safety) package, and will use it to scan your dependency graph for known security vulnerabilities!
+
+By default `pipenv check` will scan the Pipfile.lock default packages group and use this as the input to the safety command.
+To scan other package categories pass the specific `--categories` you want to check against.
+To have `pipenv check` scan the virtualenv packages for what is installed and use this as the input to the safety command,
+run`pipenv check --use-installed`.
+Note: `--use-installed` was the default behavior in `pipenv<=2023.2.4`.
+
+Example:
+
+ $ pipenv install wheel==0.37.1
+ $ cat Pipfile.lock
+ ...
+ "default": {
+ "wheel": {
+ "hashes": [
+ "sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a",
+ "sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4"
+ ],
+ "index": "pypi",
+ "version": "==0.37.1"
+ }
+ },
+ ...
+
+ $ pipenv check --use-lock
+ ...
+ -> Vulnerability found in wheel version 0.37.1
+ Vulnerability ID: 51499
+ Affected spec: <0.38.1
+ ADVISORY: Wheel 0.38.1 includes a fix for CVE-2022-40898: An issue discovered in Python Packaging Authority (PyPA) Wheel 0.37.1 and earlier allows remote attackers to cause a denial of service
+ via attacker controlled input to wheel cli.https://pyup.io/posts/pyup-discovers-redos-vulnerabilities-in-top-python-packages
+ CVE-2022-40898
+ For more information, please visit https://pyup.io/v/51499/742
+
+ Scan was completed. 1 vulnerability was found.
+ ...
+
+Note
+
+Each month, [PyUp.io](https://pyup.io) updates the `safety` database of insecure Python packages and [makes it available to the open source community for free](https://pyup.io/safety/). Each time you run `pipenv check` to show you vulnerable dependencies,
+Pipenv makes an API call to retrieve and use those results.
+
+For more up-to-date vulnerability data, you may also use your own safety API key by setting the environment variable `PIPENV_PYUP_API_KEY`.
+
+## ☤ Community Integrations
+
+There are a range of community-maintained plugins and extensions available for a range of editors and IDEs, as well as different products which integrate with Pipenv projects:
+
+- [Heroku](https://heroku.com/python) (Cloud Hosting)
+- [Platform.sh](https://platform.sh/hosting/python)(Cloud Hosting)
+- [PyUp](https://pyup.io) (Security Notification)
+- [Emacs](https://github.com/pwalsh/pipenv.el) (Editor Integration)
+- [Fish Shell](https://github.com/fisherman/pipenv) (Automatic `$ pipenv shell`!)
+- [VS Code](https://code.visualstudio.com/docs/python/environments) (Editor Integration)
+- [PyCharm](https://www.jetbrains.com/pycharm/download/) (Editor Integration)
+
+## ☤ 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 VS Code, for example, you'll want to `export EDITOR=code` (if you're on macOS you will want to [install the command](https://code.visualstudio.com/docs/setup/mac#_launching-from-the-command-line) on to your `PATH` first).
+
+## ☤ Automatic Python Installation
+
+This is a very fancy feature, and we're very proud of it:
+
+ $ cat Pipfile
+ [[source]]
+ name = "pypi"
+ url = "https://pypi.org/simple"
+ verify_ssl = true
+
+ [dev-packages]
+
+ [packages]
+ requests = "*"
+
+ [requires]
+ python_version = "3.11"
+
+ $ pipenv install
+ 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.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](https://www.python.org/dev/peps/pep-0508/) specifiers.
+
+💫✨🍰✨💫
+
+## ☤ Testing Projects
+
+Pipenv is being used in projects like [Requests](https://github.com/psf/requests) for declaring development dependencies and running the test suite.
+
+### Tox Automation Project
+
+Here's an example `tox.ini` for both local and external testing:
+
+ [tox]
+ envlist = py37, py38, py39, py310, py311, pypy3, ruff
+
+ [testenv]
+ deps = pipenv
+ commands=
+ pipenv install --dev
+ pipenv run pytest tests
+
+ [testenv:ruff]
+ basepython = python3.11
+ commands=
+ pipenv install --dev
+ pipenv run ruff --version
+ pipenv run ruff .
+
+Pipenv will automatically use the virtualenv provided by `tox`. If `pipenv install --dev` installs e.g. `pytest`, then installed command `pytest` will be present in given virtualenv and can be called directly by `pytest tests` instead of `pipenv run pytest tests`.
+W
+✨🍰✨
+
+## ☤ 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 --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/advanced.rst b/docs/advanced.rst
deleted file mode 100644
index 754221b1db..0000000000
--- a/docs/advanced.rst
+++ /dev/null
@@ -1,566 +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 advanced features.
-
-☤ Example Pipfile & Pipfile.lock
---------------------------------
-
-.. _example_files:
-
-Here is a simple example of a ``Pipfile`` and the resulting ``Pipfile.lock``.
-
-Example Pipfile
-///////////////
-
-::
-
- [dev-packages]
- pytest = "*"
-
- [packages]
- requests = "*"
-
-Example Pipfile.lock
-////////////////////
-
-::
-
- {
- "_meta": {
- "hash": {
- "sha256": "08e3181df84d04301c9d435357ec9cf43c4a491d79a1ada682cce8936c492f49"
- },
- "host-environment-markers": {
- "implementation_name": "cpython",
- "implementation_version": "3.6.2",
- "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.2",
- "python_version": "3.6",
- "sys_platform": "darwin"
- },
- "pipfile-spec": 2,
- "requires": {},
- "sources": [
- {
- "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": {
- "version": "==1.4.34"
- },
- "pytest": {
- "version": "==3.2.1"
- }
- }
- }
-
-
-.. _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.6::
-
- $ pipenv --python 3.6
-
-Use Python 2.7::
-
- $ pipenv --python 2.7
-
-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.
-
-
-☤ 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.
-
-✨🍰✨
-
-☤ 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 comitting ``.env`` files into source control!
-
-.. _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 boostrap your whole system::
-
- $ curl https://raw.githubusercontent.com/kennethreitz/pipenv/master/get-pipenv.py | python
-
-Congratulations, you now have pip and Pipenv installed!
-
-.. _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 intepreter.
-
- .. 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`` may produce unexpected results. If this is the case, try ``$ pipenv shell -c``, 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.
-
-
-☤ 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_SHELL_COMPAT`` — Always use compatibility 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.
-
- - ``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.
-
-
-☤ 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.
-
-☤ 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/
-
-☤ 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``.
-
-☤ Shell Completion
-------------------
-
-Set ``_PIPENV_COMPLETE`` and then source the output of the program.
-For example, with ``fish``, put this in your
-``~/.config/fish/completions/pipenv.fish``::
-
- eval (env _PIPENV_COMPLETE=source-fish pipenv)
-
-Magic shell completions are now enabled!
-
-✨🍰✨
diff --git a/docs/basics.rst b/docs/basics.rst
deleted file mode 100644
index 750a8e9e6d..0000000000
--- a/docs/basics.rst
+++ /dev/null
@@ -1,182 +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 avalable
-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
-
-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 ``bin`` directory to your ``PATH``.
- You can find the user base by running ``python -m site`` which will print
- site information including the user base. For example, on Linux this will
- return ``USER_BASE: '~/.local'`` so you'll need to add ``~/.local/bin`` to
- your ``PATH``. On Linux and macOS you can set your ``PATH`` permanently
- by `modifying ~/.profile`_. On Windows you can set the user
- ``PATH`` permanently in the `Control Panel`_.
-
-.. _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! ✨ 🍰 ✨
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..bae410f7a9
--- /dev/null
+++ b/docs/cli.md
@@ -0,0 +1,181 @@
+# Pipenv CLI Reference
+
+## pipenv
+
+```bash
+pipenv [OPTIONS] COMMAND [ARGS]...
+```
+
+## check
+
+Checks and scans project for PyUp Safety security vulnerabilities and against PEP 508 markers.
+
+```bash
+pipenv check [OPTIONS]
+```
+
+Options:
+```
+--db TEXT Path or URL to a PyUp Safety vulnerabilities database.
+--ignore, -i TEXT Ignore specified vulnerability during PyUp Safety checks.
+--output [screen|text|json|bare]
+ Specifies the output format for the PyUp Safety check.
+--key TEXT Safety API key from PyUp.io for scanning dependencies against a live
+ vulnerabilities database.
+--quiet Quiet standard output, except vulnerability report.
+--policy-file TEXT Define the policy file to be used.
+--exit-code / --continue-on-error
+ Output standard exit codes. Default: --exit-code.
+--audit-and-monitor / --disable-audit-and-monitor
+ Send results back to pyup.io for viewing on your dashboard.
+--project TEXT Project to associate this scan with on pyup.io.
+--save-json TEXT Path to where output file will be placed.
+--use-installed Whether to use the lockfile as input to check.
+--categories TEXT Use the specified categories from the lockfile as input to check.
+--auto-install Automatically install safety if not already installed.
+--scan Use the new scan command instead of the deprecated check command.
+```
+
+**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.
+
+When using the `--scan` option, you'll need to obtain an API key from https://pyup.io to access the full vulnerability database.
+
+## clean
+
+Uninstalls all packages not specified in Pipfile.lock.
+
+```bash
+pipenv clean [OPTIONS]
+```
+
+## graph
+
+Displays currently–installed dependency graph information.
+
+```bash
+pipenv graph [OPTIONS]
+```
+
+## install
+
+Installs provided packages and adds them to Pipfile, or (if no packages are given), installs all packages from Pipfile.lock
+
+```bash
+pipenv install [OPTIONS] [PACKAGES]...
+```
+
+Environment Variables
+
+PIP_INDEX_URL
+
+```bash
+ Provide a default for -i
+```
+
+## lock
+
+Generates Pipfile.lock.
+
+```bash
+pipenv lock [OPTIONS]
+```
+
+## open
+
+View a given module in your editor.
+
+This uses the EDITOR environment variable. You can temporarily override it, for example:
+
+EDITOR=atom pipenv open requests
+
+```bash
+pipenv open [OPTIONS] MODULE
+```
+
+## requirements
+
+Generate a requirements.txt from Pipfile.lock.
+
+```bash
+pipenv requirements [OPTIONS]
+```
+
+## run
+
+Spawns a command installed into the virtualenv.
+
+```bash
+pipenv run [OPTIONS] COMMAND [ARGS]...
+```
+
+## scripts
+
+Lists scripts in current environment config.
+
+```bash
+pipenv scripts [OPTIONS]
+```
+
+## shell
+
+Spawns a shell within the virtualenv.
+
+```bash
+pipenv shell [OPTIONS] [SHELL_ARGS]...
+```
+
+## sync
+
+Installs all packages specified in Pipfile.lock.
+
+```bash
+pipenv sync [OPTIONS]
+```
+
+## uninstall
+
+Un-installs a provided package and removes it from Pipfile.
+
+```bash
+pipenv uninstall [OPTIONS] [PACKAGES]...
+```
+
+## update
+
+Runs lock when no packages are specified, or upgrade, and then sync.
+
+```bash
+pipenv update [OPTIONS] [PACKAGES]...
+```
+
+Environment Variables
+
+PIP_INDEX_URL
+
+```bash
+ Provide a default for -i
+```
+
+## upgrade
+
+Resolves provided packages and adds them to Pipfile, or (if no packages are given), merges results to Pipfile.lock
+
+```bash
+pipenv upgrade [OPTIONS] [PACKAGES]...
+```
+
+Environment Variables
+
+PIP_INDEX_URL
+
+```bash
+ Provide a default for -i
+```
+
+## verify
+
+Verify the hash in Pipfile.lock is up-to-date.
+
+```bash
+pipenv verify [OPTIONS]
+```
diff --git a/docs/commands.md b/docs/commands.md
new file mode 100644
index 0000000000..44a18bb874
--- /dev/null
+++ b/docs/commands.md
@@ -0,0 +1,89 @@
+# Pipenv Commands
+
+The commands reference for pipenv (incomplete)
+
+## install
+
+``$ pipenv install`` is used for installing packages into the pipenv virtual environment
+and updating your Pipfile and Pipfile.lock in the case of adding new packages.
+
+Along with the basic installation command, which takes the form:
+
+ $ pipenv install
+
+Running the above will install the package `` and add it to the default packages section in the `Pipfile` and all of its dependencies to the `Pipfile.lock`.
+
+The user can provide these additional parameters:
+
+ --python= — Performs the installation in a virtualenv using the provided Python interpreter.
+warning: The above commands should only be used when initially creating the environment.
+
+The user can provide these additional parameters:
+
+ --dev — Install both develop and default package categories from Pipfile.
+ --categories — Install packages to the category groups specified here.
+ --system — Install packages to the system site-packages rather than into your virtualenv.
+ --deploy — Verifies the _meta hash of the lock file is up to date with the ``Pipfile``, aborts install if not.
+ --ignore-pipfile — Install from the Pipfile.lock completely ignoring Pipfile information.
+
+General Interface Note:
+```{note}
+ It was confusing to users that prior to pipenv 2024, the install would relock the lock file every time it was run.
+ Based on feedback in pipenv issue reports, we changed the install command to only update lock when adding or changing a package.
+ If you wish to relock the entire set of Pipfile specifiers, please continue to utilize `pipenv lock`
+```
+
+## sync
+``$ pipenv sync`` installs dependencies from the ``Pipfile.lock`` without any alteration to the lockfile.
+
+The user can provide these additional parameters:
+
+ --categories — Install packages from the category groups specified here.
+
+## uninstall
+
+``$ pipenv uninstall`` supports all of the parameters in `pipenv install, as well as two additional options,
+``--all`` and ``--all-dev``.
+
+ - --all — This parameter will purge all files from the virtual environment,
+ but leave the Pipfile untouched.
+
+ - --all-dev — This parameter will remove all of the development packages from
+ the virtual environment, and remove them from the Pipfile.
+
+
+## lock
+
+``$ pipenv lock`` is used to update all dependencies of ``Pipfile.lock`` to their latest resolved versions based on your ``Pipfile`` specification.
+
+## update
+
+``$ pipenv update `` will update the lock of specified dependency and sub-dependencies only and install the updates.
+
+
+## upgrade
+
+``$ pipenv upgrade `` will update the lock of specified dependency and sub-dependencies only, but does not modify the environment.
+
+## run
+
+``$ pipenv run`` will run a given command from the virtualenv, with any arguments forwarded (e.g. ``$ pipenv run python`` or ``$ pipenv run pip freeze``).
+
+## shell
+
+``$ pipenv shell`` will spawn a shell with the virtualenv activated. This shell can be deactivated by using ``exit``.
+
+## graph
+``$ pipenv graph`` will show you a dependency graph of your installed dependencies where each root node is a specifier from the ``Pipfile``.
+
+## check
+
+``$ pipenv check`` checks for security vulnerabilities and asserts that [PEP 508](https://www.python.org/dev/peps/pep-0508/) requirements are being met by the project's lock file or current environment.
+
+The user can provide these additional parameters:
+
+ --auto-install — Automatically install safety if not already installed.
+ --scan - Enable the newer version of the check command with improved functionality.
+
+## scripts
+``$ pipenv scripts`` will list the scripts in the current environment config.
diff --git a/docs/conf.py b/docs/conf.py
index 71f307ad42..aef08afa82 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,11 @@
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
import os
-import sys
+
+import pipenv.vendor.click
+
+# Hackery to get the CLI docs to generate
+from pipenv.vendor import click
# Path hackery to get current version number.
here = os.path.abspath(os.path.dirname(__file__))
@@ -26,6 +29,9 @@
with open(os.path.join(here, "..", "pipenv", "__version__.py")) as f:
exec(f.read(), about)
+click.Command = pipenv.vendor.click.Command
+click.Group = pipenv.vendor.click.Group
+click.BaseCommand = pipenv.vendor.click.BaseCommand
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
@@ -35,37 +41,59 @@
# 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",
+ "sphinx_click",
+]
# 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 +105,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': True,
- '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 +167,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 +182,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 +190,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 +199,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 +229,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..bc42d2438a
--- /dev/null
+++ b/docs/configuration.md
@@ -0,0 +1,45 @@
+# Configuration
+
+## Configuration With Environment Variables
+
+Pipenv comes with a handful of options that can be set via shell environment
+variables.
+
+To enable boolean options, create the variable in your shell and assign to it a
+true value. Allowed values are: `"1", "true", "yes", "on"`
+
+ $ PIPENV_IGNORE_VIRTUALENVS=1
+
+To explicitly disable a boolean option, assign to it a false value (i.e. `"0"`).
+
+```{eval-rst}
+.. autoclass:: pipenv.environments.Setting
+ :members:
+```
+
+Also note that `pip` supports additional [environment variables](https://pip.pypa.io/en/stable/user_guide/#environment-variables), if you need additional customization.
+
+For example:
+
+ $ PIP_INSTALL_OPTION="-- -DCMAKE_BUILD_TYPE=Release" pipenv install -e .
+
+## Changing Cache Location
+
+You can force pipenv to use a different cache location by setting the environment variable `PIPENV_CACHE_DIR` to the location you wish.
+This is useful in the same situations that you would change `PIP_CACHE_DIR` to a different directory.
+
+## Changing Default Python Versions
+
+By default, pipenv will initialize a project using whatever version of python the system has as default.
+Besides starting a project with the `--python` flag, you can also use `PIPENV_DEFAULT_PYTHON_VERSION` to specify what version to use when starting a project when `--python` isn't used.
+
+## Environments with network issues
+
+If you are trying to use pipenv in an environment with network issues, you may be able to try modifying
+the following settings when you encounter errors related to network connectivity.
+
+### REQUESTS_TIMEOUT
+
+Default is 10 seconds. You can increase it by setting `PIPENV_REQUESTS_TIMEOUT` environment variable.
+
+Please notice that this setting only affects pipenv itself, not additional packages such as [safety](advanced.rst).
diff --git a/docs/credentials.md b/docs/credentials.md
new file mode 100644
index 0000000000..c22b1f072d
--- /dev/null
+++ b/docs/credentials.md
@@ -0,0 +1,73 @@
+# Credentials
+
+## Injecting credentials into Pipfile via environment variables
+
+Pipenv will expand environment variables (if defined) in your Pipfile. Quite
+useful if you need to authenticate to a private PyPI:
+
+ [[source]]
+ url = "https://$USERNAME:$%7BPASSWORD%7D@mypypi.example.com/simple"
+ verify_ssl = true
+ name = "pypi"
+
+Luckily - pipenv will hash your Pipfile *before* expanding environment
+variables (and, helpfully, will substitute the environment variables again when
+you install from the lock file - so no need to commit any secrets! Woo!)
+
+If your credentials contain special characters, make sure they are URL-encoded as specified in `rfc3986 `_.
+
+Environment variables may be specified as `${MY_ENVAR}` or `$MY_ENVAR`.
+
+On Windows, `%MY_ENVAR%` is supported in addition to `${MY_ENVAR}` or `$MY_ENVAR`.
+
+Environment variables in the URL part of requirement specifiers can also be expanded, where the variable must be in the form of `${VAR_NAME}`. Neither `$VAR_NAME` nor `%VAR_NAME%` is acceptable:
+
+ [[package]]
+ requests = {git = "git://${USERNAME}:${PASSWORD}@private.git.com/psf/requests.git", ref = "2.22.0"}
+
+Keep in mind that environment variables are expanded in runtime, leaving the entries in `Pipfile` or `Pipfile.lock` untouched. This is to avoid the accidental leakage of credentials in the source code.
+
+## Injecting credentials through keychain support
+
+Private registries on Google Cloud, Azure and AWS support dynamic credentials using
+the keychain implementation.
+
+Pipenv supports this keychain implementation. It will automatically detect the
+keychain implementation and use it to authenticate to the private registry.
+
+### Google Cloud
+
+Google Cloud supports private registries. You can find more information about
+this here: https://cloud.google.com/artifact-registry/docs/python/authentication
+
+In order to utilize, you need to install the `keyring` and `keyrings.google-artifactregistry` packages,
+and they must be available in the same virtualenv that you intend to use Pipenv in.
+
+ pipenv run pip install keyring keyrings.google-artifactregistry-auth
+
+Depending on the way your keychain is structured, it may ask for user input.
+Asking the user for input is disabled by default, and this may disable the keychain support completely.
+If you want to work with private registries that use the keychain for authentication,
+you may need to disable the "enforcement of no input".
+
+**Note:** Please be sure that the keychain will really not ask for input.
+Otherwise, the process will hang forever!:
+
+ [[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"}
+
+ [pipenv]
+ disable_pip_input = false
+
+Above example will install `flask` and a private package `private-test-package` from GCP.
diff --git a/docs/dev/contributing.md b/docs/dev/contributing.md
new file mode 100644
index 0000000000..a6bd1021dd
--- /dev/null
+++ b/docs/dev/contributing.md
@@ -0,0 +1,285 @@
+# 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
+ $ pipenv install --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.
+
+## 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
+$ pipenv install --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..72fac27613
--- /dev/null
+++ b/docs/diagnose.md
@@ -0,0 +1,97 @@
+# Frequently Encountered Pipenv Problems
+
+Pipenv is constantly being improved by volunteers, but is still a very young
+project with limited resources, and has some quirks that needs to be dealt
+with. We need everyone’s help (including yours!).
+
+Here are some common questions people have using Pipenv. Please take a look
+below and see if they resolve your problem.
+
+Note
+
+**Make sure you’re running the newest Pipenv version first!**
+
+## ☤ Your dependencies could not be resolved
+
+Make sure your dependencies actually _do_ resolve. If you’re confident they
+are, you may need to clear your resolver cache. Run the following command::
+
+ pipenv lock --clear
+
+and try again.
+
+If this does not work, try manually deleting the whole cache directory. It is
+usually one of the following locations:
+
+- `~/Library/Caches/pipenv` (macOS)
+- `%LOCALAPPDATA%\pipenv\pipenv\Cache` (Windows)
+- `~/.cache/pipenv` (other operating systems)
+
+Pipenv does not install pre-releases (i.e. a version with an alpha/beta/etc.
+suffix, such as _1.0b1_) by default. You will need to pass the `--pre` flag
+in your command, or set
+
+ [pipenv]
+ allow_prereleases = true
+
+in your Pipfile.
+
+## ☤ No module named
+
+This is usually a result of mixing Pipenv with system packages. We _strongly_
+recommend installing Pipenv in an isolated environment. Uninstall all existing
+Pipenv installations, and see [installing pipenv](./installation.md/#installing-pipenv) to choose one of the recommended way to install Pipenv instead.
+
+## ☤ My pyenv-installed Python is not found
+
+Make sure you have `PYENV_ROOT` set correctly. Pipenv only supports CPython
+distributions, with version name like `3.6.4` or similar.
+
+## ☤ Pipenv does not respect pyenv’s global and local Python versions
+
+Pipenv by default uses the Python it is installed against to create the
+virtualenv. You can set the `--python` option to `$(pyenv which python)` to use your current pyenv interpreter. See [specifying versions](./specifiers.md) for more information.
+
+## ☤ ValueError: unknown locale: UTF-8
+
+macOS has a bug in its locale detection that prevents us from detecting your
+shell encoding correctly. This can also be an issue on other systems if the
+locale variables do not specify an encoding.
+
+The workaround is to set the following two environment variables to a standard
+localization format:
+
+- `LC_ALL`
+- `LANG`
+
+```bash
+export LC_ALL='en_US.UTF-8'
+export LANG='en_US.UTF-8'
+```
+
+For Zsh, the file to edit is `~/.zshrc`.
+
+Note
+
+You can change both the `en_US` and `UTF-8` part to the language/locale and encoding you use.
+
+## ☤ /bin/pip: No such file or directory
+
+This may be related to your locale setting. See [here](#☤-valueerror-unknown-locale-utf-8) for a possible solution.
+
+## ☤ Pipenv does not respect dependencies in setup.py
+
+No, it does not, intentionally. Pipfile and setup.py serve different purposes, and should not consider each other by default. See :ref:`pipfile-vs-setuppy` for more information.
+
+## ☤ Using `pipenv run` in Supervisor program
+
+When you configure a supervisor program's `command` with `pipenv run ...`, you need to set locale environment variables properly to make it work.
+
+Add this line under `[supervisord]` section in `/etc/supervisor/supervisord.conf`::
+
+ [supervisord]
+ environment=LC_ALL='en_US.UTF-8',LANG='en_US.UTF-8'
+
+## ☤ An exception is raised during `Locking dependencies...`
+
+Run `pipenv lock --clear` and try again. The lock sequence caches results to speed up subsequent runs. The cache may contain faulty results if a bug causes the format to corrupt, even after the bug is fixed. `--clear` flushes the cache, and therefore removes the bad results.
diff --git a/docs/docker.md b/docs/docker.md
new file mode 100644
index 0000000000..7aa73d8b1b
--- /dev/null
+++ b/docs/docker.md
@@ -0,0 +1,112 @@
+# Docker Containers
+
+In general, you should not have Pipenv inside a linux container image, since
+it is a build tool. If you want to use it to build, and install the run time
+dependencies for your application, you can use a multistage build for creating
+a virtual environment with your dependencies.
+
+In this approach, Pipenv in installed in the base layer, and it is used to create the virtual
+environment. In a later stage, in a `runtime` layer the virtual environment
+is copied from the base layer, the layer containing pipenv and other build
+dependencies is discarded.
+
+This results in a smaller image, which can still run your application.
+Here is an example `Dockerfile`, which you can use as a starting point for
+doing a multistage build for your application:
+
+ FROM docker.io/oz123/pipenv:3.11-v2023-6-26 AS builder
+
+
+ # Tell pipenv to create venv in the current directory
+ ENV PIPENV_VENV_IN_PROJECT=1
+
+ # Pipfile contains requests
+ ADD Pipfile.lock Pipfile /usr/src/
+
+ WORKDIR /usr/src
+
+ # NOTE: If you install binary packages required for a python module, you need
+ # to install them again in the runtime. For example, if you need to install pycurl
+ # you need to have pycurl build dependencies libcurl4-gnutls-dev and libcurl3-gnutls
+ # In the runtime container you need only libcurl3-gnutls
+
+ # RUN apt install -y libcurl3-gnutls libcurl4-gnutls-dev
+
+ RUN /root/.local/bin/pipenv sync
+
+ RUN /usr/src/.venv/bin/python -c "import requests; print(requests.__version__)"
+
+ FROM docker.io/python:3.11 AS runtime
+
+ RUN mkdir -v /usr/src/.venv
+
+ COPY --from=builder /usr/src/.venv/ /usr/src/.venv/
+
+ RUN /usr/src/.venv/bin/python -c "import requests; print(requests.__version__)"
+
+ # HERE GOES ANY CODE YOU NEED TO ADD TO CREATE YOUR APPLICATION'S IMAGE
+ # For example
+ # RUN apt install -y libcurl3-gnutls
+ # RUN adduser --uid 123123 coolio
+ # ADD run.py /usr/src/
+
+ WORKDIR /usr/src/
+
+ USER coolio
+
+ CMD ["./.venv/bin/python", "-m", "run.py"]
+
+```{note}
+Pipenv is not meant to run as root. However, in the multistage build above
+it is done nevertheless. A calculated risk, since the intermediate image
+is discarded.
+The runtime image later shows that you should create a user and user it to
+run your application.
+**Once again, you should not run pipenv as root (or Admin on Windows) normally.
+This could lead to breakage of your Python installation, or even your complete
+OS.**
+```
+
+When you build an image with this example (assuming requests is found in Pipfile), you
+will see that `requests` is installed in the `runtime` image:
+
+ $ sudo docker build --no-cache -t oz/123:0.1 .
+ Sending build context to Docker daemon 1.122MB
+ Step 1/12 : FROM docker.io/python:3.9 AS builder
+ ---> 81f391f1a7d7
+ Step 2/12 : RUN pip install --user pipenv
+ ---> Running in b83ed3c28448
+ ... trimmed ...
+ ---> 848743eb8c65
+ Step 4/12 : ENV PIPENV_VENV_IN_PROJECT=1
+ ---> Running in 814e6f5fec5b
+ Removing intermediate container 814e6f5fec5b
+ ---> 20167b4a13e1
+ Step 5/12 : ADD Pipfile.lock Pipfile /usr/src/
+ ---> c7632cb3d5bd
+ Step 6/12 : WORKDIR /usr/src
+ ---> Running in 1d75c6cfce10
+ Removing intermediate container 1d75c6cfce10
+ ---> 2dcae54cc2e5
+ Step 7/12 : RUN /root/.local/bin/pipenv sync
+ ---> Running in 1a00b326b1ee
+ Creating a virtualenv for this project...
+ ... trimmed ...
+ ✔ Successfully created virtual environment!
+ Virtualenv location: /usr/src/.venv
+ Installing dependencies from Pipfile.lock (fe5a22)...
+ ... trimmed ...
+ Step 8/12 : RUN /usr/src/.venv/bin/python -c "import requests; print(requests.__version__)"
+ ---> Running in 3a66e3ce4a11
+ 2.27.1
+ Removing intermediate container 3a66e3ce4a11
+ ---> 1db657d0ac17
+ Step 9/12 : FROM docker.io/python:3.9 AS runtime
+ ... trimmed ...
+ Step 12/12 : RUN /usr/src/venv/bin/python -c "import requests; print(requests.__version__)"
+ ---> Running in fa39ba4080c5
+ 2.27.1
+ Removing intermediate container fa39ba4080c5
+ ---> 2b1c90fd414e
+ Successfully built 2b1c90fd414e
+ Successfully tagged oz/123:0.1
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 0000000000..c11edaa358
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,77 @@
+# Pipenv: Python Dev Workflow for Humans
+[](https://pypi.python.org/pypi/pipenv) [](https://pypi.python.org/pypi/pipenv) [](https://pypi.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.
+
+
+## Install Pipenv Today!
+
+The recommended way to install pipenv on most platforms is to install from pypi using `pip`:
+
+ $ pip install --user pipenv
+
+More detailed installation instructions can be found in the [installing Pipenv](installation) chapter.
+
+✨🍰✨
+
+## Pipenv Features
+
+- Enables truly *deterministic builds*, while easily specifying *only what you want*.
+- Generates and checks file hashes for locked dependencies when installing from `Pipfile.lock`.
+- Automatically installs required Python version when `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 customizable location.
+- Automatically adds/removes packages to a `Pipfile` when they are installed or uninstalled.
+- Automatically loads `.env` files to support customization and overrides.
+
+
+
+## Pipenv Documentation
+
+```{toctree}
+---
+caption: Pipenv Documentation
+maxdepth: 2
+---
+installation
+pipfile
+cli
+commands
+configuration
+virtualenv
+workflows
+specifiers
+indexes
+credentials
+shell
+docker
+scripts
+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 a5c0f1fbaa..0000000000
--- a/docs/index.rst
+++ /dev/null
@@ -1,128 +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: Sacred Marriage of Pipfile, Pip, & Virtualenv
-=====================================================
-
-.. 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/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 project that aims to bring the best of all packaging worlds to the Python world. It harnesses `Pipfile `_, `pip `_, and `virtualenv `_ into one single toolchain. It features very pretty terminal colors. *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. The ``lock`` command generates a lockfile (``Pipfile.lock``).
-
-
-.. 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
-
- basics
-
-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.*
-
-**Jhon Crypt**—
- *Pipenv is the best thing since pip, thank you!*
-
-**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..3d2cef79c8
--- /dev/null
+++ b/docs/indexes.md
@@ -0,0 +1,81 @@
+# Specifying Package Indexes
+
+The default python package index that is standard for use is [pypi.org](https://pypi.org).
+Sometimes there is a need to work with alternative or additional package indexes.
+
+## Index Restricted Packages
+
+Starting in release `2022.3.23` all packages are mapped only to a single package index for security reasons.
+All unspecified packages are resolved using the default index source; the default package index is PyPI.
+
+For a specific package to be installed from an alternate package index, you must match the name of the index as in the following example:
+
+ [[source]]
+ url = "https://pypi.org/simple"
+ verify_ssl = true
+ name = "pypi"
+
+ [[source]]
+ url = "https://download.pytorch.org/whl/cu113/"
+ verify_ssl = false
+ name = "pytorch"
+
+ [dev-packages]
+
+ [packages]
+ torch = {version="*", index="pytorch"}
+ numpy = {version="*"}
+
+You may install a package such as the example `torch` from the named index `pytorch` using the CLI by running
+the following command:
+
+`pipenv install torch --index=pytorch`
+
+Alternatively the index may be specified by full url, and it will be added to the `Pipfile` with a generated name
+unless it already exists in which case the existing name with be reused when pinning the package index.
+
+```{note}
+In prior versions of `pipenv` you could specify `--extra-index-urls` to the `pip` resolver and avoid specifically matching the expected index by name.
+That functionality was deprecated in favor of index restricted packages, which is a simplifying assumption that is more security mindful.
+The pip documentation has the following warning around the `--extra-index-urls` option:
+
+> Using this option to search for packages which are not in the main repository (such as private packages) is unsafe,
+> per a security vulnerability called dependency confusion: an attacker can claim the package on the public repository
+> in a way that will ensure it gets chosen over the private package.
+```
+
+Should you wish to use an alternative default index other than PyPI: simply do not specify PyPI as one of the
+sources in your `Pipfile`. When PyPI is omitted, then any public packages required either directly or
+as sub-dependencies must be mirrored onto your private index or they will not resolve properly. This matches the
+standard recommendation of `pip` maintainers: "To correctly make a private project installable is to point
+--index-url to an index that contains both PyPI and their private projects—which is our recommended best practice."
+
+The above documentation holds true for both `lock` resolution and `sync` of packages. It was suggested that
+once the resolution and the lock file are updated, it is theoretically possible to safely scan multiple indexes
+for these packages when running `pipenv sync` or `pipenv install --deploy` since it will verify the package
+hashes match the allowed hashes that were already captured from a safe locking cycle.
+To enable this non-default behavior, add `install_search_all_sources = true` option
+to your `Pipfile` in the `pipenv` section::
+
+ [pipenv]
+ install_search_all_sources = true
+
+**Note:** The locking cycle will still require that each package be resolved from a single index. This feature was
+requested as a workaround in order to support organizations where not everyone has access to the package sources.
+
+## Using a PyPI Mirror
+
+Should you have access to a mirror of PyPI packages and wish to substitute the default pypi.org index URL with your PyPI mirror,
+you may supply the `--pypi-mirror ` argument to select commands:
+
+ $ pipenv install --pypi-mirror
+
+ $ pipenv update --pypi-mirror
+
+ $ pipenv sync --pypi-mirror
+
+ $ pipenv lock --pypi-mirror
+
+ $ pipenv uninstall --pypi-mirror
+
+Note that setting the `PIPENV_PYPI_MIRROR` environment variable is equivalent to passing `--pypi-mirror `.
diff --git a/docs/installation.md b/docs/installation.md
new file mode 100644
index 0000000000..bc31613f2b
--- /dev/null
+++ b/docs/installation.md
@@ -0,0 +1,174 @@
+# Pipenv Installation
+
+```{note}
+This guide is written for Python 3.7+
+```
+
+
+## Make sure you have python and 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
+
+ $ python --version
+
+You should get some output like `3.12.1`. If you do not have Python, please
+install the latest 3.x version from [python.org](https://python.org)
+
+Additionally, make sure you have [pip] available, assuming you install via pip, our preferred method of installation.
+Check this by running
+
+ $ pip --version
+ pip 24.0
+
+If you installed Python from source, with an installer from [python.org] or via [Homebrew], you likely already have pip.
+If you're on Linux and installed using your OS package manager, you may have to [install pip](https://pip.pypa.io/en/stable/installing/) manually.
+
+[python.org]: https://python.org
+[pypi.org]: https://pypi.org
+[pip]: https://pypi.org/project/pip/
+[Homebrew]: https://brew.sh/
+
+
+## Installing Pipenv
+
+
+### Preferred Installation of Pipenv
+
+It is recommended that users on most platforms install pipenv from [pypi.org] using
+
+ $ pip install pipenv --user
+
+```{note}
+pip [user installations] allow for installation into your home directory to prevent breaking any system-wide packages.
+Due to interaction between dependencies, you should limit tools installed in this way to basic building blocks for a Python workflow such as virtualenv, pipenv, tox, and similar software.
+```
+
+
+If `pipenv` isn't available in your shell after installation,
+you'll need to add the user site-packages 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 appending `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
+`python -m site --user-site` and replacing `site-packages` with
+`Scripts`. For example, this could return
+`C:\Users\Username\AppData\Roaming\Python37\site-packages`, so you would
+need to set your `PATH` to include
+`C:\Users\Username\AppData\Roaming\Python37\Scripts`. You can set your
+user `PATH` permanently in the [Control Panel](https://learn.microsoft.com/en-us/windows/win32/shell/user-environment-variables).
+
+You may need to log out for the `PATH` changes to take effect.
+
+[user base]: https://docs.python.org/3/library/site.html#site.USER_BASE
+[user installations]: https://pip.pypa.io/en/stable/user_guide/#user-installs
+[modifying ~/.profile]: https://stackoverflow.com/a/14638025
+[Control Panel]: https://learn.microsoft.com/en-us/windows/win32/shell/user-environment-variables
+
+To upgrade pipenv at any time:
+
+ $ pip install --user --upgrade pipenv
+
+### Homebrew Installation of Pipenv
+* [Homebrew] is a popular open-source package management system for macOS (or Linux).
+
+Once you have installed Homebrew simply run
+
+ $ brew install pipenv
+
+To upgrade pipenv at any time:
+
+ $ brew upgrade pipenv
+
+```{note}
+Homebrew installation is discouraged because it works better to install pipenv using pip on macOS.
+```
+
+## Installing packages for your project
+
+Pipenv manages dependencies on a per-project basis. To install a package,
+change into your project's directory (or just an empty directory for this
+tutorial) and run
+
+ $ cd myproject
+ $ pipenv install
+
+```{note}
+Pipenv is designed to be used by non-privileged OS users. It is not meant
+to install or handle packages for the whole OS. Running Pipenv as `root`
+or with `sudo` (or `Admin` on Windows) is highly discouraged and might
+lead to unintend breakage of your OS.
+```
+
+Pipenv will install the package and create a `Pipfile`
+for you in your project's directory. The `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.
+
+For example when installing the `requests` library, you should get output similar to this:
+
+ $ pipenv install requests
+ Creating a virtualenv for this project...
+ Pipfile: /home/matteius/pipenv-triage/test_install2/Pipfile
+ Using default python from /mnt/extra/miniconda3/bin/python (3.12.1) to create virtualenv...
+ ⠹ Creating virtual environment...created virtual environment CPython3.12.1.final.0-64 in 139ms
+ creator CPython3Posix(dest=/home/matteius/Envs/test_install2-DMnDbAT9, clear=False, no_vcs_ignore=False, global=False)
+ seeder FromAppData(download=False, pip=bundle, via=copy, app_data_dir=/home/matteius/.local/share/virtualenv)
+ added seed packages: pip==24.0
+ activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
+
+ ✔ Successfully created virtual environment!
+ Virtualenv location: /home/matteius/Envs/test_install2-DMnDbAT9
+ Creating a Pipfile for this project...
+ Installing requests...
+ Resolving requests...
+ Added requests to Pipfile's [packages] ...
+ ✔ Installation Succeeded
+ Pipfile.lock not found, creating...
+ Locking [packages] dependencies...
+ Building requirements...
+ Resolving dependencies...
+ ✔ Success!
+ Locking [dev-packages] dependencies...
+ Updated Pipfile.lock (1977acb1ba9778abb66054090e2618a0a1f1759b1b3b32afd8a7d404ba18b4fb)!
+ To activate this project's virtualenv, run pipenv shell.
+ Alternatively, run a command inside the virtualenv with pipenv run.
+ Installing dependencies from Pipfile.lock (18b4fb)...
+
+
+## Using installed packages
+
+Now that `requests` is installed you can create a simple `main.py` file to use it:
+
+```
+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`
+
+ $ pipenv run python main.py
+
+You should get output similar to this:
+
+ Your IP is 8.8.8.8
+
+Using `$ pipenv run` ensures that your installed packages are available to
+your script by activating the virtualenv. It is also possible to spawn a new shell
+that ensures all commands have access to your installed packages with `$ pipenv shell`.
+
+
+## Virtualenv mapping caveat
+
+- Pipenv automatically maps projects to their specific virtualenvs.
+- By default, the virtualenv is stored globally with the name of the project’s root directory plus the hash of the full path to the project's root (e.g., `my_project-a3de50`).
+- Should you change your project's path, you break such a default mapping and pipenv will no longer be able to find and to use the project's virtualenv.
+- If you must move or rename a directory managed by pipenv, run 'pipenv --rm' before renaming or moving your project directory. Then, after renaming or moving the directory run 'pipenv install' to recreate the virtualenv.
+- Customize this behavior with `PIPENV_CUSTOM_VENV_NAME` environment variable.
+- You might also prefer to set `PIPENV_VENV_IN_PROJECT=1` in your .env or .bashrc/.zshrc (or other shell configuration file) for creating the virtualenv inside your project's directory.
diff --git a/docs/locking.md b/docs/locking.md
new file mode 100644
index 0000000000..f19b6660f8
--- /dev/null
+++ b/docs/locking.md
@@ -0,0 +1,86 @@
+# Locking Dependencies
+
+Locking dependencies in Pipenv ensures that your project's dependencies are consistent across different environments by creating a `Pipfile.lock` file. This file contains the exact versions of all dependencies, making your builds deterministic and reproducible.
+
+## Creating a Lock File
+
+Pipenv will automatically generate a `Pipfile.lock` file when you install dependencies using the `pipenv install` command. This file contains the specific versions of all installed packages and their dependencies.
+
+```bash
+pipenv install requests
+```
+
+To completely update a `Pipfile.lock` file based on the currently available packages and your `Pipfile` specifiers, run the following command:
+
+ pipenv lock
+
+
+## Installing from a Lock File
+
+When you have a `Pipfile.lock` file in your project, you can install the exact dependencies specified in the lock file with:
+
+ pipenv install
+
+## Updating Lock Files
+
+When you need to update your dependencies, you can update a subset of lock file with:
+
+ pipenv upgrade mypackage==1.2.3
+
+This command updates all dependencies to their latest compatible versions and regenerates the `Pipfile.lock`.
+
+Should you want `pipenv` to also install the upgraded packages, you can run the following command:
+
+ pipenv update mypackage==1.2.3
+
+## Viewing Locked Dependencies
+
+You can view the currently locked dependencies and their versions with:
+
+ pipenv graph
+
+This command outputs a dependency graph, showing all locked packages and their dependencies.
+
+## Best Practices
+
+- **Commit Your `Pipfile.lock`:** Always commit your `Pipfile.lock` file to version control to ensure that your team members and CI/CD pipelines use the same dependencies.
+- **Regularly Update Dependencies:** Periodically update your dependencies to include the latest patches and improvements while ensuring compatibility.
+- **Review Dependency Changes:** When updating dependencies, review the changes in the `Pipfile.lock` to understand the impact on your project.
+
+## Troubleshooting
+
+### Common Issues
+
+- **Dependency Conflicts:** If you encounter dependency conflicts, you may need to adjust your `Pipfile` or manually resolve the conflicts before locking again. Run with the `--verbose` flag to get more information about the conflict.
+- **Installation Errors:** Ensure that your `Pipfile.lock` is not corrupted and that you have the necessary permissions to install the dependencies. Check for common system dependencies when building sdist packages.
+
+### Helpful Commands
+
+- **Check for Dependency Issues:**
+
+ ```bash
+ pipenv check
+ ```
+
+ This command checks for security vulnerabilities and other issues in your dependencies.
+
+- **Clear Caches:**
+
+ ```bash
+ pipenv --clear
+ ```
+
+ This command clears Pipenv’s caches, which can resolve some installation issues.
+
+## Supplying additional arguments to the pipenv resolver
+
+You can supply additional arguments to the pipenv resolver by supplying `--extra-pip-arg` to the `install` command. For example, `pipenv install --extra-pip-args="--platform=win_amd64 --target /path/to/my/target`.
+
+```bash
+
+## Conclusion
+
+Locking in Pipenv is a powerful feature that ensures your Python project’s dependencies are consistent, secure, and reproducible. By understanding and utilizing Pipenv’s locking mechanism, you can avoid many common dependency management issues and ensure your projects run smoothly across different environments.
+
+```note
+Locking ensures that all dependencies are resolved and installed in a consistent manner. This helps avoid issues where different versions of dependencies might introduce bugs or inconsistencies in your project.
diff --git a/docs/pipfile.md b/docs/pipfile.md
new file mode 100644
index 0000000000..b208d219b1
--- /dev/null
+++ b/docs/pipfile.md
@@ -0,0 +1,274 @@
+# Pipfile & Pipfile.lock
+
+`Pipfile` contains the specification for the project top-level requirements and any desired specifiers.
+This file is managed by the developers invoking pipenv commands.
+The `Pipfile` uses inline tables and the [TOML Spec](https://toml.io/en/latest#spec).
+
+`Pipfile.lock` replaces the `requirements.txt` file used in most Python projects and adds
+security benefits of tracking the packages hashes that were last locked.
+This file is managed automatically through locking actions.
+
+You should add both `Pipfile` and `Pipfile.lock` to the project's source control.
+
+## `[pipenv]` Directives
+
+`Pipfile` may contain a `[pipenv]` section to control the behaviour of pipenv itself. Some available settings include:
+
+* `allow_prereleases` - Tell pipenv to install pre-release versions of a package -i.e. a version with an alpha/beta/etc. suffix, such as _1.0b1_. Equivalent to passing the `--pre` flag on the command line.
+* `disable_pip_input` - Prevent pipenv from asking for input. Equivalent to the `--no-input` flag.
+* `install_search_all_sources` - Allow installation of packages from an existing `Pipfile.lock` to search all defined indexes for the constrained package version and hash signatures. See [Specifying Package Indexes](indexes.md).
+* `sort_pipfile` - Sort package names alphabetically inside each category. Categories will be sorted and updated on `install` and `uninstall`. This is purely cosmetic to make reading easier for humans, and has no effect on installation order or dependency resolution. Note that `Pipfile.lock` packages are always sorted alphabetically.
+
+
+## Example Pipfile
+
+Here is a simple example of a `Pipfile` and the resulting `Pipfile.lock`.
+
+ [[source]]
+ url = "https://pypi.org/simple"
+ verify_ssl = true
+ name = "pypi"
+
+ [packages]
+ Django = "==4.*"
+ waitress = {version = "*", markers="sys_platform == 'win32'"}
+ gunicorn = {version = "*", markers="sys_platform == 'linux'"}
+
+ [dev-packages]
+ pytest-cov = "==3.*"
+
+
+## Example Pipfile.lock
+
+ {
+ "_meta": {
+ "hash": {
+ "sha256": "d09f41c21ecfb3b019ace66b61ea1174f99e8b0da0d39e70a5c1cf2363d8b88d"
+ },
+ "pipfile-spec": 6,
+ "requires": {},
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "asgiref": {
+ "hashes": [
+ "sha256:71e68008da809b957b7ee4b43dbccff33d1b23519fb8344e33f049897077afac",
+ "sha256:9567dfe7bd8d3c8c892227827c41cce860b368104c3431da67a0c5a65a949506"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==3.6.0"
+ },
+ "django": {
+ "hashes": [
+ "sha256:44f714b81c5f190d9d2ddad01a532fe502fa01c4cb8faf1d081f4264ed15dcd8",
+ "sha256:f2f431e75adc40039ace496ad3b9f17227022e8b11566f4b363da44c7e44761e"
+ ],
+ "index": "pypi",
+ "version": "==4.1.7"
+ },
+ "gunicorn": {
+ "hashes": [
+ "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e",
+ "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"
+ ],
+ "index": "pypi",
+ "markers": "sys_platform == 'linux'",
+ "version": "==20.1.0"
+ },
+ "setuptools": {
+ "hashes": [
+ "sha256:95f00380ef2ffa41d9bba85d95b27689d923c93dfbafed4aecd7cf988a25e012",
+ "sha256:bb6d8e508de562768f2027902929f8523932fcd1fb784e6d573d2cafac995a48"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==67.3.2"
+ },
+ "sqlparse": {
+ "hashes": [
+ "sha256:0323c0ec29cd52bceabc1b4d9d579e311f3e4961b98d174201d5622a23b85e34",
+ "sha256:69ca804846bb114d2ec380e4360a8a340db83f0ccf3afceeb1404df028f57268"
+ ],
+ "markers": "python_version >= '3.5'",
+ "version": "==0.4.3"
+ },
+ "waitress": {
+ "hashes": [
+ "sha256:7500c9625927c8ec60f54377d590f67b30c8e70ef4b8894214ac6e4cad233d2a",
+ "sha256:780a4082c5fbc0fde6a2fcfe5e26e6efc1e8f425730863c04085769781f51eba"
+ ],
+ "markers": "sys_platform == 'win32'",
+ "version": "==2.1.2"
+ }
+ },
+ "develop": {
+ "attrs": {
+ "hashes": [
+ "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836",
+ "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"
+ ],
+ "markers": "python_version >= '3.6'",
+ "version": "==22.2.0"
+ },
+ "coverage": {
+ "extras": [
+ "toml"
+ ],
+ "hashes": [
+ "sha256:04481245ef966fbd24ae9b9e537ce899ae584d521dfbe78f89cad003c38ca2ab",
+ "sha256:0c45948f613d5d18c9ec5eaa203ce06a653334cf1bd47c783a12d0dd4fd9c851",
+ "sha256:10188fe543560ec4874f974b5305cd1a8bdcfa885ee00ea3a03733464c4ca265",
+ "sha256:218fe982371ac7387304153ecd51205f14e9d731b34fb0568181abaf7b443ba0",
+ "sha256:29571503c37f2ef2138a306d23e7270687c0efb9cab4bd8038d609b5c2393a3a",
+ "sha256:2a60d6513781e87047c3e630b33b4d1e89f39836dac6e069ffee28c4786715f5",
+ "sha256:2bf1d5f2084c3932b56b962a683074a3692bce7cabd3aa023c987a2a8e7612f6",
+ "sha256:3164d31078fa9efe406e198aecd2a02d32a62fecbdef74f76dad6a46c7e48311",
+ "sha256:32df215215f3af2c1617a55dbdfb403b772d463d54d219985ac7cd3bf124cada",
+ "sha256:33d1ae9d4079e05ac4cc1ef9e20c648f5afabf1a92adfaf2ccf509c50b85717f",
+ "sha256:33ff26d0f6cc3ca8de13d14fde1ff8efe1456b53e3f0273e63cc8b3c84a063d8",
+ "sha256:38da2db80cc505a611938d8624801158e409928b136c8916cd2e203970dde4dc",
+ "sha256:3b155caf3760408d1cb903b21e6a97ad4e2bdad43cbc265e3ce0afb8e0057e73",
+ "sha256:3b946bbcd5a8231383450b195cfb58cb01cbe7f8949f5758566b881df4b33baf",
+ "sha256:3baf5f126f30781b5e93dbefcc8271cb2491647f8283f20ac54d12161dff080e",
+ "sha256:4b14d5e09c656de5038a3f9bfe5228f53439282abcab87317c9f7f1acb280352",
+ "sha256:51b236e764840a6df0661b67e50697aaa0e7d4124ca95e5058fa3d7cbc240b7c",
+ "sha256:63ffd21aa133ff48c4dff7adcc46b7ec8b565491bfc371212122dd999812ea1c",
+ "sha256:6a43c7823cd7427b4ed763aa7fb63901ca8288591323b58c9cd6ec31ad910f3c",
+ "sha256:755e89e32376c850f826c425ece2c35a4fc266c081490eb0a841e7c1cb0d3bda",
+ "sha256:7a726d742816cb3a8973c8c9a97539c734b3a309345236cd533c4883dda05b8d",
+ "sha256:7c7c0d0827e853315c9bbd43c1162c006dd808dbbe297db7ae66cd17b07830f0",
+ "sha256:7ed681b0f8e8bcbbffa58ba26fcf5dbc8f79e7997595bf071ed5430d8c08d6f3",
+ "sha256:7ee5c9bb51695f80878faaa5598040dd6c9e172ddcf490382e8aedb8ec3fec8d",
+ "sha256:8361be1c2c073919500b6601220a6f2f98ea0b6d2fec5014c1d9cfa23dd07038",
+ "sha256:8ae125d1134bf236acba8b83e74c603d1b30e207266121e76484562bc816344c",
+ "sha256:9817733f0d3ea91bea80de0f79ef971ae94f81ca52f9b66500c6a2fea8e4b4f8",
+ "sha256:98b85dd86514d889a2e3dd22ab3c18c9d0019e696478391d86708b805f4ea0fa",
+ "sha256:9ccb092c9ede70b2517a57382a601619d20981f56f440eae7e4d7eaafd1d1d09",
+ "sha256:9d58885215094ab4a86a6aef044e42994a2bd76a446dc59b352622655ba6621b",
+ "sha256:b643cb30821e7570c0aaf54feaf0bfb630b79059f85741843e9dc23f33aaca2c",
+ "sha256:bc7c85a150501286f8b56bd8ed3aa4093f4b88fb68c0843d21ff9656f0009d6a",
+ "sha256:beeb129cacea34490ffd4d6153af70509aa3cda20fdda2ea1a2be870dfec8d52",
+ "sha256:c31b75ae466c053a98bf26843563b3b3517b8f37da4d47b1c582fdc703112bc3",
+ "sha256:c4e4881fa9e9667afcc742f0c244d9364d197490fbc91d12ac3b5de0bf2df146",
+ "sha256:c5b15ed7644ae4bee0ecf74fee95808dcc34ba6ace87e8dfbf5cb0dc20eab45a",
+ "sha256:d12d076582507ea460ea2a89a8c85cb558f83406c8a41dd641d7be9a32e1274f",
+ "sha256:d248cd4a92065a4d4543b8331660121b31c4148dd00a691bfb7a5cdc7483cfa4",
+ "sha256:d47dd659a4ee952e90dc56c97d78132573dc5c7b09d61b416a9deef4ebe01a0c",
+ "sha256:d4a5a5879a939cb84959d86869132b00176197ca561c664fc21478c1eee60d75",
+ "sha256:da9b41d4539eefd408c46725fb76ecba3a50a3367cafb7dea5f250d0653c1040",
+ "sha256:db61a79c07331e88b9a9974815c075fbd812bc9dbc4dc44b366b5368a2936063",
+ "sha256:ddb726cb861c3117a553f940372a495fe1078249ff5f8a5478c0576c7be12050",
+ "sha256:ded59300d6330be27bc6cf0b74b89ada58069ced87c48eaf9344e5e84b0072f7",
+ "sha256:e2617759031dae1bf183c16cef8fcfb3de7617f394c813fa5e8e46e9b82d4222",
+ "sha256:e5cdbb5cafcedea04924568d990e20ce7f1945a1dd54b560f879ee2d57226912",
+ "sha256:ec8e767f13be637d056f7e07e61d089e555f719b387a7070154ad80a0ff31801",
+ "sha256:ef382417db92ba23dfb5864a3fc9be27ea4894e86620d342a116b243ade5d35d",
+ "sha256:f2cba5c6db29ce991029b5e4ac51eb36774458f0a3b8d3137241b32d1bb91f06",
+ "sha256:f5b4198d85a3755d27e64c52f8c95d6333119e49fd001ae5798dac872c95e0f8",
+ "sha256:ffeeb38ee4a80a30a6877c5c4c359e5498eec095878f1581453202bfacc8fbc2"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==7.1.0"
+ },
+ "iniconfig": {
+ "hashes": [
+ "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3",
+ "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==2.0.0"
+ },
+ "packaging": {
+ "hashes": [
+ "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2",
+ "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==23.0"
+ },
+ "pluggy": {
+ "hashes": [
+ "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159",
+ "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"
+ ],
+ "markers": "python_version >= '3.6'",
+ "version": "==1.0.0"
+ },
+ "pytest": {
+ "hashes": [
+ "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5",
+ "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==7.2.1"
+ },
+ "pytest-cov": {
+ "hashes": [
+ "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6",
+ "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"
+ ],
+ "index": "pypi",
+ "version": "==3.0.0"
+ }
+ }
+ }
+
+
+## Importing from requirements.txt
+
+For projects utilizing a `requirements.txt` pipenv can import the contents of this file and create a
+`Pipfile` and `Pipfile.lock` for you:
+
+ $ pipenv install -r path/to/requirements.txt
+
+If your requirements file has version numbers pinned, you'll likely want to edit the new `Pipfile`
+to only keep track of top level dependencies and let `pipenv` keep track of pinning sub-dependencies in the lock file.
+
+
+## Pipfile.lock Security Features
+
+`Pipfile.lock` leverages the security of package hash validation in `pip`.
+The `Pipfile.lock` is generated with the sha256 hashes of each downloaded package.
+This guarantees you're installing the same exact packages on any network as the one
+where the lock file was last updated, even on untrusted networks.
+
+We recommend designing CI/CD deployments whereby the build does not alter the lock file as a side effect.
+In other words, you can use `pipenv lock` or `pipenv upgrade` to adjust your lockfile through local development.
+The PR process of reviewing and approving those lock changes before deploying to production that version of the lockfile
+is a recommended best practice.
+In other words: always avoid having your CI issue `lock`, `update`, `upgrade` `uninstall` or any commands that will relock.
+
+```{admonition} Generate requirements.txt output from lock file
+ $ pipenv requirements
+```
+
+## Package Category Groups
+
+Pipenv supports arbitrarily named package categories in the Pipfile/Pipfile.lock for organizing dependencies into different groups.
+
+Traditionally there were only two package groups, and they were named different between the `Pipfile` and `Pipfile.lock`:
+
+* `packages` in the `Pipfile` corresponds to `default` group in the lockfile.
+* `dev-packages` in the `Pipfile` corresponds to `develop` group in the lockfile.
+
+The default/packages group is what you interact with when specifying no particular categories,
+whereas the develop/dev-packages group is typically what you interact with when specifying the `--dev` or `-d` flag.
+
+Beginning in `pipenv==2022.10.9` support for named package categories was generalized such that any
+non-reserved keywords may be used to create named package groups other than the original groups.
+All named categories (other than the special default/develop) will use the category name consistently between the `Pipfile` and `Pipfile.lock`
+
+## General Notes and Recommendations
+
+- Keep both `Pipfile` and `Pipfile.lock` in version control.
+- `pipenv install package-name` adds specifiers to `Pipfile` and rebuilds the lock file based on the Pipfile specs, by utilizing the internal resolver of `pip`.
+- Not all the required sub-dependencies need be specified in `Pipfile`, instead only add specifiers that make sense for the stability of your project.
+Example: `requests` requires `cryptography` but (for reasons) you want to ensure `cryptography` is pinned to a particular version set.
+- Consider specifying your target Python version in your `Pipfile`'s `[requires]` section.
+For this use either `python_version` in the format `X.Y` (or `X`) or `python_full_version` in `X.Y.Z` format.
+- Considering making use of named package categories to further isolate dependency install groups for large monoliths.
diff --git a/docs/requirements.txt b/docs/requirements.txt
index a14ace82b5..3d3077a662 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,29 +1,18 @@
-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
+click>=8.1.7
+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
+sphinx-click>=6.0.0
+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..cd513347be
--- /dev/null
+++ b/docs/scripts.md
@@ -0,0 +1,51 @@
+# Custom Script Shortcuts
+
+It is possible to create custom shortcuts in the optional `[scripts]` section of your Pipfile.
+
+You can then run `pipenv run ` in your terminal to run the command in the
+context of your pipenv virtual environment even if you have not activated the pipenv shell first.
+
+For example, in your Pipfile:
+
+```{code-block}
+ [scripts]
+ printspam = "python -c \"print('I am a silly example, no one would need to do this')\""
+---
+toml
+```
+And then in your terminal:
+
+ $ pipenv run printspam
+ I am a silly example, no one would need to do this
+
+Commands that expect arguments will also work.
+
+```{code-block}
+ [scripts]
+ echospam = "echo I am really a very silly example"
+---
+toml
+```
+
+Invoke script:
+
+ $ pipenv run echospam "indeed"
+ I am really a very silly example indeed
+
+You can also specify package functions as callables such as: `:`. These can also take arguments.
+For example:
+
+ [scripts]
+ my_func_with_args = {call = "package.module:func('arg1', 'arg2')"}
+ my_func_no_args = {call = "package.module:func()"}
+
+To run the script:
+
+ $ pipenv run my_func_with_args
+ $ pipenv run my_func_no_args
+
+You can display the names and commands of your shortcuts by running `pipenv scripts` in your terminal.
+
+ $ pipenv scripts
+ command script
+ echospam echo I am really a very silly example
diff --git a/docs/shell.md b/docs/shell.md
new file mode 100644
index 0000000000..743cf89afc
--- /dev/null
+++ b/docs/shell.md
@@ -0,0 +1,76 @@
+# Environment and Shell Configuration
+
+
+## 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'
+
+Variable expansion is available in `.env` files using `${VARNAME}` syntax:
+
+ $ cat .env
+ CONFIG_PATH=${HOME}/.config/foo
+
+ $ pipenv run python
+ Loading .env environment variables...
+ Python 3.7.6 (default, Dec 19 2019, 22:52:49)
+ [GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
+ Type "help", "copyright", "credits" or "license" for more information.
+ >>> import os
+ >>> os.environ['CONFIG_PATH']
+ '/home/kennethreitz/.config/foo'
+
+
+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
+
+To prevent pipenv from loading the `.env` file, set the `PIPENV_DONT_LOAD_ENV` environment variable:
+
+ $ PIPENV_DONT_LOAD_ENV=1 pipenv shell
+
+See [theskumar/python-dotenv](https://github.com/theskumar/python-dotenv) for more information on `.env` files.
+
+## Shell Completion
+
+To enable completion in fish, add this to your configuration:
+
+ eval (env _PIPENV_COMPLETE=fish_source pipenv)
+
+Alternatively, with zsh, add this to your configuration:
+
+ eval "$(_PIPENV_COMPLETE=zsh_source pipenv)"
+
+Alternatively, with bash, add this to your configuration:
+
+ eval "$(_PIPENV_COMPLETE=bash_source pipenv)"
+
+Shell completions are now enabled!
+
+## Shell Notes (stale)
+
+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.
+
+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.
diff --git a/docs/specifiers.md b/docs/specifiers.md
new file mode 100644
index 0000000000..d52741f717
--- /dev/null
+++ b/docs/specifiers.md
@@ -0,0 +1,213 @@
+# Specifiers
+
+
+## Specifying Versions of a Package
+
+You can specify versions of a package using the [Semantic Versioning scheme](https://semver.org/)
+(i.e. `major.minor.micro`).
+
+To install a major version of requests you can use:
+
+ $ pipenv install requests~=1.1
+
+Pipenv will install version `1.2` as it is a minor update, but not `2.0`.
+
+To install a minor version of requests you can use:
+
+ $ pipenv install requests~=1.0.1
+
+Pipenv will install version `1.0.4` as it is a micro version update, but not `1.1.0`.
+
+This will update your `Pipfile` to reflect this requirement, automatically.
+
+In general, Pipenv uses the same specifier format as pip. However, note that according to [PEP 440](https://www.python.org/dev/peps/pep-0440/),
+you can't use versions containing a hyphen or a plus sign.
+
+To make inclusive or exclusive version comparisons you can use:
+
+ $ pipenv install "requests>=1.4" # will install a version equal or larger than 1.4.0
+ $ pipenv install "requests<=2.13" # will install a version equal or lower than 2.13.0
+ $ pipenv install "requests>2.19" # will install 2.19.1 but not 2.19.0
+
+```{note}
+The use of double quotes around the package and version specification (i.e. `"requests>2.19"`) is highly recommended
+to avoid issues with [Input and output redirection](https://robots.thoughtbot.com/input-output-redirection-in-the-shell)
+in Unix-based operating systems.
+```
+
+The use of `~=` is preferred over the `==` identifier as the latter prevents pipenv from updating the packages:
+
+ $ pipenv install "requests~=2.2" # locks the major version of the package (this is equivalent to using >=2.2, ==2.*)
+
+To avoid installing a specific version you can use the `!=` identifier.
+
+For an in depth explanation of the valid identifiers and more complex use cases check
+the [relevant section of PEP-440]( https://www.python.org/dev/peps/pep-0440/#version-specifiers).
+
+## 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.11
+
+ $ pipenv --python 3.11
+
+
+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
+ name = "pypi"
+
+ [dev-packages]
+
+ [packages]
+
+ [requires]
+ python_version = "3.11"
+
+```{note}
+The inclusion of `[requires] python_version = "3.11"` 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 . )
+
+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 --dev -e .
+
+ $ cat Pipfile
+ ...
+ [dev-packages]
+ "e1839a8" = {path = ".", editable = true}
+ ...
+```{note}
+All sub-dependencies will get added to the `Pipfile.lock` as well. Sub-dependencies are **not** added to the
+`Pipfile.lock` if you leave the `-e` option out.
+```
+
+## VCS Dependencies
+
+VCS dependencies from git and other version control systems using URLs formatted using preferred pip line formats:
+
+ +:////@
+
+Extras may be specified using the following format when issuing install command:
+
+ @ +:////@
+
+Note: that the #egg fragments should only be used for legacy pip lines which are still required in editable requirements.
+
+ $ pipenv install -e git+https://github.com/requests/requests.git@v2.31.0#egg=requests
+
+
+Below is an example usage which installs the git repository located at `https://github.com/requests/requests.git` from tag `v2.20.1` as package name `requests`:
+
+ $ pipenv install -e git+https://github.com/requests/requests.git@v2.20.1#egg=requests
+ Installing -e git+https://github.com/requests/requests.git@v2.20.1#egg=requests...
+ Resolving -e git+https://github.com/requests/requests.git@v2.20.1#egg=requests...
+ Added requests to Pipfile's [packages] ...
+ Installation Succeeded
+ Pipfile.lock not found, creating...
+ Locking [packages] dependencies...
+ Building requirements...
+ Resolving dependencies...
+ Success!
+ Locking [dev-packages] dependencies...
+ Updated Pipfile.lock (389441cc656bb774aaa28c7e53a35137aace7499ca01668765d528fa79f8acc8)!
+ Installing dependencies from Pipfile.lock (f8acc8)...
+ To activate this project's virtualenv, run pipenv shell.
+ Alternatively, run a command inside the virtualenv with pipenv run.
+
+ $ cat Pipfile
+ [packages]
+ requests = {editable = true, ref = "v2.20.1", git = "git+https://github.com/requests/requests.git"}
+
+ $ cat Pipfile.lock
+ ...
+ "requests": {
+ "editable": true,
+ "git": "git+https://github.com/requests/requests.git",
+ "markers": "python_version >= '3.7'",
+ "ref": "6cfbe1aedd56f8c2f9ff8b968efe65b22669795b"
+ },
+ ...
+
+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`.
+
+You can read more about pip's implementation of VCS support `here `__.
+
+
+## Specifying Package Categories
+
+Originally pipenv supported only two package groups: `packages` and `dev-packages` in the `Pipfile` which mapped to `default` and `develop` in the `Pipfile.lock`. Support for additional named categories has been added such that arbitrary named groups can utilized across the available pipenv commands.
+
+```{note}
+The name will be the same between `Pipfile` and lock file, however to support the legacy naming convention it is not possible to have an additional group named `default` or `develop` in the `Pipfile`.
+```
+
+By default `pipenv lock` will lock all known package categorises; to specify locking only specific groups use the `--categories` argument.
+The command should process the package groups in the order specified.
+
+Example usages:
+
+ # single category
+ pipenv install six --categories prereq
+
+ # multiple categories
+ pipenv sync --categories="prereq packages"
+
+ # lock and uninstall examples
+ pipenv lock --categories="prereq dev-packages"
+ pipenv uninstall six --categories prereq
+
+
+```{note}
+The `packages`/`default` specifiers are used to constrain all other categories just as they have done
+for `dev-packages`/`develop` category. However this is the only way constraints are applied --
+the presence of other named groups do not constraint each other,
+which means it is possible to define conflicting package versions across groups.
+This may be desired in some use cases where users only are installing groups specific to their system platform.
+```
+
+## 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](https://www.python.org/dev/peps/pep-0508/) 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 = "*", sys_platform = "== 'win32'"}
+
+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')"}
+
+Markers provide a ton of flexibility when specifying package requirements.
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/virtualenv.md b/docs/virtualenv.md
new file mode 100644
index 0000000000..7e5eca37d2
--- /dev/null
+++ b/docs/virtualenv.md
@@ -0,0 +1,30 @@
+# virtualenv
+
+## Custom Virtual Environment Location
+
+Pipenv automatically honors the `WORKON_HOME` environment variable, if it
+is 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.
+
+## Virtual Environment Name
+
+The virtualenv name 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.
+
+Pipenv supports a arbitrary custom name for the virtual environment set at `PIPENV_CUSTOM_VENV_NAME`.
+
+The logical place to specify this would be in a user's `.env` file in the root of the project, which gets loaded by pipenv when it is invoked.
+
+## Renaming or Moving a project folder managed by pipenv
+By default pipenv creates a virtualenv for your project and gives it a name. The default name is how pipenv maps the individual project to the correct virtualenv. Pipenv names the virtualenv with the name of the project’s root directory plus the hash of the full path to the project's root (e.g., `my_project-a3de50`).
+
+If you rename or move the project folder this will change the project path. Then, pipenv will no longer be able to find your virtualenv and it will make a new virtualenv. This leaves you with the old virtualenv still lying around on you system. Luckily the fix is simple.
+- Run 'pipenv --rm' *before* renaming or moving your project directory
+- Then, after renaming or moving the directory run 'pipenv install' to recreate the virtualenv
diff --git a/docs/workflows.md b/docs/workflows.md
new file mode 100644
index 0000000000..31fb8e7171
--- /dev/null
+++ b/docs/workflows.md
@@ -0,0 +1,43 @@
+# Pipenv Workflows
+
+Clone / create project repository:
+
+ $ cd myproject
+
+Install from `Pipfile.lock`, if there is one:
+
+ $ pipenv install
+
+Add a package to your project, recalibrating subset of lock file using the Pipfile specifiers:
+
+ $ pipenv install
+
+- Note: This will create a `Pipfile` if one doesn't exist. If one does exist, it will automatically be edited with the new package you provided, the lock file updated and the new dependencies installed.
+- `pipenv install` is fully compatible with `pip install` [package specifiers](https://pip.pypa.io/en/stable/user_guide/#installing-packages).
+- Additional arguments may be supplied to `pip` by supplying `pipenv` with `--extra-pip-args`.
+
+Update everything (equivalent to `pipenv lock && pipenv sync`):
+
+ $ pipenv update
+
+Update and install just the relevant package and its sub-dependencies:
+
+ $ pipenv update
+
+Update in the Pipfile/lockfile just the relevant package and its sub-dependencies:
+
+ $ pipenv upgrade
+
+Find out what's changed upstream:
+
+ $ pipenv update --outdated
+
+Determine the virtualenv `PATH`:
+
+ $ pipenv --venv
+
+Activate the Pipenv shell:
+
+ $ pipenv shell
+
+- Note: This will spawn a new shell subprocess, which can be deactivated by using `exit`.
diff --git a/examples/Pipfile b/examples/Pipfile
index 3aac6a5e22..8b47a907c0 100644
--- a/examples/Pipfile
+++ b/examples/Pipfile
@@ -1,5 +1,17 @@
-[dev-packages]
-pytest = "*"
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
[packages]
-requests = "*"
\ No newline at end of file
+requests = ">=2.32.0"
+urllib3 = ">=2.2.1"
+certifi = ">=2024.2.2"
+idna = ">=3.6"
+charset-normalizer = ">=3.3.2"
+
+[dev-packages]
+pytest = ">=7.4.0"
+
+[requires]
+python_version = "3.11"
diff --git a/examples/Pipfile.lock b/examples/Pipfile.lock
index 09abb084b6..52b3ca5de6 100644
--- a/examples/Pipfile.lock
+++ b/examples/Pipfile.lock
@@ -1,26 +1,16 @@
{
"_meta": {
"hash": {
- "sha256": "08e3181df84d04301c9d435357ec9cf43c4a491d79a1ada682cce8936c492f49"
+ "sha256": "a41d6e551c69880f7899c2f45d7a7ce37afc94a0938a53f57b0688d03382d5ff"
},
- "host-environment-markers": {
- "implementation_name": "cpython",
- "implementation_version": "3.6.2",
- "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.2",
- "python_version": "3.6",
- "sys_platform": "darwin"
+ "pipfile-spec": 6,
+ "requires": {
+ "python_version": "3.11"
},
- "pipfile-spec": 2,
- "requires": {},
"sources": [
{
- "url": "https://pypi.python.org/simple",
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
"verify_ssl": true
}
]
@@ -28,46 +18,173 @@
"default": {
"certifi": {
"hashes": [
- "sha256:54a07c09c586b0e4c619f02a5e94e36619da8e2b053e20f594348c0611803704",
- "sha256:40523d2efb60523e113b44602298f0960e900388cf3bb6043f645cf57ea9e3f5"
+ "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651",
+ "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"
],
- "version": "==2017.7.27.1"
+ "index": "pypi",
+ "markers": "python_version >= '3.6'",
+ "version": "==2025.1.31"
},
- "chardet": {
+ "charset-normalizer": {
"hashes": [
- "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691",
- "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"
+ "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537",
+ "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa",
+ "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a",
+ "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294",
+ "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b",
+ "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd",
+ "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601",
+ "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd",
+ "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4",
+ "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d",
+ "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2",
+ "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313",
+ "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd",
+ "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa",
+ "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8",
+ "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1",
+ "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2",
+ "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496",
+ "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d",
+ "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b",
+ "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e",
+ "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a",
+ "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4",
+ "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca",
+ "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78",
+ "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408",
+ "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5",
+ "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3",
+ "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f",
+ "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a",
+ "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765",
+ "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6",
+ "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146",
+ "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6",
+ "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9",
+ "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd",
+ "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c",
+ "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f",
+ "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545",
+ "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176",
+ "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770",
+ "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824",
+ "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f",
+ "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf",
+ "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487",
+ "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d",
+ "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd",
+ "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b",
+ "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534",
+ "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f",
+ "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b",
+ "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9",
+ "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd",
+ "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125",
+ "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9",
+ "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de",
+ "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11",
+ "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d",
+ "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35",
+ "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f",
+ "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda",
+ "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7",
+ "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a",
+ "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971",
+ "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8",
+ "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41",
+ "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d",
+ "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f",
+ "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757",
+ "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a",
+ "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886",
+ "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77",
+ "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76",
+ "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247",
+ "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85",
+ "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb",
+ "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7",
+ "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e",
+ "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6",
+ "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037",
+ "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1",
+ "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e",
+ "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807",
+ "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407",
+ "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c",
+ "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12",
+ "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3",
+ "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089",
+ "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd",
+ "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e",
+ "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00",
+ "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"
],
- "version": "==3.0.4"
+ "index": "pypi",
+ "markers": "python_version >= '3.7'",
+ "version": "==3.4.1"
},
"idna": {
"hashes": [
- "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4",
- "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f"
+ "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
+ "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
],
- "version": "==2.6"
+ "index": "pypi",
+ "markers": "python_version >= '3.6'",
+ "version": "==3.10"
},
"requests": {
"hashes": [
- "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b",
- "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e"
+ "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
+ "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
],
- "version": "==2.18.4"
+ "index": "pypi",
+ "markers": "python_version >= '3.8'",
+ "version": "==2.32.3"
},
"urllib3": {
"hashes": [
- "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b",
- "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"
+ "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466",
+ "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"
],
- "version": "==1.22"
+ "index": "pypi",
+ "markers": "python_version >= '3.9'",
+ "version": "==2.4.0"
}
},
"develop": {
- "py": {
- "version": "==1.4.34"
+ "iniconfig": {
+ "hashes": [
+ "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7",
+ "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.1.0"
+ },
+ "packaging": {
+ "hashes": [
+ "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484",
+ "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==25.0"
+ },
+ "pluggy": {
+ "hashes": [
+ "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
+ "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==1.5.0"
},
"pytest": {
- "version": "==3.2.1"
+ "hashes": [
+ "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820",
+ "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.8'",
+ "version": "==8.3.5"
}
}
}
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="https://github.com/store_true")
+ pre_parser.add_argument("--no-wheel", action="https://github.com/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