1
0
mirror of https://github.com/checktheroads/hyperglass synced 2024-05-11 05:55:08 +00:00

start automated installer; improve ci testing

This commit is contained in:
checktheroads
2020-02-23 01:24:22 -07:00
parent afc4fe32d8
commit 2277b21dc0
7 changed files with 566 additions and 93 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

449
install.sh Executable file
View File

@@ -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

153
poetry.lock generated
View File

@@ -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"},
]