diff --git a/.gitignore b/.gitignore index f624e2ad..e1f5422a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ output/* .env .deployenv .identity +.netrc + diff --git a/README.md b/README.md index 6b3719f4..eba0b935 100644 --- a/README.md +++ b/README.md @@ -2,58 +2,150 @@ # Running the Tests +Each test suite is run in a separate Docker container using a temporary image built at test time. +`conda` is used for dependency management. The two steps for each test suite are building and +running the associated image. + ## Install Prerequisites * [Docker](https://www.docker.com/get-started) -## Build the Image & Run the Container +## Set Up Authentication +Create a .netrc file in the `test` directory of this repository. It must contain +credentials for on logging into [Earthdata Login production](https://urs.earthdata.nasa.gov) +for tests run against Harmony production or +[Earthdata Login UAT](https://uat.urs.earthdata.nasa.gov) for Harmony SIT and +UAT environments. + +Example `test/.netrc` that can log into both environments: + + machine urs.earthdata.nasa.gov login SOME_USER password SOME_PASSWORD + machine uat.urs.earthdata.nasa.gov login SOME_UAT_USER password SOME_UAT_PASSWORD + +This file will be copied to into the docker images and used when running the +notebooks. The `.gitignore` file will prevent this from being committed to the +git project, but we recommend providing a user account with minimal privileges +for test purposes. + +## Build the Images $ cd test - $ make image - $ make run + $ make images -By default this will run the tests against the UAT environment. To run -against a specific environment: +`make -j images` can be used to make the images in parallel (faster), although this may lead to +Docker Desktop instabilities - $ make run environment=prod +## Run the Notebooks -Valid environment values are: sbx, sit, uat, prod. + $ cd test + $ export HARMONY_HOST_URL= + $ ./run_notebooks.sh -# Notebook Development +Outputs will be in the `output` directory. +`HARMONY_HOST_URL` for SIT would be `https://harmony.sit.earthdata.nasa.gov` + +# Running the Tests in an AWS for Same-Region Data Access + +Harmony runs in the AWS us-west-2 region and offers additional access methods for +clients running in the same region. We have provided a Terraform deployment to +ease test execution in this region. -**Note** - this section applies to the contents of the `test` directory +## Create Terraform Autovars File +In the `terraform` directory create a file called `key.auto.tfvars` and +add a single line indicating the name of the ssh public key file that +should be used for the EC2 instance that runs the notebooks. -These prerequisites and steps are only needed if you want to do local -development on the project. +This file name is the name of the S3 file created in the Harmony ssh key bucket as described in the Harmony project README.md. -## Prerequisites +Example: +``` +key_name = "harmony-sit-my-key-name" +``` -* [pyenv](https://github.com/pyenv/pyenv) -* [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv) -* [poetry](https://python-poetry.org/) +## Execute the Tests -## Install Python 3.8 (if needed) +**Important**: The following steps allocate resources in AWS. To ease repeated +tests and troubleshooting, they also don't automatically clean up the instance +they create. See "Clean Up Test Resources" to ensure you are minimizing costs +by cleaning up resources. - $ pyenv install 3.8.5 +First create a `.env` file in the top level directory by copying in the `dot_env` file and filling +in the proper values. Then execute the following. -## Install dependencies + $ cd script + $ export HARMONY_ENVIRONMENT= + $ ./test.sh - $ pyenv virtualenv 3.8.5 harmony-rt - $ pyenv local harmony-rt - $ pyenv activate harmony-rt - $ poetry install - $ pyenv rehash +Output will be in the bucket specified with the `REGRESSION_TEST_OUTPUT_BUCKET` +environment variable with a folder for each notebook. -## Run the notebooks +## Clean Up Test Resources - $ ./run_notebooks harmony_host_url= - -e.g., - - $ ./run_notebooks harmony_host_url="https://harmony.sit.earthdata.nasa.gov" +The prior scripts do not clean up allocated resources. To remove the resources +used to run the test, run. -Outputs will be in the `output` directory + $ terraform destroy -## Start JupyterLab +Tests outputs are not automatically deleted. + +# Notebook Development - $ jupyter-lab +Notebooks and support files should be placed in a subdirectory of the `test` directory. + +For example, in the `harmony` directory we have + +``` +├── Harmony.ipynb +├── __init__.py +├── environment.yaml +└── util.py +``` + + Notebook dependencies should be listed in file named `environment.yaml` at the top level of the + subdirectory. The `name` field in the file should be `papermill`. For example: + + ```yaml + name: papermill +channels: + - conda-forge + - defaults +dependencies: + - python=3.7 + - jupyter + - requests + - netcdf4 + - matplotlib + - papermill + - pytest + - ipytest +``` + +## Generating a Dependency Lockfile +To increase runtime efficiency, the build relies on [conda-lock](https://pypi.org/project/conda-lock/). This is used to create a dependency lockfile that can be used +by conda to more efficiently load dependencies. The Docker build expects a lockfile +named `conda-linux-64.lock` to exist at the top level of a notebook directory (next to +the `environment.yaml` file). + +To build the lockflie install `conda-lock` by following the directions provided on its website. Then generate the lockfile for your notebook by running the following: +``` +conda-lock -f environment.yaml -p linux-64 +``` + +Test notebooks should not rely on other forms of dependency management or expect user input. +They _should_ utilize the `harmony_host_url` global variable to communicate with Harmony +or to determine the Harmony environment. This variable is set by `papermill` - see the +`Harmony.ipynb` for how to make use of this variable. More information can be found +in the [papermill](https://papermill.readthedocs.io/en/latest/usage-parameterize.html) +documentation on setting parameters. + +New test suites must be added to the `Makefile`. A new `name-image` target (where name is the name of +the test suite) should be added (see the `harmony-image` example), and the new image target +should be added as a dependency of the `images` target. The docker image should have a name like +`harmony/regression-tests-`, where `base_name` is the name of the test suite. + +Finally, add the image base name to the `images` array on line 6 of the `run_notebooks.sh` file. +For instance, if the image is named `harmony/regression-tests-foo`, then we would add `foo` to the +array. + +The `run_notebooks.sh` file can be used as described above to run the test suite. Notebooks are +expected to exit with a non-zero exit code on failure when run from `papermill`. diff --git a/dot_env b/dot_env new file mode 100644 index 00000000..f0643cf0 --- /dev/null +++ b/dot_env @@ -0,0 +1,6 @@ +REGRESSION_TEST_OUTPUT_BUCKET= +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +EDL_USER=harmony_dev_user +EDL_PASSWORD= +SECRET_KEY_FILE= diff --git a/script/deploy-from-docker.sh b/script/deploy-from-docker.sh index 8024d9c9..3216ac2c 100755 --- a/script/deploy-from-docker.sh +++ b/script/deploy-from-docker.sh @@ -30,11 +30,15 @@ function retry { return 0 } +# copy the test directory to the EC2 instance retry 5 scp -v -F sshconfig -i .identity -r test "ec2-user@${INSTANCE_ID}:" +# create a .netrc file on the EC2 instance +netrc_default="machine urs.earthdata.nasa.gov login ${EDL_USER} password ${EDL_PASSWORD}\nmachine uat.urs.earthdata.nasa.gov login ${EDL_USER} password ${EDL_PASSWORD}" +retry 5 ssh -F sshconfig -i .identity "ec2-user@${INSTANCE_ID}" "echo -e \"${netrc_default}\" > ./test/.netrc" # It can take a couple minutes for docker to be available on the instance -retry 10 ssh -F sshconfig -i .identity "ec2-user@${INSTANCE_ID}" "cd test && make image" +retry 10 ssh -F sshconfig -i .identity "ec2-user@${INSTANCE_ID}" "cd test && make -j images" set +e -ssh -F sshconfig -i .identity "ec2-user@${INSTANCE_ID}" "cd test && make run HARMONY_HOST_URL=${HARMONY_HOST_URL}" +ssh -v -F sshconfig -i .identity "ec2-user@${INSTANCE_ID}" "cd test && export HARMONY_HOST_URL=${HARMONY_HOST_URL} && ./run_notebooks.sh" exit_code=$? set -e # copy the output to here diff --git a/script/test.sh b/script/test.sh index 6d29d4eb..4fdd4876 100755 --- a/script/test.sh +++ b/script/test.sh @@ -12,6 +12,36 @@ function get_elb { echo $(aws elbv2 describe-load-balancers | jq --arg host "harmony-$HARMONY_ENVIRONMENT-frontend" '.LoadBalancers[] | select(.LoadBalancerName == $host) | .DNSName' | tr -d '"') } +cd .. + +deployenv='.deployenv' +if [ -e $deployenv ]; then + rm $deployenv +fi + +if [ -e .env ]; then + echo "Using .env file" + set -o allexport + source .env + set +o allexport + cp .env $deployenv +else + echo "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" >> $deployenv + echo "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" >> $deployenv + echo "REGRESSION_TEST_OUTPUT_BUCKET=${REGRESSION_TEST_OUTPUT_BUCKET}" >> $deployenv +fi + +export AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION:-us-west-2}" +echo "AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}" >> $deployenv + +# create the test environment +cd ./terraform +terraform init +terraform apply -auto-approve -var "environment_name=${HARMONY_ENVIRONMENT}" +instance_id=$(terraform output -json harmony_regression_test_instance_id | jq -r .id) + +echo "intance_id = ${instance_id}" + case $HARMONY_ENVIRONMENT in uat) harmony_host_url="https://harmony.uat.earthdata.nasa.gov" @@ -28,13 +58,7 @@ sit|sandbox) ;; esac -output_bucket="${REGRESSION_TEST_OUTPUT_BUCKET}" - -# create the test environment -cd ../terraform -terraform init -terraform apply -auto-approve -var "environment_name=${HARMONY_ENVIRONMENT}" -instance_id=$(terraform output -json harmony_regression_test_instance_id | jq -r .id) +echo "harmony host url: ${harmony_host_url}" cd .. @@ -48,32 +72,15 @@ else fi chmod 0600 $identity -AWS_DEFAULT_REGION="${AWS_DEFAULT_REGION:-us-west-2}" - -deployenv='.deployenv' -if [ -e $deployenv ]; then - rm $deployenv -fi - -if [ -e .env ]; then - set -o allexport - source .env - set +o allexport - cp .env $deployenv -else - echo "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" >> $deployenv - echo "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" >> $deployenv -fi - echo "INSTANCE_ID=${instance_id}" >> $deployenv echo "HARMONY_HOST_URL=${harmony_host_url}" >> $deployenv -echo "AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}" >> $deployenv -echo "REGRESSION_TEST_OUTPUT_BUCKET=${output_bucket}" >> $deployenv ./script/build-image.sh docker run --rm \ -v $(pwd):/tmp \ + -e EDL_USERNAME \ + -e EDL_PASSWORD \ harmony/regression-tests \ './script/deploy-from-docker.sh' diff --git a/sshconfig b/sshconfig index b1c604ed..cceddb1c 100644 --- a/sshconfig +++ b/sshconfig @@ -4,3 +4,4 @@ Host i-* StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR + ServerAliveInterval 60 diff --git a/terraform/inputs.tf b/terraform/inputs.tf index fb1e540f..f1912821 100644 --- a/terraform/inputs.tf +++ b/terraform/inputs.tf @@ -4,12 +4,12 @@ variable "aws_region" { } variable "instance_type" { - description = "EC2 instance type for the harmony application" - default = "t2.medium" + description = "EC2 instance type for the regression test runner" + default = "t2.xlarge" } variable "key_name" { - description = "Key pair name to use for the harmony EC2 instance." + description = "Key pair name to use for the harmony regression test instance." default = "bamboo" } diff --git a/terraform/main.tf b/terraform/main.tf index 28a8acc3..2811e16e 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -45,6 +45,10 @@ resource "aws_instance" "harmony_regression_test" { user_data = file("${path.module}/harmony-user-data.tmpl") + root_block_device { + volume_size = 256 + } + vpc_security_group_ids = [aws_security_group.harmony_regression_test.id] tags = { Name = "harmony-regression-test-${var.environment_name}" diff --git a/test/Dockerfile b/test/Dockerfile index 52b83ea8..2aa3a032 100644 --- a/test/Dockerfile +++ b/test/Dockerfile @@ -1,16 +1,20 @@ -FROM python:3.8.7-buster +FROM continuumio/miniconda3:latest -WORKDIR /opt/harmony +ARG sub_dir +ARG notebook +ENV env_sub_dir=$sub_dir +ENV env_notebook=$notebook -RUN pip install poetry -RUN mkdir -p ./output +WORKDIR /root -COPY pyproject.toml . -COPY poetry.lock . -RUN poetry install +RUN conda config --add channels conda-forge +RUN pip install conda-lock +RUN conda install conda-lock -COPY notebooks ./notebooks -COPY harmony ./harmony -COPY run_notebooks.sh . +COPY .netrc .netrc +RUN mkdir ./${sub_dir} +COPY ${sub_dir}/conda-linux-64.lock ./${sub_dir} -ENTRYPOINT ./run_notebooks.sh -p harmony_host_url $harmony_host_url +RUN conda create --name papermill --file ./${sub_dir}/conda-linux-64.lock + +ENTRYPOINT export PATH=/opt/conda/envs/papermill/bin:$PATH; mkdir /root/output/${env_sub_dir}; conda activate papermilll; papermill --cwd ${env_sub_dir} ${env_sub_dir}/${env_notebook} /root/output/${env_sub_dir}/Results.ipynb -p harmony_host_url $harmony_host_url \ No newline at end of file diff --git a/test/Makefile b/test/Makefile index 5437098f..10ad44c7 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,8 +1,10 @@ -.PHONY: run +harmony-image: Dockerfile harmony/environment.yaml + docker build -t harmony/regression-tests-harmony:latest -f ./Dockerfile --build-arg notebook=Harmony.ipynb --build-arg sub_dir=harmony . -image: pyproject.toml poetry.lock Dockerfile - docker build -t harmony/regression-tests:latest . +# asf-gdal-image: Dockerfile gdal_subsetter/environment.yaml +# docker build -t harmony/regression-tests-asf-gdal:latest -f ./Dockerfile --build-arg notebook=GDAL_Subsetter_Regression.ipynb --build-arg sub_dir=gdal_subsetter . -run: - docker run -v ${PWD}/output:/opt/harmony/output --env harmony_host_url="${HARMONY_HOST_URL}" harmony/regression-tests:latest +harmony-regression-image: Dockerfile harmony-regression/environment.yaml + docker build -t harmony/regression-tests-harmony-regression:latest -f ./Dockerfile --build-arg notebook=HarmonyRegression.ipynb --build-arg sub_dir=harmony-regression . +images: harmony-image harmony-regression-image diff --git a/test/harmony-regression/HarmonyRegression.ipynb b/test/harmony-regression/HarmonyRegression.ipynb new file mode 100644 index 00000000..70b73e0f --- /dev/null +++ b/test/harmony-regression/HarmonyRegression.ipynb @@ -0,0 +1,694 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Harmony Regression \n", + "This notebook provides condensed examples of using Harmony to perform specific tasks. For more a general introduction and tutorial, see [Harmony API Introduction](https://harmony.earthdata.nasa.gov/notebook-example.html) or any of the example notebooks provided in the [Harmony repository](https://github.com/nasa/harmony). [Helper functions](./notebook_helpers) are used for making the calls found in this notebook.\n", + "\n", + "## Prerequisites\n", + "\n", + " The dependencies for this notebook are listed in the [environment.yaml](./environment.yaml). To test or install locally, create the papermill environment used in the automated regression testing suite: \n", + "\n", + "`conda env create -f ./environment.yaml && conda activate papermill`\n", + "\n", + "Also ensure you have a `.netrc` file located in the `test` directory of this repository." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Set harmony_host_url and import libraries " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#harmony_host_url = 'https://harmony.sit.earthdata.nasa.gov'\n", + "harmony_host_url = 'https://harmony.uat.earthdata.nasa.gov'\n", + "#harmony_host_url = 'https://harmony.earthdata.nasa.gov'\n", + "\n", + "# Import libraries used throughout the notebook\n", + "from notebook_helpers import get, post, show, get_data_urls, show_async, show_async_condensed, show_shape, print_async_status, check_bbox_subset, check_stac\n", + "import json\n", + "import intake" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example Data\n", + "\n", + "Harmony has produced example collections with artificial data but realistic structure to allow testing our services. We have L3 and L2 NetCDF4 collections, and a shapefile collection." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "coverages_root = '{root}/{collection}/ogc-api-coverages/1.0.0/collections/{variable}/coverage/rangeset'\n", + "\n", + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " l3_collection = 'C1234088182-EEDTEST'\n", + " l3_zarr_collection = 'C1234088182-EEDTEST'\n", + " l2_collection = 'C1233860183-EEDTEST'\n", + " shapefile_collection = 'C1234530533-EEDTEST'\n", + " l2ss_collection = 'C1234208438-POCLOUD'\n", + " var_collection = 'C1234714698-EEDTEST'\n", + "elif harmony_host_url == 'https://harmony.earthdata.nasa.gov':\n", + " l3_collection = 'C1756916832-XYZ_PROV'\n", + " l3_zarr_collection = 'C1940468263-POCLOUD'\n", + " l2_collection = 'C1756916832-XYZ_PROV'\n", + " l2ss_collection = 'C1940473819-POCLOUD'\n", + "\n", + "example_vars = ['red_var', 'green_var', 'blue_var', 'alpha_var']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sample Sync Request - Bounding Box and Temporal Subsetting with Reformatting\n", + "\n", + "Harmony/gdal only working in UAT due to Harmony-600." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " #By default, this reformats to tiff\n", + " params = {\n", + " 'subset': [\n", + " 'lon(-20:90)', \n", + " 'lat(0:60)', \n", + " 'time(\"2020-01-15T00:00:00Z\":\"2020-01-15T01:00:00Z\")']\n", + " }\n", + " response = get(\n", + " coverages_root.format(\n", + " root=harmony_host_url,\n", + " collection=l3_collection, \n", + " variable='all'), \n", + " params=params)\n", + "\n", + " show(response, example_vars)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " response = get(\n", + " coverages_root.format(\n", + " root=harmony_host_url,\n", + " collection=l3_collection, \n", + " variable='green_var'), \n", + " params=params)\n", + "\n", + " show(response, color_index=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Asynchronous Requests\n", + "\n", + "Harmony/gdal only working in UAT due to Harmony-600." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " response = get(\n", + " coverages_root.format(\n", + " root=harmony_host_url,\n", + " collection=l3_collection, \n", + " variable='all'), \n", + " params={\n", + " 'subset': [\n", + " 'lon(-20:90)', \n", + " 'lat(0:60)', \n", + " 'time(\"2020-01-01T00:00:00Z\":\"2020-01-05T01:00:00Z\")']})\n", + " show_async_condensed(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Cancel Async Requests\n", + "\n", + "Harmony/gdal only working in UAT due to Harmony-600." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " #Add 3 requests\n", + " response1 = get(coverages_root.format(root=harmony_host_url, collection=l3_collection, variable='all'), params={'format': 'image/tiff', 'maxResults': '20'})\n", + " response2 = get(coverages_root.format(root=harmony_host_url, collection=l3_collection, variable='all'), params={'format': 'image/tiff', 'maxResults': '20'})\n", + " response3 = get(coverages_root.format(root=harmony_host_url, collection=l3_collection, variable='all'), params={'format': 'image/tiff', 'maxResults': '20'})\n", + "\n", + " #List the requests\n", + "\n", + " jobs_root = '{root}/jobs'\n", + " my_jobs = jobs_root.format(root=harmony_host_url)\n", + " response = get(my_jobs,params={'page': '1','limit': '10'})\n", + " body = response.json()\n", + "\n", + " for job in body['jobs']:\n", + " print_async_status(job)\n", + "\n", + " #Cancel one\n", + " my_jobs_cancel_root=my_jobs+'/{job_id}/cancel'\n", + " response = post(my_jobs_cancel_root.format(job_id=response3.json()['jobID']))\n", + "\n", + " print_async_status(response.json())\n", + "\n", + " assert response.json()['status'] == 'canceled'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Basic Tests with Backend Services" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Shapefile Subsetting\n", + "\n", + "Only available in UAT. Remove UAT or SIT if statements and test/modify requests when available in PROD." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### PO.DAAC's Shapefile Subsetter " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " show_shape('zip://./notebook_helpers/test_in-polygon.shp.zip')\n", + " show(get('https://harmony.uat.earthdata.nasa.gov/service-results/harmony-uat-staging/public/shapefile_example/shapefile_r_001_249_20090109T000000.shp.zip'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " response = post(\n", + " coverages_root.format(\n", + " root=harmony_host_url,\n", + " collection=shapefile_collection, \n", + " variable='all'), \n", + " data={ 'subset': 'time(\"2009-01-09T00:00:00Z\":\"2009-01-09T01:00:00Z\")' },\n", + " files={ 'shapefile': ('test_in-polygon.shp.zip', open('./notebook_helpers/test_in-polygon.shp.zip', 'rb'), 'application/shapefile+zip') }\n", + " )\n", + "\n", + " try:\n", + " show(response)\n", + " except:\n", + " print(response.text)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Zarr Reformatter" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "response = get(\n", + " coverages_root.format(\n", + " root=harmony_host_url,\n", + " collection=l3_zarr_collection, \n", + " variable='all'), \n", + " params={\n", + " 'subset': 'time(\"2020-01-15T00:00:00Z\":\"2020-01-16T01:00:00Z\")',\n", + " 'maxResults': '3'\n", + " },\n", + " headers = {'accept': 'application/x-zarr'})\n", + "\n", + "zarr_response = show_async(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### STAC outputs\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results = json.loads(zarr_response.content)\n", + "job = results['jobID']\n", + "print(job)\n", + "\n", + "stac_root = '{root}/stac/{jobID}/{item}'\n", + "\n", + "stac_cat = intake.open_stac_catalog(stac_root.format(root=harmony_host_url,jobID=job,item=''),name='Harmony output')\n", + "display(list(stac_cat))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(len(list(stac_cat))):\n", + " display(intake.open_stac_item(stac_root.format(root=harmony_host_url,jobID=job,item=i)))\n", + "\n", + "entries = []\n", + "for id, entry in stac_cat.search('type').items():\n", + " display(entry)\n", + " entries.append(entry)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# da = stac_cat[list(stac_cat)[0]][entries[0].describe()['name']].to_dask()\n", + "# da" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#da.plot.imshow()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### SWOT Reprojection Tool\n", + "\n", + "Only available in UAT. Remove UAT or SIT if statements and test/modify requests when available in PROD." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#Shows original test data for easy visual comparison\n", + "\n", + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " response = get('https://harmony.uat.earthdata.nasa.gov/service-results/harmony-uat-staging/public/harmony_example_l2/nc/015_02_210_europe.nc')\n", + " show(response, example_vars)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### SWOT Reprojection Tool (Sync)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " response = get(\n", + " coverages_root.format(\n", + " root=harmony_host_url,\n", + " collection=l2_collection, \n", + " variable='all'), \n", + " params={\n", + " 'outputCrs': 'EPSG:4326',\n", + " 'subset': 'time(\"2020-01-15T16:00:00Z\":\"2020-01-15T17:00:00Z\")'})\n", + " show(response, example_vars)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " response = get(\n", + " coverages_root.format(\n", + " root=harmony_host_url,\n", + " collection=l2_collection, \n", + " variable='all'), \n", + " params={\n", + " 'outputCrs': '+proj=lcc +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs',\n", + " 'interpolation': 'near',\n", + " 'scaleExtent': '-4000000,-1000000,5000000,7000000',\n", + " 'subset': 'time(\"2020-01-15T16:00:00Z\":\"2020-01-15T17:00:00Z\")'})\n", + "\n", + " show(response, example_vars)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### SWOT Reprojection Tool (Async)\n", + "\n", + "Only available in UAT. Remove UAT or SIT if statements and test/modify requests when available in PROD." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " response = get(\n", + " coverages_root.format(\n", + " root=harmony_host_url,\n", + " collection=l2_collection, \n", + " variable='all'), \n", + " params={\n", + " 'outputCrs': '+proj=lcc +lat_1=43 +lat_2=62 +lat_0=30 +lon_0=10 +x_0=0 +y_0=0 +ellps=intl +units=m +no_defs',\n", + " 'interpolation': 'near',\n", + " 'scaleExtent': '-7000000,-1000000,8000000,8000000',\n", + " 'maxResults': '3'})\n", + "\n", + " show_async_condensed(response, example_vars)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PODAAC L2 Subsetter" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### PODAAC L2 Subsetter (Sync)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "response = get(\n", + " coverages_root.format(\n", + " root=harmony_host_url,\n", + " collection=l2ss_collection, \n", + " variable='all'), \n", + " params={\n", + " 'maxResults': '1',\n", + " 'subset': [\n", + " 'lon(-160:160)', \n", + " 'lat(-80:80)',\n", + " 'time(\"2012-03-03T12:17:00\":\"2012-03-03T12:18:00\")']\n", + " })\n", + "\n", + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " show(response, ['ssha'])\n", + "else:\n", + " show(response, ['sea_surface_temperature'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### PODAAC L2 Subsetter (Async)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "response = get(\n", + " coverages_root.format(\n", + " root=harmony_host_url,\n", + " collection=l2ss_collection, \n", + " variable='all'), \n", + " params={\n", + " 'maxResults': '3',\n", + " 'format': 'application/x-netcdf4',\n", + " 'subset': [\n", + " 'lon(-160:160)', \n", + " 'lat(-80:80)',\n", + " 'time(\"2012-03-03T00:00:00Z\":\"2012-03-03T02:59:59Z\")'\n", + " ]})\n", + "\n", + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " show_async_condensed(response, ['ssha'])\n", + "else:\n", + " show_async_condensed(response, ['sea_surface_temperature'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### SDS Variable Subsetter\n", + "Only available in UAT. Remove UAT or SIT if statements and test/modify requests when available in PROD.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### SDS Variable Subsetter (Sync)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " response = get(\n", + " coverages_root.format(\n", + " root=harmony_host_url,\n", + " collection=var_collection, \n", + " variable='%2Fgt1l%2Fland_segments%2Fcanopy%2Fh_canopy'), \n", + " params={\n", + " 'granuleid':'G1238479514-EEDTEST'\n", + " })\n", + "\n", + " show(response, ['/gt1l/land_segments/canopy/h_canopy'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### SDS Variable Subsetter (Async)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if harmony_host_url == 'https://harmony.uat.earthdata.nasa.gov' or harmony_host_url == 'https://harmony.sit.earthdata.nasa.gov':\n", + " response = get(\n", + " coverages_root.format(\n", + " root=harmony_host_url,\n", + " collection=var_collection, \n", + " variable='%2Fgt1l%2Fland_segments%2Fcanopy%2Fh_canopy'), \n", + " params={'maxResults': '3'})\n", + "\n", + " show_async_condensed(response, ['/gt1l/land_segments/canopy/h_canopy'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ASF's GDAL Subsetter (These cells are conmented out until issues with the ASF service are resolved)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### ASF's GDAL Subsetter (Sync)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# response = get(\n", + "# coverages_root.format(\n", + "# root=harmony_host_url,\n", + "# collection='C1225776654-ASF',\n", + "# variable='science%2Fgrids%2Fdata%2Famplitude'), \n", + "# params={\n", + "# 'granuleId' : 'G1235282694-ASF',\n", + "# 'subset': [\n", + "# 'lon(37:40)', \n", + "# 'lat(23:24)', \n", + "# 'time(\"2014-10-30T15:00:00Z\":\"2014-10-30T15:59:00Z\")']})\n", + " \n", + "# show(response)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### ASF's GDAL Subsetter (Async)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# response = get(\n", + "# coverages_root.format(\n", + "# root=harmony_host_url,\n", + "# collection='C1225776654-ASF',\n", + "# variable='science%2Fgrids%2Fdata%2Famplitude'), \n", + "# params={\n", + "# 'subset': [\n", + "# 'lon(37:40)', \n", + "# 'lat(23:24)', \n", + "# 'time(\"2014-10-30T15:00:00Z\":\"2014-10-30T15:59:00Z\")']})\n", + " \n", + "# show_async_condensed(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_Minimizing time to science_" + ] + } + ], + "metadata": { + "file_extension": ".py", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.2" + }, + "mimetype": "text/x-python", + "name": "python", + "npconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": 3 + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/test/harmony-regression/conda-linux-64.lock b/test/harmony-regression/conda-linux-64.lock new file mode 100644 index 00000000..33bb9ed7 --- /dev/null +++ b/test/harmony-regression/conda-linux-64.lock @@ -0,0 +1,261 @@ +# platform: linux-64 +# env_hash: 6d17eedddec3901a625fc88f6a6d24319955806d826929876f5d31085d4187ec +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2020.12.5-ha878542_0.tar.bz2#7eb5d4ffeee663caa1635cd67071bc1b +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.35.1-hea4e1c9_2.tar.bz2#83610dba766a186bdc7a116053b782a4 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-9.3.0-hff62375_18.tar.bz2#86a1cade1bc2b99a6419ba980f730bff +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-9.3.0-h6de172a_18.tar.bz2#2f03cd1e5c966d4af5822c7ae089ab03 +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.23-ha770c72_1.tar.bz2#288ac4404aff60a4ba6812a5ab66d505 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.11.4-h7f98852_0.tar.bz2#1c827fa4db40e5e92c2619ba8fe30500 +https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.10-0.tar.bz2#02204e159c8596584135923fd81a2c10 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2021a-he74cb21_0.tar.bz2#6f36861f102249fc54861ff9343c3fdd +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-9.3.0-hff62375_18.tar.bz2#db417845fae12a62b6720f09f51ab6a7 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-9.3.0-h2828fa1_18.tar.bz2#fc7a2a7e6a741c8afdd764715ac7039d +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-1_gnu.tar.bz2#561e277319a41d4f24f5c05a9ef63c04 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-9.3.0-h2828fa1_18.tar.bz2#5a9490c49a3505a6d19bda012cde6ad3 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.17.1-h36c2ea0_0.tar.bz2#1aa683618a2df66800d568409d6841d1 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.2.10-h9c3ff4c_0.tar.bz2#c924bc4e7ae49118f6c97bd4357fed0e +https://conda.anaconda.org/conda-forge/linux-64/freexl-1.0.5-h516909a_1002.tar.bz2#c4226170e522c93f336dfe9c88437aeb +https://conda.anaconda.org/conda-forge/linux-64/geos-3.9.1-h9c3ff4c_2.tar.bz2#b9a6d9422aed3ad84ec6ccee9bfcaa0f +https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h36c2ea0_2.tar.bz2#626e68ae9cc5912d6adb79d318cf962d +https://conda.anaconda.org/conda-forge/linux-64/icu-68.1-h58526e2_0.tar.bz2#fc7a4271dc2a7f4fd78cd63695baf7c3 +https://conda.anaconda.org/conda-forge/linux-64/jpeg-9d-h36c2ea0_0.tar.bz2#ea02ce6037dbe81803ae6123e5ba1568 +https://conda.anaconda.org/conda-forge/linux-64/json-c-0.15-h98cffda_0.tar.bz2#f32d45a88e7462be446824654dbcf4a4 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.3-h58526e2_2.tar.bz2#665369991d8dd290ac5ee92fce3e6bf5 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.16-h516909a_0.tar.bz2#5c0f338a513a2943c659ae619fca9211 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.12-pthreads_h4812303_1.tar.bz2#2c7126a584f05e7bc8885d64dad3d21a +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d +https://conda.anaconda.org/conda-forge/linux-64/libspatialindex-1.9.3-h9c3ff4c_3.tar.bz2#5cfecb0aa384fd3831cc106794e3f968 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.0-h7f98852_0.tar.bz2#747d8f09e5340bc40480eb765903ec97 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.3-h9c3ff4c_0.tar.bz2#4eb64ee0d5cd43096ffcf843c76b05d4 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.2-h58526e2_4.tar.bz2#509f2a21c4a09214cd737a480dfd80c9 +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.29-h9c3ff4c_1.tar.bz2#79ae8dbabe53ab135593d87c7a4b4e23 +https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1j-h7f98852_0.tar.bz2#f91545bee2ac8cf86f1dc53e55a7bb2b +https://conda.anaconda.org/conda-forge/linux-64/pcre-8.44-he1b5a44_0.tar.bz2#e647d89cd5cdf62760cf283a001841ff +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.40.0-h36c2ea0_0.tar.bz2#660e72c82f2e75a6b3fe6a6e75c79f19 +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/tzcode-2021a-h7f98852_1.tar.bz2#69cffb84da3d06a78925fe3c5fa51646 +https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a +https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.0.10-h516909a_0.tar.bz2#4dfda1ccfd0cc90c4fe6786acece9a30 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.9-h7f98852_0.tar.bz2#bf6f803a544f26ebbdc3bfff272eb179 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h14c3975_1002.tar.bz2#fbcb7fa11dee1a5d3df4371cc55bb229 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h7f98852_1002.tar.bz2#1e15f6ad85a7d743a2ac68dae6c82b98 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.5-h516909a_1.tar.bz2#33f601066901f3e1a85af3522a8113f9 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h516909a_0.tar.bz2#03a530e925414902547cf48da7756db8 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-h516909a_1010.tar.bz2#339cc5584e6d26bc73a875ba900028c3 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.19.8.1-h0b5b191_1005.tar.bz2#ff6f69b593a9e74c0e6b61908ac513fa +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.13-h10796ff_1004.tar.bz2#aa1b96c7801b4876bb40f46f4d519836 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-8_openblas.tar.bz2#95cee6371a5b901797075040941171f3 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.10-hcdb4288_3.tar.bz2#d8f51405997093ff1799ded7650439c4 +https://conda.anaconda.org/conda-forge/linux-64/libllvm11-11.0.1-hf817b99_0.tar.bz2#774d669b89b47ed3f612142f489c5a46 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.43.0-h812cca2_0.tar.bz2#1867d1e9658596b3fac8847a7702eef4 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.37-h21135ba_2.tar.bz2#b6acf807307d033d4b7e758b4f44b036 +https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h1185371_6.tar.bz2#bdaaaa5a3984edea71596fc9cca74463 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.9.0-hab1572f_5.tar.bz2#18aaa1bd2238ae2b5e89591046973123 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1003.tar.bz2#a9371e9e40aded194dcba1447606c9a1 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.9.10-h72842e0_3.tar.bz2#5ed2c4742d5f1141783f484fe8974ccf +https://conda.anaconda.org/conda-forge/linux-64/readline-8.0-he28a2e2_2.tar.bz2#4d0ae8d473f863696088f76800ef9d38 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.10-h21135ba_1.tar.bz2#c647f70aa7e3d4cc4e029cc1c9a99953 +https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.3-h9d8b166_2.tar.bz2#c083e55b8f51b42b2487826e6d35c6a1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-h84519dc_1000.tar.bz2#56cc238b81624db9e3e36b2b6a482cc1 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_0.tar.bz2#9105c7da67ebfb39ff08e2a8ea72bb71 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.4.8-ha95c52a_1.tar.bz2#ed4dbbaf7d81423678632bf982f45ede +https://conda.anaconda.org/conda-forge/linux-64/boost-cpp-1.74.0-hc6e9bd1_2.tar.bz2#eca3e3674bf1f00fcddd63e6668fd9dd +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.10.4-h0708190_1.tar.bz2#4a06f2ac2e5bfae7b6b245171c3f07aa +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.17.2-h926e7f8_0.tar.bz2#926325c11478d6e781e76072c117763b +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-8_openblas.tar.bz2#d8e2151683bc12acffedea26eba27e0f +https://conda.anaconda.org/conda-forge/linux-64/libclang-11.0.1-default_ha53f305_1.tar.bz2#8310b95b07c2316d7b30b65b7fdf2f1f +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.66.7-h3e27bee_1.tar.bz2#dd273cc3560177ab37be0db469368bba +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-8_openblas.tar.bz2#9a860887c77e923c2807c715a7731fb8 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.2.0-hdc55705_0.tar.bz2#f1406324f1d02fa26447a0a0f2dd0107 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.0.3-he3ba5ed_0.tar.bz2#f9dbabc7e01c459ed7a1d1d64b206e9b +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.23-h935591d_1.tar.bz2#fd60f20b38b7194aa91262fdbd3ef134 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.34.0-h74cdb3f_0.tar.bz2#0a83e21e8c1929cc9a1e21ebb2459fc5 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.6.12-h516909a_0.tar.bz2#cdea71c3e27611e012419faea02c56bd +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.13.1-hba837de_1004.tar.bz2#bbe61e6ae39440dd101d77bf80ffc2cd +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.66.7-h9c3ff4c_1.tar.bz2#7affb30431ec6fec334bd4b39cc1be39 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.18.3-h3560a44_0.tar.bz2#4bd4917d4d6399a2fe38609b697f3278 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.12-hddcbb42_0.tar.bz2#797117394a4aa588de6d741b06fad80f +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.71.1-hcdd3856_8.tar.bz2#2c81fb9f0d82c04b08617fc73eb615af +https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h02e6976_1012.tar.bz2#6c62399ba7d6168ee510acf23378a6d2 +https://conda.anaconda.org/conda-forge/linux-64/libpq-13.1-hfd2b0eb_2.tar.bz2#d41b032f8940757263340b0918e62682 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.62-hb5efdd6_0.tar.bz2#f47b52c3d66ffb10127acd50197133ea +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.4.0-hf7af979_0.tar.bz2#f677c4652b03ed5d1352bf976be7192c +https://conda.anaconda.org/conda-forge/linux-64/python-3.9.2-hffdb5ce_0_cpython.tar.bz2#1d42ab08338d49f54800522a89ca3602 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h516909a_0.tar.bz2#aba40ec20012e0a2641ced275a0abdca +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.10-h516909a_1002.tar.bz2#bf3514891c6743ed808602fa9f4f1508 +https://conda.anaconda.org/conda-forge/noarch/affine-2.3.0-py_0.tar.bz2#5a9bfe23652d0ad9aa27e56cd75bfe33 +https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2#5f095bc6454094e96f146491fd03633b +https://conda.anaconda.org/conda-forge/noarch/asciitree-0.3.3-py_2.tar.bz2#c0481c9de49f040272556e2cedf42816 +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-20.3.0-pyhd3deb0d_0.tar.bz2#5b319abb055eefcfa344bc21378ca23f +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-py_2.tar.bz2#0da16b293affa6ac31812376f8eb79dd +https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.1-py_0.tar.bz2#a5773589b22d6d4f6201fb7c261bf77f +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-h7979940_1007.tar.bz2#651e79d89442d08d06b9359330379fcb +https://conda.anaconda.org/conda-forge/linux-64/cfitsio-3.470-hb418390_7.tar.bz2#5bda2e5ca5edb0c207c3ec76f57f8ecc +https://conda.anaconda.org/conda-forge/noarch/click-7.1.2-pyh9f0ad1d_0.tar.bz2#bd50a970ce07e660c319fdc4d730d3f1 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-1.6.0-py_0.tar.bz2#76d764d8881719e305f6fa368dc2b65e +https://conda.anaconda.org/conda-forge/linux-64/curl-7.71.1-he644dc0_8.tar.bz2#7fadfa44182e1cc0dbbe0c169c0b15cc +https://conda.anaconda.org/conda-forge/noarch/dataclasses-0.7-pyhb2cacf7_7.tar.bz2#3c9869f82e8f246c3f26e91da684597e +https://conda.anaconda.org/conda-forge/noarch/decorator-4.4.2-py_0.tar.bz2#d2eabb9cabd212e1ec6a9463bd846243 +https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.6.0-py_0.tar.bz2#37e1033daee0e2edaa5ff42584c52b21 +https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.3-pyhd8ed1ab_1003.tar.bz2#bbf9a201f6ce99a506f4955374d9a9f4 +https://conda.anaconda.org/conda-forge/noarch/fsspec-0.8.7-pyhd8ed1ab_0.tar.bz2#b93ab5a4692ba685b455f0e8e5dc93e4 +https://conda.anaconda.org/conda-forge/noarch/geographiclib-1.50-py_0.tar.bz2#8a5314ac08df2eec55bbd72bd2dbd4c9 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.66.7-h9c3ff4c_1.tar.bz2#83a66185b0f99b33ba9de260fc0f51f4 +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.18.3-h04508c2_0.tar.bz2#62e72470334058fb045c1f8cc9d2367c +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.10.6-nompi_h6a2412b_1114.tar.bz2#0a2984b78f51148d7ff6219abe73509e +https://conda.anaconda.org/conda-forge/noarch/heapdict-1.0.1-py_0.tar.bz2#77242bfb1e74a627fb06319b5a2d3b95 +https://conda.anaconda.org/conda-forge/noarch/idna-2.10-pyh9f0ad1d_0.tar.bz2#f95a12b4f435aae6680fe55ae2eb1b06 +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-1.0.0-pyhd8ed1ab_1.tar.bz2#f8da92114c8fbe1d951b0efaf54dd14b +https://conda.anaconda.org/conda-forge/noarch/locket-0.2.0-py_2.tar.bz2#709e8671651c7ec3d1ad07800339ff1d +https://conda.anaconda.org/conda-forge/noarch/monotonic-1.5-py_0.tar.bz2#0cc5fd0140497c3f1e2db2e7493b62b3 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.4.3-pyhd8ed1ab_0.tar.bz2#a1f2fda4d88c624810bf2029aa4c0827 +https://conda.anaconda.org/conda-forge/noarch/olefile-0.46-pyh9f0ad1d_1.tar.bz2#0b2e68acc8c78c8cc392b90983481f58 +https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.4.2-py_1.tar.bz2#ba6f4a308f1ea22abe1d72e72544af76 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.1-pyhd8ed1ab_0.tar.bz2#8b0a19d867a59005c1ae631d61a12194 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.8.1-pyhd3deb0d_0.tar.bz2#fcd2fbb062b55d14a77e664c89ee17a6 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 +https://conda.anaconda.org/conda-forge/linux-64/postgresql-13.1-h6303168_2.tar.bz2#54f4ea7800d0e2c28a9afe170304cb9b +https://conda.anaconda.org/conda-forge/linux-64/proj-7.2.0-h277dcde_2.tar.bz2#db654ee11298d3463bad67445707654c +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.9.0-pyhd3deb0d_0.tar.bz2#c7af95daf5bae22ead34151e0ab9d041 +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.20-pyh9f0ad1d_2.tar.bz2#aa798d50ffd182a0f6f31478c7f434f6 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-2.4.7-pyh9f0ad1d_0.tar.bz2#626c4f20d5bf06dcec9cf2eaa31725c7 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-1_cp39.tar.bz2#9ee3692d976902241a3392495768fe98 +https://conda.anaconda.org/conda-forge/noarch/pytz-2021.1-pyhd8ed1ab_0.tar.bz2#3af2e9424d5eb0063824a3f9b850d411 +https://conda.anaconda.org/conda-forge/noarch/qtpy-1.9.0-py_0.tar.bz2#ab75b0ea90d2621e1924b824e2f395ee +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.5.0-py_0.tar.bz2#c3779037a635e1150f1c53c28b875949 +https://conda.anaconda.org/conda-forge/noarch/six-1.15.0-pyh9f0ad1d_0.tar.bz2#1eec421f0f1f39e579e44e4a5ce646a2 +https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.3.0-pyhd8ed1ab_0.tar.bz2#2f5b87cd0bdf1822b62e40909f471db4 +https://conda.anaconda.org/conda-forge/noarch/tblib-1.6.0-py_0.tar.bz2#0e1562c39e804e0d7df8650626379caa +https://conda.anaconda.org/conda-forge/noarch/testpath-0.4.4-py_0.tar.bz2#3b98fff4d5342bebde2ecaa314f796f9 +https://conda.anaconda.org/conda-forge/noarch/textwrap3-0.9.2-py_0.tar.bz2#1f84e74e9dbe2e5ae38c58496bffaca8 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.11.1-py_0.tar.bz2#d1e66b58cb00b3817ad9f05eec098c00 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.58.0-pyhd8ed1ab_0.tar.bz2#f92f0f1f03f39c011f89f7434e654dc5 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-3.7.4.3-py_0.tar.bz2#12b96e382730541a4b332420227055ae +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.4.0-py_0.tar.bz2#0df927d2e46244cef8fd75d7ec2ba51c +https://conda.anaconda.org/conda-forge/noarch/ansiwrap-0.8.4-py_0.tar.bz2#f09557e2a7cbd2470a2ab6353000cebd +https://conda.anaconda.org/conda-forge/linux-64/certifi-2020.12.5-py39hf3d152e_1.tar.bz2#83afa403caafd7ef3162385cca9bce13 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.14.5-py39he32792d_0.tar.bz2#b561e1fad1fc8bb343064bd5497444bb +https://conda.anaconda.org/conda-forge/linux-64/chardet-4.0.0-py39hf3d152e_1.tar.bz2#d0da429a3428ffcacaad25595b96a648 +https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f +https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.1-pyhd8ed1ab_0.tar.bz2#3170b1d23788c6b161dbd14bfb5c752e +https://conda.anaconda.org/conda-forge/noarch/cycler-0.10.0-py_2.tar.bz2#f6d7c7e6d8f42cbbec7e07a8d879f91c +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.11.0-py39h3811e60_3.tar.bz2#b2acd01289447c022fde78c3b91e6e39 +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-hfdff14a_1.tar.bz2#4caaca6356992ee545080c7d7193b5a3 +https://conda.anaconda.org/conda-forge/noarch/fasteners-0.14.1-py_3.tar.bz2#8af0bf3cfe806fb001d9923b4fe1594b +https://conda.anaconda.org/conda-forge/noarch/geopy-2.1.0-pyhd3deb0d_0.tar.bz2#0424ea40a44cceff6da6856abcd95a77 +https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.6.0-h2b14fbe_4.tar.bz2#95731212a74717b0368f9805513f6da7 +https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-3.7.0-py39hf3d152e_0.tar.bz2#4e9c8d35a0fbb23e4f239fc6c171fdef +https://conda.anaconda.org/conda-forge/linux-64/jedi-0.18.0-py39hf3d152e_2.tar.bz2#cb9b5c105fb10e59bf5a263880735235 +https://conda.anaconda.org/conda-forge/linux-64/kealib-1.4.14-he4dc956_1.tar.bz2#3f3ce21f50133a8471153fb53241d3c7 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.3.1-py39h1a9c180_1.tar.bz2#c5d6241b3ec5d02c316a5f66f14024c7 +https://conda.anaconda.org/conda-forge/linux-64/libdap4-3.20.6-hd7c4107_1.tar.bz2#98d87a47b827fa75563076ddcd7eac29 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.7.4-nompi_h56d31a8_107.tar.bz2#ef3d349e818876a175de7d87bd6451df +https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.0.1-he52d314_3.tar.bz2#f6bb98bfa8e470b0d7a1ce8c356e95b2 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-1.1.1-py39h3811e60_3.tar.bz2#ba89fd2d0e9871ac81116e3008c830b4 +https://conda.anaconda.org/conda-forge/linux-64/mistune-0.8.4-py39h3811e60_1003.tar.bz2#716b1f4d19fdedf318dd100682399a76 +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.2-py39h1a9c180_1.tar.bz2#de3a1627c3c8293668468985c6118b6d +https://conda.anaconda.org/conda-forge/linux-64/mypy_extensions-0.4.3-py39hf3d152e_3.tar.bz2#fcab473c122479c0a4b1a14f716b7f1d +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.20.1-py39hdbf815f_0.tar.bz2#7d9a2aefb8964c83b707c20b9577c584 +https://conda.anaconda.org/conda-forge/noarch/packaging-20.9-pyh44b312d_0.tar.bz2#be69a38e912054a62dc82cc3c7711a64 +https://conda.anaconda.org/conda-forge/noarch/partd-1.1.0-py_0.tar.bz2#4afbf2cdf4e6ad279080d3adb5cefaae +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh9f0ad1d_2.tar.bz2#5909e7b978141dd80d28dbf9de627827 +https://conda.anaconda.org/conda-forge/linux-64/pillow-8.1.1-py39hf95b381_0.tar.bz2#65414750487aba1419d6a67ad9869d4f +https://conda.anaconda.org/conda-forge/linux-64/poppler-0.89.0-h2de54a5_5.tar.bz2#b93182f03ad6d36a4fd1054bb4d62b7b +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.8.0-py39h3811e60_1.tar.bz2#29cb4c7769cc2a6e86cc13615e9b4a15 +https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-4.19.18-py39he80948d_7.tar.bz2#efdd7803dc1df15d715e6d4a6ef03856 +https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.17.3-py39h3811e60_2.tar.bz2#4ec88cc4b941bc447fd97cadd76e32de +https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py39hf3d152e_3.tar.bz2#f7e7fdc66f2362bebc407f1ab7d10f63 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.7.5-py_0.tar.bz2#c6b028f9d5b55c772fad91e3c017861d +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-5.4.1-py39h3811e60_0.tar.bz2#6451ed66b3b438134626894c821dc5fa +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-22.0.3-py39h37b5a0c_1.tar.bz2#4720d9f18f7532cf5fa580aad240c04b +https://conda.anaconda.org/conda-forge/linux-64/regex-2020.11.13-py39h3811e60_1.tar.bz2#9773a6dbe042e33dfcd185dbde101339 +https://conda.anaconda.org/conda-forge/linux-64/rtree-0.9.7-py39hb102c33_1.tar.bz2#6f384879d03798d8a3677f37a9f543cf +https://conda.anaconda.org/conda-forge/noarch/tenacity-6.3.1-pyhd8ed1ab_0.tar.bz2#30f6171a26d8aae379f9c8debb667319 +https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.2.4-hb9a9e87_1.tar.bz2#bb6c0f736c1d732fe0f1e8d756199fed +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.1-py39h3811e60_1.tar.bz2#763597c8b91b69789ab0f6002439c32b +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.0.5-py_0.tar.bz2#99618ee9ab1323e40f231acdab92fe60 +https://conda.anaconda.org/conda-forge/linux-64/typed-ast-1.4.2-py39h3811e60_0.tar.bz2#eec5a3ed253825254248e0f2ae79a4cb +https://conda.anaconda.org/conda-forge/noarch/zict-2.0.0-py_0.tar.bz2#4750152be22f24d695b3004c5e1712d3 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-20.1.0-py39h3811e60_2.tar.bz2#9e69a6cedbffc71321daf4895b9db5bf +https://conda.anaconda.org/conda-forge/noarch/black-20.8b1-py_1.tar.bz2#e555d6b71ec916c3dc4e6e3793cc9796 +https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py39h3811e60_1001.tar.bz2#35ad78e61aec955783acfd00f3c6bcde +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.4.1-py39hce5d2b2_0.tar.bz2#cc9096497f074e5f86893f8c674d20c7 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-3.4.4-py39h95dcef6_0.tar.bz2#43dcf8bc5342d18e888f241d39810961 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2021.2.0-pyhd8ed1ab_0.tar.bz2#55e9ec3fa2b40d163f062977c7fee870 +https://conda.anaconda.org/conda-forge/linux-64/h5py-3.1.0-nompi_py39h25020de_100.tar.bz2#0b7140c4a9abb0a7d85dd52fc5822b06 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-3.7.0-hd8ed1ab_0.tar.bz2#d9eb59a3cafc09132ea0932247a20e39 +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-4.7.1-py39hf3d152e_0.tar.bz2#6bddb50072e5c769100295b967b7b212 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.1.4-h38ff51b_8.tar.bz2#48adbb545226766333e87f15c9355835 +https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.7.3-py39he80948d_0.tar.bz2#7be467da925f77efc7ca095296dbfe18 +https://conda.anaconda.org/conda-forge/linux-64/pandas-1.2.3-py39hde0f152_0.tar.bz2#06986f8c1daf2e58b7484ec89839d2e3 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.0.0.post1-py39hb427721_0.tar.bz2#6329911d8ad9f4b08eafd1e6670fbf37 +https://conda.anaconda.org/conda-forge/linux-64/qt-5.12.9-hda022c4_4.tar.bz2#afebab1f5049d66baaaec67d9ce893f0 +https://conda.anaconda.org/conda-forge/linux-64/setuptools-49.6.0-py39hf3d152e_3.tar.bz2#4397280abb201d7adff59099e12e7ddd +https://conda.anaconda.org/conda-forge/linux-64/shapely-1.7.1-py39ha61afbd_4.tar.bz2#6899c5b3a7ab0c29737abe92a160ff19 +https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-py_0.tar.bz2#cb83a3d6ecf73f50117635192414426a +https://conda.anaconda.org/conda-forge/linux-64/terminado-0.9.2-py39hf3d152e_0.tar.bz2#be4a43825c2a6ca3638cbdcceeb7977d +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.1-py_0.tar.bz2#d36df15eaef96549ce6231e3088fba54 +https://conda.anaconda.org/conda-forge/noarch/bleach-3.3.0-pyh44b312d_0.tar.bz2#abf6b76c39358ca36ca706c46f054f2a +https://conda.anaconda.org/conda-forge/linux-64/distributed-2021.2.0-py39hf3d152e_0.tar.bz2#453cdf9d11af75f181518af5930384ed +https://conda.anaconda.org/conda-forge/linux-64/gdal-3.1.4-py39h3f36f43_8.tar.bz2#0c9c88664dbbffc2e49d29da22d66239 +https://conda.anaconda.org/conda-forge/noarch/jinja2-2.11.3-pyh44b312d_0.tar.bz2#1d4c3605d85a3655b1595e0694138eb6 +https://conda.anaconda.org/conda-forge/noarch/joblib-1.0.1-pyhd8ed1ab_0.tar.bz2#27d5ed1aaf2bbb5a0cc307a12d8e032f +https://conda.anaconda.org/conda-forge/noarch/jsonschema-3.2.0-py_2.tar.bz2#a17aa962de6145d08e1008cb37c20161 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-6.1.11-pyhd8ed1ab_1.tar.bz2#0fcd80df6d4e0558754c39453ffa3110 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.3.4-py39h2fa2bec_0.tar.bz2#9ec0b2186fab9121c54f4844f93ee5b7 +https://conda.anaconda.org/conda-forge/noarch/mercantile-1.1.6-pyh9f0ad1d_0.tar.bz2#eaf86369fd910829b49a13a91fd0ee73 +https://conda.anaconda.org/conda-forge/noarch/munch-2.5.0-py_0.tar.bz2#31d9e9be500e25ff0050bc9f57a6bcd7 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.5.6-nompi_py39h36800e2_100.tar.bz2#bec1f84d789126b809e1572592c7347e +https://conda.anaconda.org/conda-forge/noarch/pygments-2.8.0-pyhd8ed1ab_0.tar.bz2#226cd14ba0554ca2648fecd11090f473 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-20.0.1-pyhd8ed1ab_0.tar.bz2#92371c25994d0f5d28a01c1fb75ebf86 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-impl-5.12.3-py39h0fcd23e_7.tar.bz2#b9e7ab669f5c61554d9e045956db613a +https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.2.0-py39hb73aa6c_0.tar.bz2#606578c69f7d406d4cc06ec356e4f1fe +https://conda.anaconda.org/conda-forge/noarch/xarray-0.17.0-pyhd8ed1ab_0.tar.bz2#972b41b5afded8acbfed8ea18d016765 +https://conda.anaconda.org/conda-forge/noarch/zarr-2.6.1-pyhd8ed1ab_0.tar.bz2#cde929aee3ed7ceb99169b2b254735eb +https://conda.anaconda.org/conda-forge/linux-64/bokeh-2.3.0-py39hf3d152e_0.tar.bz2#8219c2a34b38c47c99d9fd57b31c5537 +https://conda.anaconda.org/conda-forge/noarch/descartes-1.1.0-py_4.tar.bz2#32fa3526c15250ccf353f1ce905f50b3 +https://conda.anaconda.org/conda-forge/linux-64/fiona-1.8.18-py39h3573629_0.tar.bz2#a67bfbc2f9eaa43adec1bd0926332f9a +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.1.2-pyh9f0ad1d_0.tar.bz2#2cbd910890bb328e8959246a1e16fac7 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.1.2-pyhd8ed1ab_1.tar.bz2#9633dbb668ac1f9266427672816899dc +https://conda.anaconda.org/conda-forge/linux-64/pyqtchart-5.12-py39h0fcd23e_7.tar.bz2#6b818c4973110a3a3753d8bb17147689 +https://conda.anaconda.org/conda-forge/linux-64/pyqtwebengine-5.12.1-py39h0fcd23e_7.tar.bz2#6423ece9d95e91a110dff695b2aaae91 +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.3-pyhd8ed1ab_0.tar.bz2#25573e57774dd54cfa848e5dd44503ed +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.5-pyh9f0ad1d_2.tar.bz2#5266fcd697043c59621fda522b3d78ee +https://conda.anaconda.org/conda-forge/noarch/dask-2021.2.0-pyhd8ed1ab_0.tar.bz2#a364d5fd4dc772b336354d78c0de9b20 +https://conda.anaconda.org/conda-forge/noarch/geopandas-0.9.0-pyhd8ed1ab_0.tar.bz2#5ad23a6ba0896134cf42bae1a9a0eee7 +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.5.3-pyhd8ed1ab_0.tar.bz2#67f12831640fde52fe9be1bbc6b699e7 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.16-pyha770c72_0.tar.bz2#1a7cec3da4a94cd23d3de4155bff4941 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.12.3-py39hf3d152e_7.tar.bz2#08e46ad97d4712558a52ae2ea6a92c8d +https://conda.anaconda.org/conda-forge/noarch/requests-2.25.1-pyhd3deb0d_0.tar.bz2#ae687aba31a1c400192a86a2e993ffdc +https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.12.6-py_0.tar.bz2#f847758d76d4d532caedadcd2180cab6 +https://conda.anaconda.org/conda-forge/noarch/contextily-1.1.0-pyhd8ed1ab_0.tar.bz2#48d4a468961294913865a20aef9338df +https://conda.anaconda.org/conda-forge/noarch/intake-0.6.1-pyhd8ed1ab_0.tar.bz2#208abfece70ea3558b9fbb215e4a8cb2 +https://conda.anaconda.org/conda-forge/linux-64/ipython-7.21.0-py39hef51801_0.tar.bz2#9ff1c412845b7c4919ae9d0925cb1e2c +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.3.4-py39hf3d152e_0.tar.bz2#cbaec993375a908bbe506dc7328d747c +https://conda.anaconda.org/conda-forge/linux-64/nbconvert-6.0.7-py39hf3d152e_3.tar.bz2#5f914e1113c7a926798c7659efbcd6a3 +https://conda.anaconda.org/conda-forge/noarch/papermill-2.3.2-pyhd8ed1ab_0.tar.bz2#5e2e120f45f2114e5db60219b7218197 +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.16-hd8ed1ab_0.tar.bz2#32d3475edd80c7445f8cf6ecaf1d7e6b +https://conda.anaconda.org/conda-forge/noarch/sat-stac-0.4.1-pyh44b312d_0.tar.bz2#db4efed11f9ee2b921d2893fc66806f2 +https://conda.anaconda.org/conda-forge/noarch/intake-xarray-0.4.1-pyhd8ed1ab_0.tar.bz2#a3204c2105c162fb1c3087ee43513fdd +https://conda.anaconda.org/conda-forge/linux-64/ipykernel-5.5.0-py39hef51801_1.tar.bz2#7fdf48a376b83e4511b550410482c806 +https://conda.anaconda.org/conda-forge/noarch/intake-stac-0.3.0-py_0.tar.bz2#428ef98978acff3293c37540daece3b7 +https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.2.0-py_0.tar.bz2#cb063fba0917fab041217d5a4a3adca0 +https://conda.anaconda.org/conda-forge/linux-64/notebook-6.2.0-py39hf3d152e_0.tar.bz2#b41aa687fbe881f4941707dc8646bdfc +https://conda.anaconda.org/conda-forge/noarch/qtconsole-5.0.2-pyhd8ed1ab_0.tar.bz2#0fb6a03f1a5fa89a0adc21e62959ac63 +https://conda.anaconda.org/conda-forge/linux-64/widgetsnbextension-3.5.1-py39hf3d152e_4.tar.bz2#ae54c7d751b678c0021929892d598ecd +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-7.6.3-pyhd3deb0d_0.tar.bz2#536a9ed6d9e740f2b83d1a3c388e4388 +https://conda.anaconda.org/conda-forge/linux-64/jupyter-1.0.0-py39hf3d152e_6.tar.bz2#2d0bd16f96154fa0095ea75667995495 diff --git a/test/harmony-regression/environment.yaml b/test/harmony-regression/environment.yaml new file mode 100644 index 00000000..fb74633c --- /dev/null +++ b/test/harmony-regression/environment.yaml @@ -0,0 +1,20 @@ +name: papermill +channels: + - conda-forge + - defaults +dependencies: + - python=3.9 + - jupyter + - papermill + - requests >= 2.23.0 + - CacheControl >= 0.12.6 + - matplotlib >= 3.2.1 + - Pillow >= 7.1.1 + - h5py >= 2.10.0 + - numpy >= 1.18.2 + - geopandas >= 0.7.0 + - descartes >= 1.1.0 + - contextily >= 1.0.0 + - sat-stac >= 0.4.0 + - xarray >= 0.16.2 + - intake-stac diff --git a/test/harmony-regression/notebook_helpers/__init__.py b/test/harmony-regression/notebook_helpers/__init__.py new file mode 100644 index 00000000..14088218 --- /dev/null +++ b/test/harmony-regression/notebook_helpers/__init__.py @@ -0,0 +1,377 @@ +from contextlib import contextmanager +import http.client as http_client +import logging +from datetime import datetime +from time import sleep +import json + +import tempfile +import os + +from io import BytesIO +from matplotlib import pyplot as plt +from PIL import Image +from h5py import File as H5File +import xarray as xa +import numpy as np +import geopandas as gpd +import contextily as ctx + +from satstac import Catalog + +import requests +from cachecontrol import CacheController, CacheControlAdapter + +def _build_session(): + """Builds a requests session that caches responses where possible, making redirects faster. + + Returns: + requests.Session -- A shared session to use for the notebook + """ + result = requests.session() + + # Set up caching. Particularly obey and cache 307 redirects to avoid duplicate expensive calls when we already + # have a result + cache_adapter = CacheControlAdapter() + cache_adapter.controller = CacheController(cache=cache_adapter.cache, status_codes=(200, 203, 300, 301, 307)) + + result.mount('http://', cache_adapter) + result.mount('https://', cache_adapter) + return result + +# Session accessible by callers +session = _build_session() + +def debug_http(): + """Adds debugging output to HTTP requests to show redirects, headers, etc + """ + http_client.HTTPConnection.debuglevel = 1 + logging.basicConfig() + logging.getLogger().setLevel(logging.DEBUG) + requests_log = logging.getLogger("requests.packages.urllib3") + requests_log.setLevel(logging.DEBUG) + requests_log.propagate = True + +def request(*args, **kwargs): + """Thin wrapper around requests.Request, logging URL sent and Content-Type received + + See https://requests.readthedocs.io/en/master/api/#requests.Request for args + + Returns: + requests.Response -- The response to the request + """ + req = requests.Request(*args, **kwargs) + prepped = session.prepare_request(req) + + print('%s %s' % (prepped.method, prepped.path_url)) + response = session.send(prepped) + #print('Received %s' % (response.headers.get('Content-Type', 'unknown content',))) + return response + +def get(*args, **kwargs): + """Performs a GET request using the request wrapper + + See https://requests.readthedocs.io/en/master/api/#requests.Request for args + + Returns: + requests.Response -- The response to the request + """ + return request('GET', *args, **kwargs) + +def post(*args, **kwargs): + """Performs a POST request using the request wrapper + + See https://requests.readthedocs.io/en/master/api/#requests.Request for args + + Returns: + requests.Response -- The response to the request + """ + return request('POST', *args, **kwargs) + +def show_shape(filename, basemap=True): + """Plots the shapefile in the given filename with optional basemap (ESRI or GeoJSON) + + Arguments: + filename {string} -- The filename of the shapefile to display + + Keyword Arguments: + basemap {bool} -- Whether to display a basemap under the shapefile (default: {True}) + """ + shape = gpd.read_file(filename).to_crs(epsg=3857) + plot = shape.plot(alpha=0.5, edgecolor='k', figsize=(8, 8)) + if basemap: + ctx.add_basemap(plot) + +def show(response, varList=[], color_index=None, immediate=True): + """Shows a variety of responses possible from Harmony for its example data + + Handles NetCDF files with red_var, green_var, blue_var, and alpha_var bands, compositing output + into a single colored image, ESRI Shapefiles with basemaps, and any type of image that can be + read by PIL, including GeoTIFF + + Arguments: + response {requests.Response} -- The response containing the data to display + varList {array} -- If set, only plot the variables listed in varList. Otherwise, plot all. + + Keyword Arguments: + color_index {number} -- Set for monochromatic images to put the output in a color band (0=red, 1=green, 2=blue) (default: {None}) + immediate {bool} -- True if the data should be shown immediately in the notebook (default: {True}) + + """ + + + # show_netcdf (look at dimensions, decide how to display); show_image + plt.rcParams['figure.figsize'] = [16, 8] + arrays = [] + + check_status(response) + content_type = response.headers['Content-Type'] + print('Content-type: ', content_type) + + if content_type == 'binary/octet-stream' or content_type == 'application/octet-stream': + print('WARNING: Let service developer know to set their content_type correctly!') + + if content_type == 'application/x-netcdf' or content_type == 'application/x-netcdf4' or content_type == 'application/netcdf' or content_type == 'binary/octet-stream' or content_type == 'application/octet-stream': + # Show NetCDF4 + data = H5File(BytesIO(response.content), 'r') + + #If user didn't provide any specific vars to plot, pull all of them into varList + if (len(varList) == 0): + varList = data.keys() + print(varList) + + #Plot the variables requested + for var in varList: + if var in data and len(data[var].shape) > 0: + ds = data[var] + if (len(data[var].shape) < 3): + #Simple plot for 1D or 2D + np_data=ds[()] + plt.plot(np_data) + plt.show() + else: + #Setup for 3D display + # ds = data[var] + values = np.flip(ds[0,:], 0) + where = (values != ds.attrs.get('_FillValue', None)) + scale = ds.attrs.get('scale_factor', [1])[0] + offset = ds.attrs.get('add_offset', [0])[0] + array = np.where(where, values * scale + offset, values) + arrays.append(array) + else: + print('Error: ', var, 'not found in dataset') + if (len(arrays) != 0): + #plot the 3D data + plt.imshow(np.dstack(arrays)) + elif content_type in ['application/zip', 'application/shapefile+zip']: + # Show ESRI Shapefiles + tmp = tempfile.NamedTemporaryFile(suffix='.shp.zip', delete=False) + try: + tmp.write(response.content) + show_shape('zip://' + tmp.name, immediate) + finally: + os.unlink(tmp.name) + elif 'application/json' in content_type: + #Most likely an error + print(response.json()) + assert(False) + else: + # Show Images + if color_index == None: + plt.imshow(Image.open(BytesIO(response.content))) + else: + gray_image = Image.open(BytesIO(response.content)) + # Move 1-channel green_var TIFF to second channel of RGB + image = Image.new('RGB', gray_image.size) + # There's probably a better way to do this with numpy + if color_index == 0: + image.putdata([(g, 0, 0) for g in gray_image.getdata()]) + if color_index == 1: + image.putdata([(0, g, 0) for g in gray_image.getdata()]) + if color_index == 2: + image.putdata([(0, 0, g) for g in gray_image.getdata()]) + plt.imshow(image) + if immediate: + plt.show() + +def get_data_urls(response): + """Returns the data URLs in an async response + + Arguments: + response {response.Response} -- The async job response + + Returns: + string[] -- An array of URLs for data links + """ + return [link['href'] for link in response.json()['links'] if link.get('rel', 'data') == 'data'] + +def show_async(response, varList = []): + """Shows an asynchronous Harmony response. + + Polls the output, displaying it as it changes, displaying any http data + links in the response as they arrive, and ultimately ending once the request + is successful or failed + + Arguments: + response {response.Response} -- the response to display + varList {array} -- If set, only plot the variables listed in varList. Otherwise, plot all. + + Returns: + response.Response -- the response from the final successful or failed poll + """ + def show_response(response, link_count): + print('Async response at', datetime.now().strftime("%H:%M:%S")) + print(json.dumps(response.json(), indent=2)) + links = get_data_urls(response) + new_links = links[slice(link_count, None)] + for link in new_links: + if link.startswith('http'): + show(get(link), varList) + return len(links) + + check_status(response) + displayed_link_count = 0 + body = response.json() + displayed_link_count = show_response(response, displayed_link_count) + waiting_message_printed = False + while body['status'] not in ['successful', 'failed', 'canceled']: + if not waiting_message_printed: + print('Waiting for updates...') + waiting_message_printed = True + sleep(1) + progress = body['progress'] + status = body['status'] + response = session.get(response.url) + body = response.json() + if progress != body['progress'] or status != body['status']: + displayed_link_count = show_response(response, displayed_link_count) + waiting_message_printed = False + + assert(body['status'] not in ['failed']) + check_stac(response) + print('Async request is complete') + return response + +def print_async_status(body): + """Prints the status, progress and any messages for the async job + + Arguments: + body {json} -- the response body to display + + """ + print('JobID:',body['jobID'],'Status:',body['status'],'(',body['progress'],'%) Messages:', body['message']) + +def show_async_condensed(response, varList = [], show_results=True): + """Shows a condensed version of the asynchronous Harmony response. Useful for getting status if you don't care about the results. + + Polls the output, displaying status as it changes, and ultimately ending once the request + is successful or failed + + Arguments: + response {response.Response} -- the response to display + varList {array} -- If set, only plot the variables listed in varList. Otherwise, plot all. + show_results {bool} -- True will display the results as they arrive. (default: {True}) + """ + def show_response_condensed(response, varList, link_count): + links = get_data_urls(response) + new_links = links[slice(link_count, None)] + for link in new_links: + if link.startswith('http'): + show(get(link), varList) + return len(links) + + check_status(response) + + displayed_link_count = 0 + body = response.json() + print ('Getting results for request') + print_async_status(body) + if show_results: + displayed_link_count = show_response_condensed(response, varList, displayed_link_count) + while body['status'] not in ['successful', 'failed', 'canceled']: + sleep(0.5) + progress = body['progress'] + status = body['status'] + response = session.get(response.url) + body = response.json() + if progress != body['progress'] or status != body['status']: + if show_results: + displayed_link_count = show_response_condensed(response, varList, displayed_link_count) + print_async_status(body) + + assert(body['status'] not in ['failed']) + check_stac(response) + print('Async request is complete') + + + +def check_bbox_subset(response, req_lat_min, req_lat_max, req_lon_min, req_lon_max): + """Asserts if the spatial extents of the data in the response are within the requested bbox of a spatial subset + + ##### CHECK_BBOX_SUBSET currently is not in use; placeholder for the next round of regression test work + + Arguments: + response {response.Response} -- the response to display + req_lat_min -- The minimimum latitude from the request bbox for a spatial subset + req_lat_max -- The maximum latitude from the request bbox for a spatial subset + req_lon_min -- The minimimum longitude from the request bbox for a spatial subset + req_lon_max -- The maximum longitude from the request bbox for a spatial subset + """ + + data = H5File(BytesIO(response.content), 'r') + + attr_data = data['lat'][:] + + print('Orig min and max: ', attr_data.min(), attr_data.max() ) + lat_min = (attr_data.min() + 180) % 360 - 180 + lat_max = (attr_data.max() + 180) % 360 - 180 + print(lat_min) + print(lat_max) + + assert lat_max <= req_lat_max + assert lat_min >= req_lat_min + + attr_data = data['lon'][:] + lon_min = (attr_data.min() + 180) % 360 - 180 + lon_max = (attr_data.max() + 180) % 360 - 180 + print(lon_min) + print(lon_max) + + assert lon_max <= req_lon_max + assert lon_min >= req_lon_min + +def check_status(response): + """Asserts if the response is a 200, if not, print out the response code + + Arguments: + response {response.Response} -- the response to display + """ + if (response.status_code != 200): + errStr = 'Request failed with status code ' + str(response.status_code) + assert False, errStr + + +def check_stac(response): + """Asserts if the response contains a valid STAC catalog and prints it out. More robust assertions could + be done here in the future to confirm that the STAC metadata is valid per the request parameters + + Arguments: + response {response.Response} -- the response to display + """ + for i in range(len(response.json()['links'])): + if response.json()['links'][i]['title'] == 'STAC catalog': + stac_url = response.json()['links'][i]['href'] + + assert(stac_url) + cat = Catalog.open(stac_url) + + for i in cat.items(): + assert(i.id) + assert(i.datetime) + assert(i.bbox) + assert(i.assets.keys()) + print('STAC Item') + print('\t', 'ID:', i.id) + print('\t', 'Date:', i.datetime) + print('\t', 'Bounding Box:', i.bbox) + print('\t', 'File:', list(i.assets.keys())) diff --git a/test/harmony-regression/notebook_helpers/namibia.geo.json b/test/harmony-regression/notebook_helpers/namibia.geo.json new file mode 100644 index 00000000..e061cfde --- /dev/null +++ b/test/harmony-regression/notebook_helpers/namibia.geo.json @@ -0,0 +1,196 @@ +{ + "type": "FeatureCollection", + "features": [ +{ + "type": "Feature", + "properties": { + "name": "Namibia", + "code": "NAM", + "group": "Countries" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 16.344977, + -28.576705 + ], + [ + 16.824017, + -28.082162 + ], + [ + 17.218929, + -28.355943 + ], + [ + 17.387497, + -28.783514 + ], + [ + 17.836152, + -28.856378 + ], + [ + 18.464899, + -29.045462 + ], + [ + 19.002127, + -28.972443 + ], + [ + 19.894734, + -28.461105 + ], + [ + 19.895768, + -24.76779 + ], + [ + 19.895458, + -21.849157 + ], + [ + 20.881134, + -21.814327 + ], + [ + 20.910641, + -18.252219 + ], + [ + 21.65504, + -18.219146 + ], + [ + 23.196858, + -17.869038 + ], + [ + 23.579006, + -18.281261 + ], + [ + 24.217365, + -17.889347 + ], + [ + 24.520705, + -17.887125 + ], + [ + 25.084443, + -17.661816 + ], + [ + 25.07695, + -17.578823 + ], + [ + 24.682349, + -17.353411 + ], + [ + 24.033862, + -17.295843 + ], + [ + 23.215048, + -17.523116 + ], + [ + 21.377176, + -17.930636 + ], + [ + 18.956187, + -17.789095 + ], + [ + 18.263309, + -17.309951 + ], + [ + 14.209707, + -17.353101 + ], + [ + 14.058501, + -17.423381 + ], + [ + 13.462362, + -16.971212 + ], + [ + 12.814081, + -16.941343 + ], + [ + 12.215461, + -17.111668 + ], + [ + 11.734199, + -17.301889 + ], + [ + 11.794919, + -18.069129 + ], + [ + 12.608564, + -19.045349 + ], + [ + 12.826845, + -19.673166 + ], + [ + 13.352498, + -20.872834 + ], + [ + 13.868642, + -21.699037 + ], + [ + 14.257714, + -22.111208 + ], + [ + 14.385717, + -22.656653 + ], + [ + 14.408144, + -23.853014 + ], + [ + 14.743214, + -25.39292 + ], + [ + 14.989711, + -26.117372 + ], + [ + 15.210472, + -27.090956 + ], + [ + 15.601818, + -27.821247 + ], + [ + 16.344977, + -28.576705 + ] + ] + ] + }, + "_id": "namibia" +} + ]} diff --git a/test/harmony-regression/notebook_helpers/test_in-polygon.geojson b/test/harmony-regression/notebook_helpers/test_in-polygon.geojson new file mode 100644 index 00000000..a2f41d27 --- /dev/null +++ b/test/harmony-regression/notebook_helpers/test_in-polygon.geojson @@ -0,0 +1,23 @@ +{ +"type": "FeatureCollection", +"name": "test_in-polygon", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "FID": 0 }, "geometry": { "type": "Polygon", "coordinates": [ +[ + [ -122.02175857287973, 39.69939017657147 ], + [ -121.97881092875886, 39.58679770414649 ], + [ -122.02408006715653, 39.55313603713284 ], + [ -121.98693615872767, 39.48813419738234 ], + [ -122.03452679140214, 39.44634730039987 ], + [ -121.9985436301117, 39.38018471351097 ], + [ -122.03916977995576, 39.27919971247002 ], + [ -121.99738288297328, 39.309379138068465 ], + [ -121.97416794020525, 39.46840149602951 ], + [ -121.97532868734366, 39.50554540445837 ], + [ -121.97997167589726, 39.55081454285604 ], + [ -121.94863150316041, 39.641352819651374 ], + [ -122.02175857287973, 39.69939017657147 ] +] ] } } +] +} diff --git a/test/harmony-regression/notebook_helpers/test_in-polygon.shp.zip b/test/harmony-regression/notebook_helpers/test_in-polygon.shp.zip new file mode 100644 index 00000000..371ec5f5 Binary files /dev/null and b/test/harmony-regression/notebook_helpers/test_in-polygon.shp.zip differ diff --git a/test/notebooks/Harmony.ipynb b/test/harmony/Harmony.ipynb similarity index 97% rename from test/notebooks/Harmony.ipynb rename to test/harmony/Harmony.ipynb index 5a235c98..4e3264a0 100644 --- a/test/notebooks/Harmony.ipynb +++ b/test/harmony/Harmony.ipynb @@ -31,8 +31,8 @@ "module_path = os.path.abspath(os.path.join('..'))\n", "if module_path not in sys.path:\n", " sys.path.append(module_path)\n", - "\n", - "from harmony import util\n", + " \n", + "import util\n", "import pytest\n", "import ipytest\n", "\n", diff --git a/test/harmony/conda-linux-64.lock b/test/harmony/conda-linux-64.lock new file mode 100644 index 00000000..47d98527 --- /dev/null +++ b/test/harmony/conda-linux-64.lock @@ -0,0 +1,184 @@ +# platform: linux-64 +# env_hash: 7f23ae47b87460caefd9cef26cd832a26fa8a5203b63cf0f3eb3fae68d2e503f +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2020.12.5-ha878542_0.tar.bz2#7eb5d4ffeee663caa1635cd67071bc1b +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.35.1-hea4e1c9_2.tar.bz2#83610dba766a186bdc7a116053b782a4 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-9.3.0-hff62375_18.tar.bz2#86a1cade1bc2b99a6419ba980f730bff +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-9.3.0-h6de172a_18.tar.bz2#2f03cd1e5c966d4af5822c7ae089ab03 +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.23-ha770c72_1.tar.bz2#288ac4404aff60a4ba6812a5ab66d505 +https://conda.anaconda.org/conda-forge/linux-64/pandoc-2.11.4-h7f98852_0.tar.bz2#1c827fa4db40e5e92c2619ba8fe30500 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-9.3.0-hff62375_18.tar.bz2#db417845fae12a62b6720f09f51ab6a7 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-9.3.0-h2828fa1_18.tar.bz2#fc7a2a7e6a741c8afdd764715ac7039d +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-1_gnu.tar.bz2#561e277319a41d4f24f5c05a9ef63c04 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-9.3.0-h2828fa1_18.tar.bz2#5a9490c49a3505a6d19bda012cde6ad3 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.17.1-h36c2ea0_0.tar.bz2#1aa683618a2df66800d568409d6841d1 +https://conda.anaconda.org/conda-forge/linux-64/expat-2.2.10-h9c3ff4c_0.tar.bz2#c924bc4e7ae49118f6c97bd4357fed0e +https://conda.anaconda.org/conda-forge/linux-64/icu-68.1-h58526e2_0.tar.bz2#fc7a4271dc2a7f4fd78cd63695baf7c3 +https://conda.anaconda.org/conda-forge/linux-64/jpeg-9d-h36c2ea0_0.tar.bz2#ea02ce6037dbe81803ae6123e5ba1568 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.3-h58526e2_2.tar.bz2#665369991d8dd290ac5ee92fce3e6bf5 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.16-h516909a_0.tar.bz2#5c0f338a513a2943c659ae619fca9211 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.12-pthreads_h4812303_1.tar.bz2#2c7126a584f05e7bc8885d64dad3d21a +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d +https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.0-h7f98852_0.tar.bz2#747d8f09e5340bc40480eb765903ec97 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.3-h9c3ff4c_0.tar.bz2#4eb64ee0d5cd43096ffcf843c76b05d4 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.2-h58526e2_4.tar.bz2#509f2a21c4a09214cd737a480dfd80c9 +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.29-h9c3ff4c_1.tar.bz2#79ae8dbabe53ab135593d87c7a4b4e23 +https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1j-h7f98852_0.tar.bz2#f91545bee2ac8cf86f1dc53e55a7bb2b +https://conda.anaconda.org/conda-forge/linux-64/pcre-8.44-he1b5a44_0.tar.bz2#e647d89cd5cdf62760cf283a001841ff +https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.9-h7f98852_0.tar.bz2#bf6f803a544f26ebbdc3bfff272eb179 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.5-h516909a_1.tar.bz2#33f601066901f3e1a85af3522a8113f9 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h516909a_0.tar.bz2#03a530e925414902547cf48da7756db8 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-h516909a_1010.tar.bz2#339cc5584e6d26bc73a875ba900028c3 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.19.8.1-h0b5b191_1005.tar.bz2#ff6f69b593a9e74c0e6b61908ac513fa +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.13-h10796ff_1004.tar.bz2#aa1b96c7801b4876bb40f46f4d519836 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-8_openblas.tar.bz2#95cee6371a5b901797075040941171f3 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 +https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.10-hcdb4288_3.tar.bz2#d8f51405997093ff1799ded7650439c4 +https://conda.anaconda.org/conda-forge/linux-64/libllvm11-11.0.1-hf817b99_0.tar.bz2#774d669b89b47ed3f612142f489c5a46 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.43.0-h812cca2_0.tar.bz2#1867d1e9658596b3fac8847a7702eef4 +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.37-h21135ba_2.tar.bz2#b6acf807307d033d4b7e758b4f44b036 +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.9.0-hab1572f_5.tar.bz2#18aaa1bd2238ae2b5e89591046973123 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.13-h7f98852_1003.tar.bz2#a9371e9e40aded194dcba1447606c9a1 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.9.10-h72842e0_3.tar.bz2#5ed2c4742d5f1141783f484fe8974ccf +https://conda.anaconda.org/conda-forge/linux-64/readline-8.0-he28a2e2_2.tar.bz2#4d0ae8d473f863696088f76800ef9d38 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.10-h21135ba_1.tar.bz2#c647f70aa7e3d4cc4e029cc1c9a99953 +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_0.tar.bz2#9105c7da67ebfb39ff08e2a8ea72bb71 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.4.8-ha95c52a_1.tar.bz2#ed4dbbaf7d81423678632bf982f45ede +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.10.4-h0708190_1.tar.bz2#4a06f2ac2e5bfae7b6b245171c3f07aa +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.17.2-h926e7f8_0.tar.bz2#926325c11478d6e781e76072c117763b +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-8_openblas.tar.bz2#d8e2151683bc12acffedea26eba27e0f +https://conda.anaconda.org/conda-forge/linux-64/libclang-11.0.1-default_ha53f305_1.tar.bz2#8310b95b07c2316d7b30b65b7fdf2f1f +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.66.7-h3e27bee_1.tar.bz2#dd273cc3560177ab37be0db469368bba +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-8_openblas.tar.bz2#9a860887c77e923c2807c715a7731fb8 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.2.0-hdc55705_0.tar.bz2#f1406324f1d02fa26447a0a0f2dd0107 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.0.3-he3ba5ed_0.tar.bz2#f9dbabc7e01c459ed7a1d1d64b206e9b +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.23-h935591d_1.tar.bz2#fd60f20b38b7194aa91262fdbd3ef134 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.34.0-h74cdb3f_0.tar.bz2#0a83e21e8c1929cc9a1e21ebb2459fc5 +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.13.1-hba837de_1004.tar.bz2#bbe61e6ae39440dd101d77bf80ffc2cd +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.66.7-h9c3ff4c_1.tar.bz2#7affb30431ec6fec334bd4b39cc1be39 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.18.3-h3560a44_0.tar.bz2#4bd4917d4d6399a2fe38609b697f3278 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.12-hddcbb42_0.tar.bz2#797117394a4aa588de6d741b06fad80f +https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.71.1-hcdd3856_8.tar.bz2#2c81fb9f0d82c04b08617fc73eb615af +https://conda.anaconda.org/conda-forge/linux-64/libpq-13.1-hfd2b0eb_2.tar.bz2#d41b032f8940757263340b0918e62682 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.62-hb5efdd6_0.tar.bz2#f47b52c3d66ffb10127acd50197133ea +https://conda.anaconda.org/conda-forge/linux-64/python-3.7.10-hffdb5ce_100_cpython.tar.bz2#7425fffa658971915f595e9110163c3c +https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyh9f0ad1d_0.tar.bz2#5f095bc6454094e96f146491fd03633b +https://conda.anaconda.org/conda-forge/noarch/async_generator-1.10-py_0.tar.bz2#d56c596e61b1c4952acf0a9920856c12 +https://conda.anaconda.org/conda-forge/noarch/attrs-20.3.0-pyhd3deb0d_0.tar.bz2#5b319abb055eefcfa344bc21378ca23f +https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-py_2.tar.bz2#0da16b293affa6ac31812376f8eb79dd +https://conda.anaconda.org/conda-forge/noarch/click-7.1.2-pyh9f0ad1d_0.tar.bz2#bd50a970ce07e660c319fdc4d730d3f1 +https://conda.anaconda.org/conda-forge/linux-64/curl-7.71.1-he644dc0_8.tar.bz2#7fadfa44182e1cc0dbbe0c169c0b15cc +https://conda.anaconda.org/conda-forge/noarch/dataclasses-0.7-pyhb2cacf7_7.tar.bz2#3c9869f82e8f246c3f26e91da684597e +https://conda.anaconda.org/conda-forge/noarch/decorator-4.4.2-py_0.tar.bz2#d2eabb9cabd212e1ec6a9463bd846243 +https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.6.0-py_0.tar.bz2#37e1033daee0e2edaa5ff42584c52b21 +https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.3-pyhd8ed1ab_1003.tar.bz2#bbf9a201f6ce99a506f4955374d9a9f4 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.66.7-h9c3ff4c_1.tar.bz2#83a66185b0f99b33ba9de260fc0f51f4 +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.18.3-h04508c2_0.tar.bz2#62e72470334058fb045c1f8cc9d2367c +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.10.6-nompi_h6a2412b_1114.tar.bz2#0a2984b78f51148d7ff6219abe73509e +https://conda.anaconda.org/conda-forge/noarch/idna-2.10-pyh9f0ad1d_0.tar.bz2#f95a12b4f435aae6680fe55ae2eb1b06 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-1.1.1-pyh9f0ad1d_0.tar.bz2#39161f81cc5e5ca45b8226fbb06c6905 +https://conda.anaconda.org/conda-forge/noarch/ipython_genutils-0.2.0-py_1.tar.bz2#5071c982548b3a20caf70462f04f5287 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-1.0.0-pyhd8ed1ab_1.tar.bz2#f8da92114c8fbe1d951b0efaf54dd14b +https://conda.anaconda.org/conda-forge/noarch/more-itertools-8.7.0-pyhd8ed1ab_0.tar.bz2#3be1ba5a28d394d78f3d692fb9e5c1c2 +https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.4.3-pyhd8ed1ab_0.tar.bz2#a1f2fda4d88c624810bf2029aa4c0827 +https://conda.anaconda.org/conda-forge/noarch/olefile-0.46-pyh9f0ad1d_1.tar.bz2#0b2e68acc8c78c8cc392b90983481f58 +https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.4.2-py_1.tar.bz2#ba6f4a308f1ea22abe1d72e72544af76 +https://conda.anaconda.org/conda-forge/noarch/parso-0.8.1-pyhd8ed1ab_0.tar.bz2#8b0a19d867a59005c1ae631d61a12194 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.8.1-pyhd3deb0d_0.tar.bz2#fcd2fbb062b55d14a77e664c89ee17a6 +https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2#415f0ebb6198cc2801c73438a9fb5761 +https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.9.0-pyhd3deb0d_0.tar.bz2#c7af95daf5bae22ead34151e0ab9d041 +https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 +https://conda.anaconda.org/conda-forge/noarch/py-1.10.0-pyhd3deb0d_0.tar.bz2#88ca1328ecc79a070214aa24911bace8 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.20-pyh9f0ad1d_2.tar.bz2#aa798d50ffd182a0f6f31478c7f434f6 +https://conda.anaconda.org/conda-forge/noarch/pyparsing-2.4.7-pyh9f0ad1d_0.tar.bz2#626c4f20d5bf06dcec9cf2eaa31725c7 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.7-1_cp37m.tar.bz2#658a5c3d766bfc6574480204b10a6f20 +https://conda.anaconda.org/conda-forge/noarch/qtpy-1.9.0-py_0.tar.bz2#ab75b0ea90d2621e1924b824e2f395ee +https://conda.anaconda.org/conda-forge/noarch/send2trash-1.5.0-py_0.tar.bz2#c3779037a635e1150f1c53c28b875949 +https://conda.anaconda.org/conda-forge/noarch/six-1.15.0-pyh9f0ad1d_0.tar.bz2#1eec421f0f1f39e579e44e4a5ce646a2 +https://conda.anaconda.org/conda-forge/noarch/testpath-0.4.4-py_0.tar.bz2#3b98fff4d5342bebde2ecaa314f796f9 +https://conda.anaconda.org/conda-forge/noarch/textwrap3-0.9.2-py_0.tar.bz2#1f84e74e9dbe2e5ae38c58496bffaca8 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.58.0-pyhd8ed1ab_0.tar.bz2#f92f0f1f03f39c011f89f7434e654dc5 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-3.7.4.3-py_0.tar.bz2#12b96e382730541a4b332420227055ae +https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-py_1.tar.bz2#3563be4c5611a44210d9ba0c16113136 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.4.0-py_0.tar.bz2#0df927d2e46244cef8fd75d7ec2ba51c +https://conda.anaconda.org/conda-forge/noarch/ansiwrap-0.8.4-py_0.tar.bz2#f09557e2a7cbd2470a2ab6353000cebd +https://conda.anaconda.org/conda-forge/linux-64/certifi-2020.12.5-py37h89c1867_1.tar.bz2#fb121f213009359498ada17a9e6d775f +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.14.5-py37hc58025e_0.tar.bz2#e05f1fad0c52c21b6b92778d31f89cd0 +https://conda.anaconda.org/conda-forge/linux-64/chardet-4.0.0-py37h89c1867_1.tar.bz2#f4fbd4721b80f0d6b53b3a3374914068 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.10.0-py_2.tar.bz2#f6d7c7e6d8f42cbbec7e07a8d879f91c +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-hfdff14a_1.tar.bz2#4caaca6356992ee545080c7d7193b5a3 +https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-3.7.0-py37h89c1867_0.tar.bz2#6cd67473456ba3a36bde7269aa4da7e0 +https://conda.anaconda.org/conda-forge/linux-64/jedi-0.18.0-py37h89c1867_2.tar.bz2#5e95b453f199caec4dd1bf6002ae0ce2 +https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.3.1-py37h2527ec5_1.tar.bz2#61149814e0ea71cb5b44881c65d25f7b +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.7.4-nompi_h56d31a8_107.tar.bz2#ef3d349e818876a175de7d87bd6451df +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-1.1.1-py37h5e8e339_3.tar.bz2#b874d44750373553008083116442c972 +https://conda.anaconda.org/conda-forge/linux-64/mistune-0.8.4-py37h5e8e339_1003.tar.bz2#6a636219f0f50dab2c327237e95f98c7 +https://conda.anaconda.org/conda-forge/linux-64/mypy_extensions-0.4.3-py37h89c1867_3.tar.bz2#b604f0897a7a207bddd7d05bf3284752 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.20.1-py37haa41c4c_0.tar.bz2#b760457d39004143870c4bae2db9c258 +https://conda.anaconda.org/conda-forge/noarch/packaging-20.9-pyh44b312d_0.tar.bz2#be69a38e912054a62dc82cc3c7711a64 +https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh9f0ad1d_2.tar.bz2#5909e7b978141dd80d28dbf9de627827 +https://conda.anaconda.org/conda-forge/linux-64/pillow-8.1.1-py37h4600e1f_0.tar.bz2#f6bddb8553c90503080bbc6fed99c259 +https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-4.19.18-py37hcd2ae1e_7.tar.bz2#f94e01aa4abd458b556d68fdb5f19b99 +https://conda.anaconda.org/conda-forge/linux-64/pyrsistent-0.17.3-py37h5e8e339_2.tar.bz2#829e0a0279d711a7b5aa67fe18c73672 +https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py37h89c1867_3.tar.bz2#bd069d59ee91a2e26552cd7bb4c64032 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.1-py_0.tar.bz2#0d0150ed9c2d25817f5324108d3f7571 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-5.4.1-py37h5e8e339_0.tar.bz2#090550b9425fe9a87dc1ec7fde201633 +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-22.0.3-py37h336d617_1.tar.bz2#798e421f018bba8ef90546e447e11060 +https://conda.anaconda.org/conda-forge/linux-64/regex-2020.11.13-py37h5e8e339_1.tar.bz2#e2c17616c22bb120a42afdf91d7b1ec1 +https://conda.anaconda.org/conda-forge/noarch/tenacity-6.3.1-pyhd8ed1ab_0.tar.bz2#30f6171a26d8aae379f9c8debb667319 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.1-py37h5e8e339_1.tar.bz2#92449128c4639feae48d731ef2186099 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.0.5-py_0.tar.bz2#99618ee9ab1323e40f231acdab92fe60 +https://conda.anaconda.org/conda-forge/linux-64/typed-ast-1.4.2-py37h5e8e339_0.tar.bz2#00946f8acca72cb6d88fe507e69f0849 +https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-20.1.0-py37h5e8e339_2.tar.bz2#5403470dcc6211e0ad72077616e2519d +https://conda.anaconda.org/conda-forge/noarch/black-20.8b1-py_1.tar.bz2#e555d6b71ec916c3dc4e6e3793cc9796 +https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py37h5e8e339_1001.tar.bz2#871eed4ba322e7b3f200956a096b34e7 +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.4.1-py37h902c9e0_0.tar.bz2#8ebdfca0cb2576e0c0c8aabd1dbf3e6b +https://conda.anaconda.org/conda-forge/linux-64/cryptography-3.4.4-py37hf1a17b8_0.tar.bz2#7df98bae15827ec0489f7c44cb22dbeb +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-3.7.0-hd8ed1ab_0.tar.bz2#d9eb59a3cafc09132ea0932247a20e39 +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-4.7.1-py37h89c1867_0.tar.bz2#42202575ecb1cc9491d57a4ad25f14bb +https://conda.anaconda.org/conda-forge/linux-64/qt-5.12.9-hda022c4_4.tar.bz2#afebab1f5049d66baaaec67d9ce893f0 +https://conda.anaconda.org/conda-forge/linux-64/setuptools-49.6.0-py37h89c1867_3.tar.bz2#928c178bf6805b8ab71fabaa620e0234 +https://conda.anaconda.org/conda-forge/linux-64/terminado-0.9.2-py37h89c1867_0.tar.bz2#660216081c3ff3826a726bb16a623576 +https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.1-py_0.tar.bz2#d36df15eaef96549ce6231e3088fba54 +https://conda.anaconda.org/conda-forge/noarch/bleach-3.3.0-pyh44b312d_0.tar.bz2#abf6b76c39358ca36ca706c46f054f2a +https://conda.anaconda.org/conda-forge/noarch/jinja2-2.11.3-pyh44b312d_0.tar.bz2#1d4c3605d85a3655b1595e0694138eb6 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-3.2.0-py_2.tar.bz2#a17aa962de6145d08e1008cb37c20161 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-6.1.11-pyhd8ed1ab_1.tar.bz2#0fcd80df6d4e0558754c39453ffa3110 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.3.4-py37h0c9df89_0.tar.bz2#55cf4f52dea2415649f0dd15d4b8970c +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.5.6-nompi_py37hdbee05a_100.tar.bz2#a8c31d11f594c8b5dc7c788f76851eb2 +https://conda.anaconda.org/conda-forge/linux-64/pluggy-0.13.1-py37h89c1867_4.tar.bz2#fae2ad595398817ce166a1af18dfe295 +https://conda.anaconda.org/conda-forge/noarch/pygments-2.8.0-pyhd8ed1ab_0.tar.bz2#226cd14ba0554ca2648fecd11090f473 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-20.0.1-pyhd8ed1ab_0.tar.bz2#92371c25994d0f5d28a01c1fb75ebf86 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-impl-5.12.3-py37he336c9b_7.tar.bz2#303251d6f2b9e60a0cd79480cf8507d2 +https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.1.2-pyh9f0ad1d_0.tar.bz2#2cbd910890bb328e8959246a1e16fac7 +https://conda.anaconda.org/conda-forge/noarch/nbformat-5.1.2-pyhd8ed1ab_1.tar.bz2#9633dbb668ac1f9266427672816899dc +https://conda.anaconda.org/conda-forge/linux-64/pyqtchart-5.12-py37he336c9b_7.tar.bz2#2b1959f3a87b5ad66690340ef921323c +https://conda.anaconda.org/conda-forge/linux-64/pyqtwebengine-5.12.1-py37he336c9b_7.tar.bz2#15f5cbcafb4889bb41da2a0a0e338f2a +https://conda.anaconda.org/conda-forge/linux-64/pytest-6.2.2-py37h89c1867_0.tar.bz2#0a75bc96b711fddbe3d62d40eefd61ae +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.3-pyhd8ed1ab_0.tar.bz2#25573e57774dd54cfa848e5dd44503ed +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.5-pyh9f0ad1d_2.tar.bz2#5266fcd697043c59621fda522b3d78ee +https://conda.anaconda.org/conda-forge/noarch/nbclient-0.5.3-pyhd8ed1ab_0.tar.bz2#67f12831640fde52fe9be1bbc6b699e7 +https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.16-pyha770c72_0.tar.bz2#1a7cec3da4a94cd23d3de4155bff4941 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.12.3-py37h89c1867_7.tar.bz2#1754ec587a9ac26e9507fea7eb6bebc2 +https://conda.anaconda.org/conda-forge/noarch/requests-2.25.1-pyhd3deb0d_0.tar.bz2#ae687aba31a1c400192a86a2e993ffdc +https://conda.anaconda.org/conda-forge/linux-64/ipython-7.21.0-py37h888b3d9_0.tar.bz2#8a22b88a82fd83f9b01e9b238a9272ef +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.3.4-py37h89c1867_0.tar.bz2#aa928e9c4e7ef59482775bbbf78e8bf5 +https://conda.anaconda.org/conda-forge/linux-64/nbconvert-6.0.7-py37h89c1867_3.tar.bz2#aa3710e0a8a44d7c7313b37775018446 +https://conda.anaconda.org/conda-forge/noarch/papermill-2.3.2-pyhd8ed1ab_0.tar.bz2#5e2e120f45f2114e5db60219b7218197 +https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.16-hd8ed1ab_0.tar.bz2#32d3475edd80c7445f8cf6ecaf1d7e6b +https://conda.anaconda.org/conda-forge/linux-64/ipykernel-5.5.0-py37h888b3d9_1.tar.bz2#0f3659210c464bbc885642b9750e7a2a +https://conda.anaconda.org/conda-forge/noarch/ipytest-0.9.1-py_0.tar.bz2#1082c05e0a6c348aa8c5018b918d731d +https://conda.anaconda.org/conda-forge/noarch/jupyter_console-6.2.0-py_0.tar.bz2#cb063fba0917fab041217d5a4a3adca0 +https://conda.anaconda.org/conda-forge/linux-64/notebook-6.2.0-py37h89c1867_0.tar.bz2#3bead31ff255215b069399b1dfb06200 +https://conda.anaconda.org/conda-forge/noarch/qtconsole-5.0.2-pyhd8ed1ab_0.tar.bz2#0fb6a03f1a5fa89a0adc21e62959ac63 +https://conda.anaconda.org/conda-forge/linux-64/widgetsnbextension-3.5.1-py37h89c1867_4.tar.bz2#274af17d64191a15d3899d5fdc4abc02 +https://conda.anaconda.org/conda-forge/noarch/ipywidgets-7.6.3-pyhd3deb0d_0.tar.bz2#536a9ed6d9e740f2b83d1a3c388e4388 +https://conda.anaconda.org/conda-forge/linux-64/jupyter-1.0.0-py37h89c1867_6.tar.bz2#1bf59adc1dfbe22ecb2b6cd9d4707b99 diff --git a/test/harmony/environment.yaml b/test/harmony/environment.yaml new file mode 100644 index 00000000..40921f1a --- /dev/null +++ b/test/harmony/environment.yaml @@ -0,0 +1,13 @@ +name: papermill +channels: + - conda-forge + - defaults +dependencies: + - python=3.7 + - jupyter + - requests + - netcdf4 + - matplotlib + - papermill + - pytest + - ipytest diff --git a/test/notebooks/__init__.py b/test/notebooks/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/test/poetry.lock b/test/poetry.lock deleted file mode 100644 index b5103a53..00000000 --- a/test/poetry.lock +++ /dev/null @@ -1,1811 +0,0 @@ -[[package]] -name = "ansiwrap" -version = "0.8.4" -description = "textwrap, but savvy to ANSI colors and styles" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -textwrap3 = ">=0.9.2" - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "appnope" -version = "0.1.2" -description = "Disable App Nap on macOS >= 10.9" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "argon2-cffi" -version = "20.1.0" -description = "The secure Argon2 password hashing algorithm." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -cffi = ">=1.0.0" -six = "*" - -[package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "wheel", "pre-commit"] -docs = ["sphinx"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] - -[[package]] -name = "async-generator" -version = "1.10" -description = "Async generators and context managers for Python 3.5+" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "attrs" -version = "20.3.0" -description = "Classes Without Boilerplate" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] - -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "bandit" -version = "1.6.2" -description = "Security oriented static analyser for python code." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} -GitPython = ">=1.0.1" -PyYAML = ">=3.13" -six = ">=1.10.0" -stevedore = ">=1.20.0" - -[[package]] -name = "black" -version = "20.8b1" -description = "The uncompromising code formatter." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -appdirs = "*" -click = ">=7.1.2" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.6,<1" -regex = ">=2020.1.8" -toml = ">=0.10.1" -typed-ast = ">=1.4.0" -typing-extensions = ">=3.7.4" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] - -[[package]] -name = "bleach" -version = "3.2.1" -description = "An easy safelist-based HTML-sanitizing tool." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -packaging = "*" -six = ">=1.9.0" -webencodings = "*" - -[[package]] -name = "certifi" -version = "2020.11.8" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "cffi" -version = "1.14.4" -description = "Foreign Function Interface for Python calling C code." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "chardet" -version = "3.0.4" -description = "Universal encoding detector for Python 2 and 3" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "click" -version = "7.1.2" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "colorama" -version = "0.4.4" -description = "Cross-platform colored terminal text." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "decorator" -version = "4.4.2" -description = "Decorators for Humans" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" - -[[package]] -name = "defusedxml" -version = "0.6.0" -description = "XML bomb protection for Python stdlib modules" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "dparse" -version = "0.5.1" -description = "A parser for Python dependency files" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -packaging = "*" -pyyaml = "*" -toml = "*" - -[package.extras] -pipenv = ["pipenv"] - -[[package]] -name = "entrypoints" -version = "0.3" -description = "Discover and load entry points from installed packages." -category = "main" -optional = false -python-versions = ">=2.7" - -[[package]] -name = "flake8" -version = "3.8.4" -description = "the modular source code checker: pep8 pyflakes and co" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" - -[package.dependencies] -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.6.0a1,<2.7.0" -pyflakes = ">=2.2.0,<2.3.0" - -[[package]] -name = "flake8-bandit" -version = "2.1.2" -description = "Automated security testing with bandit and flake8." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -bandit = "*" -flake8 = "*" -flake8-polyfill = "*" -pycodestyle = "*" - -[[package]] -name = "flake8-bugbear" -version = "20.11.1" -description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -attrs = ">=19.2.0" -flake8 = ">=3.0.0" - -[package.extras] -dev = ["coverage", "black", "hypothesis", "hypothesmith"] - -[[package]] -name = "flake8-polyfill" -version = "1.0.2" -description = "Polyfill package for Flake8 plugins" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -flake8 = "*" - -[[package]] -name = "gitdb" -version = "4.0.5" -description = "Git Object Database" -category = "dev" -optional = false -python-versions = ">=3.4" - -[package.dependencies] -smmap = ">=3.0.1,<4" - -[[package]] -name = "gitpython" -version = "3.1.11" -description = "Python Git Library" -category = "dev" -optional = false -python-versions = ">=3.4" - -[package.dependencies] -gitdb = ">=4.0.1,<5" - -[[package]] -name = "idna" -version = "2.10" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "ipykernel" -version = "5.3.4" -description = "IPython Kernel for Jupyter" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -appnope = {version = "*", markers = "platform_system == \"Darwin\""} -ipython = ">=5.0.0" -jupyter-client = "*" -tornado = ">=4.2" -traitlets = ">=4.1.0" - -[package.extras] -test = ["pytest (!=5.3.4)", "pytest-cov", "flaky", "nose"] - -[[package]] -name = "ipytest" -version = "0.9.1" -description = "Unit tests in IPython notebooks." -category = "main" -optional = false -python-versions = ">=3" - -[package.dependencies] -ipython = "*" -packaging = "*" -pytest = ">=5.4" - -[[package]] -name = "ipython" -version = "7.19.0" -description = "IPython: Productive Interactive Computing" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -jedi = ">=0.10" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" -pygments = "*" -traitlets = ">=4.2" - -[package.extras] -all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.14)", "pygments", "qtconsole", "requests", "testpath"] -doc = ["Sphinx (>=1.3)"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["notebook", "ipywidgets"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.14)"] - -[[package]] -name = "ipython-genutils" -version = "0.2.0" -description = "Vestigial utilities from IPython" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "jedi" -version = "0.17.2" -description = "An autocompletion tool for Python that can be used for text editors." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -parso = ">=0.7.0,<0.8.0" - -[package.extras] -qa = ["flake8 (==3.7.9)"] -testing = ["Django (<3.1)", "colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] - -[[package]] -name = "jinja2" -version = "2.11.2" -description = "A very fast and expressive template engine." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -MarkupSafe = ">=0.23" - -[package.extras] -i18n = ["Babel (>=0.8)"] - -[[package]] -name = "json5" -version = "0.9.5" -description = "A Python implementation of the JSON5 data format." -category = "main" -optional = false -python-versions = "*" - -[package.extras] -dev = ["hypothesis"] - -[[package]] -name = "jsonschema" -version = "3.2.0" -description = "An implementation of JSON Schema validation for Python" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -attrs = ">=17.4.0" -pyrsistent = ">=0.14.0" -six = ">=1.11.0" - -[package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] - -[[package]] -name = "jupyter-client" -version = "6.1.7" -description = "Jupyter protocol implementation and client libraries" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -jupyter-core = ">=4.6.0" -python-dateutil = ">=2.1" -pyzmq = ">=13" -tornado = ">=4.1" -traitlets = "*" - -[package.extras] -test = ["ipykernel", "ipython", "mock", "pytest", "pytest-asyncio", "async-generator", "pytest-timeout"] - -[[package]] -name = "jupyter-core" -version = "4.7.0" -description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\""} -traitlets = "*" - -[[package]] -name = "jupyterlab" -version = "2.2.9" -description = "The JupyterLab notebook server extension." -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -jinja2 = ">=2.10" -jupyterlab-server = ">=1.1.5,<2.0" -notebook = ">=4.3.1" -tornado = "<6.0.0 || >6.0.0,<6.0.1 || >6.0.1,<6.0.2 || >6.0.2" - -[package.extras] -docs = ["jsx-lexer", "recommonmark", "sphinx", "sphinx-rtd-theme", "sphinx-copybutton"] -test = ["pytest", "pytest-check-links", "requests", "wheel", "virtualenv"] - -[[package]] -name = "jupyterlab-pygments" -version = "0.1.2" -description = "Pygments theme using JupyterLab CSS variables" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pygments = ">=2.4.1,<3" - -[[package]] -name = "jupyterlab-server" -version = "1.2.0" -description = "JupyterLab Server" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -jinja2 = ">=2.10" -json5 = "*" -jsonschema = ">=3.0.1" -notebook = ">=4.2.0" -requests = "*" - -[package.extras] -test = ["pytest", "requests"] - -[[package]] -name = "markupsafe" -version = "1.1.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[[package]] -name = "mccabe" -version = "0.6.1" -description = "McCabe checker, plugin for flake8" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "mistune" -version = "0.8.4" -description = "The fastest markdown parser in pure Python" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "nbclient" -version = "0.5.1" -description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -async-generator = "*" -jupyter-client = ">=6.1.5" -nbformat = ">=5.0" -nest-asyncio = "*" -traitlets = ">=4.2" - -[package.extras] -dev = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] -sphinx = ["Sphinx (>=1.7)", "sphinx-book-theme", "mock", "moto", "myst-parser"] -test = ["codecov", "coverage", "ipython", "ipykernel", "ipywidgets", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "check-manifest", "flake8", "mypy", "tox", "bumpversion", "xmltodict", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "black"] - -[[package]] -name = "nbconvert" -version = "6.0.7" -description = "Converting Jupyter Notebooks" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -bleach = "*" -defusedxml = "*" -entrypoints = ">=0.2.2" -jinja2 = ">=2.4" -jupyter-core = "*" -jupyterlab-pygments = "*" -mistune = ">=0.8.1,<2" -nbclient = ">=0.5.0,<0.6.0" -nbformat = ">=4.4" -pandocfilters = ">=1.4.1" -pygments = ">=2.4.1" -testpath = "*" -traitlets = ">=4.2" - -[package.extras] -all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] -docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] -serve = ["tornado (>=4.0)"] -test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pyppeteer (==0.2.2)"] -webpdf = ["pyppeteer (==0.2.2)"] - -[[package]] -name = "nbformat" -version = "5.0.8" -description = "The Jupyter Notebook format" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -ipython-genutils = "*" -jsonschema = ">=2.4,<2.5.0 || >2.5.0" -jupyter-core = "*" -traitlets = ">=4.1" - -[package.extras] -fast = ["fastjsonschema"] -test = ["fastjsonschema", "testpath", "pytest", "pytest-cov"] - -[[package]] -name = "nest-asyncio" -version = "1.4.3" -description = "Patch asyncio to allow nested event loops" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "notebook" -version = "6.1.5" -description = "A web-based notebook environment for interactive computing" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -argon2-cffi = "*" -ipykernel = "*" -ipython-genutils = "*" -jinja2 = "*" -jupyter-client = ">=5.3.4" -jupyter-core = ">=4.6.1" -nbconvert = "*" -nbformat = "*" -prometheus-client = "*" -pyzmq = ">=17" -Send2Trash = "*" -terminado = ">=0.8.3" -tornado = ">=5.0" -traitlets = ">=4.2.1" - -[package.extras] -docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt"] -test = ["nose", "coverage", "requests", "nose-warnings-filters", "nbval", "nose-exclude", "selenium", "pytest", "pytest-cov", "requests-unixsocket"] - -[[package]] -name = "packaging" -version = "20.7" -description = "Core utilities for Python packages" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pyparsing = ">=2.0.2" - -[[package]] -name = "pandocfilters" -version = "1.4.3" -description = "Utilities for writing pandoc filters in python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "papermill" -version = "2.2.2" -description = "Parametrize and run Jupyter and nteract Notebooks" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -ansiwrap = "*" -black = "*" -click = "*" -entrypoints = "*" -nbclient = ">=0.2.0" -nbformat = "*" -pyyaml = "*" -requests = "*" -tenacity = "*" -tqdm = ">=4.32.2" - -[package.extras] -all = ["boto3", "azure-datalake-store (>=0.0.30)", "azure-storage-blob (>=12.1.0)", "requests (>=2.21.0)", "gcsfs (>=0.2.0)", "pyarrow"] -azure = ["azure-datalake-store (>=0.0.30)", "azure-storage-blob (>=12.1.0)", "requests (>=2.21.0)"] -dev = ["boto3", "botocore", "codecov", "coverage", "google-compute-engine", "ipython (>=5.0)", "ipywidgets", "notebook", "mock", "moto", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "pytest-mock (>=1.10)", "pytest-env (>=0.6.2)", "requests (>=2.21.0)", "check-manifest", "attrs (>=17.4.0)", "pre-commit", "flake8", "tox", "bumpversion", "recommonmark", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "azure-datalake-store (>=0.0.30)", "azure-storage-blob (>=12.1.0)", "gcsfs (>=0.2.0)", "pyarrow"] -gcs = ["gcsfs (>=0.2.0)"] -hdfs = ["pyarrow"] -s3 = ["boto3"] -test = ["boto3", "botocore", "codecov", "coverage", "google-compute-engine", "ipython (>=5.0)", "ipywidgets", "notebook", "mock", "moto", "pytest (>=4.1)", "pytest-cov (>=2.6.1)", "pytest-mock (>=1.10)", "pytest-env (>=0.6.2)", "requests (>=2.21.0)", "check-manifest", "attrs (>=17.4.0)", "pre-commit", "flake8", "tox", "bumpversion", "recommonmark", "pip (>=18.1)", "wheel (>=0.31.0)", "setuptools (>=38.6.0)", "twine (>=1.11.0)", "azure-datalake-store (>=0.0.30)", "azure-storage-blob (>=12.1.0)", "gcsfs (>=0.2.0)", "pyarrow"] - -[[package]] -name = "parso" -version = "0.7.1" -description = "A Python Parser" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -testing = ["docopt", "pytest (>=3.0.7)"] - -[[package]] -name = "pathspec" -version = "0.8.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pbr" -version = "5.5.1" -description = "Python Build Reasonableness" -category = "dev" -optional = false -python-versions = ">=2.6" - -[[package]] -name = "pexpect" -version = "4.8.0" -description = "Pexpect allows easy control of interactive console applications." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pluggy" -version = "0.13.1" -description = "plugin and hook calling mechanisms for python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -dev = ["pre-commit", "tox"] - -[[package]] -name = "prometheus-client" -version = "0.9.0" -description = "Python client for the Prometheus monitoring system." -category = "main" -optional = false -python-versions = "*" - -[package.extras] -twisted = ["twisted"] - -[[package]] -name = "prompt-toolkit" -version = "3.0.8" -description = "Library for building powerful interactive command lines in Python" -category = "main" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -wcwidth = "*" - -[[package]] -name = "ptyprocess" -version = "0.6.0" -description = "Run a subprocess in a pseudo terminal" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "py" -version = "1.9.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pycodestyle" -version = "2.6.0" -description = "Python style guide checker" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pycparser" -version = "2.20" -description = "C parser in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pyflakes" -version = "2.2.0" -description = "passive checker of Python programs" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pygments" -version = "2.7.2" -description = "Pygments is a syntax highlighting package written in Python." -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "pyrsistent" -version = "0.17.3" -description = "Persistent/Functional/Immutable data structures" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "pytest" -version = "6.1.2" -description = "pytest: simple powerful testing with Python" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=17.4.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<1.0" -py = ">=1.8.2" -toml = "*" - -[package.extras] -checkqa_mypy = ["mypy (==0.780)"] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "python-dateutil" -version = "2.8.1" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-jsonrpc-server" -version = "0.4.0" -description = "JSON RPC 2.0 server library" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -ujson = ">=3.0.0" - -[package.extras] -test = ["versioneer", "pylint", "pycodestyle", "pyflakes", "pytest", "mock", "pytest-cov", "coverage"] - -[[package]] -name = "python-language-server" -version = "0.36.2" -description = "Python Language Server for the Language Server Protocol" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -jedi = ">=0.17.2,<0.18.0" -pluggy = "*" -python-jsonrpc-server = ">=0.4.0" - -[package.extras] -all = ["autopep8", "flake8 (>=3.8.0)", "mccabe (>=0.6.0,<0.7.0)", "pycodestyle (>=2.6.0,<2.7.0)", "pydocstyle (>=2.0.0)", "pyflakes (>=2.2.0,<2.3.0)", "pylint (>=2.5.0)", "rope (>=0.10.5)", "yapf"] -autopep8 = ["autopep8"] -flake8 = ["flake8 (>=3.8.0)"] -mccabe = ["mccabe (>=0.6.0,<0.7.0)"] -pycodestyle = ["pycodestyle (>=2.6.0,<2.7.0)"] -pydocstyle = ["pydocstyle (>=2.0.0)"] -pyflakes = ["pyflakes (>=2.2.0,<2.3.0)"] -pylint = ["pylint (>=2.5.0)"] -rope = ["rope (>0.10.5)"] -test = ["versioneer", "pylint (>=2.5.0)", "pytest", "mock", "pytest-cov", "coverage", "numpy", "pandas", "matplotlib", "flaky", "pyqt5"] -yapf = ["yapf"] - -[[package]] -name = "pywin32" -version = "300" -description = "Python for Window Extensions" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pywinpty" -version = "0.5.7" -description = "Python bindings for the winpty library" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyyaml" -version = "5.3.1" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pyzmq" -version = "20.0.0" -description = "Python bindings for 0MQ" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -cffi = {version = "*", markers = "implementation_name === \"pypy\""} -py = {version = "*", markers = "implementation_name === \"pypy\""} - -[[package]] -name = "regex" -version = "2020.11.13" -description = "Alternative regular expression module, to replace re." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "requests" -version = "2.25.0" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -certifi = ">=2017.4.17" -chardet = ">=3.0.2,<4" -idna = ">=2.5,<3" -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] - -[[package]] -name = "safety" -version = "1.9.0" -description = "Checks installed dependencies for known vulnerabilities." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -Click = ">=6.0" -dparse = ">=0.5.1" -packaging = "*" -requests = "*" - -[[package]] -name = "send2trash" -version = "1.5.0" -description = "Send file to trash natively under Mac OS X, Windows and Linux." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "six" -version = "1.15.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "smmap" -version = "3.0.4" -description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "stevedore" -version = "3.3.0" -description = "Manage dynamic plugins for Python applications" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pbr = ">=2.0.0,<2.1.0 || >2.1.0" - -[[package]] -name = "tenacity" -version = "6.2.0" -description = "Retry code until it succeeds" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -six = ">=1.9.0" - -[package.extras] -doc = ["reno", "sphinx", "tornado (>=4.5)"] - -[[package]] -name = "terminado" -version = "0.9.1" -description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -ptyprocess = {version = "*", markers = "os_name != \"nt\""} -pywinpty = {version = ">=0.5", markers = "os_name == \"nt\""} -tornado = ">=4" - -[[package]] -name = "testpath" -version = "0.4.4" -description = "Test utilities for code working with files and commands" -category = "main" -optional = false -python-versions = "*" - -[package.extras] -test = ["pathlib2"] - -[[package]] -name = "textwrap3" -version = "0.9.2" -description = "textwrap from Python 3.6 backport (plus a few tweaks)" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tornado" -version = "6.1" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" -optional = false -python-versions = ">= 3.5" - -[[package]] -name = "tqdm" -version = "4.54.1" -description = "Fast, Extensible Progress Meter" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" - -[package.extras] -dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown", "wheel"] - -[[package]] -name = "traitlets" -version = "5.0.5" -description = "Traitlets Python configuration system" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -ipython-genutils = "*" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "typed-ast" -version = "1.4.1" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "typing-extensions" -version = "3.7.4.3" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "ujson" -version = "4.0.2" -description = "Ultra fast JSON encoder and decoder for Python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "urllib3" -version = "1.26.2" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "wcwidth" -version = "0.2.5" -description = "Measures the displayed width of unicode strings in a terminal" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -category = "main" -optional = false -python-versions = "*" - -[metadata] -lock-version = "1.1" -python-versions = "^3.8" -content-hash = "e9a1d7d3d427fc8cad4bf83b77e92a9c3618edfc00e593b99c25a58b00ad8e25" - -[metadata.files] -ansiwrap = [ - {file = "ansiwrap-0.8.4-py2.py3-none-any.whl", hash = "sha256:7b053567c88e1ad9eed030d3ac41b722125e4c1271c8a99ade797faff1f49fb1"}, - {file = "ansiwrap-0.8.4.zip", hash = "sha256:ca0c740734cde59bf919f8ff2c386f74f9a369818cdc60efe94893d01ea8d9b7"}, -] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] -appnope = [ - {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, - {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, -] -argon2-cffi = [ - {file = "argon2-cffi-20.1.0.tar.gz", hash = "sha256:d8029b2d3e4b4cea770e9e5a0104dd8fa185c1724a0f01528ae4826a6d25f97d"}, - {file = "argon2_cffi-20.1.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:6ea92c980586931a816d61e4faf6c192b4abce89aa767ff6581e6ddc985ed003"}, - {file = "argon2_cffi-20.1.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:05a8ac07c7026542377e38389638a8a1e9b78f1cd8439cd7493b39f08dd75fbf"}, - {file = "argon2_cffi-20.1.0-cp27-cp27m-win32.whl", hash = "sha256:0bf066bc049332489bb2d75f69216416329d9dc65deee127152caeb16e5ce7d5"}, - {file = "argon2_cffi-20.1.0-cp27-cp27m-win_amd64.whl", hash = "sha256:57358570592c46c420300ec94f2ff3b32cbccd10d38bdc12dc6979c4a8484fbc"}, - {file = "argon2_cffi-20.1.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7d455c802727710e9dfa69b74ccaab04568386ca17b0ad36350b622cd34606fe"}, - {file = "argon2_cffi-20.1.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:b160416adc0f012fb1f12588a5e6954889510f82f698e23ed4f4fa57f12a0647"}, - {file = "argon2_cffi-20.1.0-cp35-cp35m-win32.whl", hash = "sha256:9bee3212ba4f560af397b6d7146848c32a800652301843df06b9e8f68f0f7361"}, - {file = "argon2_cffi-20.1.0-cp35-cp35m-win_amd64.whl", hash = "sha256:392c3c2ef91d12da510cfb6f9bae52512a4552573a9e27600bdb800e05905d2b"}, - {file = "argon2_cffi-20.1.0-cp36-cp36m-win32.whl", hash = "sha256:ba7209b608945b889457f949cc04c8e762bed4fe3fec88ae9a6b7765ae82e496"}, - {file = "argon2_cffi-20.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:da7f0445b71db6d3a72462e04f36544b0de871289b0bc8a7cc87c0f5ec7079fa"}, - {file = "argon2_cffi-20.1.0-cp37-abi3-macosx_10_6_intel.whl", hash = "sha256:cc0e028b209a5483b6846053d5fd7165f460a1f14774d79e632e75e7ae64b82b"}, - {file = "argon2_cffi-20.1.0-cp37-cp37m-win32.whl", hash = "sha256:18dee20e25e4be86680b178b35ccfc5d495ebd5792cd00781548d50880fee5c5"}, - {file = "argon2_cffi-20.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6678bb047373f52bcff02db8afab0d2a77d83bde61cfecea7c5c62e2335cb203"}, - {file = "argon2_cffi-20.1.0-cp38-cp38-win32.whl", hash = "sha256:77e909cc756ef81d6abb60524d259d959bab384832f0c651ed7dcb6e5ccdbb78"}, - {file = "argon2_cffi-20.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:9dfd5197852530294ecb5795c97a823839258dfd5eb9420233c7cfedec2058f2"}, - {file = "argon2_cffi-20.1.0-cp39-cp39-win32.whl", hash = "sha256:e2db6e85c057c16d0bd3b4d2b04f270a7467c147381e8fd73cbbe5bc719832be"}, - {file = "argon2_cffi-20.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:8a84934bd818e14a17943de8099d41160da4a336bcc699bb4c394bbb9b94bd32"}, -] -async-generator = [ - {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"}, - {file = "async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, - {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, -] -backcall = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] -bandit = [ - {file = "bandit-1.6.2-py2.py3-none-any.whl", hash = "sha256:336620e220cf2d3115877685e264477ff9d9abaeb0afe3dc7264f55fa17a3952"}, - {file = "bandit-1.6.2.tar.gz", hash = "sha256:41e75315853507aa145d62a78a2a6c5e3240fe14ee7c601459d0df9418196065"}, -] -black = [ - {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, -] -bleach = [ - {file = "bleach-3.2.1-py2.py3-none-any.whl", hash = "sha256:9f8ccbeb6183c6e6cddea37592dfb0167485c1e3b13b3363bc325aa8bda3adbd"}, - {file = "bleach-3.2.1.tar.gz", hash = "sha256:52b5919b81842b1854196eaae5ca29679a2f2e378905c346d3ca8227c2c66080"}, -] -certifi = [ - {file = "certifi-2020.11.8-py2.py3-none-any.whl", hash = "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd"}, - {file = "certifi-2020.11.8.tar.gz", hash = "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4"}, -] -cffi = [ - {file = "cffi-1.14.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775"}, - {file = "cffi-1.14.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06"}, - {file = "cffi-1.14.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26"}, - {file = "cffi-1.14.4-cp27-cp27m-win32.whl", hash = "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c"}, - {file = "cffi-1.14.4-cp27-cp27m-win_amd64.whl", hash = "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b"}, - {file = "cffi-1.14.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d"}, - {file = "cffi-1.14.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca"}, - {file = "cffi-1.14.4-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698"}, - {file = "cffi-1.14.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b"}, - {file = "cffi-1.14.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293"}, - {file = "cffi-1.14.4-cp35-cp35m-win32.whl", hash = "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2"}, - {file = "cffi-1.14.4-cp35-cp35m-win_amd64.whl", hash = "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7"}, - {file = "cffi-1.14.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f"}, - {file = "cffi-1.14.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362"}, - {file = "cffi-1.14.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec"}, - {file = "cffi-1.14.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b"}, - {file = "cffi-1.14.4-cp36-cp36m-win32.whl", hash = "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668"}, - {file = "cffi-1.14.4-cp36-cp36m-win_amd64.whl", hash = "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009"}, - {file = "cffi-1.14.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb"}, - {file = "cffi-1.14.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d"}, - {file = "cffi-1.14.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03"}, - {file = "cffi-1.14.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a5ed8c05548b54b998b9498753fb9cadbfd92ee88e884641377d8a8b291bcc01"}, - {file = "cffi-1.14.4-cp37-cp37m-win32.whl", hash = "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e"}, - {file = "cffi-1.14.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35"}, - {file = "cffi-1.14.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d"}, - {file = "cffi-1.14.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b"}, - {file = "cffi-1.14.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53"}, - {file = "cffi-1.14.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:d5ff0621c88ce83a28a10d2ce719b2ee85635e85c515f12bac99a95306da4b2e"}, - {file = "cffi-1.14.4-cp38-cp38-win32.whl", hash = "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d"}, - {file = "cffi-1.14.4-cp38-cp38-win_amd64.whl", hash = "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375"}, - {file = "cffi-1.14.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909"}, - {file = "cffi-1.14.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd"}, - {file = "cffi-1.14.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a"}, - {file = "cffi-1.14.4-cp39-cp39-win32.whl", hash = "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3"}, - {file = "cffi-1.14.4-cp39-cp39-win_amd64.whl", hash = "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b"}, - {file = "cffi-1.14.4.tar.gz", hash = "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c"}, -] -chardet = [ - {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, - {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, -] -click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -decorator = [ - {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, - {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, -] -defusedxml = [ - {file = "defusedxml-0.6.0-py2.py3-none-any.whl", hash = "sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93"}, - {file = "defusedxml-0.6.0.tar.gz", hash = "sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5"}, -] -dparse = [ - {file = "dparse-0.5.1-py3-none-any.whl", hash = "sha256:e953a25e44ebb60a5c6efc2add4420c177f1d8404509da88da9729202f306994"}, - {file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"}, -] -entrypoints = [ - {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, - {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, -] -flake8 = [ - {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, - {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, -] -flake8-bandit = [ - {file = "flake8_bandit-2.1.2.tar.gz", hash = "sha256:687fc8da2e4a239b206af2e54a90093572a60d0954f3054e23690739b0b0de3b"}, -] -flake8-bugbear = [ - {file = "flake8-bugbear-20.11.1.tar.gz", hash = "sha256:528020129fea2dea33a466b9d64ab650aa3e5f9ffc788b70ea4bc6cf18283538"}, - {file = "flake8_bugbear-20.11.1-py36.py37.py38-none-any.whl", hash = "sha256:f35b8135ece7a014bc0aee5b5d485334ac30a6da48494998cc1fabf7ec70d703"}, -] -flake8-polyfill = [ - {file = "flake8-polyfill-1.0.2.tar.gz", hash = "sha256:e44b087597f6da52ec6393a709e7108b2905317d0c0b744cdca6208e670d8eda"}, - {file = "flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9"}, -] -gitdb = [ - {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, - {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, -] -gitpython = [ - {file = "GitPython-3.1.11-py3-none-any.whl", hash = "sha256:6eea89b655917b500437e9668e4a12eabdcf00229a0df1762aabd692ef9b746b"}, - {file = "GitPython-3.1.11.tar.gz", hash = "sha256:befa4d101f91bad1b632df4308ec64555db684c360bd7d2130b4807d49ce86b8"}, -] -idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -ipykernel = [ - {file = "ipykernel-5.3.4-py3-none-any.whl", hash = "sha256:d6fbba26dba3cebd411382bc484f7bc2caa98427ae0ddb4ab37fe8bfeb5c7dd3"}, - {file = "ipykernel-5.3.4.tar.gz", hash = "sha256:9b2652af1607986a1b231c62302d070bc0534f564c393a5d9d130db9abbbe89d"}, -] -ipytest = [ - {file = "ipytest-0.9.1-py3-none-any.whl", hash = "sha256:e555a353feb44c52813e608dabeb1ee0590627a6fed6415801eecbd71fd30d25"}, - {file = "ipytest-0.9.1.tar.gz", hash = "sha256:72dcbb56ddfd34d896d1a46bf26aef5cdc187a584b8df9d8da41788094587aac"}, -] -ipython = [ - {file = "ipython-7.19.0-py3-none-any.whl", hash = "sha256:c987e8178ced651532b3b1ff9965925bfd445c279239697052561a9ab806d28f"}, - {file = "ipython-7.19.0.tar.gz", hash = "sha256:cbb2ef3d5961d44e6a963b9817d4ea4e1fa2eb589c371a470fed14d8d40cbd6a"}, -] -ipython-genutils = [ - {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, - {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, -] -jedi = [ - {file = "jedi-0.17.2-py2.py3-none-any.whl", hash = "sha256:98cc583fa0f2f8304968199b01b6b4b94f469a1f4a74c1560506ca2a211378b5"}, - {file = "jedi-0.17.2.tar.gz", hash = "sha256:86ed7d9b750603e4ba582ea8edc678657fb4007894a12bcf6f4bb97892f31d20"}, -] -jinja2 = [ - {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, - {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, -] -json5 = [ - {file = "json5-0.9.5-py2.py3-none-any.whl", hash = "sha256:af1a1b9a2850c7f62c23fde18be4749b3599fd302f494eebf957e2ada6b9e42c"}, - {file = "json5-0.9.5.tar.gz", hash = "sha256:703cfee540790576b56a92e1c6aaa6c4b0d98971dc358ead83812aa4d06bdb96"}, -] -jsonschema = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, -] -jupyter-client = [ - {file = "jupyter_client-6.1.7-py3-none-any.whl", hash = "sha256:c958d24d6eacb975c1acebb68ac9077da61b5f5c040f22f6849928ad7393b950"}, - {file = "jupyter_client-6.1.7.tar.gz", hash = "sha256:49e390b36fe4b4226724704ea28d9fb903f1a3601b6882ce3105221cd09377a1"}, -] -jupyter-core = [ - {file = "jupyter_core-4.7.0-py3-none-any.whl", hash = "sha256:0a451c9b295e4db772bdd8d06f2f1eb31caeec0e81fbb77ba37d4a3024e3b315"}, - {file = "jupyter_core-4.7.0.tar.gz", hash = "sha256:aa1f9496ab3abe72da4efe0daab0cb2233997914581f9a071e07498c6add8ed3"}, -] -jupyterlab = [ - {file = "jupyterlab-2.2.9-py3-none-any.whl", hash = "sha256:59af02c26a15ec2d2862a15bc72e41ae304b406a0b0d3f4f705eeb7caf91902b"}, - {file = "jupyterlab-2.2.9.tar.gz", hash = "sha256:3be8f8edea173753dd838c1b6d3bbcb6f5c801121f824a477025c1b6a1d33dc6"}, -] -jupyterlab-pygments = [ - {file = "jupyterlab_pygments-0.1.2-py2.py3-none-any.whl", hash = "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008"}, - {file = "jupyterlab_pygments-0.1.2.tar.gz", hash = "sha256:cfcda0873626150932f438eccf0f8bf22bfa92345b814890ab360d666b254146"}, -] -jupyterlab-server = [ - {file = "jupyterlab_server-1.2.0-py3-none-any.whl", hash = "sha256:55d256077bf13e5bc9e8fbd5aac51bef82f6315111cec6b712b9a5ededbba924"}, - {file = "jupyterlab_server-1.2.0.tar.gz", hash = "sha256:5431d9dde96659364b7cc877693d5d21e7b80cea7ae3959ecc2b87518e5f5d8c"}, -] -markupsafe = [ - {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, - {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, -] -mccabe = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, -] -mistune = [ - {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, - {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -nbclient = [ - {file = "nbclient-0.5.1-py3-none-any.whl", hash = "sha256:4d6b116187c795c99b9dba13d46e764d596574b14c296d60670c8dfe454db364"}, - {file = "nbclient-0.5.1.tar.gz", hash = "sha256:01e2d726d16eaf2cde6db74a87e2451453547e8832d142f73f72fddcd4fe0250"}, -] -nbconvert = [ - {file = "nbconvert-6.0.7-py3-none-any.whl", hash = "sha256:39e9f977920b203baea0be67eea59f7b37a761caa542abe80f5897ce3cf6311d"}, - {file = "nbconvert-6.0.7.tar.gz", hash = "sha256:cbbc13a86dfbd4d1b5dee106539de0795b4db156c894c2c5dc382062bbc29002"}, -] -nbformat = [ - {file = "nbformat-5.0.8-py3-none-any.whl", hash = "sha256:aa9450c16d29286dc69b92ea4913c1bffe86488f90184445996ccc03a2f60382"}, - {file = "nbformat-5.0.8.tar.gz", hash = "sha256:f545b22138865bfbcc6b1ffe89ed5a2b8e2dc5d4fe876f2ca60d8e6f702a30f8"}, -] -nest-asyncio = [ - {file = "nest_asyncio-1.4.3-py3-none-any.whl", hash = "sha256:dbe032f3e9ff7f120e76be22bf6e7958e867aed1743e6894b8a9585fe8495cc9"}, - {file = "nest_asyncio-1.4.3.tar.gz", hash = "sha256:eaa09ef1353ebefae19162ad423eef7a12166bcc63866f8bff8f3635353cd9fa"}, -] -notebook = [ - {file = "notebook-6.1.5-py3-none-any.whl", hash = "sha256:508cf9dad7cdb3188f1aa27017dc78179029dfe83814fc505329f689bc2ab50f"}, - {file = "notebook-6.1.5.tar.gz", hash = "sha256:3db37ae834c5f3b6378381229d0e5dfcbfb558d08c8ce646b1ad355147f5e91d"}, -] -packaging = [ - {file = "packaging-20.7-py2.py3-none-any.whl", hash = "sha256:eb41423378682dadb7166144a4926e443093863024de508ca5c9737d6bc08376"}, - {file = "packaging-20.7.tar.gz", hash = "sha256:05af3bb85d320377db281cf254ab050e1a7ebcbf5410685a9a407e18a1f81236"}, -] -pandocfilters = [ - {file = "pandocfilters-1.4.3.tar.gz", hash = "sha256:bc63fbb50534b4b1f8ebe1860889289e8af94a23bff7445259592df25a3906eb"}, -] -papermill = [ - {file = "papermill-2.2.2-py3-none-any.whl", hash = "sha256:761db2d6f478228f9152772e35aa05bf0e6e6eebcb63687d7e1970c44b316bfb"}, - {file = "papermill-2.2.2.tar.gz", hash = "sha256:1c452b1c5a9ab52b94c99d8b7705ae7173f6aa88a3d28a5d30cffba48a46f5b6"}, -] -parso = [ - {file = "parso-0.7.1-py2.py3-none-any.whl", hash = "sha256:97218d9159b2520ff45eb78028ba8b50d2bc61dcc062a9682666f2dc4bd331ea"}, - {file = "parso-0.7.1.tar.gz", hash = "sha256:caba44724b994a8a5e086460bb212abc5a8bc46951bf4a9a1210745953622eb9"}, -] -pathspec = [ - {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, - {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, -] -pbr = [ - {file = "pbr-5.5.1-py2.py3-none-any.whl", hash = "sha256:b236cde0ac9a6aedd5e3c34517b423cd4fd97ef723849da6b0d2231142d89c00"}, - {file = "pbr-5.5.1.tar.gz", hash = "sha256:5fad80b613c402d5b7df7bd84812548b2a61e9977387a80a5fc5c396492b13c9"}, -] -pexpect = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] -pickleshare = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -prometheus-client = [ - {file = "prometheus_client-0.9.0-py2.py3-none-any.whl", hash = "sha256:b08c34c328e1bf5961f0b4352668e6c8f145b4a087e09b7296ef62cbe4693d35"}, - {file = "prometheus_client-0.9.0.tar.gz", hash = "sha256:9da7b32f02439d8c04f7777021c304ed51d9ec180604700c1ba72a4d44dceb03"}, -] -prompt-toolkit = [ - {file = "prompt_toolkit-3.0.8-py3-none-any.whl", hash = "sha256:7debb9a521e0b1ee7d2fe96ee4bd60ef03c6492784de0547337ca4433e46aa63"}, - {file = "prompt_toolkit-3.0.8.tar.gz", hash = "sha256:25c95d2ac813909f813c93fde734b6e44406d1477a9faef7c915ff37d39c0a8c"}, -] -ptyprocess = [ - {file = "ptyprocess-0.6.0-py2.py3-none-any.whl", hash = "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"}, - {file = "ptyprocess-0.6.0.tar.gz", hash = "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0"}, -] -py = [ - {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, - {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, -] -pycodestyle = [ - {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, - {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, -] -pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, -] -pyflakes = [ - {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, - {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, -] -pygments = [ - {file = "Pygments-2.7.2-py3-none-any.whl", hash = "sha256:88a0bbcd659fcb9573703957c6b9cff9fab7295e6e76db54c9d00ae42df32773"}, - {file = "Pygments-2.7.2.tar.gz", hash = "sha256:381985fcc551eb9d37c52088a32914e00517e57f4a21609f48141ba08e193fa0"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pyrsistent = [ - {file = "pyrsistent-0.17.3.tar.gz", hash = "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e"}, -] -pytest = [ - {file = "pytest-6.1.2-py3-none-any.whl", hash = "sha256:4288fed0d9153d9646bfcdf0c0428197dba1ecb27a33bb6e031d002fa88653fe"}, - {file = "pytest-6.1.2.tar.gz", hash = "sha256:c0a7e94a8cdbc5422a51ccdad8e6f1024795939cc89159a0ae7f0b316ad3823e"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, - {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, -] -python-jsonrpc-server = [ - {file = "python-jsonrpc-server-0.4.0.tar.gz", hash = "sha256:62c543e541f101ec5b57dc654efc212d2c2e3ea47ff6f54b2e7dcb36ecf20595"}, - {file = "python_jsonrpc_server-0.4.0-py3-none-any.whl", hash = "sha256:e5a908ff182e620aac07db5f57887eeb0afe33993008f57dc1b85b594cea250c"}, -] -python-language-server = [ - {file = "python-language-server-0.36.2.tar.gz", hash = "sha256:9984c84a67ee2c5102c8e703215f407fcfa5e62b0ae86c9572d0ada8c4b417b0"}, - {file = "python_language_server-0.36.2-py2.py3-none-any.whl", hash = "sha256:a0ad0aca03f4a20c1c40f4f230c6773eac82c9b7cdb026cb09ba10237f4815d5"}, -] -pywin32 = [ - {file = "pywin32-300-cp35-cp35m-win32.whl", hash = "sha256:1c204a81daed2089e55d11eefa4826c05e604d27fe2be40b6bf8db7b6a39da63"}, - {file = "pywin32-300-cp35-cp35m-win_amd64.whl", hash = "sha256:350c5644775736351b77ba68da09a39c760d75d2467ecec37bd3c36a94fbed64"}, - {file = "pywin32-300-cp36-cp36m-win32.whl", hash = "sha256:a3b4c48c852d4107e8a8ec980b76c94ce596ea66d60f7a697582ea9dce7e0db7"}, - {file = "pywin32-300-cp36-cp36m-win_amd64.whl", hash = "sha256:27a30b887afbf05a9cbb05e3ffd43104a9b71ce292f64a635389dbad0ed1cd85"}, - {file = "pywin32-300-cp37-cp37m-win32.whl", hash = "sha256:d7e8c7efc221f10d6400c19c32a031add1c4a58733298c09216f57b4fde110dc"}, - {file = "pywin32-300-cp37-cp37m-win_amd64.whl", hash = "sha256:8151e4d7a19262d6694162d6da85d99a16f8b908949797fd99c83a0bfaf5807d"}, - {file = "pywin32-300-cp38-cp38-win32.whl", hash = "sha256:fbb3b1b0fbd0b4fc2a3d1d81fe0783e30062c1abed1d17c32b7879d55858cfae"}, - {file = "pywin32-300-cp38-cp38-win_amd64.whl", hash = "sha256:60a8fa361091b2eea27f15718f8eb7f9297e8d51b54dbc4f55f3d238093d5190"}, - {file = "pywin32-300-cp39-cp39-win32.whl", hash = "sha256:638b68eea5cfc8def537e43e9554747f8dee786b090e47ead94bfdafdb0f2f50"}, - {file = "pywin32-300-cp39-cp39-win_amd64.whl", hash = "sha256:b1609ce9bd5c411b81f941b246d683d6508992093203d4eb7f278f4ed1085c3f"}, -] -pywinpty = [ - {file = "pywinpty-0.5.7-cp27-cp27m-win32.whl", hash = "sha256:b358cb552c0f6baf790de375fab96524a0498c9df83489b8c23f7f08795e966b"}, - {file = "pywinpty-0.5.7-cp27-cp27m-win_amd64.whl", hash = "sha256:1e525a4de05e72016a7af27836d512db67d06a015aeaf2fa0180f8e6a039b3c2"}, - {file = "pywinpty-0.5.7-cp35-cp35m-win32.whl", hash = "sha256:2740eeeb59297593a0d3f762269b01d0285c1b829d6827445fcd348fb47f7e70"}, - {file = "pywinpty-0.5.7-cp35-cp35m-win_amd64.whl", hash = "sha256:33df97f79843b2b8b8bc5c7aaf54adec08cc1bae94ee99dfb1a93c7a67704d95"}, - {file = "pywinpty-0.5.7-cp36-cp36m-win32.whl", hash = "sha256:e854211df55d107f0edfda8a80b39dfc87015bef52a8fe6594eb379240d81df2"}, - {file = "pywinpty-0.5.7-cp36-cp36m-win_amd64.whl", hash = "sha256:dbd838de92de1d4ebf0dce9d4d5e4fc38d0b7b1de837947a18b57a882f219139"}, - {file = "pywinpty-0.5.7-cp37-cp37m-win32.whl", hash = "sha256:5fb2c6c6819491b216f78acc2c521b9df21e0f53b9a399d58a5c151a3c4e2a2d"}, - {file = "pywinpty-0.5.7-cp37-cp37m-win_amd64.whl", hash = "sha256:dd22c8efacf600730abe4a46c1388355ce0d4ab75dc79b15d23a7bd87bf05b48"}, - {file = "pywinpty-0.5.7-cp38-cp38-win_amd64.whl", hash = "sha256:8fc5019ff3efb4f13708bd3b5ad327589c1a554cb516d792527361525a7cb78c"}, - {file = "pywinpty-0.5.7.tar.gz", hash = "sha256:2d7e9c881638a72ffdca3f5417dd1563b60f603e1b43e5895674c2a1b01f95a0"}, -] -pyyaml = [ - {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, - {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, - {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, - {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, - {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"}, - {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"}, - {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, -] -pyzmq = [ - {file = "pyzmq-20.0.0-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:523d542823cabb94065178090e05347bd204365f6e7cb260f0071c995d392fc2"}, - {file = "pyzmq-20.0.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:225774a48ed7414c0395335e7123ef8c418dbcbe172caabdc2496133b03254c2"}, - {file = "pyzmq-20.0.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:bc7dd697356b31389d5118b9bcdef3e8d8079e8181800c4e8d72dccd56e1ff68"}, - {file = "pyzmq-20.0.0-cp35-cp35m-win32.whl", hash = "sha256:d81184489369ec325bd50ba1c935361e63f31f578430b9ad95471899361a8253"}, - {file = "pyzmq-20.0.0-cp35-cp35m-win_amd64.whl", hash = "sha256:7113eb93dcd0a5750c65d123ed0099e036a3a3f2dcb48afedd025ffa125c983b"}, - {file = "pyzmq-20.0.0-cp36-cp36m-macosx_10_9_intel.whl", hash = "sha256:b62113eeb9a0649cebed9b21fd578f3a0175ef214a2a91dcb7b31bbf55805295"}, - {file = "pyzmq-20.0.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:f0beef935efe78a63c785bb21ed56c1c24448511383e3994927c8bb2caf5e714"}, - {file = "pyzmq-20.0.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:46250789730489009fe139cbf576679557c070a6a3628077d09a4153d52fd381"}, - {file = "pyzmq-20.0.0-cp36-cp36m-win32.whl", hash = "sha256:bf755905a7d30d2749079611b9a89924c1f2da2695dc09ce221f42122c9808e3"}, - {file = "pyzmq-20.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2742e380d186673eee6a570ef83d4568741945434ba36d92b98d36cdbfedbd44"}, - {file = "pyzmq-20.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1e9b75a119606732023a305d1c214146c09a91f8116f6aff3e8b7d0a60b6f0ff"}, - {file = "pyzmq-20.0.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:03638e46d486dd1c118e03c8bf9c634bdcae679600eac6573ae1e54906de7c2f"}, - {file = "pyzmq-20.0.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:63ee08e35be72fdd7568065a249a5b5cf51a2e8ab6ee63cf9f73786fcb9e710b"}, - {file = "pyzmq-20.0.0-cp37-cp37m-win32.whl", hash = "sha256:c95dda497a7c1b1e734b5e8353173ca5dd7b67784d8821d13413a97856588057"}, - {file = "pyzmq-20.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:cc09c5cd1a4332611c8564d65e6a432dc6db3e10793d0254da9fa1e31d9ffd6d"}, - {file = "pyzmq-20.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6e24907857c80dc67692e31f5bf3ad5bf483ee0142cec95b3d47e2db8c43bdda"}, - {file = "pyzmq-20.0.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:895695be380f0f85d2e3ec5ccf68a93c92d45bd298567525ad5633071589872c"}, - {file = "pyzmq-20.0.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d92c7f41a53ece82b91703ea433c7d34143248cf0cead33aa11c5fc621c764bf"}, - {file = "pyzmq-20.0.0-cp38-cp38-win32.whl", hash = "sha256:309d763d89ec1845c0e0fa14e1fb6558fd8c9ef05ed32baec27d7a8499cc7bb0"}, - {file = "pyzmq-20.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:0e554fd390021edbe0330b67226325a820b0319c5b45e1b0a59bf22ccc36e793"}, - {file = "pyzmq-20.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cfa54a162a7b32641665e99b2c12084555afe9fc8fe80ec8b2f71a57320d10e1"}, - {file = "pyzmq-20.0.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:5efe02bdcc5eafcac0aab531292294298f0ab8d28ed43be9e507d0e09173d1a4"}, - {file = "pyzmq-20.0.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:0af84f34f27b5c6a0e906c648bdf46d4caebf9c8e6e16db0728f30a58141cad6"}, - {file = "pyzmq-20.0.0-cp39-cp39-win32.whl", hash = "sha256:c63fafd2556d218368c51d18588f8e6f8d86d09d493032415057faf6de869b34"}, - {file = "pyzmq-20.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:f110a4d3f8f01209eec304ed542f6c8054cce9b0f16dfe3d571e57c290e4e133"}, - {file = "pyzmq-20.0.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4d9259a5eb3f71abbaf61f165cacf42240bfeea3783bebd8255341abdfe206f1"}, - {file = "pyzmq-20.0.0.tar.gz", hash = "sha256:824ad5888331aadeac772bce27e1c2fbcab82fade92edbd234542c4e12f0dca9"}, -] -regex = [ - {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, - {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, - {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, - {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, - {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, - {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, - {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, - {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, - {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, - {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, - {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, - {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, - {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, -] -requests = [ - {file = "requests-2.25.0-py2.py3-none-any.whl", hash = "sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998"}, - {file = "requests-2.25.0.tar.gz", hash = "sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8"}, -] -safety = [ - {file = "safety-1.9.0-py2.py3-none-any.whl", hash = "sha256:86c1c4a031fe35bd624fce143fbe642a0234d29f7cbf7a9aa269f244a955b087"}, - {file = "safety-1.9.0.tar.gz", hash = "sha256:23bf20690d4400edc795836b0c983c2b4cbbb922233108ff925b7dd7750f00c9"}, -] -send2trash = [ - {file = "Send2Trash-1.5.0-py3-none-any.whl", hash = "sha256:f1691922577b6fa12821234aeb57599d887c4900b9ca537948d2dac34aea888b"}, - {file = "Send2Trash-1.5.0.tar.gz", hash = "sha256:60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2"}, -] -six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, -] -smmap = [ - {file = "smmap-3.0.4-py2.py3-none-any.whl", hash = "sha256:54c44c197c819d5ef1991799a7e30b662d1e520f2ac75c9efbeb54a742214cf4"}, - {file = "smmap-3.0.4.tar.gz", hash = "sha256:9c98bbd1f9786d22f14b3d4126894d56befb835ec90cef151af566c7e19b5d24"}, -] -stevedore = [ - {file = "stevedore-3.3.0-py3-none-any.whl", hash = "sha256:50d7b78fbaf0d04cd62411188fa7eedcb03eb7f4c4b37005615ceebe582aa82a"}, - {file = "stevedore-3.3.0.tar.gz", hash = "sha256:3a5bbd0652bf552748871eaa73a4a8dc2899786bc497a2aa1fcb4dcdb0debeee"}, -] -tenacity = [ - {file = "tenacity-6.2.0-py2.py3-none-any.whl", hash = "sha256:5a5d3dcd46381abe8b4f82b5736b8726fd3160c6c7161f53f8af7f1eb9b82173"}, - {file = "tenacity-6.2.0.tar.gz", hash = "sha256:29ae90e7faf488a8628432154bb34ace1cca58244c6ea399fd33f066ac71339a"}, -] -terminado = [ - {file = "terminado-0.9.1-py3-none-any.whl", hash = "sha256:c55f025beb06c2e2669f7ba5a04f47bb3304c30c05842d4981d8f0fc9ab3b4e3"}, - {file = "terminado-0.9.1.tar.gz", hash = "sha256:3da72a155b807b01c9e8a5babd214e052a0a45a975751da3521a1c3381ce6d76"}, -] -testpath = [ - {file = "testpath-0.4.4-py2.py3-none-any.whl", hash = "sha256:bfcf9411ef4bf3db7579063e0546938b1edda3d69f4e1fb8756991f5951f85d4"}, - {file = "testpath-0.4.4.tar.gz", hash = "sha256:60e0a3261c149755f4399a1fff7d37523179a70fdc3abdf78de9fc2604aeec7e"}, -] -textwrap3 = [ - {file = "textwrap3-0.9.2-py2.py3-none-any.whl", hash = "sha256:bf5f4c40faf2a9ff00a9e0791fed5da7415481054cef45bb4a3cfb1f69044ae0"}, - {file = "textwrap3-0.9.2.zip", hash = "sha256:5008eeebdb236f6303dcd68f18b856d355f6197511d952ba74bc75e40e0c3414"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tornado = [ - {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, - {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, - {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, - {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, - {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, - {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, - {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, - {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, - {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, - {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, - {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, - {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, - {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, - {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, - {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, - {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, - {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, - {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, - {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, - {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, - {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, - {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, - {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, - {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, - {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, - {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, - {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, -] -tqdm = [ - {file = "tqdm-4.54.1-py2.py3-none-any.whl", hash = "sha256:d4f413aecb61c9779888c64ddf0c62910ad56dcbe857d8922bb505d4dbff0df1"}, - {file = "tqdm-4.54.1.tar.gz", hash = "sha256:38b658a3e4ecf9b4f6f8ff75ca16221ae3378b2e175d846b6b33ea3a20852cf5"}, -] -traitlets = [ - {file = "traitlets-5.0.5-py3-none-any.whl", hash = "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"}, - {file = "traitlets-5.0.5.tar.gz", hash = "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396"}, -] -typed-ast = [ - {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, - {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, - {file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"}, - {file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"}, - {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, - {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, - {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, - {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, - {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, - {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, - {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, - {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, - {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, - {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, - {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, - {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, - {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, - {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, - {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, - {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, - {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:92c325624e304ebf0e025d1224b77dd4e6393f18aab8d829b5b7e04afe9b7a2c"}, - {file = "typed_ast-1.4.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d648b8e3bf2fe648745c8ffcee3db3ff903d0817a01a12dd6a6ea7a8f4889072"}, - {file = "typed_ast-1.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fac11badff8313e23717f3dada86a15389d0708275bddf766cca67a84ead3e91"}, - {file = "typed_ast-1.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0d8110d78a5736e16e26213114a38ca35cb15b6515d535413b090bd50951556d"}, - {file = "typed_ast-1.4.1-cp39-cp39-win32.whl", hash = "sha256:b52ccf7cfe4ce2a1064b18594381bccf4179c2ecf7f513134ec2f993dd4ab395"}, - {file = "typed_ast-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:3742b32cf1c6ef124d57f95be609c473d7ec4c14d0090e5a5e05a15269fb4d0c"}, - {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, -] -typing-extensions = [ - {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, - {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, - {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, -] -ujson = [ - {file = "ujson-4.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:e390df0dcc7897ffb98e17eae1f4c442c39c91814c298ad84d935a3c5c7a32fa"}, - {file = "ujson-4.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:84b1dca0d53b0a8d58835f72ea2894e4d6cf7a5dd8f520ab4cbd698c81e49737"}, - {file = "ujson-4.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:91396a585ba51f84dc71c8da60cdc86de6b60ba0272c389b6482020a1fac9394"}, - {file = "ujson-4.0.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:eb6b25a7670c7537a5998e695fa62ff13c7f9c33faf82927adf4daa460d5f62e"}, - {file = "ujson-4.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f8aded54c2bc554ce20b397f72101737dd61ee7b81c771684a7dd7805e6cca0c"}, - {file = "ujson-4.0.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:30962467c36ff6de6161d784cd2a6aac1097f0128b522d6e9291678e34fb2b47"}, - {file = "ujson-4.0.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:fc51e545d65689c398161f07fd405104956ec27f22453de85898fa088b2cd4bb"}, - {file = "ujson-4.0.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e6e90330670c78e727d6637bb5a215d3e093d8e3570d439fd4922942f88da361"}, - {file = "ujson-4.0.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:5e1636b94c7f1f59a8ead4c8a7bab1b12cc52d4c21ababa295ffec56b445fd2a"}, - {file = "ujson-4.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:e2cadeb0ddc98e3963bea266cc5b884e5d77d73adf807f0bda9eca64d1c509d5"}, - {file = "ujson-4.0.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a214ba5a21dad71a43c0f5aef917cd56a2d70bc974d845be211c66b6742a471c"}, - {file = "ujson-4.0.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:0190d26c0e990c17ad072ec8593647218fe1c675d11089cd3d1440175b568967"}, - {file = "ujson-4.0.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:f273a875c0b42c2a019c337631bc1907f6fdfbc84210cc0d1fff0e2019bbfaec"}, - {file = "ujson-4.0.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:d3a87888c40b5bfcf69b4030427cd666893e826e82cc8608d1ba8b4b5e04ea99"}, - {file = "ujson-4.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:7333e8bc45ea28c74ae26157eacaed5e5629dbada32e0103c23eb368f93af108"}, - {file = "ujson-4.0.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b3a6dcc660220539aa718bcc9dbd6dedf2a01d19c875d1033f028f212e36d6bb"}, - {file = "ujson-4.0.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:0ea07fe57f9157118ca689e7f6db72759395b99121c0ff038d2e38649c626fb1"}, - {file = "ujson-4.0.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4d6d061563470cac889c0a9fd367013a5dbd8efc36ad01ab3e67a57e56cad720"}, - {file = "ujson-4.0.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b5c70704962cf93ec6ea3271a47d952b75ae1980d6c56b8496cec2a722075939"}, - {file = "ujson-4.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:aad6d92f4d71e37ea70e966500f1951ecd065edca3a70d3861b37b176dd6702c"}, - {file = "ujson-4.0.2.tar.gz", hash = "sha256:c615a9e9e378a7383b756b7e7a73c38b22aeb8967a8bfbffd4741f7ffd043c4d"}, -] -urllib3 = [ - {file = "urllib3-1.26.2-py2.py3-none-any.whl", hash = "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473"}, - {file = "urllib3-1.26.2.tar.gz", hash = "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08"}, -] -wcwidth = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, -] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] diff --git a/test/pyproject.toml b/test/pyproject.toml deleted file mode 100644 index 4e80725c..00000000 --- a/test/pyproject.toml +++ /dev/null @@ -1,27 +0,0 @@ -[tool.poetry] -name = "harmony-regression-tests" -version = "0.1.0" -description = "Regression tests of Harmony services and collections." -authors = ["Kevin Beam "] - -[tool.poetry.dependencies] -python = "^3.8" -jupyterlab = "^2.2.9" -pytest = "^6.1.2" -requests = "^2.25.0" -black = "^20.8b1" -flake8 = "^3.8.4" -ipytest = "^0.9.1" -papermill = "^2.2.2" - -[tool.poetry.dev-dependencies] -flake8 = "^3.8.4" -black = "^20.8b1" -flake8-bugbear = "^20.11.1" -flake8-bandit = "^2.1.2" -safety = "^1.9.0" -python-language-server = "^0.36.2" - -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" diff --git a/test/run_notebooks.sh b/test/run_notebooks.sh index 55cfc1b4..281ee114 100755 --- a/test/run_notebooks.sh +++ b/test/run_notebooks.sh @@ -1,11 +1,57 @@ #!/bin/bash +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + echo "Running regression tests" -for file in $(ls notebooks/*.ipynb); do - echo "$file" - dir="./output/$(basename ${file} .ipynb)" - mkdir -p "${dir}" - poetry run papermill "${file}" "${dir}/Results.ipynb" -p harmony_host_url $harmony_host_url +# Add Docker images created in Makefile here +images=(harmony harmony-regression) + +# launch all the docker containers and store their process IDs +for image in ${images[@]}; do + echo -e "Test suite ${image} starting" + PIDS+=(${image},$(docker run -d -v ${PWD}/output:/root/output -v ${PWD}/${image}:/root/${image} --env harmony_host_url="${HARMONY_HOST_URL}" "harmony/regression-tests-${image}:latest")) +done + +trap ctrl_c SIGINT SIGTERM + +function ctrl_c() { + echo "Cleaning up" + for name_comma_pid in ${PIDS[@]}; do + name_pid=(${name_comma_pid//,/ }) + echo "Killing ${name_pid[0]}" + docker kill "${name_pid[1]}" >/dev/null + done + echo "Exiting" + exit 1 +} + +exit_code=0 +# wait for processes to finish and store each exit code into array STATUS' +for name_comma_pid in ${PIDS[@]}; do + name_pid=(${name_comma_pid//,/ }) + name=${name_pid[0]} + pid=${name_pid[1]} + + echo "Waiting for ${name}." + docker logs --follow "${pid}" + code=$(docker container wait ${pid}) + + if [[ ${code} -ne 0 ]]; then + echo -e "${RED}Test suite ${name} failed with exit code ${code}${NC}" 1>&2; + docker logs "${pid}" 1>&2; + exit_code=1 + else + echo -e "${GREEN}Test suite ${name} succeeded${NC}" + fi +done + +if [[ ${exit_code} -ne 0 ]]; then + echo "Tests completed (failed)" +else + echo "Tests completed (passed)" +fi -done \ No newline at end of file +exit ${exit_code}