#!/usr/bin/env bash # # This script updates the development dependencies used for the Python bindings. # # When you run it, it will: # - create and activate a temporary virtual env # - install the current package dependencies from `py/requirements.txt` # - upgrade the package dependencies to the latest versions available on PyPI # - run `pip freeze` to generate a new `py/requirements.txt` file # - run `bazel run //py:requirements.update` to generate a new `py/requirements_lock.txt` file # - deactivate and remove the temporary virtual env # # After running this script, you should also manually check package dependency # versions in `py/pyproject.toml`, `py/tox.ini`, py/BUILD.bazel`, # `py/docs/requirements.txt`, and update those if needed. # # Once all dependencies are updated, create a new Pull Request with the changes. set -e REQUIREMENTS_FILE="./py/requirements.txt" VENV="./temp_virtualenv" cd "$(git rev-parse --show-toplevel)" if [[ ! -f "${REQUIREMENTS_FILE}" ]]; then echo "can't find: ${REQUIREMENTS_FILE}" exit 1 fi if [[ -d "${VENV}" ]]; then echo "${VENV} already exists" exit 1 fi echo "creating virtual env: ${VENV}" python3 -m venv "${VENV}" echo "activating virtual env" source "${VENV}/bin/activate" echo "upgrading pip" python -m pip install --upgrade pip > /dev/null echo "installing dev dependencies from: ${REQUIREMENTS_FILE}" pip install -r "${REQUIREMENTS_FILE}" > /dev/null echo "upgrading outdated dependencies ..." echo pip list --outdated | while read -r line; do if [[ ! "${line}" =~ "Version" && ! "${line}" =~ "----" ]]; then read -ra fields <<< "${line}" package="${fields[0]}" echo "upgrading ${package} from ${fields[1]} to ${fields[2]}" pip install --upgrade "${package}==${fields[2]}" > /dev/null fi done echo echo "generating new ${REQUIREMENTS_FILE}" pip freeze > "${REQUIREMENTS_FILE}" # `pip freeze` doesn't show package "extras", so we explicitly add it here for urllib3 if [[ "${OSTYPE}" == "linux"* ]]; then sed -i "s/urllib3/urllib3[socks]/g" "${REQUIREMENTS_FILE}" # GNU sed else sed -i "" "s/urllib3/urllib3[socks]/g" "${REQUIREMENTS_FILE}" fi echo "generating new lock file" bazel run //py:requirements.update echo echo "deleting virtual env: ${VENV}" deactivate rm -rf "${VENV}" echo git status echo echo "done!"