diff --git a/.tests/dockersetup.sh b/.tests/app/setup.sh similarity index 100% rename from .tests/dockersetup.sh rename to .tests/app/setup.sh diff --git a/.tests/DockerfileUbuntu b/.tests/app/ubuntu/Dockerfile similarity index 93% rename from .tests/DockerfileUbuntu rename to .tests/app/ubuntu/Dockerfile index 8bcb59b..9f802e2 100644 --- a/.tests/DockerfileUbuntu +++ b/.tests/app/ubuntu/Dockerfile @@ -22,5 +22,5 @@ RUN poetry install --no-ansi FROM install as setup WORKDIR /tmp/hyperglass -COPY .tests/dockersetup.sh /tmp/dockersetup.sh +COPY .tests/app/setup.sh /tmp/setup.sh RUN ls -lsah /tmp \ No newline at end of file diff --git a/.tests/install/ubuntu/Dockerfile b/.tests/install/ubuntu/Dockerfile new file mode 100644 index 0000000..3cee18f --- /dev/null +++ b/.tests/install/ubuntu/Dockerfile @@ -0,0 +1,8 @@ +FROM ubuntu:bionic as base +WORKDIR /tmp +COPY ./install.sh /tmp/install.sh +RUN apt-get update && apt-get install -y apt-utils \ + && apt-get install -y curl gnupg build-essential + +# FROM base as install +# RUN bash /tmp/install.sh diff --git a/.travis.yml b/.travis.yml index acc74ba..44e4554 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,24 @@ --- language: minimal -services: - - docker - - redis -before_install: - - docker build -t hyperglass/ubuntu -f .tests/DockerfileUbuntu . jobs: include: - stage: Lint + services: + - docker + before_install: + - docker build -t hyperglass/ubuntu -f .tests/app/ubuntu/Dockerfile . script: docker run hyperglass/ubuntu /bin/sh -c "cd /tmp/hyperglass; poetry run flake8 hyperglass" - - stage: Test - script: docker run hyperglass/ubuntu /tmp/dockersetup.sh + - stage: Installer - Ubuntu + services: + - docker + before_install: + - docker build -t install_ubuntu -f .tests/install/ubuntu/Dockerfile . + script: docker run install_ubuntu /bin/bash /tmp/install.sh + - stage: App - Ubuntu + services: + - docker + - redis + before_install: + - docker build -t hyperglass/ubuntu -f .tests/app/ubuntu/Dockerfile . + script: docker run hyperglass/ubuntu /tmp/setup.sh diff --git a/.travis.yml.old b/.travis.yml.old deleted file mode 100644 index 3fad0f7..0000000 --- a/.travis.yml.old +++ /dev/null @@ -1,23 +0,0 @@ ---- - -language: python -python: - - '3.7' -before_install: - - sudo add-apt-repository universe -y - - sudo apt-get update -q - - sudo apt-get install -y redis-server - - sudo systemctl start redis-server - - sudo systemctl status redis-server -install: - - pip3 install -r requirements.txt -before_script: - - pip3 uninstall -y -r ./tests/requirements_dev.txt - - pip3 install -r ./tests/requirements_dev.txt - - isort -rc hyperglass - - flake8 hyperglass - - python3 ./tests/ci_prepare.py -script: - - nohup python3 ./tests/ci_dev_server.py & - - sleep 20 - - python3 ./tests/ci_test.py diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..8049c49 --- /dev/null +++ b/install.sh @@ -0,0 +1,449 @@ +#!/usr/bin/env bash + +MIN_PYTHON_MAJOR="3" +MIN_PYTHON_MINOR="6" +MIN_NODE_MAJOR="13" +MIN_YARN_MAJOR="1" +MIN_REDIS_MAJOR="4" + +APT_INSTALL="apt-get install -y" +APT_UPDATE="apt update" +YUM_INSTALL="yum install -y" +YUM_UPDATE="yum update" +BREW_INSTALL="brew install" +BREW_UPDATE="brew update" + +INSTALL_MAP=(["apt"]="$APT_INSTALL" ["yum"]="$YUM_INSTALL" ["brew"]="$BREW_INSTALL") +UPDATE_MAP=(["apt"]="$APT_UPDATE" ["yum"]="$YUM_UPDATE" ["brew"]="$BREW_UPDATE") + +INSTALLER="" +NEEDS_UPDATE="0" +NEEDS_PYTHON="1" +NEEDS_NODE="1" +NEEDS_YARN="1" +NEEDS_REDIS="1" + +has_cmd () { + which $1 > /dev/null + + if [[ $? == 0 ]]; then + echo "0" + else + echo "1" + fi +} + +semver () { + local ver_raw=$(echo "$1" | egrep -o '\d+\.\d+\.\d+') + local ver_digits=( ${ver_raw//./ } ) + echo ${ver_digits[@]} +} + +parse_redis_version () { + local one=$(echo "$@" | egrep -o 'v=\d+\.\d+\.\d+') + local two=$(echo $one | egrep -o '\d+\.\d+\.\d+') + echo $two +} + +python3_version () { + local ver_digits=($(semver "$(python3 --version)")) + local major="${ver_digits[0]}" + local minor="${ver_digits[1]}" + + if [[ $major != $MIN_PYTHON_MAJOR ]]; then + echo "1" + return 1 + elif [[ $major == $MIN_PYTHON_MAJOR && $minor -lt $MIN_PYTHON_MINOR ]]; then + echo "1" + return 1 + elif [[ $major == $MIN_PYTHON_MAJOR && $minor -ge $MIN_PYTHON_MINOR ]]; then + echo "0" + return 0 + else + echo "1" + return 1 + fi +} + +node_version () { + local ver_digits=($(semver "$(node --version)")) + local major=${ver_digits[0]} + + if [[ $major < $MIN_NODE_MAJOR ]]; then + echo "1" + elif [[ $major -ge $MIN_NODE_MAJOR ]]; then + echo "0" + else + echo "1" + fi +} + +needs_python () { + local has_python3=$(has_cmd "python3") + if [[ $has_python3 == 1 ]]; then + NEEDS_PYTHON="1" + elif [[ $has_python3 == 0 ]]; then + local needs_upgrade=$(python3_version) + if [[ $needs_upgrade == 1 ]]; then + NEEDS_PYTHON="1" + elif [[ $needs_upgrade == 0 ]]; then + NEEDS_PYTHON="0" + else + NEEDS_PYTHON="1" + fi + else + NEEDS_PYTHON="1" + fi +} + +needs_node () { + local has_node=$(has_cmd node) + if [[ $has_node == 1 ]]; then + NEEDS_NODE="1" + elif [[ $has_node == 0 ]]; then + local needs_upgrade=$(node_version) + if [[ $needs_upgrade == 1 ]]; then + NEEDS_NODE="1" + elif [[ $needs_upgrade == 0 ]]; then + NEEDS_NODE="0" + else + NEEDS_NODE="1" + fi + else + NEEDS_NODE="1" + fi +} + +needs_yarn () { + local has_yarn=$(has_cmd yarn) + if [[ $has_yarn == 1 ]]; then + NEEDS_YARN="1" + elif [[ $has_yarn == 0 ]]; then + NEEDS_YARN="0" + else + NEEDS_YARN="1" + fi +} + +needs_redis () { + local has_redis=$(has_cmd redis-server) + if [[ $has_redis == 1 ]]; then + NEEDS_REDIS="1" + elif [[ $has_redis == 0 ]]; then + NEEDS_REDIS="0" + else + NEEDS_REDIS="1" + fi +} + +get_platform () { + local use_apt=$(has_cmd apt-get) + local use_yum=$(has_cmd yum) + local use_brew=$(has_cmd brew) + + if [[ $use_apt == 0 ]]; then + INSTALLER="apt" + elif [[ $use_yum == 0 ]]; then + INSTALLER="yum" + elif [[ $use_brew == 0 ]]; then + INSTALLER="brew" + else + echo "[ERROR] Unable to identify this system's package manager" + exit 1 + fi +} + +python_post () { + if [[ $1 == 0 ]]; then + local successful=$(needs_python) + if [[ $successful == 0 ]]; then + echo "[SUCCESS] Installed $(python --version)" + else + echo "[ERROR] Tried to install Python 3, but post-install check failed." + fi + else + echo "[ERROR] Tried to install Python 3, but encountered an error. Consult the Python 3 installation instructions for your system." + fi +} + +node_post () { + if [[ $1 == 0 ]]; then + local successful=$(needs_node) + if [[ $successful == 0 ]]; then + echo "[SUCCESS] Installed NodeJS $(node --version | egrep -o '\d+\.\d+\.\d+')" + else + echo "[ERROR] Tried to install NodeJS, but post-install check failed." + fi + else + echo "[ERROR] Tried to install NodeJS, but encountered an error. Try running `${INSTALL_MAP[$INSTALLER]} nodejs` to investigate." + fi +} + +yarn_post () { + if [[ $1 == 0 ]]; then + local successful=$(needs_yarn) + if [[ $successful == 0 ]]; then + echo "[SUCCESS] Installed Yarn $(yarn --version | egrep -o '\d+\.\d+\.\d+')" + else + echo "[ERROR] Tried to install Yarn, but post-install check failed." + fi + else + echo "[ERROR] Tried to install Yarn, but encountered an error. Try running `${INSTALL_MAP[$INSTALLER]} yarn` to investigate." + fi +} + +redis_post () { + if [[ $1 == 0 ]]; then + local successful=$(needs_redis) + if [[ $successful == 0 ]]; then + echo "[SUCCESS] Installed Redis $(parse_redis_version $(redis-server --version))" + else + echo "[ERROR] Tried to install Redis, but post-install check failed." + fi + else + echo "[ERROR] Tried to install Redis, but encountered an error. Try running `${INSTALL_MAP[$INSTALLER]} $redis_name` to investigate." + fi +} + +node_apt_prepare () { + curl -sL https://deb.nodesource.com/setup_13.x -o /tmp/nodesetup.sh + sleep 1 + bash /tmp/nodesetup.sh + NEEDS_UPDATE="1" +} + +yarn_apt_prepare () { + curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg -o /tmp/yarnkey.gpg + sleep 1 + apt-key add /tmp/yarnkey.gpg + echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list + NEEDS_UPDATE="1" +} + +node_yum_prepare () { + curl -sL https://rpm.nodesource.com/setup_13.x -o /tmp/nodesetup.sh + bash /tmp/nodesetup.sh + sleep 1 + NEEDS_UPDATE="1" +} + +yarn_yum_prepare () { + curl -sL https://dl.yarnpkg.com/rpm/yarn.repo -o /etc/yum.repos.d/yarn.repo + sleep 1 + NEEDS_UPDATE="1" +} + +node_apt () { + apt-get install -y nodejs + node_post $? +} + +node_yum () { + yum -y install gcc-c++ make nodejs + node_post $? +} + +node_brew () { + brew install node + node_post $? +} + +yarn_apt () { + apt-get install -y yarn + yarn_post $? +} + +yarn_yum () { + yum -y install gcc-c++ make yarn + yarn_post $? +} + +yarn_brew () { + brew install yarn + yarn_post $? +} + +python_apt () { + apt-get install -y python3.6-dev python3-pip + python_post $? +} + +python_yum () { + yum install centos-release-scl + yum install rh-python36 + python_post $? +} + +python_brew () { + brew install python3 + python_post $? +} + +redis_apt () { + apt-get install -y redis-server + redis_post $? +} + +redis_yum () { + yum -y install redis + redis_post $? +} + +redis_brew () { + brew install redis + redis_post $? +} + +update_repo () { + if [[ $INSTALLER == "apt" ]]; then + apt-get update + elif [[ $INSTALLER == "yum" ]]; then + yum update + elif [[ $INSTALLER == "brew" ]]; then + brew update + fi +} + +install_python () { + if [[ $NEEDS_PYTHON == "1" ]]; then + echo "[INFO] Installing Python..." + + if [[ $INSTALLER == "apt" ]]; then + python_apt + elif [[ $INSTALLER == "yum" ]]; then + python_yum + elif [[ $INSTALLER == "brew" ]]; then + python_brew + fi + + elif [[ $NEEDS_PYTHON == "0" ]]; then + echo "[INFO] Your system is running $(python3 --version) (Minimum is $MIN_PYTHON_MAJOR.$MIN_PYTHON_MINOR+)." + + else + echo "[ERROR] Unable to determine if your system needs Python." + exit 1 + fi +} + +install_node () { + if [[ $NEEDS_NODE == "1" ]]; then + echo "[INFO] Installing NodeJS..." + + if [[ $INSTALLER == "apt" ]]; then + node_apt + elif [[ $INSTALLER == "yum" ]]; then + node_yum + elif [[ $INSTALLER == "brew" ]]; then + node_brew + fi + + elif [[ $NEEDS_NODE == "0" ]]; then + echo "[INFO] Your system is running NodeJS $(node --version) (Minimum is $MIN_NODE_MAJOR+)." + + else + echo "[ERROR] Unable to determine if your system needs NodeJS." + exit 1 + fi +} + +install_yarn () { + if [[ $NEEDS_YARN == "1" ]]; then + echo "[INFO] Installing Yarn..." + + if [[ $INSTALLER == "apt" ]]; then + yarn_apt + elif [[ $INSTALLER == "yum" ]]; then + yarn_yum + elif [[ $INSTALLER == "brew" ]]; then + yarn_brew + fi + + elif [[ $NEEDS_YARN == "0" ]]; then + echo "[INFO] Your system is running Yarn $(yarn --version) (Minimum is $MIN_YARN_MAJOR+)." + + else + echo "[ERROR] Unable to determine if your system needs Yarn." + exit 1 + fi +} + +install_redis () { + if [[ $NEEDS_REDIS == "1" ]]; then + echo "[INFO] Installing Redis..." + + if [[ $INSTALLER == "apt" ]]; then + redis_apt + elif [[ $INSTALLER == "yum" ]]; then + redis_yum + elif [[ $INSTALLER == "brew" ]]; then + redis_brew + fi + + elif [[ $NEEDS_REDIS == "0" ]]; then + echo "[INFO] Your system is running Redis $(parse_redis_version $(redis-server --version)) (Minimum is $MIN_REDIS_MAJOR+)." + + else + echo "[ERROR] Unable to determine if your system needs Redis." + exit 1 + fi +} + +clean_temp () { + echo "Cleaning up temporary files..." + rm -rf /tmp/yarnkey.gpg + rm -rf /tmp/nodesetup.sh +} + +catch_interrupt () { + kill $PID + exit +} + +trap catch_interrupt SIGINT + +while true; do + PID=$! + + if (($EUID != 0)); then + echo 'hyperglass installer must be run with root privileges. Try running with `sudo`' + exit 1 + fi + + get_platform + + needs_python + needs_node + needs_yarn + needs_redis + + if [[ $NEEDS_YARN == "1" && $INSTALLER == "apt" ]]; then + yarn_apt_prepare + elif [[ $NEEDS_YARN == "1" && $INSTALLER == "yum" ]]; then + yarn_yum_prepare + fi + + if [[ $NEEDS_NODE == "1" && $INSTALLER == "apt" ]]; then + node_apt_prepare + elif [[ $NEEDS_NODE == "1" && $INSTALLER == "yum" ]]; then + node_yum_prepare + fi + + if [[ $NEEDS_UPDATE == "1" ]]; then + update_repo + fi + + install_python + install_node + install_yarn + install_redis + + if [[ $? == 0 ]]; then + clean_temp + echo "[SUCCESS] Finished installed dependencies." + exit 0 + else + clean_temp + echo "[ERROR] An error occurred while attempting to install dependencies." + exit 1 + fi +done diff --git a/poetry.lock b/poetry.lock index dd27db8..f0581ef 100644 --- a/poetry.lock +++ b/poetry.lock @@ -500,13 +500,24 @@ version = "0.18.2" [[package]] category = "dev" description = "Git Object Database" -name = "gitdb2" +name = "gitdb" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.0.6" +python-versions = ">=3.4" +version = "4.0.0" [package.dependencies] -smmap2 = ">=2.0.0" +smmap = ">=3" + +[[package]] +category = "dev" +description = "Git Object Database" +name = "gitdb2" +optional = false +python-versions = ">=3.4" +version = "4.0.1" + +[package.dependencies] +gitdb = ">=4" [[package]] category = "dev" @@ -514,10 +525,10 @@ description = "Python Git Library" name = "gitpython" optional = false python-versions = ">=3.4" -version = "3.0.7" +version = "3.0.8" [package.dependencies] -gitdb2 = ">=2.0.0" +gitdb2 = ">=3" [[package]] category = "main" @@ -553,16 +564,19 @@ description = "Chromium HSTS Preload list as a Python package and updated daily" name = "hstspreload" optional = false python-versions = ">=3.6" -version = "2020.2.5" +version = "2020.2.21" [[package]] category = "main" description = "A collection of framework independent HTTP protocol utils." -marker = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"pypy\"" +marker = "sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"" name = "httptools" optional = false python-versions = "*" -version = "0.0.13" +version = "0.1.1" + +[package.extras] +test = ["Cython (0.29.14)"] [[package]] category = "main" @@ -608,7 +622,7 @@ description = "Internationalized Domain Names in Applications (IDNA)" name = "idna" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.8" +version = "2.9" [[package]] category = "main" @@ -924,7 +938,7 @@ description = "Alternative regular expression module, to replace re." name = "regex" optional = false python-versions = "*" -version = "2020.1.8" +version = "2020.2.20" [[package]] category = "main" @@ -959,10 +973,10 @@ version = "1.14.0" [[package]] category = "dev" description = "A pure Python implementation of a sliding window memory map manager" -name = "smmap2" +name = "smmap" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.0.5" +version = "3.0.0" [[package]] category = "main" @@ -1038,12 +1052,12 @@ description = "A collection of helpers and mock objects for unit tests and doc t name = "testfixtures" optional = false python-versions = "*" -version = "6.12.0" +version = "6.13.1" [package.extras] build = ["setuptools-git", "wheel", "twine"] -docs = ["sphinx"] -test = ["pytest (>=3.6)", "pytest-cov", "pytest-django", "sybil", "zope.component", "twisted", "mock", "django (<2)", "django"] +docs = ["sphinx", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"] +test = ["pytest (>=3.6)", "pytest-cov", "pytest-django", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"] [[package]] category = "main" @@ -1100,12 +1114,12 @@ description = "The lightning-fast ASGI server." name = "uvicorn" optional = false python-versions = "*" -version = "0.11.2" +version = "0.11.3" [package.dependencies] click = ">=7.0.0,<8.0.0" h11 = ">=0.8,<0.10" -httptools = "0.0.13" +httptools = ">=0.1.0,<0.2.0" uvloop = ">=0.14.0" websockets = ">=8.0.0,<9.0.0" @@ -1123,13 +1137,13 @@ description = "Virtual Python Environment builder" name = "virtualenv" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "20.0.3" +version = "20.0.5" [package.dependencies] appdirs = ">=1.4.3,<2" distlib = ">=0.3.0,<1" filelock = ">=3.0.0,<4" -six = ">=1.12.0,<2" +six = ">=1.9.0,<2" [package.dependencies.importlib-metadata] python = "<3.8" @@ -1170,11 +1184,11 @@ marker = "python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=3.6" -version = "2.2.0" +version = "3.0.0" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["jaraco.itertools"] +testing = ["jaraco.itertools", "func-timeout"] [metadata] content-hash = "416c043c10ed68323afdf9aa286261be5b7787e6408b4a3b056286129871e303" @@ -1412,13 +1426,17 @@ flake8-return = [ future = [ {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, ] +gitdb = [ + {file = "gitdb-4.0.0-py2.py3-none-any.whl", hash = "sha256:03013fe466cff860ce0dd12d666e4ca0be4c8b2ad611727fb524ba519eec905c"}, + {file = "gitdb-4.0.0.tar.gz", hash = "sha256:1bad024b93eb39e01641acf88809b25293d7f4d8fa4d2ff229069a91130a8e2c"}, +] gitdb2 = [ - {file = "gitdb2-2.0.6-py2.py3-none-any.whl", hash = "sha256:96bbb507d765a7f51eb802554a9cfe194a174582f772e0d89f4e87288c288b7b"}, - {file = "gitdb2-2.0.6.tar.gz", hash = "sha256:1b6df1433567a51a4a9c1a5a0de977aa351a405cc56d7d35f3388bad1f630350"}, + {file = "gitdb2-4.0.1-py2.py3-none-any.whl", hash = "sha256:db61e0786993eb2bf11fe79d76f90eaba2ec1fc3104e450f5117c1dd23a4ba65"}, + {file = "gitdb2-4.0.1.tar.gz", hash = "sha256:06045ac819e8a30ee12eb17f84e7dc0a2a1d91c6240add65a4b065c8358ad2ec"}, ] gitpython = [ - {file = "GitPython-3.0.7-py3-none-any.whl", hash = "sha256:99c77677f31f255e130f3fed4c8e0eebb35f1a09df98ff965fff6774f71688cf"}, - {file = "GitPython-3.0.7.tar.gz", hash = "sha256:99cd0403cecd8a13b95d2e045b9fcaa7837137fcc5ec3105f2c413305d82c143"}, + {file = "GitPython-3.0.8-py3-none-any.whl", hash = "sha256:a43a5d88a5bbc3cf32bb5223e4b4e68fd716db5e9996cad6e561bbfee6e5f4af"}, + {file = "GitPython-3.0.8.tar.gz", hash = "sha256:620b3c729bbc143b498cfea77e302999deedc55faec5b1067086c9ef90e101bc"}, ] h11 = [ {file = "h11-0.9.0-py2.py3-none-any.whl", hash = "sha256:4bc6d6a1238b7615b266ada57e0618568066f57dd6fa967d1290ec9309b2f2f1"}, @@ -1433,10 +1451,21 @@ hpack = [ {file = "hpack-3.0.0.tar.gz", hash = "sha256:8eec9c1f4bfae3408a3f30500261f7e6a65912dc138526ea054f9ad98892e9d2"}, ] hstspreload = [ - {file = "hstspreload-2020.2.5.tar.gz", hash = "sha256:e1fc3184ddf1c8b1af7143b28d76cf648fe385cf29b6d4e7bc9d8fbab98867be"}, + {file = "hstspreload-2020.2.21.tar.gz", hash = "sha256:6759706864a830ad46cecb8485bec68a32dd8b2a2a389572634a2765cc6e2334"}, ] httptools = [ - {file = "httptools-0.0.13.tar.gz", hash = "sha256:e00cbd7ba01ff748e494248183abc6e153f49181169d8a3d41bb49132ca01dfc"}, + {file = "httptools-0.1.1-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:a2719e1d7a84bb131c4f1e0cb79705034b48de6ae486eb5297a139d6a3296dce"}, + {file = "httptools-0.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:fa3cd71e31436911a44620473e873a256851e1f53dee56669dae403ba41756a4"}, + {file = "httptools-0.1.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:86c6acd66765a934e8730bf0e9dfaac6fdcf2a4334212bd4a0a1c78f16475ca6"}, + {file = "httptools-0.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bc3114b9edbca5a1eb7ae7db698c669eb53eb8afbbebdde116c174925260849c"}, + {file = "httptools-0.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ac0aa11e99454b6a66989aa2d44bca41d4e0f968e395a0a8f164b401fefe359a"}, + {file = "httptools-0.1.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:96da81e1992be8ac2fd5597bf0283d832287e20cb3cfde8996d2b00356d4e17f"}, + {file = "httptools-0.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:56b6393c6ac7abe632f2294da53f30d279130a92e8ae39d8d14ee2e1b05ad1f2"}, + {file = "httptools-0.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:96eb359252aeed57ea5c7b3d79839aaa0382c9d3149f7d24dd7172b1bcecb009"}, + {file = "httptools-0.1.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:fea04e126014169384dee76a153d4573d90d0cbd1d12185da089f73c78390437"}, + {file = "httptools-0.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3592e854424ec94bd17dc3e0c96a64e459ec4147e6d53c0a42d0ebcef9cb9c5d"}, + {file = "httptools-0.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a4b1b2012b28e68306575ad14ad5e9120b34fccd02a81eb08838d7e3bbb48be"}, + {file = "httptools-0.1.1.tar.gz", hash = "sha256:41b573cf33f64a8f8f3400d0a7faf48e1888582b6f6e02b82b9bd4f0bf7497ce"}, ] httpx = [ {file = "httpx-0.11.1-py2.py3-none-any.whl", hash = "sha256:1d3893d3e4244c569764a6bae5c5a9fbbc4a6ec3825450b5696602af7a275576"}, @@ -1451,8 +1480,8 @@ identify = [ {file = "identify-1.4.11.tar.gz", hash = "sha256:d824ebe21f38325c771c41b08a95a761db1982f1fc0eee37c6c97df3f1636b96"}, ] idna = [ - {file = "idna-2.8-py2.py3-none-any.whl", hash = "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"}, - {file = "idna-2.8.tar.gz", hash = "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407"}, + {file = "idna-2.9-py2.py3-none-any.whl", hash = "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"}, + {file = "idna-2.9.tar.gz", hash = "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb"}, ] immutables = [ {file = "immutables-0.11-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:bce27277a2fe91509cca69181971ab509c2ee862e8b37b09f26b64f90e8fe8fb"}, @@ -1634,27 +1663,27 @@ readchar = [ {file = "readchar-2.0.1-py3-none-any.whl", hash = "sha256:3ac34aab28563bc895f73233d5c08b28f951ca190d5850b8d4bec973132a8dca"}, ] regex = [ - {file = "regex-2020.1.8-cp27-cp27m-win32.whl", hash = "sha256:4e8f02d3d72ca94efc8396f8036c0d3bcc812aefc28ec70f35bb888c74a25161"}, - {file = "regex-2020.1.8-cp27-cp27m-win_amd64.whl", hash = "sha256:e6c02171d62ed6972ca8631f6f34fa3281d51db8b326ee397b9c83093a6b7242"}, - {file = "regex-2020.1.8-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4eae742636aec40cf7ab98171ab9400393360b97e8f9da67b1867a9ee0889b26"}, - {file = "regex-2020.1.8-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bd25bb7980917e4e70ccccd7e3b5740614f1c408a642c245019cff9d7d1b6149"}, - {file = "regex-2020.1.8-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3e77409b678b21a056415da3a56abfd7c3ad03da71f3051bbcdb68cf44d3c34d"}, - {file = "regex-2020.1.8-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:07b39bf943d3d2fe63d46281d8504f8df0ff3fe4c57e13d1656737950e53e525"}, - {file = "regex-2020.1.8-cp36-cp36m-win32.whl", hash = "sha256:23e2c2c0ff50f44877f64780b815b8fd2e003cda9ce817a7fd00dea5600c84a0"}, - {file = "regex-2020.1.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27429b8d74ba683484a06b260b7bb00f312e7c757792628ea251afdbf1434003"}, - {file = "regex-2020.1.8-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0e182d2f097ea8549a249040922fa2b92ae28be4be4895933e369a525ba36576"}, - {file = "regex-2020.1.8-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e3cd21cc2840ca67de0bbe4071f79f031c81418deb544ceda93ad75ca1ee9f7b"}, - {file = "regex-2020.1.8-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ecc6de77df3ef68fee966bb8cb4e067e84d4d1f397d0ef6fce46913663540d77"}, - {file = "regex-2020.1.8-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:26ff99c980f53b3191d8931b199b29d6787c059f2e029b2b0c694343b1708c35"}, - {file = "regex-2020.1.8-cp37-cp37m-win32.whl", hash = "sha256:7bcd322935377abcc79bfe5b63c44abd0b29387f267791d566bbb566edfdd146"}, - {file = "regex-2020.1.8-cp37-cp37m-win_amd64.whl", hash = "sha256:10671601ee06cf4dc1bc0b4805309040bb34c9af423c12c379c83d7895622bb5"}, - {file = "regex-2020.1.8-cp38-cp38-manylinux1_i686.whl", hash = "sha256:98b8ed7bb2155e2cbb8b76f627b2fd12cf4b22ab6e14873e8641f266e0fb6d8f"}, - {file = "regex-2020.1.8-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6a6ba91b94427cd49cd27764679024b14a96874e0dc638ae6bdd4b1a3ce97be1"}, - {file = "regex-2020.1.8-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:6a6ae17bf8f2d82d1e8858a47757ce389b880083c4ff2498dba17c56e6c103b9"}, - {file = "regex-2020.1.8-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:0932941cdfb3afcbc26cc3bcf7c3f3d73d5a9b9c56955d432dbf8bbc147d4c5b"}, - {file = "regex-2020.1.8-cp38-cp38-win32.whl", hash = "sha256:d58e4606da2a41659c84baeb3cfa2e4c87a74cec89a1e7c56bee4b956f9d7461"}, - {file = "regex-2020.1.8-cp38-cp38-win_amd64.whl", hash = "sha256:e7c7661f7276507bce416eaae22040fd91ca471b5b33c13f8ff21137ed6f248c"}, - {file = "regex-2020.1.8.tar.gz", hash = "sha256:d0f424328f9822b0323b3b6f2e4b9c90960b24743d220763c7f07071e0778351"}, + {file = "regex-2020.2.20-cp27-cp27m-win32.whl", hash = "sha256:99272d6b6a68c7ae4391908fc15f6b8c9a6c345a46b632d7fdb7ef6c883a2bbb"}, + {file = "regex-2020.2.20-cp27-cp27m-win_amd64.whl", hash = "sha256:974535648f31c2b712a6b2595969f8ab370834080e00ab24e5dbb9d19b8bfb74"}, + {file = "regex-2020.2.20-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5de40649d4f88a15c9489ed37f88f053c15400257eeb18425ac7ed0a4e119400"}, + {file = "regex-2020.2.20-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:82469a0c1330a4beb3d42568f82dffa32226ced006e0b063719468dcd40ffdf0"}, + {file = "regex-2020.2.20-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d58a4fa7910102500722defbde6e2816b0372a4fcc85c7e239323767c74f5cbc"}, + {file = "regex-2020.2.20-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f1ac2dc65105a53c1c2d72b1d3e98c2464a133b4067a51a3d2477b28449709a0"}, + {file = "regex-2020.2.20-cp36-cp36m-win32.whl", hash = "sha256:8c2b7fa4d72781577ac45ab658da44c7518e6d96e2a50d04ecb0fd8f28b21d69"}, + {file = "regex-2020.2.20-cp36-cp36m-win_amd64.whl", hash = "sha256:269f0c5ff23639316b29f31df199f401e4cb87529eafff0c76828071635d417b"}, + {file = "regex-2020.2.20-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:bed7986547ce54d230fd8721aba6fd19459cdc6d315497b98686d0416efaff4e"}, + {file = "regex-2020.2.20-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:046e83a8b160aff37e7034139a336b660b01dbfe58706f9d73f5cdc6b3460242"}, + {file = "regex-2020.2.20-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:b33ebcd0222c1d77e61dbcd04a9fd139359bded86803063d3d2d197b796c63ce"}, + {file = "regex-2020.2.20-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bba52d72e16a554d1894a0cc74041da50eea99a8483e591a9edf1025a66843ab"}, + {file = "regex-2020.2.20-cp37-cp37m-win32.whl", hash = "sha256:01b2d70cbaed11f72e57c1cfbaca71b02e3b98f739ce33f5f26f71859ad90431"}, + {file = "regex-2020.2.20-cp37-cp37m-win_amd64.whl", hash = "sha256:113309e819634f499d0006f6200700c8209a2a8bf6bd1bdc863a4d9d6776a5d1"}, + {file = "regex-2020.2.20-cp38-cp38-manylinux1_i686.whl", hash = "sha256:25f4ce26b68425b80a233ce7b6218743c71cf7297dbe02feab1d711a2bf90045"}, + {file = "regex-2020.2.20-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9b64a4cc825ec4df262050c17e18f60252cdd94742b4ba1286bcfe481f1c0f26"}, + {file = "regex-2020.2.20-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:9ff16d994309b26a1cdf666a6309c1ef51ad4f72f99d3392bcd7b7139577a1f2"}, + {file = "regex-2020.2.20-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c7f58a0e0e13fb44623b65b01052dae8e820ed9b8b654bb6296bc9c41f571b70"}, + {file = "regex-2020.2.20-cp38-cp38-win32.whl", hash = "sha256:200539b5124bc4721247a823a47d116a7a23e62cc6695744e3eb5454a8888e6d"}, + {file = "regex-2020.2.20-cp38-cp38-win_amd64.whl", hash = "sha256:7f78f963e62a61e294adb6ff5db901b629ef78cb2a1cfce3cf4eeba80c1c67aa"}, + {file = "regex-2020.2.20.tar.gz", hash = "sha256:9e9624440d754733eddbcd4614378c18713d2d9d0dc647cf9c72f64e39671be5"}, ] rfc3986 = [ {file = "rfc3986-1.3.2-py2.py3-none-any.whl", hash = "sha256:df4eba676077cefb86450c8f60121b9ae04b94f65f85b69f3f731af0516b7b18"}, @@ -1668,9 +1697,9 @@ six = [ {file = "six-1.14.0-py2.py3-none-any.whl", hash = "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"}, {file = "six-1.14.0.tar.gz", hash = "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a"}, ] -smmap2 = [ - {file = "smmap2-2.0.5-py2.py3-none-any.whl", hash = "sha256:0555a7bf4df71d1ef4218e4807bbf9b201f910174e6e08af2e138d4e517b4dde"}, - {file = "smmap2-2.0.5.tar.gz", hash = "sha256:29a9ffa0497e7f2be94ca0ed1ca1aa3cd4cf25a1f6b4f5f87f74b46ed91d609a"}, +smmap = [ + {file = "smmap-3.0.0-py2.py3-none-any.whl", hash = "sha256:7845d7d51201380e857420bf11e169a936e27b9764ac118310999d1c1ae58b82"}, + {file = "smmap-3.0.0.tar.gz", hash = "sha256:cc601e2d7bb9e9218f83f0ce8b6d3a4da614acd5e41ac694eb34a030329ad723"}, ] sniffio = [ {file = "sniffio-1.1.0-py3-none-any.whl", hash = "sha256:20ed6d5b46f8ae136d00b9dcb807615d83ed82ceea6b2058cecb696765246da5"}, @@ -1695,8 +1724,8 @@ stevedore = [ {file = "stevedore-1.32.0.tar.gz", hash = "sha256:18afaf1d623af5950cc0f7e75e70f917784c73b652a34a12d90b309451b5500b"}, ] testfixtures = [ - {file = "testfixtures-6.12.0-py2.py3-none-any.whl", hash = "sha256:76eef0c048d6c1ad28bb74ae2b28fa9e3ea3a2f42a56715a4102480b8188e588"}, - {file = "testfixtures-6.12.0.tar.gz", hash = "sha256:c352760016f0e5579a3e5565387e6d582ccad4db9791b6a293fdfc59d4591b97"}, + {file = "testfixtures-6.13.1-py2.py3-none-any.whl", hash = "sha256:ed7f36c5d426a4271368569d3b2d35590eeaf340ee9653cc3dd06ba2e21c6ba8"}, + {file = "testfixtures-6.13.1.tar.gz", hash = "sha256:6edef5d0d39b4a11ada53307379c07c38d69db4a684d40d4e3e08ec7ba66187e"}, ] textfsm = [ {file = "textfsm-1.1.0-py2.py3-none-any.whl", hash = "sha256:0aef3f9cad3d03905915fd62bff358c42b7dc35c863ff2cb0b5324c2b746cc24"}, @@ -1737,8 +1766,8 @@ urllib3 = [ {file = "urllib3-1.25.8.tar.gz", hash = "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"}, ] uvicorn = [ - {file = "uvicorn-0.11.2-py3-none-any.whl", hash = "sha256:4a35496af38e4deeec911f4af99b0bace19669c986210b0a950ad2b7bfd5737a"}, - {file = "uvicorn-0.11.2.tar.gz", hash = "sha256:11f397855c7f35dc034a3d288883382a4c16afdfe6675b70896f55bd6051da64"}, + {file = "uvicorn-0.11.3-py3-none-any.whl", hash = "sha256:0f58170165c4495f563d8224b2f415a0829af0412baa034d6f777904613087fd"}, + {file = "uvicorn-0.11.3.tar.gz", hash = "sha256:6fdaf8e53bf1b2ddf0fe9ed06079b5348d7d1d87b3365fe2549e6de0d49e631c"}, ] uvloop = [ {file = "uvloop-0.14.0-cp35-cp35m-macosx_10_11_x86_64.whl", hash = "sha256:08b109f0213af392150e2fe6f81d33261bb5ce968a288eb698aad4f46eb711bd"}, @@ -1752,8 +1781,8 @@ uvloop = [ {file = "uvloop-0.14.0.tar.gz", hash = "sha256:123ac9c0c7dd71464f58f1b4ee0bbd81285d96cdda8bc3519281b8973e3a461e"}, ] virtualenv = [ - {file = "virtualenv-20.0.3-py2.py3-none-any.whl", hash = "sha256:ec376274f5abb6da25e0ef81d082d2884cda8fd924e1ff73b4c2bb5416d48c87"}, - {file = "virtualenv-20.0.3.tar.gz", hash = "sha256:526484e29a9a12f0680d251331e7841b36f1e2b918935377f173f764b1b8be89"}, + {file = "virtualenv-20.0.5-py2.py3-none-any.whl", hash = "sha256:5dd42a9f56307542bddc446cfd10ef6576f11910366a07609fe8d0d88fa8fb7e"}, + {file = "virtualenv-20.0.5.tar.gz", hash = "sha256:531b142e300d405bb9faedad4adbeb82b4098b918e35209af2adef3129274aae"}, ] websockets = [ {file = "websockets-8.0.2-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:e906128532a14b9d264a43eb48f9b3080d53a9bda819ab45bf56b8039dc606ac"}, @@ -1773,6 +1802,6 @@ win32-setctime = [ {file = "win32_setctime-1.0.1.tar.gz", hash = "sha256:b47e5023ec7f0b4962950902b15bc56464a380d869f59d27dbf9ab423b23e8f9"}, ] zipp = [ - {file = "zipp-2.2.0-py36-none-any.whl", hash = "sha256:d65287feb793213ffe11c0f31b81602be31448f38aeb8ffc2eb286c4f6f6657e"}, - {file = "zipp-2.2.0.tar.gz", hash = "sha256:5c56e330306215cd3553342cfafc73dda2c60792384117893f3a83f8a1209f50"}, + {file = "zipp-3.0.0-py3-none-any.whl", hash = "sha256:12248a63bbdf7548f89cb4c7cda4681e537031eda29c02ea29674bc6854460c2"}, + {file = "zipp-3.0.0.tar.gz", hash = "sha256:7c0f8e91abc0dc07a5068f315c52cb30c66bfbc581e5b50704c8a2f6ebae794a"}, ]