From 9f4a9443aed70229927654fceffb648a9d3c8f95 Mon Sep 17 00:00:00 2001 From: "betolink:w" Date: Sat, 23 Apr 2022 23:13:43 -0600 Subject: [PATCH 1/5] major refactoring in progress add readthedocs and pin pygments to avoid mkdocs-jupyter bug with inline code in md cells --- .github/workflows/documentation.yml | 47 + .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- .gitignore | 2 + Makefile | 8 +- binder/environment.yml | 20 +- docs/index.md | 4 +- docs/tutorials/data/.placeholder | 0 docs/tutorials/demo.ipynb | 1098 +++++++++ docs/tutorials/restricted-datasets.ipynb | 317 +++ .../collections/collections-query.md | 9 + .../user-reference/collections/collections.md | 3 + .../user-reference/granules/granules-query.md | 9 + docs/user-reference/granules/granules.md | 3 + earthdata/__init__.py | 2 +- earthdata/auth.py | 296 ++- earthdata/results.py | 31 +- earthdata/search.py | 3 +- earthdata/store.py | 70 +- mkdocs.yml | 38 +- notebooks/DatasetSearch.ipynb | 122 +- poetry.lock | 2073 ++++++++++++++--- pyproject.toml | 49 +- readthedocs.yml | 24 + scripts/docs-live.sh | 1 + tests/test_auth.py | 16 + 26 files changed, 3727 insertions(+), 522 deletions(-) create mode 100644 .github/workflows/documentation.yml create mode 100644 docs/tutorials/data/.placeholder create mode 100644 docs/tutorials/demo.ipynb create mode 100644 docs/tutorials/restricted-datasets.ipynb create mode 100644 docs/user-reference/collections/collections-query.md create mode 100644 docs/user-reference/collections/collections.md create mode 100644 docs/user-reference/granules/granules-query.md create mode 100644 docs/user-reference/granules/granules.md create mode 100644 readthedocs.yml diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml new file mode 100644 index 00000000..89409d17 --- /dev/null +++ b/.github/workflows/documentation.yml @@ -0,0 +1,47 @@ +name: Documentation + +on: + push: + +jobs: + documentation: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: conda-incubator/setup-miniconda@v2 + with: + python-version: 3.9 + channels: conda-forge + mamba-version: "*" + activate-environment: earthdata-dev + environment-file: binder/environment.yml + - name: Get full python version + id: full-python-version + run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") + - name: Install poetry + run: | + curl -fsS -o get-poetry.py https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py + python get-poetry.py -y + echo "$HOME/.poetry/bin" >> $GITHUB_PATH + - name: Configure poetry + run: poetry config virtualenvs.in-project true + - name: Set up cache + uses: actions/cache@v1 + id: cache + with: + path: .venv + key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} + - name: Ensure cache is healthy + if: steps.cache.outputs.cache-hit == 'true' + run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv + - name: Install Dependencies + run: poetry install + - name: Build docs + run: poetry run bash scripts/build-docs.sh + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./site diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index bec1024e..efdf1aa7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -12,5 +12,5 @@ jobs: - name: Build and publish to pypi uses: JRubics/poetry-publish@v1.8 with: - python_version: "3.8" + python_version: "3.9" pypi_token: ${{ secrets.PYPI_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 15207d8a..57769860 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.7, 3.8, 3.9] + python-version: [3.8, 3.9, '3.10'] fail-fast: false steps: diff --git a/.gitignore b/.gitignore index 613a34a9..2c1b10e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .idea .ipynb_checkpoints +.python-version .mypy_cache __pycache__ .pytest_cache @@ -15,6 +16,7 @@ Pipfile Pipfile.lock build/ *.egg-info/ +docs/tutorials/data # OS X .DS_Store diff --git a/Makefile b/Makefile index d0fdc746..289f949e 100644 --- a/Makefile +++ b/Makefile @@ -16,18 +16,14 @@ help: # adds anything that has a double # comment to the phony help list @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ".:*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' -python-three-seven: -python-three-seven: ## setup python3.7 virtual environment using poetry - poetry env use python3.7 - poetry install python-three-eight: -python-three-eight: ## setup python3.6 virtual environment using poetry +python-three-eight: ## setup python3.8 virtual environment using poetry poetry env use python3.8 poetry install python-three-nine: -python-three-nine: ## setup python3.6 virtual environment using poetry +python-three-nine: ## setup python3.9 virtual environment using poetry poetry env use python3.9 poetry install diff --git a/binder/environment.yml b/binder/environment.yml index ba92ac27..2fbb537a 100644 --- a/binder/environment.yml +++ b/binder/environment.yml @@ -1,9 +1,10 @@ name: earthdata-dev channels: - conda-forge +- nodefaults dependencies: - python=3.9 -- jupyterlab=3 +- jupyterlab>=3 - xarray>=0.19 - rioxarray>=0.3 - matplotlib-base>=3.3 @@ -14,10 +15,17 @@ dependencies: - h5py>=3.2 - geopandas>=0.9 - zarr>=2.9.5 -- s3fs -- dask +- earthdata +# documentation +- mkdocs>=1.2 +- mkdocs-material>=7.1, <9.0 +- markdown-include>=0.6 +- mkdocstrings>=0.18 +- mkdocs-jupyter=0.18.0 +- pymdown-extensions=9.2 +- pygments=2.11.1 +- pqdm +- ipywidgets - pip - pip: - - pqdm - - zarr-eosdis-store - - earthdata + - zarr-eosdis-store diff --git a/docs/index.md b/docs/index.md index eea1ed0c..cd858c88 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,7 +21,9 @@ Code style: black +

+--- ## Overview @@ -52,7 +54,7 @@ poetry install ## Example Usage -```python +```py from earthdata import Auth, DataGranules, DataCollections, Store auth = Auth().login() # if we want to access NASA DATA in the cloud diff --git a/docs/tutorials/data/.placeholder b/docs/tutorials/data/.placeholder new file mode 100644 index 00000000..e69de29b diff --git a/docs/tutorials/demo.ipynb b/docs/tutorials/demo.ipynb new file mode 100644 index 00000000..5869d7c9 --- /dev/null +++ b/docs/tutorials/demo.ipynb @@ -0,0 +1,1098 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "56ba2387-54e8-4aa5-aedb-c7d90644536f", + "metadata": { + "tags": [] + }, + "source": [ + "## Overview\n", + "\n", + "\n", + "# NASA Earthdata API Client 🌍\n", + "\n", + "\n", + "\n", + "#### TL;DR: [**earthdata**](https://github.com/nsidc/earthdata) is a Python package to search, preview and access NASA datasets (on-prem or in the cloud) with a few lines of code.\n", + "\n", + "\n", + "## Why? \n", + "\n", + "**Programmatic, Easy, Reproducible.**\n", + "\n", + "There are many ways to access NASA datasets, we can use the [Earthdata search portal](https://search.earthdata.nasa.gov/). We can use DAAC specific portals or tools.\n", + "We could even use [data.gov](https://data.gov)! Web portals are great but they are not designed for programmatic access and reproducible workflows. This is extremely important in the age of the cloud and reproducible open science. \n", + "\n", + "The good news is that NASA also exposes APIs that allows us to search, transform and access data in a programmatic way. Many of these libraries contain amazing features and some similarities. In this context, **earthdata** aims to be a simple library that can deal with the important parts of the metadata so we can access or download data without having to worry if a given dataset is on-prem or in the cloud.\n", + "\n", + "\n", + "## How?\n", + "\n", + "> Note: There are a lot of acronyms that we need to get familiar with before any of this makes sense, here is a brief glossary for NASA Earthdata terms: [NASA glossary](glossary.md)\n", + "\n", + "\n", + "### Authentication: Before we can use `earthdata` we need an account with **[NASA EDL](https://urs.earthdata.nasa.gov/)**\n", + "\n", + "\n", + "Earthdata Login provides free and immediate access to thousands of EOSDIS data products covering all Earth science disciplines and topic areas for researchers, applied science users, application developers, and the general public.\n", + "\n", + "Once we have our NASA EDL login credentials we can start accessing NASA data in a programmatic way.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "10f6c9ed-fe58-4e03-b29b-c6c447061f84", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0.3.0'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import earthdata\n", + "earthdata.__version__" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2acb1926-3442-446a-8a35-fcbba8868d4d", + "metadata": {}, + "outputs": [], + "source": [ + "auth = earthdata.Auth()" + ] + }, + { + "cell_type": "markdown", + "id": "95121ff7-5222-4778-a4de-25625e23884b", + "metadata": {}, + "source": [ + "#### Auth()\n", + "\n", + "`earthdata`'s **Auth** class provides 3 different strategies to authenticate ourselves with NASA EDL.\n", + "\n", + "* **netrc**: Do we have a `.netrc` file with our EDL credentials? if so, we can use it with `earthdata`.\n", + "If we don't have it and want to create one we can, earthdata allows users to type their credentials and persist them into a `.netrc` file.\n", + "* **environment**: If we have our EDL credentials as environment variables \n", + " * EDL_USERNAME\n", + " * EDL_PASSWORD\n", + "* **interactive**: We will be asked for our EDL credentials with optinal persistance to `.netrc`\n", + "\n", + "To persist our credentials to a `.netrc` file we have to do the following:\n", + "\n", + "```python\n", + "auth.login(strategy=\"interactive\", persist=True)\n", + "```\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "caab3b4b-80cc-4790-9417-1dd12503aa55", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You're now authenticated with NASA Earthdata Login\n", + "Using token with expiration date: 07/24/2022\n", + "True\n" + ] + } + ], + "source": [ + "auth.login(strategy=\"netrc\")\n", + "# are we authenticated?\n", + "print(auth.authenticated)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "a0a5f73d-b4b9-4dad-ac72-12c7ae6278d1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "We are already authenticated with NASA EDL\n", + "True\n" + ] + } + ], + "source": [ + "a = auth.login(strategy=\"environment\")\n", + "# are we authenticated?\n", + "print(auth.authenticated)" + ] + }, + { + "cell_type": "markdown", + "id": "fcc8b461-8c68-4719-94e5-34057159dac7", + "metadata": {}, + "source": [ + "## Querying for datasets\n", + "\n", + "The `DataCollections` class can query CMR for any collection (dataset) using all of CMR's Query parameters and has built-in functions to extract useful information from the response.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8d5bf4c9-571b-4c93-af94-e66bd51cb584", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collections found: 338\n" + ] + }, + { + "data": { + "text/plain": [ + "[{\n", + " \"meta\": {\n", + " \"concept-id\": \"C1908348134-LPDAAC_ECS\",\n", + " \"granule-count\": 0,\n", + " \"provider-id\": \"LPDAAC_ECS\"\n", + " },\n", + " \"umm\": {\n", + " \"ShortName\": \"GEDI02_A\",\n", + " \"Version\": \"002\"\n", + " }\n", + " },\n", + " {\n", + " \"meta\": {\n", + " \"concept-id\": \"C1431413941-NSIDC_ECS\",\n", + " \"granule-count\": 61,\n", + " \"provider-id\": \"NSIDC_ECS\"\n", + " },\n", + " \"umm\": {\n", + " \"ShortName\": \"RDEFT4\",\n", + " \"Version\": \"1\"\n", + " }\n", + " },\n", + " {\n", + " \"meta\": {\n", + " \"concept-id\": \"C1299783579-LPDAAC_ECS\",\n", + " \"granule-count\": 0,\n", + " \"provider-id\": \"LPDAAC_ECS\"\n", + " },\n", + " \"umm\": {\n", + " \"ShortName\": \"AST14DEM\",\n", + " \"Version\": \"003\"\n", + " }\n", + " }]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# The first step is to create a DataCollections query \n", + "Query = DataCollections()\n", + "\n", + "# Use chain methods to customize our query\n", + "Query.keyword('elevation').bounding_box(-134.7,58.9,-133.9,59.2).temporal(\"2020-01-01\",\"2020-02-01\")\n", + "\n", + "print(f'Collections found: {Query.hits()}')\n", + "\n", + "# filtering what UMM fields to print, to see the full record we omit the fields filters\n", + "# meta is always included as \n", + "collections = Query.fields(['ShortName','Version']).get(5)\n", + "# Inspect some results printing just the ShortName and Abstract\n", + "collections[0:3]" + ] + }, + { + "cell_type": "markdown", + "id": "26962664-cbe8-453f-b617-80d473df9c75", + "metadata": {}, + "source": [ + "The results from a DataCollections and DataGranules query are enhanced python dictionaries, this means\n", + "that we can access all the keys and values like we usually do with Python dictionaries." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8cb5154c-f131-44ad-a68f-cf0fa21ce18f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'GEDI02_A'" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "collections[0][\"umm\"][\"ShortName\"]" + ] + }, + { + "cell_type": "markdown", + "id": "28d45a6f-ac37-4744-bcfe-88ac3dd6ac07", + "metadata": {}, + "source": [ + "The DataCollections class returns python dictionaries with some handy methods.\n", + "\n", + "```python \n", + "collection.concept_id() # returns the concept-id, used to search for data granules\n", + "collection.abstract() # returns the abstract\n", + "collection.landing_page() # returns the landing page if present in the UMM fields\n", + "collection.get_data() # returns the portal where data can be accessed.\n", + "```\n", + "\n", + "The same results can be obtained using the `dict` syntax:\n", + "\n", + "```python\n", + "collection[\"meta\"][\"concept-id\"] # concept-id\n", + "collection[\"umm\"][\"RelatedUrls\"] # URLs, with GET DATA, LANDING PAGE etc\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "48cdcd74-dfe3-4b83-93f4-7378a0d981df", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collections found: 502\n" + ] + }, + { + "data": { + "text/plain": [ + "{\n", + " \"meta\": {\n", + " \"concept-id\": \"C1674798938-PODAAC\",\n", + " \"granule-count\": 49150,\n", + " \"provider-id\": \"PODAAC\"\n", + " },\n", + " \"umm\": {\n", + " \"ShortName\": \"ASCATB-L2-25km\"\n", + " }\n", + "}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# We can now search for collections using a pythonic API client for CMR.\n", + "Query = DataCollections().daac(\"PODAAC\")\n", + "\n", + "print(f'Collections found: {Query.hits()}')\n", + "collections = Query.fields(['ShortName']).get(10)\n", + "# Printing the first collection\n", + "collections[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "63792353-ab3e-4f0b-963d-7750e4b89113", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collections found: 322\n" + ] + }, + { + "data": { + "text/plain": [ + "{\n", + " \"meta\": {\n", + " \"concept-id\": \"C1940473819-POCLOUD\",\n", + " \"granule-count\": 2376387,\n", + " \"provider-id\": \"POCLOUD\"\n", + " },\n", + " \"umm\": {\n", + " \"ShortName\": \"MODIS_A-JPL-L2P-v2019.0\"\n", + " }\n", + "}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# What if we want cloud collections\n", + "Query = DataCollections().daac(\"PODAAC\").cloud_hosted(True)\n", + "\n", + "print(f'Collections found: {Query.hits()}')\n", + "collections = Query.fields(['ShortName']).get(10)\n", + "# Printing 3 collections\n", + "collections[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "c4c5a34a-e808-4cc9-b34d-353d091a8242", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['C1940473819-POCLOUD',\n", + " 'C2075141559-POCLOUD',\n", + " 'C2075141638-POCLOUD',\n", + " 'C1940475563-POCLOUD',\n", + " 'C2036878688-POCLOUD',\n", + " 'C1996880725-POCLOUD',\n", + " 'C1996880450-POCLOUD',\n", + " 'C2036877595-POCLOUD',\n", + " 'C2075141605-POCLOUD',\n", + " 'C1996881146-POCLOUD']" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Printing the concept-id for the first 10 collections\n", + "[collection.concept_id() for collection in collections]" + ] + }, + { + "cell_type": "markdown", + "id": "4bb9c3bb-ac8b-48e8-8233-8c44da8fb7bc", + "metadata": {}, + "source": [ + "## Querying for data files (granules)\n", + "\n", + "The DataGranules class provides similar functionality as the collection class. To query for granules in a more reliable way concept-id would be the main key.\n", + "You can search data granules using a short name but that could (more likely will) return different versions of the same data granules. \n", + "\n", + "In this example we're querying for 10 data grnaules from ICESat-2 [ATL06](https://nsidc.org/data/ATL06/versions/) version `005` dataset. \n", + "\n", + "\n", + "> **Note**: Generally speaking we won't need authenticated queries unless they are restricted datasets for early adopters." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "9364d737-5a79-4089-853f-76d2ad1c85a7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", + " Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -127.0482205607256, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}\n", + " Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-10-14T00:18:55.637Z', 'EndingDateTime': '2018-10-14T00:19:19.913Z'}}\n", + " Size(MB): 3.7921009064\n", + " Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.10.14/ATL06_20181014001049_02350102_005_01.h5'],\n", + " Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", + " Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 50.741590031724314, 'StartLatitude': 59.5, 'StartDirection': 'D', 'EndLatitude': 27.0, 'EndDirection': 'D'}}}\n", + " Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-11-09T11:28:36.538Z', 'EndingDateTime': '2018-11-09T11:29:14.738Z'}}\n", + " Size(MB): 5.0780105591\n", + " Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.09/ATL06_20181109112837_06390106_005_01.h5'],\n", + " Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", + " Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -126.78857810482624, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}\n", + " Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-11-11T22:55:08.251Z', 'EndingDateTime': '2018-11-11T22:55:37.758Z'}}\n", + " Size(MB): 4.1429281235\n", + " Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.11/ATL06_20181111224708_06770102_005_01.h5'],\n", + " Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", + " Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -127.56718592349382, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}\n", + " Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-11-15T22:46:36.934Z', 'EndingDateTime': '2018-11-15T22:47:15.558Z'}}\n", + " Size(MB): 11.893447876\n", + " Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.15/ATL06_20181115223845_07380102_005_01.h5'],\n", + " Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", + " Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 51.00122639850689, 'StartLatitude': 59.5, 'StartDirection': 'D', 'EndLatitude': 27.0, 'EndDirection': 'D'}}}\n", + " Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-12-08T10:04:25.906Z', 'EndingDateTime': '2018-12-08T10:05:02.142Z'}}\n", + " Size(MB): 3.580540657\n", + " Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.12.08/ATL06_20181208100423_10810106_005_01.h5']]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# We build our query\n", + "from pprint import pprint\n", + "Query = DataGranules().short_name('ATL06').version(\"005\").bounding_box(-134.7,58.9,-133.9,59.2)\n", + "# We get 5 metadata records\n", + "granules = Query.get(5)\n", + "granules" + ] + }, + { + "cell_type": "markdown", + "id": "40aa8035-f4a8-4592-b19c-49d5c06331fb", + "metadata": {}, + "source": [ + "## Pretty printing data granules\n", + "\n", + "Since we are in a notebook we can take advantage of it to see a more user friendly version of the granules with the built-in function `display`\n", + "This will render browse image for the granule if available and eventually will have a similar representation as the one from the Earthdata search portal" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "66cd5f5c-a854-4a72-a831-33b8bd7ce9d2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Data: https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.10.14/ATL06_20181014001049_02350102_005_01.h5

\n", + "

Size: 3.79 MB

\n", + "

Spatial: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -127.0482205607256, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}

\n", + "
\n", + "
\n", + " \"Data\"Data\n", + "
\n", + "
\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", + "Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -127.0482205607256, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}\n", + "Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-10-14T00:18:55.637Z', 'EndingDateTime': '2018-10-14T00:19:19.913Z'}}\n", + "Size(MB): 3.7921009064\n", + "Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.10.14/ATL06_20181014001049_02350102_005_01.h5']" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Data: https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.09/ATL06_20181109112837_06390106_005_01.h5

\n", + "

Size: 5.08 MB

\n", + "

Spatial: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 50.741590031724314, 'StartLatitude': 59.5, 'StartDirection': 'D', 'EndLatitude': 27.0, 'EndDirection': 'D'}}}

\n", + "
\n", + "
\n", + " \"Data\"Data\n", + "
\n", + "
\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", + "Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 50.741590031724314, 'StartLatitude': 59.5, 'StartDirection': 'D', 'EndLatitude': 27.0, 'EndDirection': 'D'}}}\n", + "Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-11-09T11:28:36.538Z', 'EndingDateTime': '2018-11-09T11:29:14.738Z'}}\n", + "Size(MB): 5.0780105591\n", + "Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.09/ATL06_20181109112837_06390106_005_01.h5']" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Data: https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.11/ATL06_20181111224708_06770102_005_01.h5

\n", + "

Size: 4.14 MB

\n", + "

Spatial: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -126.78857810482624, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}

\n", + "
\n", + "
\n", + " \"Data\"Data\n", + "
\n", + "
\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", + "Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -126.78857810482624, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}\n", + "Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-11-11T22:55:08.251Z', 'EndingDateTime': '2018-11-11T22:55:37.758Z'}}\n", + "Size(MB): 4.1429281235\n", + "Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.11/ATL06_20181111224708_06770102_005_01.h5']" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Data: https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.15/ATL06_20181115223845_07380102_005_01.h5

\n", + "

Size: 11.89 MB

\n", + "

Spatial: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -127.56718592349382, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}

\n", + "
\n", + "
\n", + " \"Data\"Data\n", + "
\n", + "
\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", + "Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -127.56718592349382, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}\n", + "Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-11-15T22:46:36.934Z', 'EndingDateTime': '2018-11-15T22:47:15.558Z'}}\n", + "Size(MB): 11.893447876\n", + "Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.15/ATL06_20181115223845_07380102_005_01.h5']" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Data: https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.12.08/ATL06_20181208100423_10810106_005_01.h5

\n", + "

Size: 3.58 MB

\n", + "

Spatial: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 51.00122639850689, 'StartLatitude': 59.5, 'StartDirection': 'D', 'EndLatitude': 27.0, 'EndDirection': 'D'}}}

\n", + "
\n", + "
\n", + " \"Data\"Data\n", + "
\n", + "
\n", + "
\n", + "
\n", + " " + ], + "text/plain": [ + "Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", + "Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 51.00122639850689, 'StartLatitude': 59.5, 'StartDirection': 'D', 'EndLatitude': 27.0, 'EndDirection': 'D'}}}\n", + "Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-12-08T10:04:25.906Z', 'EndingDateTime': '2018-12-08T10:05:02.142Z'}}\n", + "Size(MB): 3.580540657\n", + "Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.12.08/ATL06_20181208100423_10810106_005_01.h5']" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[None, None, None, None, None]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# printing 2 granules using display\n", + "[display(granule) for granule in granules]" + ] + }, + { + "cell_type": "markdown", + "id": "ec8f32a4-026d-4a5f-af66-69026cabe966", + "metadata": {}, + "source": [ + "### Spatiotemporal queries\n", + "\n", + "Our granules and collection classes accept the same spatial and temporal arguments as CMR so we can search for granules that match spatiotemporal criteria.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "00aa39ec-e2fb-49d1-bc54-8d8a2f0655aa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Granules found: 4\n" + ] + } + ], + "source": [ + "Query = DataGranules().short_name(\"ATL06\").temporal(\"2020-03-01\", \"2020-03-30\").bounding_box(-134.7,58.9,-133.9,59.2).version(\"005\")\n", + "# Always inspects the hits before retrieven the granule metadata, just because it's very verbose.\n", + "print(f\"Granules found: {Query.hits()}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "8c493585-0d48-41bb-8815-6c83ad20ae80", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'links': ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2020.03.06/ATL06_20200306122320_10810606_005_01.h5'],\n", + " 'size (MB):': 2.7875404358},\n", + " {'links': ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2020.03.08/ATL06_20200308234154_11190602_005_01.h5'],\n", + " 'size (MB):': 4.3645324707},\n", + " {'links': ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2020.03.10/ATL06_20200310121504_11420606_005_01.h5'],\n", + " 'size (MB):': 2.6717844009},\n", + " {'links': ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2020.03.12/ATL06_20200312233336_11800602_005_01.h5'],\n", + " 'size (MB):': 14.1388778687}]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Now we can print some info about these granules using the built-in methods\n", + "granules = Query.get(5)\n", + "data_links = [{'links': g.data_links(), 'size (MB):': g.size()} for g in granules]\n", + "data_links" + ] + }, + { + "cell_type": "markdown", + "id": "f7c90c43-6e17-42f5-8bf5-95fdd3cb0dce", + "metadata": {}, + "source": [ + "## **Accessing the data**\n", + "\n", + "With `earthdata` a researcher can get the files regardless if they are on-prem or cloud based with the same API call, although an important consideration is that if we want to access data in the cloud (direct access) we must run the code in the cloud. This is because some S3 buckets are configured to only allow direct access (s3:// links) if the requester is in the same zone, `us-west-2`.\n", + "\n", + "## On-prem access: DAAC hosted data 📡\n", + "\n", + "\n", + "\n", + "The `Store()` class will allow us to download or access our data and needs to be instantiated with our `auth` instance.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "b796fa53-60ac-4197-922d-1f6ee5dec00b", + "metadata": {}, + "outputs": [], + "source": [ + "store = Store(auth)" + ] + }, + { + "cell_type": "markdown", + "id": "4239e041-db87-40d1-b81a-12c26e9e0a47", + "metadata": {}, + "source": [ + "For this example we are going to use a PODAAC dataset `SMAP_JPL_L3_SSS_CAP_8DAY-RUNNINGMEAN_V5` which we previously queried (see querying for datasets) and got the concept id: `C1972955240-PODAAC`" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "910e4b90-f0e0-42e5-a4e2-d5444089161f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Granule hits: 2509\n" + ] + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Query = DataGranules().concept_id(\"C1972955240-PODAAC\").bounding_box(-134.7,54.9,-100.9,69.2)\n", + "print(f\"Granule hits: {Query.hits()}\")\n", + "# getting more than 6,000 metadata records for demo purposes is going to slow us down a bit so let's get only a few\n", + "granules = Query.get(10)\n", + "# Does this granule belong to a cloud-based collection?\n", + "granules[0].cloud_hosted" + ] + }, + { + "cell_type": "markdown", + "id": "436e8a72-64c5-4e6b-950b-ac801d7b926e", + "metadata": {}, + "source": [ + "### Finally! let's get the data\n", + "\n", + "The Store class accepts the results from a `DataGranules()` query or it can also accept a list of URLs for the data files. In the second case we'll have to specify the DAAC since it cannot infer which credentials to use solely on the URL." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "434466a3-602b-4dff-a260-f7db6901514a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Getting 4 granules, approx download size: 0.14 GB\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "QUEUEING TASKS | : 100%|█████████████████████████████████████████████████████████████████████████████████| 8/8 [00:00<00:00, 267.87it/s]\n", + "PROCESSING TASKS | : 88%|██████████████████████████████████████████████████████████████████████ | 7/8 [00:27<00:03, 3.97s/it]" + ] + } + ], + "source": [ + "%%time\n", + "files = store.get(granules[0:4], \"./data/C1972955240-PODAAC/\")" + ] + }, + { + "cell_type": "markdown", + "id": "4fe45fff-68ea-4f01-94c7-416d79cfd84c", + "metadata": {}, + "source": [ + "## **Accessing the data in the cloud ☁️** \n", + "\n", + "\n", + "\n", + "\n", + "With `earthdata` a researcher can get the files regardless if they are on-prem or cloud based with the same API call, although an important consideration is that if we want to access data in the cloud we must run the code in the cloud. This is because some S3 buckets are configured to only allow direct access (s3:// links) if the requester is in the same zone, `us-west-2`.\n", + "\n", + "Same API, just a different place, in this case the `concept-id` for the same dataset is `C2208422957-POCLOUD`\n", + "> Note: The `concept-id` changed even though is the same dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44403d51-0aa3-423c-8fff-e40d4969aa9d", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "Query = DataGranules().concept_id(\"C2208422957-POCLOUD\").bounding_box(-134.7,54.9,-100.9,69.2)\n", + "print(f\"Granule hits: {Query.hits()}\")\n", + "cloud_granules = Query.get(10)\n", + "# is this a cloud hosted data granule?\n", + "cloud_granules[0].cloud_hosted" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e59ca3e-b5d5-490f-b967-01d1c7b3fdf0", + "metadata": {}, + "outputs": [], + "source": [ + "# Let's pretty print this\n", + "cloud_granules[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b2a294f1-b1f9-4cd4-8751-dfc32feacec1", + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "# If we get an error with direct_access=True, most likely is because\n", + "# we are running this code outside the us-west-2 region.\n", + "try:\n", + " files = store.get(cloud_granules[0:4], local_path=\"./data/demo-POCLOUD\")\n", + "except Exception as e:\n", + " print(f\"Error: {e}, we are probably not using this code in the Amazon cloud. Trying external links...\")\n", + " # There is hope, even if we are not in the Amazon cloud we can still get the data\n", + " files = store.get(cloud_granules[0:4], access=\"external\", local_path=\"./data/demo-POCLOUD\")" + ] + }, + { + "cell_type": "markdown", + "id": "54b91b45-7080-4257-8ccb-99f87c93b022", + "metadata": {}, + "source": [ + "## ☁️ **Cloud Access Part II: streaming data**\n", + "\n", + "Being in the cloud allows us to stream data as if we were using it locally. Pairing gridded datasets on S3 and xarray isa very useful patter when we deal with a lot of data. \n", + "\n", + "> **Recommended read: [Skip the download! Stream NASA data directly into Python objects](https://medium.com/pangeo/intake-stac-nasa-4cd78d6246b7)**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aecdb529-5961-4fa6-b7e0-70bbd0d85041", + "metadata": {}, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "warnings.simplefilter('ignore')\n", + "import xarray as xr\n", + "# data_links\n", + "https_links = []\n", + "s3_links = []\n", + "\n", + "fs = store.get_s3fs_session('POCLOUD')\n", + "\n", + "for granule in cloud_granules:\n", + " https_links.extend(granule.data_links(access=\"on_prem\"))\n", + " s3_links.extend(granule.data_links(access=\"direct\"))\n", + "s3_links" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e693af6a-a80e-4ca2-a034-8da194c18aaf", + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "\n", + "import xarray as xr\n", + "\n", + "try:\n", + " files = store.open(s3_links, provider=\"POCLOUD\")\n", + "\n", + " ds_L3 = xr.open_mfdataset(\n", + " files,\n", + " combine='nested',\n", + " concat_dim='time',\n", + " decode_cf=True,\n", + " coords='minimal',\n", + " chunks={'time': 1}\n", + " )\n", + " ds_L3\n", + "except Exception as e:\n", + " pass\n", + " # print(e)\n" + ] + }, + { + "cell_type": "markdown", + "id": "d276eca3-ca27-4970-9367-7e65e5f2302f", + "metadata": {}, + "source": [ + "## Now to the important science! 🚀 \n", + "\n", + "### Recap\n", + "\n", + "```python\n", + "\n", + "from earthdata import Auth, DataGranules, Store\n", + "\n", + "# first we authenticate with NASA EDL\n", + "auth = Auth().login(strategy=\"netrc\")\n", + "\n", + "# Then we build a Query with spatiotemporal parameters\n", + "GranuleQuery = DataGranules().concept_id(\"C1575731655-LPDAAC_ECS\").bounding_box(-134.7,58.9,-133.9,59.2)\n", + "\n", + "# We get the metadata records from CMR\n", + "granules = GranuleQuery.get()\n", + "\n", + "# Now it{s time to download (or open) our data granules list with get()\n", + "files = Store(auth).get(granules, local_path='./data')\n", + "\n", + "# Now to the important science!\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "d779e877-2f0c-4da2-92d5-6cc299204956", + "metadata": {}, + "source": [ + "### Related links\n", + "\n", + "**Github repository**: https://github.com/nsidc/earthdata\n", + "\n", + "**CMR** API documentation: https://cmr.earthdata.nasa.gov/search/site/docs/search/api.html\n", + "\n", + "**EDL** API documentation: https://urs.earthdata.nasa.gov/\n", + "\n", + "NASA OpenScapes: https://nasa-openscapes.github.io/earthdata-cloud-cookbook/\n", + "\n", + "NSIDC: https://nsidc.org\n", + "\n", + "\n", + "Contact: luis.lopez@nsidc.org" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/tutorials/restricted-datasets.ipynb b/docs/tutorials/restricted-datasets.ipynb new file mode 100644 index 00000000..0851b5c5 --- /dev/null +++ b/docs/tutorials/restricted-datasets.ipynb @@ -0,0 +1,317 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "56ba2387-54e8-4aa5-aedb-c7d90644536f", + "metadata": { + "tags": [] + }, + "source": [ + "# Datasets under an access control list (ACL)\n", + "\n", + "## NASA Earthdata API Client 🌍\n", + "\n", + "\n", + "> Note: Before we can use `earthdata` we need an account with **[NASA EDL](https://urs.earthdata.nasa.gov/)**\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2acb1926-3442-446a-8a35-fcbba8868d4d", + "metadata": {}, + "outputs": [], + "source": [ + "from earthdata import Auth, DataCollections, DataGranules, Store\n", + "\n", + "auth = Auth()" + ] + }, + { + "cell_type": "markdown", + "id": "95121ff7-5222-4778-a4de-25625e23884b", + "metadata": {}, + "source": [ + "#### Auth()\n", + "\n", + "`earthdata`'s **Auth** class provides 3 different strategies to authenticate ourselves with NASA EDL.\n", + "\n", + "* **netrc**: Do we have a `.netrc` file with our EDL credentials? if so, we can use it with `earthdata`.\n", + "If we don't have it and want to create one we can, earthdata allows users to type their credentials and persist them into a `.netrc` file.\n", + "* **environment**: If we have our EDL credentials as environment variables \n", + " * EDL_USERNAME\n", + " * EDL_PASSWORD\n", + "* **interactive**: We will be asked for our EDL credentials with optinal persistance to `.netrc`\n", + "\n", + "To persist our credentials to a `.netrc` file we have to do the following:\n", + "\n", + "```python\n", + "auth.login(strategy=\"interactive\", persist=True)\n", + "```\n", + "\n", + "In this notebook we'll use the environment method followed by the `netrc` strategy. You can of course use the interactive strategy if you don't have a `.netrc` file.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a0a5f73d-b4b9-4dad-ac72-12c7ae6278d1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "You're now authenticated with NASA Earthdata Login\n", + "Using token with expiration date: 07/24/2022\n" + ] + } + ], + "source": [ + "auth.login(strategy=\"environment\")\n", + "# are we authenticated?\n", + "if not auth.authenticated:\n", + " auth.login(strategy=\"netrc\")" + ] + }, + { + "cell_type": "markdown", + "id": "5609eb13-397b-4da8-a007-3c2befc1769e", + "metadata": {}, + "source": [ + "## Querying for restricted datasets\n", + "\n", + "The DataCollection client can query CMR for any collection (dataset) using all of CMR's Query parameters and has built-in functions to extract useful information from the response.\n", + "\n", + "```python\n", + "auth.refresh_tokens()\n", + "```\n", + "\n", + "\n", + "If we belong to an early adopter group within NASA we can pass the Auth object to the other classes when we instantiate them.\n", + "\n", + "```python\n", + "# An anonymous query to CMR\n", + "Query = DataCollections().keyword('elevation')\n", + "# An authenticated query to CMR\n", + "Query = DataCollections(auth).keyword('elevation')\n", + "```\n", + "\n", + "and it's the same with DataGranules\n", + "\n", + "\n", + "```python\n", + "# An anonymous query to CMR\n", + "Query = DataGranules().keyword('elevation')\n", + "# An authenticated query to CMR\n", + "Query = DataGranules(auth).keyword('elevation')\n", + "```\n", + "\n", + "\n", + "> **Note**: Some collections under an access control list are flagged by CMR and won't count when asking about results with `hits()`. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d0dd51cc-b394-47cd-b606-d54750ea629e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collections found: 1\n" + ] + }, + { + "data": { + "text/plain": [ + "[{\n", + " \"meta\": {\n", + " \"concept-id\": \"C2144439155-NSIDC_ECS\",\n", + " \"granule-count\": 123484,\n", + " \"provider-id\": \"NSIDC_ECS\"\n", + " },\n", + " \"umm\": {\n", + " \"ShortName\": \"ATL06\",\n", + " \"Version\": \"005\"\n", + " }\n", + " }]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# The first step is to create a DataCollections query \n", + "Query = DataCollections()\n", + "\n", + "# Use chain methods to customize our query\n", + "Query.short_name(\"ATL06\").version(\"005\")\n", + "\n", + "print(f'Collections found: {Query.hits()}')\n", + "\n", + "# filtering what UMM fields to print, to see the full record we omit the fields filters\n", + "# meta is always included as \n", + "collections = Query.fields(['ShortName','Version']).get(5)\n", + "# Inspect some results printing just the ShortName and Abstract\n", + "collections" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "14eee26c-e9d9-4f2f-8b04-06379c29c9d8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "earthdata generated a token for CMR with expiration on: 07/24/2022\n" + ] + } + ], + "source": [ + "if not auth.refresh_tokens():\n", + " print(\"Something went wrong, we may need to regenerate our tokens manually\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "a17a8afe-0a68-4adf-a6d1-5f5bda6becc9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collections found: 1\n" + ] + }, + { + "data": { + "text/plain": [ + "[{\n", + " \"meta\": {\n", + " \"concept-id\": \"C2144439155-NSIDC_ECS\",\n", + " \"granule-count\": 123484,\n", + " \"provider-id\": \"NSIDC_ECS\"\n", + " },\n", + " \"umm\": {\n", + " \"ShortName\": \"ATL06\",\n", + " \"Version\": \"005\"\n", + " }\n", + " },\n", + " {\n", + " \"meta\": {\n", + " \"concept-id\": \"C2153572614-NSIDC_CPRD\",\n", + " \"granule-count\": 123484,\n", + " \"provider-id\": \"NSIDC_CPRD\"\n", + " },\n", + " \"umm\": {\n", + " \"ShortName\": \"ATL06\",\n", + " \"Version\": \"005\"\n", + " }\n", + " }]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Query = DataCollections(auth)\n", + "\n", + "# Use chain methods to customize our query\n", + "Query.short_name(\"ATL06\").version(\"005\")\n", + "\n", + "# This will say 1, even though we get 2 back.\n", + "print(f'Collections found: {Query.hits()}')\n", + "\n", + "collections = Query.fields(['ShortName','Version']).get()\n", + "# Inspect some results printing just the ShortName and Abstract\n", + "collections" + ] + }, + { + "cell_type": "markdown", + "id": "fd9fb5ce-bb8a-4d05-a3ae-49e79f4d455e", + "metadata": {}, + "source": [ + "\n", + "**Oh no! What!? only 1 collection found even though we got 2 results back?!**\n", + "\n", + "#### Interpreting the results\n", + "\n", + "The `hits()` method above will tell you the number of query hits, but only for publicly available data sets.\n", + "In this case because cloud hosted ICESat-2 data are not yet publicly available, CMR will return “1” hits, if you filtered DataCollections by provider = NSIDC_CPRD you'll get `0` hits. For now we need an alternative method of seeing how many cloud data sets are available at NSIDC. This is only temporary until cloud-hosted ICESat-2 become publicly available. We can create a collections object (we’re going to want one of these soon anyhow) and print the len() of the collections object to see the true number of hits. \n", + "\n", + "> **Note**: Since we cannot rely on `hits()` we need to be aware that `get()` may get us too many metadata records depending on the dataset and how broad our query is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "9478b3ef-7652-4943-9946-9ce49c085eb6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Granules found with hits(): 0\n", + "Actual number found: 4\n" + ] + } + ], + "source": [ + "Query = DataGranules(auth).concept_id(\"C2153572614-NSIDC_CPRD\").bounding_box(-134.7,58.9,-133.9,59.2).temporal(\"2020-03-01\", \"2020-03-30\")\n", + "\n", + "# Unfortunately the hits() methods will behave the same for granule queries\n", + "print(f\"Granules found with hits(): {Query.hits()}\")\n", + "\n", + "cloud_granules = Query.get()\n", + "\n", + "print(f\"Actual number found: {len(cloud_granules)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "112602f7-fc0d-4f22-8e7c-45eafbce56e6", + "metadata": {}, + "outputs": [], + "source": [ + "store = Store(auth)\n", + "files = store.get(cloud_granules, \"./data/C2153572614-NSIDC_CPRD/\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/user-reference/collections/collections-query.md b/docs/user-reference/collections/collections-query.md new file mode 100644 index 00000000..c2493f7a --- /dev/null +++ b/docs/user-reference/collections/collections-query.md @@ -0,0 +1,9 @@ +# Documentation for `Collections` + +::: earthdata.search.DataCollections + selection: + inherited_members: true + rendering: + show_root_heading: true + show_source: false + diff --git a/docs/user-reference/collections/collections.md b/docs/user-reference/collections/collections.md new file mode 100644 index 00000000..e63a2728 --- /dev/null +++ b/docs/user-reference/collections/collections.md @@ -0,0 +1,3 @@ +# `Collections` + + diff --git a/docs/user-reference/granules/granules-query.md b/docs/user-reference/granules/granules-query.md new file mode 100644 index 00000000..9762bc10 --- /dev/null +++ b/docs/user-reference/granules/granules-query.md @@ -0,0 +1,9 @@ +# Documentation for `Granules` + +::: earthdata.search.DataGranules + selection: + inherited_members: true + rendering: + show_root_heading: true + show_source: false + diff --git a/docs/user-reference/granules/granules.md b/docs/user-reference/granules/granules.md new file mode 100644 index 00000000..96fffda6 --- /dev/null +++ b/docs/user-reference/granules/granules.md @@ -0,0 +1,3 @@ +# `Granules` + + diff --git a/earthdata/__init__.py b/earthdata/__init__.py index 2a77d8e8..90680adc 100644 --- a/earthdata/__init__.py +++ b/earthdata/__init__.py @@ -1,4 +1,4 @@ -import pkg_resources +import pkg_resources # type: ignore from .auth import Auth from .search import DataCollections, DataGranules diff --git a/earthdata/auth.py b/earthdata/auth.py index 5ae7c13f..4fd71942 100644 --- a/earthdata/auth.py +++ b/earthdata/auth.py @@ -1,11 +1,12 @@ import getpass -import netrc import os from netrc import NetrcParseError -from typing import Any, Dict, Optional, Union +from pathlib import Path +from typing import Any, Dict, List, Optional, Union from urllib.parse import urlparse import requests # type: ignore +from tinynetrc import Netrc from .daac import DAACS @@ -48,110 +49,141 @@ class Auth(object): Authentication class for operations that require Earthdata login (EDL) """ - def _get_user_tokens(self, username: str, password: str) -> Any: - session = SessionWithHeaderRedirection(username, password) - auth_resp = session.get( - self.EDL_GET_TOKENS_URL, - headers={ - "Accept": "application/json", - }, - timeout=10, - ) - return auth_resp - - def get_session(self, bearer_token: bool = False) -> SessionWithHeaderRedirection: - """ - returns a new request session instance, since looks like using a session in a context is not threadsafe - https://github.com/psf/requests/issues/1871 - Session with bearer tokens are used by CMR, simple auth sessions can be used do download data - from on-prem DAAC data centers. - :returns: subclass SessionWithHeaderRedirection instance - """ - if bearer_token and self.authenticated: - session = SessionWithHeaderRedirection() - session.headers.update( - {"Authorization": f'Bearer {self.token["access_token"]}'} - ) - return session - else: - return SessionWithHeaderRedirection( - self._credentials[0], self._credentials[1] - ) - - def _generate_user_token(self, username: str, password: str) -> Any: - session = SessionWithHeaderRedirection(username, password) - auth_resp = session.post( - self.EDL_GENERATE_TOKENS_URL, - headers={ - "Accept": "application/json", - }, - timeout=10, - ) - return auth_resp - def __init__(self) -> None: # Maybe all these predefined URLs should be in a constants.py file self.authenticated = False + self.tokens: List = [] self.EDL_GET_TOKENS_URL = "https://urs.earthdata.nasa.gov/api/users/tokens" self.EDL_GENERATE_TOKENS_URL = "https://urs.earthdata.nasa.gov/api/users/token" + self.EDL_REVOKE_TOKEN = "https://urs.earthdata.nasa.gov/api/users/revoke_token" - def login(self, strategy: str = "interactive", cache: bool = True) -> Any: + def login(self, strategy: str = "interactive", persist: bool = False) -> Any: """Authenticate with Earthdata login :strategy: authentication method to used "interactive" - (default) enter username and password "netrc" - retrieve username and password from ~/.netrc - "environment" - retrieve username and password from $CMR_USERNAME and $CMR_PASSWORD - :cache: no need to input credentials after login the first time + "environment" - retrieve username and password from $EDL_USERNAME and $EDL_PASSWORD + :persist: will persist credentials in a .netrc file """ + if self.authenticated: + print("We are already authenticated with NASA EDL") + return self if strategy == "interactive": - self._interactive(cache) + self._interactive(persist) if strategy == "netrc": self._netrc() + if strategy == "environment": + self._environment() return self - def _get_credentials( - self, username: Optional[str], password: Optional[str] - ) -> bool: - if username is not None and password is not None: - self._session = SessionWithHeaderRedirection(username, password) - token_resp = self._get_user_tokens(username, password) - - if not (token_resp.ok): # type: ignore + def refresh_tokens(self) -> bool: + if len(self.tokens) == 0: + resp_tokens = self._generate_user_token( + username=self._credentials[0], password=self._credentials[1] + ) + if resp_tokens.ok: + self.token = resp_tokens.json() + self.tokens = [self.token] print( - f"Authentication with Earthdata Login failed with:\n{token_resp.text}" + f"earthdata generated a token for CMR with expiration on: {self.token['expiration_date']}" ) - self.authenticated = False - return self.authenticated - print("You're now authenticated with NASA Earthdata Login") - self._credentials = (username, password) - tokens = token_resp.json() - if len(tokens) > 0: - self.token = tokens[0] - self.authenticated = True + return True + else: + print(resp_tokens) + return False + if len(self.tokens) == 1: + resp_tokens = self._generate_user_token( + username=self._credentials[0], password=self._credentials[1] + ) + if resp_tokens.ok: + self.token = resp_tokens.json() + self.tokens.extend(self.token) + print( + f"earthdata generated a token for CMR with expiration on: {self.token['expiration_date']}" + ) + return True else: - try: - resp_tokens = self._generate_user_token(username, password) + print(resp_tokens) + return False + + if len(self.tokens) == 2: + resp_revoked = self._revoke_user_token(self.token["access_token"]) + if resp_revoked: + resp_tokens = self._generate_user_token( + username=self._credentials[0], password=self._credentials[1] + ) + if resp_tokens.ok: self.token = resp_tokens.json() - self.authenticated = True - except Exception: - self.token = None - return self.authenticated + self.tokens[0] = self.token + print( + f"earthdata generated a token for CMR with expiration on: {self.token['expiration_date']}" + ) + return True + else: + print(resp_tokens) + return False + return False - def _interactive(self, cache: bool = True) -> bool: + def get_s3_credentials( + self, cloud_provider: str = "" + ) -> Union[Dict[str, str], None]: + """ + gets AWS S3 credentials for a given NASA cloud provider + :param cloud_provider: a NASA DAAC cloud provider i.e. POCLOUD + :returns: a python dictionary with the S3 keys or None + """ + auth_url = self._get_cloud_auth_url(cloud_provider) + if auth_url.startswith("https://"): + cumulus_resp = self._session.get(auth_url, timeout=10, allow_redirects=True) + auth_resp = self._session.get( + cumulus_resp.url, allow_redirects=True, timeout=10 + ) + if not (auth_resp.ok): # type: ignore + print( + f"Authentication with Earthdata Login failed with:\n{auth_resp.text}" + ) + return None + return auth_resp.json() + else: + # This happens if the cloud provider doesn't list the S3 credentials or the DAAC + # does not have cloud collections yet + print( + f"Credentials for the cloud provider {cloud_provider} are not available" + ) + return None + + def get_session(self, bearer_token: bool = False) -> SessionWithHeaderRedirection: + """ + Returns a new request session instance, since looks like using a session in a context is not threadsafe + https://github.com/psf/requests/issues/1871 + Session with bearer tokens are used by CMR, simple auth sessions can be used do download data + from on-prem DAAC data centers. + :returns: subclass SessionWithHeaderRedirection instance + """ + if bearer_token and self.authenticated: + session = SessionWithHeaderRedirection() + session.headers.update( + {"Authorization": f'Bearer {self.token["access_token"]}'} + ) + return session + else: + return SessionWithHeaderRedirection( + self._credentials[0], self._credentials[1] + ) + + def _interactive(self, presist_credentials: bool = True) -> bool: username = input("Enter your Earthdata Login username: ") password = getpass.getpass(prompt="Enter your Earthdata password: ") authenticated = self._get_credentials(username, password) - if authenticated is True: - os.environ["EDL_USERNAME"] = username - os.environ["EDL_PASSWORD"] = password - + if authenticated is True and presist_credentials is True: + self._persist_user_credentials(username, password) return authenticated def _netrc(self) -> bool: try: - my_netrc = netrc.netrc() + my_netrc = Netrc() except FileNotFoundError as err: print(f"Expects .netrc in {os.path.expanduser('~')}") print(err) @@ -160,11 +192,11 @@ def _netrc(self) -> bool: print("Unable to parse .netrc") print(err) return False - authenticators = my_netrc.authenticators("urs.earthdata.nasa.gov") - if authenticators is None: - print("Host urs.earthdata.nasa.gov not found in netrc") + if my_netrc["urs.earthdata.nasa.gov"] is not None: + username = my_netrc["urs.earthdata.nasa.gov"]["login"] + password = my_netrc["urs.earthdata.nasa.gov"]["password"] + else: return False - username, _, password = authenticators authenticated = self._get_credentials(username, password) return authenticated @@ -174,6 +206,82 @@ def _environment(self) -> bool: authenticated = self._get_credentials(username, password) return authenticated + def _get_credentials( + self, username: Optional[str], password: Optional[str] + ) -> bool: + if username is not None and password is not None: + self._session = SessionWithHeaderRedirection(username, password) + token_resp = self._get_user_tokens(username, password) + + if not (token_resp.ok): # type: ignore + print( + f"Authentication with Earthdata Login failed with:\n{token_resp.text}" + ) + return False + print("You're now authenticated with NASA Earthdata Login") + self._credentials = (username, password) + self.tokens = token_resp.json() + self.authenticated = True + + if len(self.tokens) == 0: + self.refresh_tokens() + print( + f"earthdata generated a token for CMR with expiration on: {self.token['expiration_date']}" + ) + self.token = self.tokens[0] + elif len(self.tokens) > 0: + self.token = self.tokens[0] + print( + f"Using token with expiration date: {self.token['expiration_date']}" + ) + + return self.authenticated + + def _get_user_tokens(self, username: str, password: str) -> Any: + session = SessionWithHeaderRedirection(username, password) + auth_resp = session.get( + self.EDL_GET_TOKENS_URL, + headers={ + "Accept": "application/json", + }, + timeout=10, + ) + return auth_resp + + def _generate_user_token(self, username: str, password: str) -> Any: + session = SessionWithHeaderRedirection(username, password) + auth_resp = session.post( + self.EDL_GENERATE_TOKENS_URL, + headers={ + "Accept": "application/json", + }, + timeout=10, + ) + return auth_resp + + def _revoke_user_token(self, token: str) -> bool: + session = SessionWithHeaderRedirection( + self._credentials[0], self._credentials[1] + ) + auth_resp = session.post( + self.EDL_REVOKE_TOKEN, + params={"token": token}, + headers={ + "Accept": "application/json", + }, + timeout=10, + ) + return auth_resp.ok + + def _persist_user_credentials(self, username: str, password: str) -> bool: + # See: https://github.com/sloria/tinynetrc/issues/34 + netrc_path = Path().home().joinpath(".netrc") + netrc_path.touch(mode=600, exist_ok=True) + my_netrc = Netrc(str(netrc_path)) + my_netrc["urs.earthdata.nasa.gov"] = {"login": username, "password": password} + my_netrc.save() + return True + def _get_cloud_auth_url(self, cloud_provider: str = "") -> str: for provider in DAACS: if ( @@ -182,31 +290,3 @@ def _get_cloud_auth_url(self, cloud_provider: str = "") -> str: ): return str(provider["s3-credentials"]) return "" - - def get_s3_credentials( - self, cloud_provider: str = "" - ) -> Union[Dict[str, str], None]: - """ - gets AWS S3 credentials for a given NASA cloud provider - :param cloud_provider: a NASA DAAC cloud provider i.e. POCLOUD - :returns: a python dictionary with the S3 keys or None - """ - auth_url = self._get_cloud_auth_url(cloud_provider) - if auth_url.startswith("https://"): - cumulus_resp = self._session.get(auth_url, timeout=10, allow_redirects=True) - auth_resp = self._session.get( - cumulus_resp.url, allow_redirects=True, timeout=10 - ) - if not (auth_resp.ok): # type: ignore - print( - f"Authentication with Earthdata Login failed with:\n{auth_resp.text}" - ) - return None - return auth_resp.json() - else: - # This happens if the cloud provider doesn't list the S3 credentials or the DAAC - # does not have cloud collections yet - print( - f"Credentials for the cloud provider {cloud_provider} are not available" - ) - return None diff --git a/earthdata/results.py b/earthdata/results.py index 8e37207f..5292e482 100644 --- a/earthdata/results.py +++ b/earthdata/results.py @@ -117,7 +117,9 @@ def version(self) -> str: return "" def abstract(self) -> str: - return self["umm"]["Abstract"] + if "Abstract" in self["umm"]: + return self["umm"]["Abstract"] + return "" def landing_page(self) -> str: links = self._filter_related_links("LANDING PAGE") @@ -204,12 +206,17 @@ def size(self) -> float: """ returns the total size for the granule in MB """ - total_size = sum( - [ - float(s["Size"]) - for s in self["umm"]["DataGranule"]["ArchiveAndDistributionInformation"] - ] - ) + try: + total_size = sum( + [ + float(s["Size"]) + for s in self["umm.DataGranule.ArchiveAndDistributionInformation"] + if "ArchiveAndDistributionInformation" in self["umm"]["DataGranule"] + ] + ) + except Exception: + total_size = 0 + pass return total_size def _derive_s3_link(self, links: List[str]) -> List[str]: @@ -223,15 +230,19 @@ def _derive_s3_link(self, links: List[str]) -> List[str]: s3_links.append(f's3://{links[0].split("nasa.gov/")[1]}') return s3_links - def data_links(self, s3_only: bool = False) -> List[str]: + def data_links(self, access: str = "on_prem") -> List[str]: + """ + Returns the data links form a granule + :param access: direct or on_prem + :returns: the data link for the requested access type + """ links = self._filter_related_links("GET DATA") s3_links = self._filter_related_links("GET DATA VIA DIRECT ACCESS") - if self.cloud_hosted and s3_only: + if self.cloud_hosted and access == "direct": if len(s3_links) == 0 and len(links) > 0: return self._derive_s3_link(links) else: return s3_links - links.extend(s3_links) return links def dataviz_links(self) -> List[str]: diff --git a/earthdata/search.py b/earthdata/search.py index 6458d8af..f5b78bae 100644 --- a/earthdata/search.py +++ b/earthdata/search.py @@ -192,7 +192,8 @@ def temporal( class DataGranules(GranuleQuery): """ - A Granule oriented client for NASA CMR API + A Granule oriented client for NASA CMR + API: https://cmr.earthdata.nasa.gov/search/site/docs/search/api.html """ diff --git a/earthdata/store.py b/earthdata/store.py index 09d9b3e9..df4de932 100644 --- a/earthdata/store.py +++ b/earthdata/store.py @@ -94,7 +94,9 @@ def get_http_session( :returns: subclass SessionWithHeaderRedirection instance """ if bearer_token and self.auth.authenticated: - session = SessionWithHeaderRedirection() + session = SessionWithHeaderRedirection( + self.auth._credentials[0], self.auth._credentials[1] + ) session.headers.update( {"Authorization": f'Bearer {self.auth.token["access_token"]}'} ) @@ -104,33 +106,38 @@ def get_http_session( self.auth._credentials[0], self.auth._credentials[1] ) - def open(self, granules: List[Any]) -> List[Any]: + def open(self, granules: List[Any], provider: str = None) -> List[Any]: """ returns a list of S3 file objects that can be used to access files hosted on S3 by third party libraries like xarray - :param granules: a list of granules(DataGranule) instances + :param granules: a list of granules(DataGranule) instances or list of files + :param provider: cloud provider code, used when the list is made of s3 links :returns: a list of s3fs "file pointers" to s3 files """ - fileset: List + fileset: List = [] + data_links: List = [] + if isinstance(granules[0], DataGranule): + provider = granules[0]["meta"]["provider-id"] + data_links = list( + chain.from_iterable( + granule.data_links(access="direct") for granule in granules + ) + ) + total_size = round(sum([granule.size() for granule in granules]) / 1024, 2) + print( + f" Getting {len(granules)} granules, approx download size: {total_size} GB" + ) + elif isinstance(granules[0], str) and granules[0].startswith("s3"): + provider = provider + data_links = granules if self.auth is None: print( "A valid Earthdata login instance is required to retrieve S3 credentials" ) return [] - if not (len(granules) > 0 and isinstance(granules[0], DataGranule)): - print("To open a dataset a valid list of DataGranule instances is needed") - return [] - provider = granules[0]["meta"]["provider-id"] - cloud_hosted = granules[0].cloud_hosted - if not cloud_hosted: - print("Can't open files that are not cloud hosted, try with .get()") - return [] s3_fs = self.get_s3fs_session(provider=provider) - # We are assuming that the first GET DATA link is the data link - # TODO: filter by file type? - if s3fs is not None: - data_links = [granule.data_links()[0] for granule in granules] + if s3_fs is not None: try: fileset = [s3_fs.open(file) for file in data_links] except Exception: @@ -145,21 +152,21 @@ def get( self, granules: List[Any], local_path: str = None, - direct_access: bool = True, + access: str = None, provider: str = None, threads: int = 8, ) -> None: """ - Retrieves data granules from a remote storage system to a local instance. + Retrieves data granules from a remote storage system. If we run this in the cloud we are moving data from S3 to a cloud compute instance (EC2, AWS Lambda) If we run it outside the us-west-2 region and the data granules are part of a cloud-based collection the method will not get any files. If we requests data granules from an on-prem collection the data will be effectively downloaded to a local directory. - :param granules: a list of granules(DataGranule) instances + :param granules: a list of granules(DataGranule) instances or a list of granule links (HTTP) :param local_path: local directory to store the remote data granules - :param direct_access: use direct S3 access, only possible for cloud collections if the code runs on us-west-2 + :param access: If set it will use it for the access method. :param threads: parallel number of threads to use to download the files, adjust as necessary, default = 8 :returns: None """ @@ -167,21 +174,25 @@ def get( if isinstance(granules[0], DataGranule): provider = granules[0]["meta"]["provider-id"] cloud_hosted = granules[0].cloud_hosted + if cloud_hosted and access is None: + # TODO: validate that we are in us-west-2 + access = "direct" + if not cloud_hosted and access is None: + access = "on_prem" data_links = list( chain.from_iterable( - granule.data_links(s3_only=direct_access) for granule in granules + granule.data_links(access=access) for granule in granules ) ) total_size = round(sum([granule.size() for granule in granules]) / 1024, 2) print( f" Getting {len(granules)} granules, approx download size: {total_size} GB" ) - elif isinstance(granules[0], str): - # TODO: Fix this! + elif isinstance(granules[0], str) and granules[0].startswith("http"): provider = provider data_links = granules - cloud_hosted = direct_access - if cloud_hosted and direct_access: + if access == "direct": + print(f"Accessing cloud dataset using provider: {provider}") s3_fs = self.get_s3fs_session(provider) # TODO: make this parallel for file in data_links: @@ -199,12 +210,19 @@ def _download_file(self, url: str, directory: str) -> str: :param directory: local directory :returns: local filepath or an exception """ + # If the get data link is an Opendap location + if "/opendap/" in url and url.endswith(".nc.html"): + url = url.replace(".html", "") local_filename = url.split("/")[-1] if not os.path.exists(f"{directory}/{local_filename}"): try: # Looks like requests.session is not threadsafe - # TODO: make this efficient + # TODO: make this efficient using cache and async session = self.get_http_session() + r = session.head(url) + if "text/html" in r.headers["Content-Type"]: + # print(f"Granule file is not resolving to a valid location: {url}") + return "" with session.get(url, stream=True) as r: r.raise_for_status() with open(f"{directory}/{local_filename}", "wb") as f: diff --git a/mkdocs.yml b/mkdocs.yml index be35c42c..085f8f64 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -4,10 +4,46 @@ site_url: https://github.com/betolink/earthdata theme: name: 'material' + palette: + - scheme: default + primary: teal + toggle: + icon: material/toggle-switch-off-outline + name: Switch to dark mode + - scheme: slate + toggle: + icon: material/toggle-switch + name: Switch to light mode repo_name: betolink/earthdata repo_url: https://github.com/betolink/earthdata edit_uri: '' +plugins: + - search + - mkdocstrings + - mkdocs-jupyter: + execute: False + nav: - - earthdata: 'index.md' + - Overview: 'index.md' + - Tutorials: + - 'Basic usage': 'tutorials/demo.ipynb' + - 'Accessing restricted datasets': 'tutorials/restricted-datasets.ipynb' + - 'Accessing on-prem datasets': 'tutorials/onprem.md' + - 'Accessing cloud-based datasets': 'tutorials/cloud.md' + - User Reference: + - Collections: + - 'Collection Queries': 'user-reference/collections/collections-query.md' + - 'Collection Results': 'user-reference/collections/collections.md' + - Granules: + - 'Granule Queries': 'user-reference/granules/granules-query.md' + - 'Granule Results': 'user-reference/granules/granules.md' + +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.superfences + diff --git a/notebooks/DatasetSearch.ipynb b/notebooks/DatasetSearch.ipynb index 35ea9fd1..3631085a 100644 --- a/notebooks/DatasetSearch.ipynb +++ b/notebooks/DatasetSearch.ipynb @@ -52,17 +52,17 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "f8b80820-94ce-468c-b8cc-69d84a2dadfd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "5" + "554" ] }, - "execution_count": 1, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -71,14 +71,14 @@ "from earthdata import DataCollections\n", "\n", "# We only need to specify the DAAC and if we're looking for cloud hosted data\n", - "query = DataCollections().daac(\"LPDAAC\").cloud_hosted(True)\n", + "query = DataCollections().daac(\"LPDAAC\").cloud_hosted(False)\n", "# we use hits to get a count for the collections that match our query\n", "query.hits()" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "2e674100-f041-4620-bd33-0ec29f0a8fd8", "metadata": {}, "outputs": [], @@ -91,46 +91,96 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "e84a0423-6045-465a-9c1d-2505f9643d26", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[{'short-name': 'ASTGTM',\n", - " 'concept-id': 'C1711961296-LPCLOUD',\n", + "[{'short-name': 'ECO2LSTE',\n", + " 'concept-id': 'C1534729776-LPDAAC_ECS',\n", + " 'version': '001',\n", + " 'file-type': \"[{'AverageFileSize': 683.0, 'AverageFileSizeUnit': 'MB', 'Format': 'HDF5', 'FormatType': 'Native', 'Media': ['https'], 'TotalCollectionFileSizeBeginDate': '2018-07-09T00:00:00.000Z'}]\",\n", + " 'get-data': ['https://search.earthdata.nasa.gov/search?q=C1534729776-LPDAAC_ECS',\n", + " 'https://e4ftl01.cr.usgs.gov/ECOSTRESS/ECO2LSTE.001/',\n", + " 'https://appeears.earthdatacloud.nasa.gov/',\n", + " 'https://earthexplorer.usgs.gov/']},\n", + " {'short-name': 'SRTMGL1',\n", + " 'concept-id': 'C1000000240-LPDAAC_ECS',\n", " 'version': '003',\n", - " 'file-type': \"[{'Format': 'GeoTIFF', 'FormatType': 'Native'}]\",\n", - " 'get-data': ['https://search.earthdata.nasa.gov/search?q= C1711961296-LPCLOUD'],\n", - " 'cloud-info': {'Region': 'us-west-2', 'S3BucketAndObjectPrefixNames': ['s3://lp-prod-protected/ASTGTM.003, s3://lp-prod-public/ASTGTM.003'], 'S3CredentialsAPIEndpoint': 'https://data.lpdaac.prod.earthdatacloud.nasa.gov/s3credentials', 'S3CredentialsAPIDocumentationURL': 'https://data.lpdaac.prod.earthdatacloud.nasa.gov/s3credentialsREADME'}},\n", - " {'short-name': 'HLSS30',\n", - " 'concept-id': 'C2021957295-LPCLOUD',\n", - " 'version': '2.0',\n", - " 'file-type': \"[{'Format': 'Cloud Optimized GeoTIFF (COG)', 'FormatType': 'Native'}]\",\n", - " 'get-data': ['https://search.earthdata.nasa.gov/search?q=C2021957295-LPCLOUD'],\n", - " 'cloud-info': {'Region': 'us-west-2', 'S3BucketAndObjectPrefixNames': [' s3://lp-prod-protected/HLSS30.020', 's3://lp-prod-public/HLSS30.020'], 'S3CredentialsAPIEndpoint': 'https://data.lpdaac.prod.earthdatacloud.nasa.gov/s3credentials', 'S3CredentialsAPIDocumentationURL': 'https://data.lpdaac.prod.earthdatacloud.nasa.gov/s3credentialsREADME'}},\n", - " {'short-name': 'HLSS30',\n", - " 'concept-id': 'C1711924822-LPCLOUD',\n", - " 'version': '1.5',\n", - " 'file-type': \"[{'Format': 'Cloud Optimized GeoTIFF (COG)', 'FormatType': 'Native'}]\",\n", - " 'get-data': ['https://search.earthdata.nasa.gov/search?q=C1711924822-LPCLOUD'],\n", - " 'cloud-info': {'Region': 'us-west-2', 'S3BucketAndObjectPrefixNames': ['s3://lp-prod-protected/HLSS30.015', 's3://lp-prod-public/HLSS30.015'], 'S3CredentialsAPIEndpoint': 'https://data.lpdaac.prod.earthdatacloud.nasa.gov/s3credentials', 'S3CredentialsAPIDocumentationURL': 'https://data.lpdaac.prod.earthdatacloud.nasa.gov/s3credentialsREADME'}},\n", - " {'short-name': 'HLSL30',\n", - " 'concept-id': 'C2021957657-LPCLOUD',\n", - " 'version': '2.0',\n", - " 'file-type': \"[{'Format': 'Cloud Optimized GeoTIFF (COG)', 'FormatType': 'Native'}]\",\n", - " 'get-data': ['https://search.earthdata.nasa.gov/search?q=C2021957657-LPCLOUD'],\n", - " 'cloud-info': {'Region': 'us-west-2', 'S3BucketAndObjectPrefixNames': [' s3://lp-prod-protected/HLSL30.020', 's3://lp-prod-public/HLSL30.020'], 'S3CredentialsAPIEndpoint': 'https://data.lpdaac.prod.earthdatacloud.nasa.gov/s3credentials', 'S3CredentialsAPIDocumentationURL': 'https://data.lpdaac.prod.earthdatacloud.nasa.gov/s3credentialsREADME'}},\n", - " {'short-name': 'HLSL30',\n", - " 'concept-id': 'C1711972753-LPCLOUD',\n", - " 'version': '1.5',\n", - " 'file-type': \"[{'Format': 'Cloud Optimized GeoTIFF (COG)', 'FormatType': 'Native'}]\",\n", - " 'get-data': ['https://search.earthdata.nasa.gov/search?q=C1711972753-LPCLOUD'],\n", - " 'cloud-info': {'Region': 'us-west-2', 'S3BucketAndObjectPrefixNames': ['s3://lp-prod-protected/HLSL30.015', 's3://lp-prod-public/HLSL30.015'], 'S3CredentialsAPIEndpoint': 'https://data.lpdaac.prod.earthdatacloud.nasa.gov/s3credentials', 'S3CredentialsAPIDocumentationURL': 'https://data.lpdaac.prod.earthdatacloud.nasa.gov/s3credentialsREADME'}}]" + " 'file-type': \"[{'FormatType': 'Native', 'AverageFileSize': 6.99, 'Format': 'HGT', 'TotalCollectionFileSize': 99.96, 'TotalCollectionFileSizeUnit': 'GB', 'Description': 'Data are compressed and available for download in a zip file.', 'AverageFileSizeUnit': 'MB', 'Media': ['https']}]\",\n", + " 'get-data': ['https://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL1.003/',\n", + " 'https://earthexplorer.usgs.gov/',\n", + " 'https://lpdaacsvc.cr.usgs.gov/appeears/',\n", + " 'https://search.earthdata.nasa.gov/search?q=C1000000240-LPDAAC_ECS']},\n", + " {'short-name': 'ECO1BGEO',\n", + " 'concept-id': 'C1534584923-LPDAAC_ECS',\n", + " 'version': '001',\n", + " 'file-type': \"[{'AverageFileSize': 1.2, 'AverageFileSizeUnit': 'GB', 'Format': 'HDF5', 'FormatType': 'Native', 'Media': ['https'], 'TotalCollectionFileSizeBeginDate': '2018-07-09T00:00:00.000Z'}]\",\n", + " 'get-data': ['https://search.earthdata.nasa.gov/search?q=C1534584923-LPDAAC_ECS',\n", + " 'https://e4ftl01.cr.usgs.gov/ECOSTRESS/ECO1BGEO.001/',\n", + " 'https://earthexplorer.usgs.gov/',\n", + " 'https://appeears.earthdatacloud.nasa.gov/']},\n", + " {'short-name': 'MOD09GA',\n", + " 'concept-id': 'C1621091648-LPDAAC_ECS',\n", + " 'version': '061',\n", + " 'file-type': \"[{'Format': 'HDF-EOS2', 'FormatType': 'Native', 'FormatDescription': 'Hierarchical Data Format - Earth Observing System Version 2', 'Media': ['HTTP'], 'AverageFileSize': 84.0, 'AverageFileSizeUnit': 'MB', 'TotalCollectionFileSizeBeginDate': '2000-02-24T00:00:00.000Z'}]\",\n", + " 'get-data': ['https://e4ftl01.cr.usgs.gov/MOLT/MOD09GA.061/',\n", + " 'https://search.earthdata.nasa.gov/search?q=C1621091648-LPDAAC_ECS',\n", + " 'https://earthexplorer.usgs.gov/',\n", + " 'https://appeears.earthdatacloud.nasa.gov/']},\n", + " {'short-name': 'MOD09GA',\n", + " 'concept-id': 'C193529902-LPDAAC_ECS',\n", + " 'version': '006',\n", + " 'file-type': \"[{'Format': 'HDF-EOS2', 'FormatType': 'Native', 'FormatDescription': 'Hierarchical Data Format - Earth Observing System Version 2', 'Media': ['https'], 'AverageFileSize': 84.0, 'AverageFileSizeUnit': 'MB', 'TotalCollectionFileSizeBeginDate': '2000-02-24T00:00:00.000Z'}]\",\n", + " 'get-data': ['https://e4ftl01.cr.usgs.gov/MOLT/MOD09GA.006/',\n", + " 'https://earthexplorer.usgs.gov/',\n", + " 'https://search.earthdata.nasa.gov/search?q=C193529902-LPDAAC_ECS',\n", + " 'https://appeears.earthdatacloud.nasa.gov/']},\n", + " {'short-name': 'MOD09GQ',\n", + " 'concept-id': 'C1621091662-LPDAAC_ECS',\n", + " 'version': '061',\n", + " 'file-type': \"[{'Format': 'HDF-EOS2', 'FormatType': 'Native', 'FormatDescription': 'Hierarchical Data Format - Earth Observing System Version 2', 'Media': ['HTTP'], 'AverageFileSize': 84.0, 'AverageFileSizeUnit': 'MB', 'TotalCollectionFileSizeBeginDate': '2000-02-24T00:00:00.000Z'}]\",\n", + " 'get-data': ['https://e4ftl01.cr.usgs.gov/MOLT/MOD09GQ.061/',\n", + " 'https://search.earthdata.nasa.gov/search?q=C1621091662-LPDAAC_ECS',\n", + " 'https://earthexplorer.usgs.gov/',\n", + " 'https://appeears.earthdatacloud.nasa.gov/']},\n", + " {'short-name': 'MOD09GQ',\n", + " 'concept-id': 'C193529903-LPDAAC_ECS',\n", + " 'version': '006',\n", + " 'file-type': \"[{'Format': 'HDF-EOS2', 'FormatType': 'Native', 'FormatDescription': 'Hierarchical Data Format - Earth Observing System Version 2', 'Media': ['https'], 'AverageFileSize': 95.0, 'AverageFileSizeUnit': 'MB', 'TotalCollectionFileSizeBeginDate': '2000-02-24T00:00:00.000Z'}]\",\n", + " 'get-data': ['https://e4ftl01.cr.usgs.gov/MOLT/MOD09GQ.006/',\n", + " 'https://earthexplorer.usgs.gov/',\n", + " 'https://search.earthdata.nasa.gov/search?q=C193529903-LPDAAC_ECS',\n", + " 'https://appeears.earthdatacloud.nasa.gov/']},\n", + " {'short-name': 'MOD13Q1',\n", + " 'concept-id': 'C1621383370-LPDAAC_ECS',\n", + " 'version': '061',\n", + " 'file-type': \"[{'FormatType': 'Native', 'AverageFileSize': 93.0, 'Format': 'HDF-EOS2', 'TotalCollectionFileSizeBeginDate': '2000-02-18T00:00:00.000Z', 'FormatDescription': 'Hierarchical Data Format - Earth Observing System Version 2', 'AverageFileSizeUnit': 'MB', 'Media': ['HTTP']}]\",\n", + " 'get-data': ['https://e4ftl01.cr.usgs.gov/MOLT/MOD13Q1.061/',\n", + " 'https://search.earthdata.nasa.gov/search?q=C1621383370-LPDAAC_ECS',\n", + " 'https://appeears.earthdatacloud.nasa.gov/',\n", + " 'https://earthexplorer.usgs.gov/']},\n", + " {'short-name': 'MOD13Q1',\n", + " 'concept-id': 'C194001241-LPDAAC_ECS',\n", + " 'version': '006',\n", + " 'file-type': \"[{'FormatType': 'Native', 'AverageFileSize': 92.86, 'Format': 'HDF-EOS2', 'TotalCollectionFileSizeBeginDate': '2000-02-18T00:00:00.000Z', 'FormatDescription': 'Hierarchical Data Format - Earth Observing System Version 2', 'AverageFileSizeUnit': 'MB', 'Media': ['https']}]\",\n", + " 'get-data': ['https://e4ftl01.cr.usgs.gov/MOLT/MOD13Q1.006/',\n", + " 'http://earthexplorer.usgs.gov/',\n", + " 'https://search.earthdata.nasa.gov/search?q=C194001241-LPDAAC_ECS',\n", + " 'https://appeears.earthdatacloud.nasa.gov/']},\n", + " {'short-name': 'MYD09GA',\n", + " 'concept-id': 'C1621389350-LPDAAC_ECS',\n", + " 'version': '061',\n", + " 'file-type': \"[{'Format': 'HDF-EOS2', 'FormatType': 'Native', 'FormatDescription': 'Hierarchical Data Format - Earth Observing System Version 2', 'Media': ['HTTP'], 'AverageFileSize': 84.0, 'AverageFileSizeUnit': 'MB', 'TotalCollectionFileSizeBeginDate': '2002-07-04T00:00:00.000Z'}]\",\n", + " 'get-data': ['https://e4ftl01.cr.usgs.gov/MOLA/MYD09GA.061/',\n", + " 'https://search.earthdata.nasa.gov/search?q=C1621389350-LPDAAC_ECS',\n", + " 'https://earthexplorer.usgs.gov/',\n", + " 'https://appeears.earthdatacloud.nasa.gov/']}]" ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } diff --git a/poetry.lock b/poetry.lock index ec8541c8..4327e785 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,6 +1,6 @@ [[package]] name = "aiobotocore" -version = "2.1.2" +version = "2.2.0" description = "Async client for aws services using botocore and aiohttp" category = "main" optional = false @@ -9,12 +9,12 @@ python-versions = ">=3.6" [package.dependencies] aiohttp = ">=3.3.1" aioitertools = ">=0.5.1" -botocore = ">=1.23.24,<1.23.25" +botocore = ">=1.24.21,<1.24.22" wrapt = ">=1.10.10" [package.extras] -awscli = ["awscli (>=1.22.24,<1.22.25)"] -boto3 = ["boto3 (>=1.20.24,<1.20.25)"] +awscli = ["awscli (>=1.22.76,<1.22.77)"] +boto3 = ["boto3 (>=1.21.21,<1.21.22)"] [[package]] name = "aiohttp" @@ -27,12 +27,10 @@ python-versions = ">=3.6" [package.dependencies] aiosignal = ">=1.1.2" async-timeout = ">=4.0.0a3,<5.0" -asynctest = {version = "0.13.0", markers = "python_version < \"3.8\""} attrs = ">=17.3.0" charset-normalizer = ">=2.0,<3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} yarl = ">=1.0,<2.0" [package.extras] @@ -61,23 +59,93 @@ python-versions = ">=3.6" frozenlist = ">=1.1.0" [[package]] -name = "async-timeout" -version = "4.0.2" -description = "Timeout context manager for asyncio programs" -category = "main" +name = "anyio" +version = "3.5.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=6.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16)"] + +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "argon2-cffi" +version = "21.3.0" +description = "The secure Argon2 password hashing algorithm." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["pre-commit", "cogapp", "tomli", "coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "sphinx-notfound-page", "furo"] +docs = ["sphinx", "sphinx-notfound-page", "furo"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] -typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""} +cffi = ">=1.0.1" + +[package.extras] +dev = ["pytest", "cogapp", "pre-commit", "wheel"] +tests = ["pytest"] + +[[package]] +name = "asttokens" +version = "2.0.5" +description = "Annotate AST trees with source code positions" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[package.extras] +test = ["astroid", "pytest"] + +[[package]] +name = "astunparse" +version = "1.6.3" +description = "An AST unparser for Python" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +six = ">=1.6.1,<2.0" [[package]] -name = "asynctest" -version = "0.13.0" -description = "Enhance the standard unittest package with features for testing asyncio libraries" +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [[package]] name = "atomicwrites" @@ -112,48 +180,93 @@ python-versions = "*" [package.dependencies] pyflakes = ">=1.1.0" +[[package]] +name = "babel" +version = "2.10.1" +description = "Internationalization utilities" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pytz = ">=2015.7" + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "beautifulsoup4" +version = "4.11.1" +description = "Screen-scraping library" +category = "dev" +optional = false +python-versions = ">=3.6.0" + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "black" -version = "21.12b0" +version = "22.3.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.6.2" [package.dependencies] -click = ">=7.1.2" +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0,<1" +pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = ">=0.2.6,<2.0.0" -typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} -typing-extensions = [ - {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, - {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, -] +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} [package.extras] colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "bleach" +version = "5.0.0" +description = "An easy safelist-based HTML-sanitizing tool." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0)"] +dev = ["pip-tools (==6.5.1)", "pytest (==7.1.1)", "flake8 (==4.0.1)", "tox (==3.24.5)", "sphinx (==4.3.2)", "twine (==4.0.0)", "wheel (==0.37.1)", "hashin (==0.17.0)", "black (==22.3.0)", "mypy (==0.942)"] + [[package]] name = "botocore" -version = "1.23.24" +version = "1.24.21" description = "Low-level, data-driven core of boto 3." category = "main" optional = false python-versions = ">= 3.6" [package.dependencies] -jmespath = ">=0.7.1,<1.0.0" +jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" urllib3 = ">=1.25.4,<1.27" [package.extras] -crt = ["awscrt (==0.12.5)"] +crt = ["awscrt (==0.13.5)"] [[package]] name = "bounded-pool-executor" @@ -171,6 +284,17 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "cffi" +version = "1.15.0" +description = "Foreign Function Interface for Python calling C code." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + [[package]] name = "cfgv" version = "3.3.1" @@ -192,15 +316,14 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.0.4" +version = "8.1.2" description = "Composable command line interface toolkit" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "colorama" @@ -218,9 +341,36 @@ category = "dev" optional = false python-versions = ">=3.7" +[package.dependencies] +tomli = {version = "*", optional = true, markers = "extra == \"toml\""} + [package.extras] toml = ["tomli"] +[[package]] +name = "debugpy" +version = "1.6.0" +description = "An implementation of the Debug Adapter Protocol for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + [[package]] name = "distlib" version = "0.3.4" @@ -237,6 +387,33 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "entrypoints" +version = "0.4" +description = "Discover and load entry points from installed packages." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "executing" +version = "0.8.3" +description = "Get the currently executing AST node of a frame, and other information" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "fastjsonschema" +version = "2.15.3" +description = "Fastest Python implementation of JSON schema" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +devel = ["colorama", "jsonschema", "json-spec", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + [[package]] name = "filelock" version = "3.6.0" @@ -251,17 +428,16 @@ testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-co [[package]] name = "flake8" -version = "3.9.2" +version = "4.0.1" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6" [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.7.0,<2.8.0" -pyflakes = ">=2.3.0,<2.4.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" [[package]] name = "frozenlist" @@ -273,7 +449,7 @@ python-versions = ">=3.7" [[package]] name = "fsspec" -version = "2022.2.0" +version = "2022.3.0" description = "File-system specification" category = "main" optional = false @@ -300,6 +476,7 @@ s3 = ["s3fs"] sftp = ["paramiko"] smb = ["smbprotocol"] ssh = ["paramiko"] +tqdm = ["tqdm"] [[package]] name = "ftfy" @@ -354,7 +531,6 @@ optional = false python-versions = ">=3.7" [package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] @@ -362,6 +538,21 @@ docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] perf = ["ipython"] testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +[[package]] +name = "importlib-resources" +version = "5.7.1" +description = "Read resources from Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] + [[package]] name = "iniconfig" version = "1.1.1" @@ -370,6 +561,72 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "ipykernel" +version = "6.13.0" +description = "IPython Kernel for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +debugpy = ">=1.0" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +tornado = ">=6.1" +traitlets = ">=5.1.0" + +[package.extras] +test = ["pytest (>=6.0)", "pytest-cov", "flaky", "ipyparallel", "pre-commit", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.2.0" +description = "IPython: Productive Interactive Computing" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +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 = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" + +[package.extras] +all = ["black", "Sphinx (>=1.3)", "ipykernel", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.19)", "pandas", "trio"] +black = ["black"] +doc = ["Sphinx (>=1.3)"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test_extra = ["pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.19)", "pandas", "trio"] + +[[package]] +name = "ipython-genutils" +version = "0.2.0" +description = "Vestigial utilities from IPython" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "isort" version = "5.10.1" @@ -384,13 +641,28 @@ requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] plugins = ["setuptools"] +[[package]] +name = "jedi" +version = "0.18.1" +description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +parso = ">=0.8.0,<0.9.0" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] + [[package]] name = "jinja2" -version = "3.0.3" +version = "3.1.1" description = "A very fast and expressive template engine." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] MarkupSafe = ">=2.0" @@ -400,15 +672,179 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jmespath" -version = "0.10.0" +version = "1.0.0" description = "JSON Matching Expressions" category = "main" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.7" + +[[package]] +name = "json5" +version = "0.9.6" +description = "A Python implementation of the JSON5 data format." +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +dev = ["hypothesis"] + +[[package]] +name = "jsonschema" +version = "4.4.0" +description = "An implementation of JSON Schema validation for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +attrs = ">=17.4.0" +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format_nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jupyter-client" +version = "7.3.0" +description = "Jupyter protocol implementation and client libraries" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +entrypoints = "*" +jupyter-core = ">=4.9.2" +nest-asyncio = ">=1.5.4" +python-dateutil = ">=2.8.2" +pyzmq = ">=22.3" +tornado = ">=6.0" +traitlets = "*" + +[package.extras] +doc = ["ipykernel", "myst-parser", "sphinx (>=1.3.6)", "sphinx-rtd-theme", "sphinxcontrib-github-alt"] +test = ["codecov", "coverage", "ipykernel (>=6.5)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "4.10.0" +description = "Jupyter core package. A base package on which Jupyter projects rely." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = "*" + +[package.extras] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-server" +version = "1.16.0" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = "*" +jinja2 = "*" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.7.0" +nbconvert = ">=6.4.4" +nbformat = ">=5.2.0" +packaging = "*" +prometheus-client = "*" +pywinpty = {version = "*", markers = "os_name == \"nt\""} +pyzmq = ">=17" +Send2Trash = "*" +terminado = ">=0.8.3" +tornado = ">=6.1.0" +traitlets = ">=5.1.0" +websocket-client = "*" + +[package.extras] +test = ["coverage", "pytest (>=6.0)", "pytest-cov", "pytest-mock", "pytest-timeout", "requests", "pytest-tornasync", "pytest-console-scripts", "ipykernel", "pre-commit"] + +[[package]] +name = "jupyterlab" +version = "3.3.4" +description = "JupyterLab computational environment" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +ipython = "*" +jinja2 = ">=2.1" +jupyter-core = "*" +jupyter-server = ">=1.4,<2.0" +jupyterlab-server = ">=2.10,<3.0" +nbclassic = ">=0.2,<1.0" +packaging = "*" +tornado = ">=6.1.0" + +[package.extras] +test = ["check-manifest", "coverage", "jupyterlab-server", "pytest (>=6.0)", "pytest-cov", "pytest-console-scripts", "pytest-check-links (>=0.5)", "requests", "requests-cache", "virtualenv", "pre-commit"] +ui-tests = ["build"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.2.2" +description = "Pygments theme using JupyterLab CSS variables" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "jupyterlab-server" +version = "2.13.0" +description = "A set of server components for JupyterLab and JupyterLab like applications ." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +babel = "*" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0.3" +json5 = "*" +jsonschema = ">=3.0.1" +jupyter-server = ">=1.8,<2" +packaging = "*" +requests = "*" + +[package.extras] +openapi = ["openapi-core (>=0.14.2)", "ruamel.yaml"] +test = ["openapi-core (>=0.14.2)", "ruamel.yaml", "codecov", "ipykernel", "jupyter-server", "openapi-spec-validator (<0.5)", "pytest-console-scripts", "pytest-cov", "pytest (>=5.3.2)", "strict-rfc3339", "wheel"] + +[[package]] +name = "jupytext" +version = "1.13.8" +description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" +category = "dev" +optional = false +python-versions = "~=3.6" + +[package.dependencies] +markdown-it-py = ">=1.0.0,<3.0.0" +mdit-py-plugins = "*" +nbformat = "*" +pyyaml = "*" +toml = "*" + +[package.extras] +rst2md = ["sphinx-gallery (>=0.7.0,<0.8.0)"] +toml = ["toml"] [[package]] name = "mailchecker" -version = "4.1.14" +version = "4.1.16" description = "Cross-language email validation. Backed by a database of thousands throwable email providers." category = "main" optional = false @@ -439,6 +875,27 @@ python-versions = "*" [package.dependencies] markdown = "*" +[[package]] +name = "markdown-it-py" +version = "2.1.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] +code_style = ["pre-commit (==2.6)"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "markupsafe" version = "2.1.1" @@ -447,6 +904,17 @@ category = "dev" optional = false python-versions = ">=3.7" +[[package]] +name = "matplotlib-inline" +version = "0.1.3" +description = "Inline Matplotlib backend for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +traitlets = "*" + [[package]] name = "mccabe" version = "0.6.1" @@ -455,6 +923,30 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "mdit-py-plugins" +version = "0.3.0" +description = "Collection of plugins for markdown-it-py" +category = "dev" +optional = false +python-versions = "~=3.6" + +[package.dependencies] +markdown-it-py = ">=1.0.0,<3.0.0" + +[package.extras] +code_style = ["pre-commit (==2.6)"] +rtd = ["myst-parser (>=0.14.0,<0.15.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.1" +description = "Markdown URL utilities" +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "mergedeep" version = "1.3.4" @@ -463,9 +955,17 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "mistune" +version = "0.8.4" +description = "The fastest markdown parser in pure Python" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "mkdocs" -version = "1.2.3" +version = "1.3.0" description = "Project documentation with Markdown." category = "dev" optional = false @@ -474,8 +974,8 @@ python-versions = ">=3.6" [package.dependencies] click = ">=3.3" ghp-import = ">=1.0" -importlib-metadata = ">=3.10" -Jinja2 = ">=2.10.1" +importlib-metadata = ">=4.3" +Jinja2 = ">=2.10.2" Markdown = ">=3.2.1" mergedeep = ">=1.3.4" packaging = ">=20.5" @@ -486,20 +986,47 @@ watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] +[[package]] +name = "mkdocs-autorefs" +version = "0.4.1" +description = "Automatically link across pages in MkDocs." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +Markdown = ">=3.3" +mkdocs = ">=1.1" + +[[package]] +name = "mkdocs-jupyter" +version = "0.19.0" +description = "Use Jupyter in mkdocs websites" +category = "dev" +optional = false +python-versions = ">=3.7.1,<4" + +[package.dependencies] +jupytext = ">=1.11.02,<2.0.0" +mkdocs = ">=1.2.3,<2.0.0" +mkdocs-material = ">=8.0.0,<9.0.0" +nbconvert = ">=6.2.0,<7.0.0" + [[package]] name = "mkdocs-material" -version = "6.2.8" -description = "A Material Design theme for MkDocs" +version = "8.2.11" +description = "Documentation that simply works" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [package.dependencies] +jinja2 = ">=2.11.1" markdown = ">=3.2" -mkdocs = ">=1.1" -mkdocs-material-extensions = ">=1.0" -Pygments = ">=2.4" -pymdown-extensions = ">=7.0" +mkdocs = ">=1.3.0" +mkdocs-material-extensions = ">=1.0.3" +pygments = ">=2.10,<2.12" +pymdown-extensions = ">=9.0,<9.4" [[package]] name = "mkdocs-material-extensions" @@ -509,6 +1036,40 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "mkdocstrings" +version = "0.18.1" +description = "Automatic documentation from sources, for MkDocs." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +Jinja2 = ">=2.11.1" +Markdown = ">=3.3" +MarkupSafe = ">=1.1" +mkdocs = ">=1.2" +mkdocs-autorefs = ">=0.3.1" +mkdocstrings-python-legacy = ">=0.2" +pymdown-extensions = ">=6.3" + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python-legacy" +version = "0.2.2" +description = "A legacy Python handler for mkdocstrings." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +mkdocstrings = ">=0.18" +pytkdocs = ">=0.14" + [[package]] name = "multidict" version = "6.0.2" @@ -519,19 +1080,21 @@ python-versions = ">=3.7" [[package]] name = "mypy" -version = "0.812" +version = "0.942" description = "Optional static typing for Python" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [package.dependencies] -mypy-extensions = ">=0.4.3,<0.5.0" -typed-ast = ">=1.4.0,<1.5.0" -typing-extensions = ">=3.7.4" +mypy-extensions = ">=0.4.3" +tomli = ">=1.1.0" +typing-extensions = ">=3.10" [package.extras] dmypy = ["psutil (>=4.0)"] +python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] [[package]] name = "mypy-extensions" @@ -541,6 +1104,98 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "nbclassic" +version = "0.3.7" +description = "Jupyter Notebook as a Jupyter Server extension." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +jupyter-server = ">=1.8" +notebook = "<7" +notebook-shim = ">=0.1.0" + +[package.extras] +test = ["pytest", "pytest-tornasync", "pytest-console-scripts"] + +[[package]] +name = "nbclient" +version = "0.6.0" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +category = "dev" +optional = false +python-versions = ">=3.7.0" + +[package.dependencies] +jupyter-client = ">=6.1.5" +nbformat = ">=5.0" +nest-asyncio = "*" +traitlets = ">=5.0.0" + +[package.extras] +sphinx = ["mock", "moto", "myst-parser", "Sphinx (>=1.7)", "sphinx-book-theme"] +test = ["black", "check-manifest", "flake8", "ipykernel", "ipython (<8.0.0)", "ipywidgets (<8.0.0)", "mypy", "pip (>=18.1)", "pre-commit", "pytest (>=4.1)", "pytest-asyncio", "pytest-cov (>=2.6.1)", "setuptools (>=60.0)", "testpath", "twine (>=1.11.0)", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "6.5.0" +description = "Converting Jupyter Notebooks" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "*" +defusedxml = "*" +entrypoints = ">=0.2.2" +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +MarkupSafe = ">=2.0" +mistune = ">=0.8.1,<2" +nbclient = ">=0.5.0" +nbformat = ">=5.1" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.0" + +[package.extras] +all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pyppeteer (>=1,<1.1)", "tornado (>=6.1)", "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 (>=6.1)"] +test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pyppeteer (>=1,<1.1)"] +webpdf = ["pyppeteer (>=1,<1.1)"] + +[[package]] +name = "nbformat" +version = "5.3.0" +description = "The Jupyter Notebook format" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +fastjsonschema = "*" +jsonschema = ">=2.6" +jupyter-core = "*" +traitlets = ">=4.1" + +[package.extras] +test = ["check-manifest", "testpath", "pytest", "pre-commit"] + +[[package]] +name = "nest-asyncio" +version = "1.5.5" +description = "Patch asyncio to allow nested event loops" +category = "dev" +optional = false +python-versions = ">=3.5" + [[package]] name = "nodeenv" version = "1.6.0" @@ -549,6 +1204,50 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "notebook" +version = "6.4.11" +description = "A web-based notebook environment for interactive computing" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +argon2-cffi = "*" +ipykernel = "*" +ipython-genutils = "*" +jinja2 = "*" +jupyter-client = ">=5.3.4" +jupyter-core = ">=4.6.1" +nbconvert = ">=5" +nbformat = "*" +nest-asyncio = ">=1.5" +prometheus-client = "*" +pyzmq = ">=17" +Send2Trash = ">=1.8.0" +terminado = ">=0.8.3" +tornado = ">=6.1" +traitlets = ">=4.2.1" + +[package.extras] +docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] +json-logging = ["json-logging"] +test = ["pytest", "coverage", "requests", "testpath", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] + +[[package]] +name = "notebook-shim" +version = "0.1.0" +description = "A shim layer for notebook traits and config" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +jupyter-server = ">=1.8,<2.0" + +[package.extras] +test = ["pytest", "pytest-tornasync", "pytest-console-scripts"] + [[package]] name = "packaging" version = "21.3" @@ -560,6 +1259,26 @@ python-versions = ">=3.6" [package.dependencies] pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +[[package]] +name = "pandocfilters" +version = "1.5.0" +description = "Utilities for writing pandoc filters in python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + [[package]] name = "pathspec" version = "0.9.0" @@ -568,25 +1287,44 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ptyprocess = ">=0.5" + [[package]] name = "phonenumbers" -version = "8.12.45" +version = "8.12.47" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." category = "main" optional = false python-versions = "*" +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "platformdirs" -version = "2.5.1" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -596,16 +1334,13 @@ category = "dev" optional = false python-versions = ">=3.6" -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] name = "pqdm" -version = "0.1.0" +version = "0.2.0" description = "PQDM is a TQDM and concurrent futures wrapper to allow enjoyable paralellization of progress bars." category = "main" optional = false @@ -618,21 +1353,72 @@ typing-extensions = "*" [[package]] name = "pre-commit" -version = "2.17.0" +version = "2.18.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.7" [package.dependencies] cfgv = ">=2.0.0" identify = ">=1.0.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} nodeenv = ">=0.11.1" pyyaml = ">=5.1" toml = "*" virtualenv = ">=20.0.8" +[[package]] +name = "prometheus-client" +version = "0.14.1" +description = "Python client for the Prometheus monitoring system." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.29" +description = "Library for building powerful interactive command lines in Python" +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "5.9.0" +description = "Cross-platform lib for process and system monitoring in Python." +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +tests = ["pytest"] + [[package]] name = "py" version = "1.11.0" @@ -643,30 +1429,23 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pycodestyle" -version = "2.7.0" +version = "2.8.0" description = "Python style guide checker" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] -name = "pydantic" -version = "1.9.0" -description = "Data validation and settings management using python 3.6 type hinting" -category = "main" +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "dev" optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -typing-extensions = ">=3.7.4.3" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pyflakes" -version = "2.3.1" +version = "2.4.0" description = "passive checker of Python programs" category = "dev" optional = false @@ -674,7 +1453,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.11.2" +version = "2.11.1" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -693,49 +1472,55 @@ Markdown = ">=3.2" [[package]] name = "pyparsing" -version = "3.0.7" -description = "Python parsing module" +version = "3.0.8" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pyrsistent" +version = "0.18.1" +description = "Persistent/Functional/Immutable data structures" +category = "dev" +optional = false +python-versions = ">=3.7" [[package]] name = "pytest" -version = "6.2.5" +version = "7.1.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" py = ">=1.8.2" -toml = "*" +tomli = ">=1.0.0" [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytest-cov" -version = "2.12.1" +version = "3.0.0" description = "Pytest plugin for measuring coverage." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6" [package.dependencies] -coverage = ">=5.2.1" +coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" -toml = "*" [package.extras] testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] @@ -776,14 +1561,14 @@ xmltodict = ">=0.12.0,<1.0.0" [[package]] name = "python-cmr" -version = "0.4.1" +version = "0.7.0" description = "Python wrapper to the NASA Common Metadata Repository (CMR) API." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8,<4.0" [package.dependencies] -requests = "*" +requests = ">=2.26.0,<3.0.0" [[package]] name = "python-dateutil" @@ -818,6 +1603,44 @@ text-unidecode = ">=1.3" [package.extras] unidecode = ["Unidecode (>=1.1.1)"] +[[package]] +name = "pytkdocs" +version = "0.16.1" +description = "Load Python objects documentation." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} + +[package.extras] +numpy-style = ["docstring_parser (>=0.7)"] + +[[package]] +name = "pytz" +version = "2022.1" +description = "World timezone definitions, modern and historical" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pywin32" +version = "303" +description = "Python for Window Extensions" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pywinpty" +version = "2.0.5" +description = "Pseudo terminal support for Windows from Python." +category = "dev" +optional = false +python-versions = ">=3.7" + [[package]] name = "pyyaml" version = "6.0" @@ -837,6 +1660,18 @@ python-versions = ">=3.6" [package.dependencies] pyyaml = "*" +[[package]] +name = "pyzmq" +version = "22.3.0" +description = "Python bindings for 0MQ" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} +py = {version = "*", markers = "implementation_name == \"pypy\""} + [[package]] name = "requests" version = "2.27.1" @@ -857,36 +1692,48 @@ use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] [[package]] name = "responses" -version = "0.14.0" +version = "0.20.0" description = "A utility library for mocking out the `requests` Python library." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [package.dependencies] -requests = ">=2.0" -six = "*" +requests = ">=2.0,<3.0" urllib3 = ">=1.25.10" [package.extras] -tests = ["coverage (>=3.7.1,<6.0.0)", "pytest-cov", "pytest-localserver", "flake8", "types-mock", "types-requests", "types-six", "pytest (>=4.6,<5.0)", "pytest (>=4.6)", "mypy"] +tests = ["pytest (>=7.0.0)", "coverage (>=6.0.0)", "pytest-cov", "pytest-asyncio", "pytest-localserver", "flake8", "types-mock", "types-requests", "mypy"] [[package]] name = "s3fs" -version = "2022.2.0" +version = "2022.3.0" description = "Convenient Filesystem interface over S3" category = "main" optional = false python-versions = ">= 3.7" [package.dependencies] -aiobotocore = ">=2.1.0,<2.2.0" +aiobotocore = ">=2.2.0,<2.3.0" aiohttp = "<=4" -fsspec = "2022.02.0" +fsspec = "2022.3.0" + +[package.extras] +awscli = ["aiobotocore[awscli] (>=2.2.0,<2.3.0)"] +boto3 = ["aiobotocore[boto3] (>=2.2.0,<2.3.0)"] + +[[package]] +name = "send2trash" +version = "1.8.0" +description = "Send file to trash natively under Mac OS X, Windows and Linux." +category = "dev" +optional = false +python-versions = "*" [package.extras] -awscli = ["aiobotocore[awscli] (>=2.1.0,<2.2.0)"] -boto3 = ["aiobotocore[boto3] (>=2.1.0,<2.2.0)"] +nativelib = ["pyobjc-framework-cocoa", "pywin32"] +objc = ["pyobjc-framework-cocoa"] +win32 = ["pywin32"] [[package]] name = "six" @@ -896,6 +1743,54 @@ category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +[[package]] +name = "sniffio" +version = "1.2.0" +description = "Sniff out which async library your code is running under" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "soupsieve" +version = "2.3.2.post1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "stack-data" +version = "0.2.0" +description = "Extract data from python stack frames and tracebacks for informative displays" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +asttokens = "*" +executing = "*" +pure-eval = "*" + +[package.extras] +tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] + +[[package]] +name = "terminado" +version = "0.13.3" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=4" + +[package.extras] +test = ["pytest"] + [[package]] name = "text-unidecode" version = "1.3" @@ -904,6 +1799,34 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "tinycss2" +version = "1.1.1" +description = "A tiny CSS parser" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"] + +[[package]] +name = "tinynetrc" +version = "1.3.1" +description = "Read and write .netrc files." +category = "main" +optional = false +python-versions = "*" + +[package.extras] +dev = ["pytest", "flake8 (==3.9.2)", "tox", "konch"] +lint = ["flake8 (==3.9.2)"] +tests = ["pytest"] + [[package]] name = "toml" version = "0.10.2" @@ -914,15 +1837,23 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.3" +version = "2.0.1" description = "A lil' TOML parser" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" + +[[package]] +name = "tornado" +version = "6.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "dev" +optional = false +python-versions = ">= 3.5" [[package]] name = "tqdm" -version = "4.63.0" +version = "4.64.0" description = "Fast, Extensible Progress Meter" category = "main" optional = false @@ -934,23 +1865,54 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] dev = ["py-make (>=0.1.0)", "twine", "wheel"] notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] telegram = ["requests"] [[package]] -name = "typed-ast" -version = "1.4.3" -description = "a fork of Python 2 and 3 ast modules with type comment support" +name = "traitlets" +version = "5.1.1" +description = "Traitlets Python configuration system" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "types-requests" +version = "2.27.20" +description = "Typing stubs for requests" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +types-urllib3 = "<1.27" + +[[package]] +name = "types-setuptools" +version = "57.4.14" +description = "Typing stubs for setuptools" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "types-urllib3" +version = "1.26.13" +description = "Typing stubs for urllib3" category = "dev" optional = false python-versions = "*" [[package]] name = "typing-extensions" -version = "4.1.1" -description = "Backported and Experimental Type Hints for Python 3.6+" +version = "4.2.0" +description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "urllib3" @@ -967,7 +1929,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.13.3" +version = "20.14.1" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -976,7 +1938,6 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [package.dependencies] distlib = ">=0.3.1,<1" filelock = ">=3.2,<4" -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} platformdirs = ">=2,<3" six = ">=1.9.0,<2" @@ -986,7 +1947,7 @@ testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", [[package]] name = "watchdog" -version = "2.1.6" +version = "2.1.7" description = "Filesystem events monitoring" category = "dev" optional = false @@ -1003,6 +1964,27 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "websocket-client" +version = "1.3.2" +description = "WebSocket client for Python with low level API options" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + [[package]] name = "wrapt" version = "1.14.0" @@ -1030,28 +2012,27 @@ python-versions = ">=3.6" [package.dependencies] idna = ">=2.0" multidict = ">=4.0" -typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [[package]] name = "zipp" -version = "3.7.0" +version = "3.8.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" -python-versions = "^3.7" -content-hash = "9d5ba25154c3e1338a8e554578ecfa1973dae1424bd8f77f130532d8ff9f5848" +python-versions = ">=3.8,<4.0" +content-hash = "05e750d567a24f619eab893d4ca282ef2c2c7e949ec02e9058090a33183dedc5" [metadata.files] aiobotocore = [ - {file = "aiobotocore-2.1.2.tar.gz", hash = "sha256:00fd7f43cc0484d8ed274fd0be492aa16a7fea679dbea96a602bb722ca4c2d22"}, + {file = "aiobotocore-2.2.0.tar.gz", hash = "sha256:71357939c3022670d7bb94833194147a44ebfce24b1643e4e44fedc1ee7349ba"}, ] aiohttp = [ {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"}, @@ -1135,14 +2116,53 @@ aiosignal = [ {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, ] +anyio = [ + {file = "anyio-3.5.0-py3-none-any.whl", hash = "sha256:b5fa16c5ff93fa1046f2eeb5bbff2dad4d3514d6cda61d02816dba34fa8c3c2e"}, + {file = "anyio-3.5.0.tar.gz", hash = "sha256:a0aeffe2fb1fdf374a8e4b471444f0f3ac4fb9f5a5b542b48824475e0042a5a6"}, +] +appnope = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] +argon2-cffi = [ + {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, + {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, +] +argon2-cffi-bindings = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] +asttokens = [ + {file = "asttokens-2.0.5-py2.py3-none-any.whl", hash = "sha256:0844691e88552595a6f4a4281a9f7f79b8dd45ca4ccea82e5e05b4bbdb76705c"}, + {file = "asttokens-2.0.5.tar.gz", hash = "sha256:9a54c114f02c7a9480d56550932546a3f1fe71d8a02f1bc7ccd0ee3ee35cf4d5"}, +] +astunparse = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] async-timeout = [ {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, ] -asynctest = [ - {file = "asynctest-0.13.0-py3-none-any.whl", hash = "sha256:5da6118a7e6d6b54d83a8f7197769d046922a44d2a99c21382f0a6e4fadae676"}, - {file = "asynctest-0.13.0.tar.gz", hash = "sha256:c27862842d15d83e6a34eb0b2866c323880eb3a75e4485b079ea11748fd77fac"}, -] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -1154,13 +2174,50 @@ attrs = [ autoflake = [ {file = "autoflake-1.4.tar.gz", hash = "sha256:61a353012cff6ab94ca062823d1fb2f692c4acda51c76ff83a8d77915fba51ea"}, ] +babel = [ + {file = "Babel-2.10.1-py3-none-any.whl", hash = "sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2"}, + {file = "Babel-2.10.1.tar.gz", hash = "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13"}, +] +backcall = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] +beautifulsoup4 = [ + {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, + {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, +] black = [ - {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"}, - {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2497f9c2386572e28921fa8bec7be3e51de6801f7459dffd6e62492531c47e09"}, + {file = "black-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5795a0375eb87bfe902e80e0c8cfaedf8af4d49694d69161e5bd3206c18618bb"}, + {file = "black-22.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3556168e2e5c49629f7b0f377070240bd5511e45e25a4497bb0073d9dda776a"}, + {file = "black-22.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67c8301ec94e3bcc8906740fe071391bce40a862b7be0b86fb5382beefecd968"}, + {file = "black-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd57160949179ec517d32ac2ac898b5f20d68ed1a9c977346efbac9c2f1e779d"}, + {file = "black-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc1e1de68c8e5444e8f94c3670bb48a2beef0e91dddfd4fcc29595ebd90bb9ce"}, + {file = "black-22.3.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2fc92002d44746d3e7db7cf9313cf4452f43e9ea77a2c939defce3b10b5c82"}, + {file = "black-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a6342964b43a99dbc72f72812bf88cad8f0217ae9acb47c0d4f141a6416d2d7b"}, + {file = "black-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:328efc0cc70ccb23429d6be184a15ce613f676bdfc85e5fe8ea2a9354b4e9015"}, + {file = "black-22.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06f9d8846f2340dfac80ceb20200ea5d1b3f181dd0556b47af4e8e0b24fa0a6b"}, + {file = "black-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4efa5fad66b903b4a5f96d91461d90b9507a812b3c5de657d544215bb7877a"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8477ec6bbfe0312c128e74644ac8a02ca06bcdb8982d4ee06f209be28cdf163"}, + {file = "black-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:637a4014c63fbf42a692d22b55d8ad6968a946b4a6ebc385c5505d9625b6a464"}, + {file = "black-22.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:863714200ada56cbc366dc9ae5291ceb936573155f8bf8e9de92aef51f3ad0f0"}, + {file = "black-22.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dbe6e6d2988049b4655b2b739f98785a884d4d6b85bc35133a8fb9a2233176"}, + {file = "black-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:cee3e11161dde1b2a33a904b850b0899e0424cc331b7295f2a9698e79f9a69a0"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5891ef8abc06576985de8fa88e95ab70641de6c1fca97e2a15820a9b69e51b20"}, + {file = "black-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:30d78ba6bf080eeaf0b7b875d924b15cd46fec5fd044ddfbad38c8ea9171043a"}, + {file = "black-22.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee8f1f7228cce7dffc2b464f07ce769f478968bfb3dd1254a4c2eeed84928aad"}, + {file = "black-22.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee227b696ca60dd1c507be80a6bc849a5a6ab57ac7352aad1ffec9e8b805f21"}, + {file = "black-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b542ced1ec0ceeff5b37d69838106a6348e60db7b8fdd245294dc1d26136265"}, + {file = "black-22.3.0-py3-none-any.whl", hash = "sha256:bc58025940a896d7e5356952228b68f793cf5fcb342be703c3a2669a1488cb72"}, + {file = "black-22.3.0.tar.gz", hash = "sha256:35020b8886c022ced9282b51b5a875b6d1ab0c387b31a065b84db7c33085ca79"}, +] +bleach = [ + {file = "bleach-5.0.0-py3-none-any.whl", hash = "sha256:08a1fe86d253b5c88c92cc3d810fd8048a16d15762e1e5b74d502256e5926aa1"}, + {file = "bleach-5.0.0.tar.gz", hash = "sha256:c6d6cc054bdc9c83b48b8083e236e5f00f238428666d2ce2e083eaa5fd568565"}, ] botocore = [ - {file = "botocore-1.23.24-py3-none-any.whl", hash = "sha256:e78d48c50c8c013fb9b362c6202fece2fe868edfd89b51968080180bdff41617"}, - {file = "botocore-1.23.24.tar.gz", hash = "sha256:43006b4f52d7bb655319d3da0f615cdbee7762853acc1ebcb1d49f962e6b4806"}, + {file = "botocore-1.24.21-py3-none-any.whl", hash = "sha256:92daca8775e738a9db9b465d533019285f09d541e903233261299fd87c2f842c"}, + {file = "botocore-1.24.21.tar.gz", hash = "sha256:7e976cfd0a61601e74624ef8f5246b40a01f2cce73a011ef29cf80a6e371d0fa"}, ] bounded-pool-executor = [ {file = "bounded_pool_executor-0.0.3-py3-none-any.whl", hash = "sha256:6f164d64919db1e6a5c187cce281f62bc559a5fed4ce064942e650c227aef190"}, @@ -1170,6 +2227,58 @@ certifi = [ {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, ] +cffi = [ + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, +] cfgv = [ {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, @@ -1179,8 +2288,8 @@ charset-normalizer = [ {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, ] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.1.2-py3-none-any.whl", hash = "sha256:24e1a4a9ec5bf6299411369b208c1df2188d9eb8d916302fe6bf03faed227f1e"}, + {file = "click-8.1.2.tar.gz", hash = "sha256:479707fe14d9ec9a0757618b7a100a0ae4c4e236fac5b7f80ca68028141a1a72"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -1229,6 +2338,34 @@ coverage = [ {file = "coverage-6.3.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:18d520c6860515a771708937d2f78f63cc47ab3b80cb78e86573b0a760161faf"}, {file = "coverage-6.3.2.tar.gz", hash = "sha256:03e2a7826086b91ef345ff18742ee9fc47a6839ccd517061ef8fa1976e652ce9"}, ] +debugpy = [ + {file = "debugpy-1.6.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:eb1946efac0c0c3d411cea0b5ac772fbde744109fd9520fb0c5a51979faf05ad"}, + {file = "debugpy-1.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e3513399177dd37af4c1332df52da5da1d0c387e5927dc4c0709e26ee7302e8f"}, + {file = "debugpy-1.6.0-cp310-cp310-win32.whl", hash = "sha256:5c492235d6b68f879df3bdbdb01f25c15be15682665517c2c7d0420e5658d71f"}, + {file = "debugpy-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:40de9ba137d355538432209d05e0f5fe5d0498dce761c39119ad4b950b51db31"}, + {file = "debugpy-1.6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:0d383b91efee57dbb923ba20801130cf60450a0eda60bce25bccd937de8e323a"}, + {file = "debugpy-1.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ff853e60e77e1c16f85a31adb8360bb2d98ca588d7ed645b7f0985b240bdb5e"}, + {file = "debugpy-1.6.0-cp37-cp37m-win32.whl", hash = "sha256:8e972c717d95f56b6a3a7a29a5ede1ee8f2c3802f6f0e678203b0778eb322bf1"}, + {file = "debugpy-1.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a8aaeb53e87225141fda7b9081bd87155c1debc13e2f5a532d341112d1983b65"}, + {file = "debugpy-1.6.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:132defb585b518955358321d0f42f6aa815aa15b432be27db654807707c70b2f"}, + {file = "debugpy-1.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ee75844242b4537beb5899f3e60a578454d1f136b99e8d57ac424573797b94a"}, + {file = "debugpy-1.6.0-cp38-cp38-win32.whl", hash = "sha256:a65a2499761d47df3e9ea9567109be6e73d412e00ac3ffcf74839f3ddfcdf028"}, + {file = "debugpy-1.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:bd980d533d0ddfc451e03a3bb32acb2900049fec39afc3425b944ebf0889be62"}, + {file = "debugpy-1.6.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:245c7789a012f86210847ec7ee9f38c30a30d4c2223c3e111829a76c9006a5d0"}, + {file = "debugpy-1.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e3aa2368883e83e7b689ddff3cafb595f7b711f6a065886b46a96a7fef874e7"}, + {file = "debugpy-1.6.0-cp39-cp39-win32.whl", hash = "sha256:72bcfa97f3afa0064afc77ab811f48ad4a06ac330f290b675082c24437730366"}, + {file = "debugpy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:30abefefd2ff5a5481162d613cb70e60e2fa80a5eb4c994717c0f008ed25d2e1"}, + {file = "debugpy-1.6.0-py2.py3-none-any.whl", hash = "sha256:4de7777842da7e08652f2776c552070bbdd758557fdec73a15d7be0e4aab95ce"}, + {file = "debugpy-1.6.0.zip", hash = "sha256:7b79c40852991f7b6c3ea65845ed0f5f6b731c37f4f9ad9c61e2ab4bd48a9275"}, +] +decorator = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] +defusedxml = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] distlib = [ {file = "distlib-0.3.4-py2.py3-none-any.whl", hash = "sha256:6564fe0a8f51e734df6333d08b8b94d4ea8ee6b99b5ed50613f731fd4089f34b"}, {file = "distlib-0.3.4.zip", hash = "sha256:e4b58818180336dc9c529bfb9a0b58728ffc09ad92027a3f30b7cd91e3458579"}, @@ -1236,13 +2373,25 @@ distlib = [ docopt = [ {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, ] +entrypoints = [ + {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, + {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, +] +executing = [ + {file = "executing-0.8.3-py2.py3-none-any.whl", hash = "sha256:d1eef132db1b83649a3905ca6dd8897f71ac6f8cac79a7e58a1a09cf137546c9"}, + {file = "executing-0.8.3.tar.gz", hash = "sha256:c6554e21c6b060590a6d3be4b82fb78f8f0194d809de5ea7df1c093763311501"}, +] +fastjsonschema = [ + {file = "fastjsonschema-2.15.3-py3-none-any.whl", hash = "sha256:ddb0b1d8243e6e3abb822bd14e447a89f4ab7439342912d590444831fa00b6a0"}, + {file = "fastjsonschema-2.15.3.tar.gz", hash = "sha256:0a572f0836962d844c1fc435e200b2e4f4677e4e6611a2e3bdd01ba697c275ec"}, +] filelock = [ {file = "filelock-3.6.0-py3-none-any.whl", hash = "sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0"}, {file = "filelock-3.6.0.tar.gz", hash = "sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85"}, ] flake8 = [ - {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, - {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] frozenlist = [ {file = "frozenlist-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2257aaba9660f78c7b1d8fea963b68f3feffb1a9d5d05a18401ca9eb3e8d0a3"}, @@ -1306,8 +2455,8 @@ frozenlist = [ {file = "frozenlist-1.3.0.tar.gz", hash = "sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b"}, ] fsspec = [ - {file = "fsspec-2022.2.0-py3-none-any.whl", hash = "sha256:eb9c9d9aee49d23028deefffe53e87c55d3515512c63f57e893710301001449a"}, - {file = "fsspec-2022.2.0.tar.gz", hash = "sha256:20322c659538501f52f6caa73b08b2ff570b7e8ea30a86559721d090e473ad5c"}, + {file = "fsspec-2022.3.0-py3-none-any.whl", hash = "sha256:a53491b003210fce6911dd8f2d37e20c41a27ce52a655eef11b885d1578ed4cf"}, + {file = "fsspec-2022.3.0.tar.gz", hash = "sha256:fd582cc4aa0db5968bad9317cae513450eddd08b2193c4428d9349265a995523"}, ] ftfy = [ {file = "ftfy-6.1.1-py3-none-any.whl", hash = "sha256:0ffd33fce16b54cccaec78d6ec73d95ad370e5df5a25255c8966a6147bd667ca"}, @@ -1329,24 +2478,80 @@ importlib-metadata = [ {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"}, {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"}, ] +importlib-resources = [ + {file = "importlib_resources-5.7.1-py3-none-any.whl", hash = "sha256:e447dc01619b1e951286f3929be820029d48c75eb25d265c28b92a16548212b8"}, + {file = "importlib_resources-5.7.1.tar.gz", hash = "sha256:b6062987dfc51f0fcb809187cffbd60f35df7acb4589091f154214af6d0d49d3"}, +] 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-6.13.0-py3-none-any.whl", hash = "sha256:2b0987af43c0d4b62cecb13c592755f599f96f29aafe36c01731aaa96df30d39"}, + {file = "ipykernel-6.13.0.tar.gz", hash = "sha256:0e28273e290858393e86e152b104e5506a79c13d25b951ac6eca220051b4be60"}, +] +ipython = [ + {file = "ipython-8.2.0-py3-none-any.whl", hash = "sha256:1b672bfd7a48d87ab203d9af8727a3b0174a4566b4091e9447c22fb63ea32857"}, + {file = "ipython-8.2.0.tar.gz", hash = "sha256:70e5eb132cac594a34b5f799bd252589009905f05104728aea6a403ec2519dc1"}, +] +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"}, +] isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, ] +jedi = [ + {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"}, + {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"}, +] jinja2 = [ - {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, - {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, + {file = "Jinja2-3.1.1-py3-none-any.whl", hash = "sha256:539835f51a74a69f41b848a9645dbdc35b4f20a3b601e2d9a7e22947b15ff119"}, + {file = "Jinja2-3.1.1.tar.gz", hash = "sha256:640bed4bb501cbd17194b3cace1dc2126f5b619cf068a726b98192a0fde74ae9"}, ] jmespath = [ - {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, - {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, + {file = "jmespath-1.0.0-py3-none-any.whl", hash = "sha256:e8dcd576ed616f14ec02eed0005c85973b5890083313860136657e24784e4c04"}, + {file = "jmespath-1.0.0.tar.gz", hash = "sha256:a490e280edd1f57d6de88636992d05b71e97d69a26a19f058ecf7d304474bf5e"}, +] +json5 = [ + {file = "json5-0.9.6-py2.py3-none-any.whl", hash = "sha256:823e510eb355949bed817e1f3e2d682455dc6af9daf6066d5698d6a2ca4481c2"}, + {file = "json5-0.9.6.tar.gz", hash = "sha256:9175ad1bc248e22bb8d95a8e8d765958bf0008fef2fe8abab5bc04e0f1ac8302"}, +] +jsonschema = [ + {file = "jsonschema-4.4.0-py3-none-any.whl", hash = "sha256:77281a1f71684953ee8b3d488371b162419767973789272434bbc3f29d9c8823"}, + {file = "jsonschema-4.4.0.tar.gz", hash = "sha256:636694eb41b3535ed608fe04129f26542b59ed99808b4f688aa32dcf55317a83"}, +] +jupyter-client = [ + {file = "jupyter_client-7.3.0-py3-none-any.whl", hash = "sha256:671dd2d90d03f41716b09627a4eb06bb37875f92bf6563cc2ce4fe71c61c5cda"}, + {file = "jupyter_client-7.3.0.tar.gz", hash = "sha256:3bcc8e08a294d0fa9406e48cfe17e11ef0efdb7c504fe8cc335128e3ef8f3dac"}, +] +jupyter-core = [ + {file = "jupyter_core-4.10.0-py3-none-any.whl", hash = "sha256:e7f5212177af7ab34179690140f188aa9bf3d322d8155ed972cbded19f55b6f3"}, + {file = "jupyter_core-4.10.0.tar.gz", hash = "sha256:a6de44b16b7b31d7271130c71a6792c4040f077011961138afed5e5e73181aec"}, +] +jupyter-server = [ + {file = "jupyter_server-1.16.0-py3-none-any.whl", hash = "sha256:72dd1ff5373d2def94e80632ba4397e504cc9200c5b5f44b5b0af2e062a73353"}, + {file = "jupyter_server-1.16.0.tar.gz", hash = "sha256:c756f87ad64b84e2aa522ef482445e1a93f7fe4a5fc78358f4636e53c9a0463a"}, +] +jupyterlab = [ + {file = "jupyterlab-3.3.4-py3-none-any.whl", hash = "sha256:87121636963027a0477e50ea8f366acf1ab06bb05d7e581cd2ec8c00f6e741a5"}, + {file = "jupyterlab-3.3.4.tar.gz", hash = "sha256:e04355848b3d91ac4d95c2e3846a0429b33e9c2edc79668fb4fc4d212f1e5107"}, +] +jupyterlab-pygments = [ + {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, + {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, +] +jupyterlab-server = [ + {file = "jupyterlab_server-2.13.0-py3-none-any.whl", hash = "sha256:fc9e86d4e7c4b139de59b0a96b53071e670bee1ed106a3389daecd68f1221aeb"}, + {file = "jupyterlab_server-2.13.0.tar.gz", hash = "sha256:2040298a133458aa22f287a877d6bb91ff973f6298d562264f9f7b75e92a5ace"}, +] +jupytext = [ + {file = "jupytext-1.13.8-py3-none-any.whl", hash = "sha256:625d2d2012763cc87d3f0dd60383516cec442c11894f53ad0c5ee5aa2a52caa2"}, + {file = "jupytext-1.13.8.tar.gz", hash = "sha256:60148537de5aa08bb9cbe8797500a49360b7a8eb6667736ae5b80e3ec7ba084d"}, ] mailchecker = [ - {file = "mailchecker-4.1.14.tar.gz", hash = "sha256:e7c2f0695c18ce3625201dec0243036add455fcc00ec8880601c0f67484c39d1"}, + {file = "mailchecker-4.1.16.tar.gz", hash = "sha256:03e961f8182031227f3c871831f5f7bbf625295aa11b92316eb1cf6f553a2e5e"}, ] markdown = [ {file = "Markdown-3.3.6-py3-none-any.whl", hash = "sha256:9923332318f843411e9932237530df53162e29dc7a4e2b91e35764583c46c9a3"}, @@ -1355,6 +2560,10 @@ markdown = [ markdown-include = [ {file = "markdown-include-0.6.0.tar.gz", hash = "sha256:6f5d680e36f7780c7f0f61dca53ca581bd50d1b56137ddcd6353efafa0c3e4a2"}, ] +markdown-it-py = [ + {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, + {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, +] markupsafe = [ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, @@ -1397,26 +2606,57 @@ markupsafe = [ {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, ] +matplotlib-inline = [ + {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, + {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, +] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] +mdit-py-plugins = [ + {file = "mdit-py-plugins-0.3.0.tar.gz", hash = "sha256:ecc24f51eeec6ab7eecc2f9724e8272c2fb191c2e93cf98109120c2cace69750"}, + {file = "mdit_py_plugins-0.3.0-py3-none-any.whl", hash = "sha256:b1279701cee2dbf50e188d3da5f51fee8d78d038cdf99be57c6b9d1aa93b4073"}, +] +mdurl = [ + {file = "mdurl-0.1.1-py3-none-any.whl", hash = "sha256:6a8f6804087b7128040b2fb2ebe242bdc2affaeaa034d5fc9feeed30b443651b"}, + {file = "mdurl-0.1.1.tar.gz", hash = "sha256:f79c9709944df218a4cdb0fcc0b0c7ead2f44594e3e84dc566606f04ad749c20"}, +] mergedeep = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, ] +mistune = [ + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, +] mkdocs = [ - {file = "mkdocs-1.2.3-py3-none-any.whl", hash = "sha256:a1fa8c2d0c1305d7fc2b9d9f607c71778572a8b110fb26642aa00296c9e6d072"}, - {file = "mkdocs-1.2.3.tar.gz", hash = "sha256:89f5a094764381cda656af4298727c9f53dc3e602983087e1fe96ea1df24f4c1"}, + {file = "mkdocs-1.3.0-py3-none-any.whl", hash = "sha256:26bd2b03d739ac57a3e6eed0b7bcc86168703b719c27b99ad6ca91dc439aacde"}, + {file = "mkdocs-1.3.0.tar.gz", hash = "sha256:b504405b04da38795fec9b2e5e28f6aa3a73bb0960cb6d5d27ead28952bd35ea"}, +] +mkdocs-autorefs = [ + {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, + {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, +] +mkdocs-jupyter = [ + {file = "mkdocs-jupyter-0.19.0.tar.gz", hash = "sha256:40bb752658156706adabe6140551e5efe4164256861cc72f082bdaf50139575b"}, ] mkdocs-material = [ - {file = "mkdocs-material-6.2.8.tar.gz", hash = "sha256:ce2f4a71e5db49540d71fd32f9afba7645765f7eca391e560d1d27f947eb344c"}, - {file = "mkdocs_material-6.2.8-py2.py3-none-any.whl", hash = "sha256:c9b63d709d29778aa3dafc7178b6a8c655b00937be2594aab016d1423696c792"}, + {file = "mkdocs-material-8.2.11.tar.gz", hash = "sha256:af6bbd608a54b8493cb5fa0d2f2cf29cde3bf348837ab718afb1be0a8bea6509"}, + {file = "mkdocs_material-8.2.11-py2.py3-none-any.whl", hash = "sha256:4a3631ba22cff7ceca00c39465a8db5b2116fcd74f3abd82b801f7711cceb699"}, ] mkdocs-material-extensions = [ {file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"}, {file = "mkdocs_material_extensions-1.0.3-py3-none-any.whl", hash = "sha256:a82b70e533ce060b2a5d9eb2bc2e1be201cf61f901f93704b4acf6e3d5983a44"}, ] +mkdocstrings = [ + {file = "mkdocstrings-0.18.1-py3-none-any.whl", hash = "sha256:4053929356df8cd69ed32eef71d8f676a472ef72980c9ffd4f933ead1debcdad"}, + {file = "mkdocstrings-0.18.1.tar.gz", hash = "sha256:fb7c91ce7e3ab70488d3fa6c073a4f827cdc319042f682ef8ea95459790d64fc"}, +] +mkdocstrings-python-legacy = [ + {file = "mkdocstrings-python-legacy-0.2.2.tar.gz", hash = "sha256:f0e7ec6a19750581b752acb38f6b32fcd1efe006f14f6703125d2c2c9a5c6f02"}, + {file = "mkdocstrings_python_legacy-0.2.2-py3-none-any.whl", hash = "sha256:379107a3a5b8db9b462efc4493c122efe21e825e3702425dbd404621302a563a"}, +] multidict = [ {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, @@ -1479,133 +2719,218 @@ multidict = [ {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, ] mypy = [ - {file = "mypy-0.812-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a26f8ec704e5a7423c8824d425086705e381b4f1dfdef6e3a1edab7ba174ec49"}, - {file = "mypy-0.812-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:28fb5479c494b1bab244620685e2eb3c3f988d71fd5d64cc753195e8ed53df7c"}, - {file = "mypy-0.812-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:9743c91088d396c1a5a3c9978354b61b0382b4e3c440ce83cf77994a43e8c521"}, - {file = "mypy-0.812-cp35-cp35m-win_amd64.whl", hash = "sha256:d7da2e1d5f558c37d6e8c1246f1aec1e7349e4913d8fb3cb289a35de573fe2eb"}, - {file = "mypy-0.812-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4eec37370483331d13514c3f55f446fc5248d6373e7029a29ecb7b7494851e7a"}, - {file = "mypy-0.812-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d65cc1df038ef55a99e617431f0553cd77763869eebdf9042403e16089fe746c"}, - {file = "mypy-0.812-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:61a3d5b97955422964be6b3baf05ff2ce7f26f52c85dd88db11d5e03e146a3a6"}, - {file = "mypy-0.812-cp36-cp36m-win_amd64.whl", hash = "sha256:25adde9b862f8f9aac9d2d11971f226bd4c8fbaa89fb76bdadb267ef22d10064"}, - {file = "mypy-0.812-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:552a815579aa1e995f39fd05dde6cd378e191b063f031f2acfe73ce9fb7f9e56"}, - {file = "mypy-0.812-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:499c798053cdebcaa916eef8cd733e5584b5909f789de856b482cd7d069bdad8"}, - {file = "mypy-0.812-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:5873888fff1c7cf5b71efbe80e0e73153fe9212fafdf8e44adfe4c20ec9f82d7"}, - {file = "mypy-0.812-cp37-cp37m-win_amd64.whl", hash = "sha256:9f94aac67a2045ec719ffe6111df543bac7874cee01f41928f6969756e030564"}, - {file = "mypy-0.812-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d23e0ea196702d918b60c8288561e722bf437d82cb7ef2edcd98cfa38905d506"}, - {file = "mypy-0.812-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:674e822aa665b9fd75130c6c5f5ed9564a38c6cea6a6432ce47eafb68ee578c5"}, - {file = "mypy-0.812-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:abf7e0c3cf117c44d9285cc6128856106183938c68fd4944763003decdcfeb66"}, - {file = "mypy-0.812-cp38-cp38-win_amd64.whl", hash = "sha256:0d0a87c0e7e3a9becdfbe936c981d32e5ee0ccda3e0f07e1ef2c3d1a817cf73e"}, - {file = "mypy-0.812-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7ce3175801d0ae5fdfa79b4f0cfed08807af4d075b402b7e294e6aa72af9aa2a"}, - {file = "mypy-0.812-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b09669bcda124e83708f34a94606e01b614fa71931d356c1f1a5297ba11f110a"}, - {file = "mypy-0.812-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:33f159443db0829d16f0a8d83d94df3109bb6dd801975fe86bacb9bf71628e97"}, - {file = "mypy-0.812-cp39-cp39-win_amd64.whl", hash = "sha256:3f2aca7f68580dc2508289c729bd49ee929a436208d2b2b6aab15745a70a57df"}, - {file = "mypy-0.812-py3-none-any.whl", hash = "sha256:2f9b3407c58347a452fc0736861593e105139b905cca7d097e413453a1d650b4"}, - {file = "mypy-0.812.tar.gz", hash = "sha256:cd07039aa5df222037005b08fbbfd69b3ab0b0bd7a07d7906de75ae52c4e3119"}, + {file = "mypy-0.942-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5bf44840fb43ac4074636fd47ee476d73f0039f4f54e86d7265077dc199be24d"}, + {file = "mypy-0.942-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dcd955f36e0180258a96f880348fbca54ce092b40fbb4b37372ae3b25a0b0a46"}, + {file = "mypy-0.942-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6776e5fa22381cc761df53e7496a805801c1a751b27b99a9ff2f0ca848c7eca0"}, + {file = "mypy-0.942-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:edf7237137a1a9330046dbb14796963d734dd740a98d5e144a3eb1d267f5f9ee"}, + {file = "mypy-0.942-cp310-cp310-win_amd64.whl", hash = "sha256:64235137edc16bee6f095aba73be5334677d6f6bdb7fa03cfab90164fa294a17"}, + {file = "mypy-0.942-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b840cfe89c4ab6386c40300689cd8645fc8d2d5f20101c7f8bd23d15fca14904"}, + {file = "mypy-0.942-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b184db8c618c43c3a31b32ff00cd28195d39e9c24e7c3b401f3db7f6e5767f5"}, + {file = "mypy-0.942-cp36-cp36m-win_amd64.whl", hash = "sha256:1a0459c333f00e6a11cbf6b468b870c2b99a906cb72d6eadf3d1d95d38c9352c"}, + {file = "mypy-0.942-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4c3e497588afccfa4334a9986b56f703e75793133c4be3a02d06a3df16b67a58"}, + {file = "mypy-0.942-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f6ad963172152e112b87cc7ec103ba0f2db2f1cd8997237827c052a3903eaa6"}, + {file = "mypy-0.942-cp37-cp37m-win_amd64.whl", hash = "sha256:0e2dd88410937423fba18e57147dd07cd8381291b93d5b1984626f173a26543e"}, + {file = "mypy-0.942-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:246e1aa127d5b78488a4a0594bd95f6d6fb9d63cf08a66dafbff8595d8891f67"}, + {file = "mypy-0.942-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d8d3ba77e56b84cd47a8ee45b62c84b6d80d32383928fe2548c9a124ea0a725c"}, + {file = "mypy-0.942-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2bc249409a7168d37c658e062e1ab5173300984a2dada2589638568ddc1db02b"}, + {file = "mypy-0.942-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9521c1265ccaaa1791d2c13582f06facf815f426cd8b07c3a485f486a8ffc1f3"}, + {file = "mypy-0.942-cp38-cp38-win_amd64.whl", hash = "sha256:e865fec858d75b78b4d63266c9aff770ecb6a39dfb6d6b56c47f7f8aba6baba8"}, + {file = "mypy-0.942-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6ce34a118d1a898f47def970a2042b8af6bdcc01546454726c7dd2171aa6dfca"}, + {file = "mypy-0.942-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:10daab80bc40f84e3f087d896cdb53dc811a9f04eae4b3f95779c26edee89d16"}, + {file = "mypy-0.942-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3841b5433ff936bff2f4dc8d54cf2cdbfea5d8e88cedfac45c161368e5770ba6"}, + {file = "mypy-0.942-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f7106cbf9cc2f403693bf50ed7c9fa5bb3dfa9007b240db3c910929abe2a322"}, + {file = "mypy-0.942-cp39-cp39-win_amd64.whl", hash = "sha256:7742d2c4e46bb5017b51c810283a6a389296cda03df805a4f7869a6f41246534"}, + {file = "mypy-0.942-py3-none-any.whl", hash = "sha256:a1b383fe99678d7402754fe90448d4037f9512ce70c21f8aee3b8bf48ffc51db"}, + {file = "mypy-0.942.tar.gz", hash = "sha256:17e44649fec92e9f82102b48a3bf7b4a5510ad0cd22fa21a104826b5db4903e2"}, ] 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"}, ] +nbclassic = [ + {file = "nbclassic-0.3.7-py3-none-any.whl", hash = "sha256:89184baa2d66b8ac3c8d3df57cbcf16f34148954d410a2fb3e897d7c18f2479d"}, + {file = "nbclassic-0.3.7.tar.gz", hash = "sha256:36dbaa88ffaf5dc05d149deb97504b86ba648f4a80a60b8a58ac94acab2daeb5"}, +] +nbclient = [ + {file = "nbclient-0.6.0-py3-none-any.whl", hash = "sha256:2eed35fc954716cdf0a01ea8cbdd9f9316761479008570059e2f5de29e139423"}, + {file = "nbclient-0.6.0.tar.gz", hash = "sha256:3f89a403c6badf24d2855a455b69a80985b3b27e04111243fdb6a88a28d27031"}, +] +nbconvert = [ + {file = "nbconvert-6.5.0-py3-none-any.whl", hash = "sha256:c56dd0b8978a1811a5654f74c727ff16ca87dd5a43abd435a1c49b840fcd8360"}, + {file = "nbconvert-6.5.0.tar.gz", hash = "sha256:223e46e27abe8596b8aed54301fadbba433b7ffea8196a68fd7b1ff509eee99d"}, +] +nbformat = [ + {file = "nbformat-5.3.0-py3-none-any.whl", hash = "sha256:38856d97de49e8292e2d5d8f595e9d26f02abfd87e075d450af4511870b40538"}, + {file = "nbformat-5.3.0.tar.gz", hash = "sha256:fcc5ab8cb74e20b19570b5be809e2dba9b82836fd2761a89066ad43394ba29f5"}, +] +nest-asyncio = [ + {file = "nest_asyncio-1.5.5-py3-none-any.whl", hash = "sha256:b98e3ec1b246135e4642eceffa5a6c23a3ab12c82ff816a92c612d68205813b2"}, + {file = "nest_asyncio-1.5.5.tar.gz", hash = "sha256:e442291cd942698be619823a17a86a5759eabe1f8613084790de189fe9e16d65"}, +] nodeenv = [ {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, ] +notebook = [ + {file = "notebook-6.4.11-py3-none-any.whl", hash = "sha256:b4a6baf2eba21ce67a0ca11a793d1781b06b8078f34d06c710742e55f3eee505"}, + {file = "notebook-6.4.11.tar.gz", hash = "sha256:709b1856a564fe53054796c80e17a67262071c86bfbdfa6b96aaa346113c555a"}, +] +notebook-shim = [ + {file = "notebook_shim-0.1.0-py3-none-any.whl", hash = "sha256:02432d55a01139ac16e2100888aa2b56c614720cec73a27e71f40a5387e45324"}, + {file = "notebook_shim-0.1.0.tar.gz", hash = "sha256:7897e47a36d92248925a2143e3596f19c60597708f7bef50d81fcd31d7263e85"}, +] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, ] +pandocfilters = [ + {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, + {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, +] +parso = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] pathspec = [ {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] phonenumbers = [ - {file = "phonenumbers-8.12.45-py2.py3-none-any.whl", hash = "sha256:e3af21c1e33a3dd063cddba3cad653abb8d23c37c62cedee597a3f3ea0f5365c"}, - {file = "phonenumbers-8.12.45.tar.gz", hash = "sha256:94e30f59b2be6c4310a90f3d5da53d49900bdb440484506f3333c694ebb0cdab"}, + {file = "phonenumbers-8.12.47-py2.py3-none-any.whl", hash = "sha256:065fc5930ceff3147f50beb4c6d253c25ab0a467ac461174c62696c119593f7e"}, + {file = "phonenumbers-8.12.47.tar.gz", hash = "sha256:56fd605d2f5460e1df2117085b653bb38322295ec658e6acaafc9c976867d522"}, +] +pickleshare = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] platformdirs = [ - {file = "platformdirs-2.5.1-py3-none-any.whl", hash = "sha256:bcae7cab893c2d310a711b70b24efb93334febe65f8de776ee320b517471e227"}, - {file = "platformdirs-2.5.1.tar.gz", hash = "sha256:7535e70dfa32e84d4b34996ea99c5e432fa29a708d0f4e394bbcb2a8faa4f16d"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] pqdm = [ - {file = "pqdm-0.1.0-py2.py3-none-any.whl", hash = "sha256:da70804b2222a08fc15bf35fe94d5aa321c126e3e9789df25f2c98f482b9d419"}, - {file = "pqdm-0.1.0.tar.gz", hash = "sha256:5b405b8799001129091d21212b3ae5845059d2ebaf3eec2d6fb8479d8b35c3c0"}, + {file = "pqdm-0.2.0-py2.py3-none-any.whl", hash = "sha256:0da33a22ebee349a047abf8ef7fd00d85403638101d5e374b421a74188231b62"}, + {file = "pqdm-0.2.0.tar.gz", hash = "sha256:d99d01fe498d327b440ebfe08c14c84e0dc9ecce6172ef9a31f96bb1aaf4e9e3"}, ] pre-commit = [ - {file = "pre_commit-2.17.0-py2.py3-none-any.whl", hash = "sha256:725fa7459782d7bec5ead072810e47351de01709be838c2ce1726b9591dad616"}, - {file = "pre_commit-2.17.0.tar.gz", hash = "sha256:c1a8040ff15ad3d648c70cc3e55b93e4d2d5b687320955505587fd79bbaed06a"}, + {file = "pre_commit-2.18.1-py2.py3-none-any.whl", hash = "sha256:02226e69564ebca1a070bd1f046af866aa1c318dbc430027c50ab832ed2b73f2"}, + {file = "pre_commit-2.18.1.tar.gz", hash = "sha256:5d445ee1fa8738d506881c5d84f83c62bb5be6b2838e32207433647e8e5ebe10"}, +] +prometheus-client = [ + {file = "prometheus_client-0.14.1-py3-none-any.whl", hash = "sha256:522fded625282822a89e2773452f42df14b5a8e84a86433e3f8a189c1d54dc01"}, + {file = "prometheus_client-0.14.1.tar.gz", hash = "sha256:5459c427624961076277fdc6dc50540e2bacb98eebde99886e59ec55ed92093a"}, +] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.29-py3-none-any.whl", hash = "sha256:62291dad495e665fca0bda814e342c69952086afb0f4094d0893d357e5c78752"}, + {file = "prompt_toolkit-3.0.29.tar.gz", hash = "sha256:bd640f60e8cecd74f0dc249713d433ace2ddc62b65ee07f96d358e0b152b6ea7"}, +] +psutil = [ + {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:55ce319452e3d139e25d6c3f85a1acf12d1607ddedea5e35fb47a552c051161b"}, + {file = "psutil-5.9.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:7336292a13a80eb93c21f36bde4328aa748a04b68c13d01dfddd67fc13fd0618"}, + {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cb8d10461c1ceee0c25a64f2dd54872b70b89c26419e147a05a10b753ad36ec2"}, + {file = "psutil-5.9.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:7641300de73e4909e5d148e90cc3142fb890079e1525a840cf0dfd39195239fd"}, + {file = "psutil-5.9.0-cp27-none-win32.whl", hash = "sha256:ea42d747c5f71b5ccaa6897b216a7dadb9f52c72a0fe2b872ef7d3e1eacf3ba3"}, + {file = "psutil-5.9.0-cp27-none-win_amd64.whl", hash = "sha256:ef216cc9feb60634bda2f341a9559ac594e2eeaadd0ba187a4c2eb5b5d40b91c"}, + {file = "psutil-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90a58b9fcae2dbfe4ba852b57bd4a1dded6b990a33d6428c7614b7d48eccb492"}, + {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d41f8b3e9ebb6b6110057e40019a432e96aae2008951121ba4e56040b84f3"}, + {file = "psutil-5.9.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:742c34fff804f34f62659279ed5c5b723bb0195e9d7bd9907591de9f8f6558e2"}, + {file = "psutil-5.9.0-cp310-cp310-win32.whl", hash = "sha256:8293942e4ce0c5689821f65ce6522ce4786d02af57f13c0195b40e1edb1db61d"}, + {file = "psutil-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:9b51917c1af3fa35a3f2dabd7ba96a2a4f19df3dec911da73875e1edaf22a40b"}, + {file = "psutil-5.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e9805fed4f2a81de98ae5fe38b75a74c6e6ad2df8a5c479594c7629a1fe35f56"}, + {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c51f1af02334e4b516ec221ee26b8fdf105032418ca5a5ab9737e8c87dafe203"}, + {file = "psutil-5.9.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32acf55cb9a8cbfb29167cd005951df81b567099295291bcfd1027365b36591d"}, + {file = "psutil-5.9.0-cp36-cp36m-win32.whl", hash = "sha256:e5c783d0b1ad6ca8a5d3e7b680468c9c926b804be83a3a8e95141b05c39c9f64"}, + {file = "psutil-5.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d62a2796e08dd024b8179bd441cb714e0f81226c352c802fca0fd3f89eeacd94"}, + {file = "psutil-5.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3d00a664e31921009a84367266b35ba0aac04a2a6cad09c550a89041034d19a0"}, + {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7779be4025c540d1d65a2de3f30caeacc49ae7a2152108adeaf42c7534a115ce"}, + {file = "psutil-5.9.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:072664401ae6e7c1bfb878c65d7282d4b4391f1bc9a56d5e03b5a490403271b5"}, + {file = "psutil-5.9.0-cp37-cp37m-win32.whl", hash = "sha256:df2c8bd48fb83a8408c8390b143c6a6fa10cb1a674ca664954de193fdcab36a9"}, + {file = "psutil-5.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1d7b433519b9a38192dfda962dd8f44446668c009833e1429a52424624f408b4"}, + {file = "psutil-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c3400cae15bdb449d518545cbd5b649117de54e3596ded84aacabfbb3297ead2"}, + {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2237f35c4bbae932ee98902a08050a27821f8f6dfa880a47195e5993af4702d"}, + {file = "psutil-5.9.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1070a9b287846a21a5d572d6dddd369517510b68710fca56b0e9e02fd24bed9a"}, + {file = "psutil-5.9.0-cp38-cp38-win32.whl", hash = "sha256:76cebf84aac1d6da5b63df11fe0d377b46b7b500d892284068bacccf12f20666"}, + {file = "psutil-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:3151a58f0fbd8942ba94f7c31c7e6b310d2989f4da74fcbf28b934374e9bf841"}, + {file = "psutil-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:539e429da49c5d27d5a58e3563886057f8fc3868a5547b4f1876d9c0f007bccf"}, + {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58c7d923dc209225600aec73aa2c4ae8ea33b1ab31bc11ef8a5933b027476f07"}, + {file = "psutil-5.9.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3611e87eea393f779a35b192b46a164b1d01167c9d323dda9b1e527ea69d697d"}, + {file = "psutil-5.9.0-cp39-cp39-win32.whl", hash = "sha256:4e2fb92e3aeae3ec3b7b66c528981fd327fb93fd906a77215200404444ec1845"}, + {file = "psutil-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:7d190ee2eaef7831163f254dc58f6d2e2a22e27382b936aab51c835fc080c3d3"}, + {file = "psutil-5.9.0.tar.gz", hash = "sha256:869842dbd66bb80c3217158e629d6fceaecc3a3166d3d1faee515b05dd26ca25"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +pure-eval = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, ] py = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] pycodestyle = [ - {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, - {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, -] -pydantic = [ - {file = "pydantic-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb23bcc093697cdea2708baae4f9ba0e972960a835af22560f6ae4e7e47d33f5"}, - {file = "pydantic-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1d5278bd9f0eee04a44c712982343103bba63507480bfd2fc2790fa70cd64cf4"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab624700dc145aa809e6f3ec93fb8e7d0f99d9023b713f6a953637429b437d37"}, - {file = "pydantic-1.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8d7da6f1c1049eefb718d43d99ad73100c958a5367d30b9321b092771e96c25"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3c3b035103bd4e2e4a28da9da7ef2fa47b00ee4a9cf4f1a735214c1bcd05e0f6"}, - {file = "pydantic-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3011b975c973819883842c5ab925a4e4298dffccf7782c55ec3580ed17dc464c"}, - {file = "pydantic-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:086254884d10d3ba16da0588604ffdc5aab3f7f09557b998373e885c690dd398"}, - {file = "pydantic-1.9.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0fe476769acaa7fcddd17cadd172b156b53546ec3614a4d880e5d29ea5fbce65"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8e9dcf1ac499679aceedac7e7ca6d8641f0193c591a2d090282aaf8e9445a46"}, - {file = "pydantic-1.9.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1e4c28f30e767fd07f2ddc6f74f41f034d1dd6bc526cd59e63a82fe8bb9ef4c"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c86229333cabaaa8c51cf971496f10318c4734cf7b641f08af0a6fbf17ca3054"}, - {file = "pydantic-1.9.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:c0727bda6e38144d464daec31dff936a82917f431d9c39c39c60a26567eae3ed"}, - {file = "pydantic-1.9.0-cp36-cp36m-win_amd64.whl", hash = "sha256:dee5ef83a76ac31ab0c78c10bd7d5437bfdb6358c95b91f1ba7ff7b76f9996a1"}, - {file = "pydantic-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9c9bdb3af48e242838f9f6e6127de9be7063aad17b32215ccc36a09c5cf1070"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ee7e3209db1e468341ef41fe263eb655f67f5c5a76c924044314e139a1103a2"}, - {file = "pydantic-1.9.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b6037175234850ffd094ca77bf60fb54b08b5b22bc85865331dd3bda7a02fa1"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b2571db88c636d862b35090ccf92bf24004393f85c8870a37f42d9f23d13e032"}, - {file = "pydantic-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8b5ac0f1c83d31b324e57a273da59197c83d1bb18171e512908fe5dc7278a1d6"}, - {file = "pydantic-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bbbc94d0c94dd80b3340fc4f04fd4d701f4b038ebad72c39693c794fd3bc2d9d"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e0896200b6a40197405af18828da49f067c2fa1f821491bc8f5bde241ef3f7d7"}, - {file = "pydantic-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bdfdadb5994b44bd5579cfa7c9b0e1b0e540c952d56f627eb227851cda9db77"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:574936363cd4b9eed8acdd6b80d0143162f2eb654d96cb3a8ee91d3e64bf4cf9"}, - {file = "pydantic-1.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c556695b699f648c58373b542534308922c46a1cda06ea47bc9ca45ef5b39ae6"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f947352c3434e8b937e3aa8f96f47bdfe6d92779e44bb3f41e4c213ba6a32145"}, - {file = "pydantic-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5e48ef4a8b8c066c4a31409d91d7ca372a774d0212da2787c0d32f8045b1e034"}, - {file = "pydantic-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:96f240bce182ca7fe045c76bcebfa0b0534a1bf402ed05914a6f1dadff91877f"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:815ddebb2792efd4bba5488bc8fde09c29e8ca3227d27cf1c6990fc830fd292b"}, - {file = "pydantic-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c5b77947b9e85a54848343928b597b4f74fc364b70926b3c4441ff52620640c"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c68c3bc88dbda2a6805e9a142ce84782d3930f8fdd9655430d8576315ad97ce"}, - {file = "pydantic-1.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a79330f8571faf71bf93667d3ee054609816f10a259a109a0738dac983b23c3"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5a64b64ddf4c99fe201ac2724daada8595ada0d102ab96d019c1555c2d6441d"}, - {file = "pydantic-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a733965f1a2b4090a5238d40d983dcd78f3ecea221c7af1497b845a9709c1721"}, - {file = "pydantic-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cc6a4cb8a118ffec2ca5fcb47afbacb4f16d0ab8b7350ddea5e8ef7bcc53a16"}, - {file = "pydantic-1.9.0-py3-none-any.whl", hash = "sha256:085ca1de245782e9b46cefcf99deecc67d418737a1fd3f6a4f511344b613a5b3"}, - {file = "pydantic-1.9.0.tar.gz", hash = "sha256:742645059757a56ecd886faf4ed2441b9c0cd406079c2b4bee51bcc3fbcd510a"}, + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] pyflakes = [ - {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, - {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] pygments = [ - {file = "Pygments-2.11.2-py3-none-any.whl", hash = "sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65"}, - {file = "Pygments-2.11.2.tar.gz", hash = "sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a"}, + {file = "Pygments-2.11.1-py3-none-any.whl", hash = "sha256:9135c1af61eec0f650cd1ea1ed8ce298e54d56bcd8cc2ef46edd7702c171337c"}, + {file = "Pygments-2.11.1.tar.gz", hash = "sha256:59b895e326f0fb0d733fd28c6839bd18ad0687ba20efc26d4277fd1d30b971f4"}, ] pymdown-extensions = [ {file = "pymdown-extensions-9.2.tar.gz", hash = "sha256:ed8f69a18bc158f00cbf03abc536b88b6e541b7e699156501e767c48f81d8850"}, {file = "pymdown_extensions-9.2-py3-none-any.whl", hash = "sha256:f2fa7d9317c672a419868c893c20a28fb7ed7fc60d4ec4774c35e01398ab330c"}, ] pyparsing = [ - {file = "pyparsing-3.0.7-py3-none-any.whl", hash = "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484"}, - {file = "pyparsing-3.0.7.tar.gz", hash = "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea"}, + {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"}, + {file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"}, +] +pyrsistent = [ + {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"}, + {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26"}, + {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e"}, + {file = "pyrsistent-0.18.1-cp310-cp310-win32.whl", hash = "sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6"}, + {file = "pyrsistent-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-win32.whl", hash = "sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286"}, + {file = "pyrsistent-0.18.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6"}, + {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec"}, + {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c"}, + {file = "pyrsistent-0.18.1-cp38-cp38-win32.whl", hash = "sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca"}, + {file = "pyrsistent-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a"}, + {file = "pyrsistent-0.18.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5"}, + {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045"}, + {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c"}, + {file = "pyrsistent-0.18.1-cp39-cp39-win32.whl", hash = "sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc"}, + {file = "pyrsistent-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07"}, + {file = "pyrsistent-0.18.1.tar.gz", hash = "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96"}, ] pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, ] pytest-cov = [ - {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"}, - {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, + {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, + {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, ] pytest-watch = [ {file = "pytest-watch-4.2.0.tar.gz", hash = "sha256:06136f03d5b361718b8d0d234042f7b2f203910d8568f63df2f866b547b3d4b9"}, @@ -1615,8 +2940,8 @@ python-benedict = [ {file = "python_benedict-0.25.0-py3-none-any.whl", hash = "sha256:ef79be4842adbadc7d4bdc099ad397506a6d240be4be06ced4877abf33a3a2e3"}, ] python-cmr = [ - {file = "python-cmr-0.4.1.tar.gz", hash = "sha256:baa09f08fa3e09216ed9f3ac1e223ac020b5097d94e9f1f3e9acfdee3f871a40"}, - {file = "python_cmr-0.4.1-py3-none-any.whl", hash = "sha256:ba5ebce5c2f9d49a607c141614e90d2a583c5da115ffccd02ca79536a772c306"}, + {file = "python-cmr-0.7.0.tar.gz", hash = "sha256:d1c3fa15053193cfdea667252da1152f81a8ecf8ac9a18362cdcfe549d48a1b5"}, + {file = "python_cmr-0.7.0-py3-none-any.whl", hash = "sha256:9f09299b9bccb994311cde00625d4dfabe1f77877051a96ae1461e5db1e99cfb"}, ] python-dateutil = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, @@ -1630,6 +2955,35 @@ python-slugify = [ {file = "python-slugify-6.1.1.tar.gz", hash = "sha256:00003397f4e31414e922ce567b3a4da28cf1436a53d332c9aeeb51c7d8c469fd"}, {file = "python_slugify-6.1.1-py2.py3-none-any.whl", hash = "sha256:8c0016b2d74503eb64761821612d58fcfc729493634b1eb0575d8f5b4aa1fbcf"}, ] +pytkdocs = [ + {file = "pytkdocs-0.16.1-py3-none-any.whl", hash = "sha256:a8c3f46ecef0b92864cc598e9101e9c4cf832ebbf228f50c84aa5dd850aac379"}, + {file = "pytkdocs-0.16.1.tar.gz", hash = "sha256:e2ccf6dfe9dbbceb09818673f040f1a7c32ed0bffb2d709b06be6453c4026045"}, +] +pytz = [ + {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, + {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, +] +pywin32 = [ + {file = "pywin32-303-cp310-cp310-win32.whl", hash = "sha256:6fed4af057039f309263fd3285d7b8042d41507343cd5fa781d98fcc5b90e8bb"}, + {file = "pywin32-303-cp310-cp310-win_amd64.whl", hash = "sha256:51cb52c5ec6709f96c3f26e7795b0bf169ee0d8395b2c1d7eb2c029a5008ed51"}, + {file = "pywin32-303-cp311-cp311-win32.whl", hash = "sha256:d9b5d87ca944eb3aa4cd45516203ead4b37ab06b8b777c54aedc35975dec0dee"}, + {file = "pywin32-303-cp311-cp311-win_amd64.whl", hash = "sha256:fcf44032f5b14fcda86028cdf49b6ebdaea091230eb0a757282aa656e4732439"}, + {file = "pywin32-303-cp36-cp36m-win32.whl", hash = "sha256:aad484d52ec58008ca36bd4ad14a71d7dd0a99db1a4ca71072213f63bf49c7d9"}, + {file = "pywin32-303-cp36-cp36m-win_amd64.whl", hash = "sha256:2a09632916b6bb231ba49983fe989f2f625cea237219530e81a69239cd0c4559"}, + {file = "pywin32-303-cp37-cp37m-win32.whl", hash = "sha256:b1675d82bcf6dbc96363fca747bac8bff6f6e4a447a4287ac652aa4b9adc796e"}, + {file = "pywin32-303-cp37-cp37m-win_amd64.whl", hash = "sha256:c268040769b48a13367221fced6d4232ed52f044ffafeda247bd9d2c6bdc29ca"}, + {file = "pywin32-303-cp38-cp38-win32.whl", hash = "sha256:5f9ec054f5a46a0f4dfd72af2ce1372f3d5a6e4052af20b858aa7df2df7d355b"}, + {file = "pywin32-303-cp38-cp38-win_amd64.whl", hash = "sha256:793bf74fce164bcffd9d57bb13c2c15d56e43c9542a7b9687b4fccf8f8a41aba"}, + {file = "pywin32-303-cp39-cp39-win32.whl", hash = "sha256:7d3271c98434617a11921c5ccf74615794d97b079e22ed7773790822735cc352"}, + {file = "pywin32-303-cp39-cp39-win_amd64.whl", hash = "sha256:79cbb862c11b9af19bcb682891c1b91942ec2ff7de8151e2aea2e175899cda34"}, +] +pywinpty = [ + {file = "pywinpty-2.0.5-cp310-none-win_amd64.whl", hash = "sha256:f86c76e2881c37e69678cbbf178109f8da1fa8584db24d58e1b9369b0276cfcb"}, + {file = "pywinpty-2.0.5-cp37-none-win_amd64.whl", hash = "sha256:ff9b52f182650cfdf3db1b264a6fe0963eb9d996a7a1fa843ac406c1e32111f8"}, + {file = "pywinpty-2.0.5-cp38-none-win_amd64.whl", hash = "sha256:651ee1467bd7eb6f64d44dbc954b7ab7d15ab6d8adacc4e13299692c67c5d5d2"}, + {file = "pywinpty-2.0.5-cp39-none-win_amd64.whl", hash = "sha256:e59a508ae78374febada3e53b5bbc90b5ad07ae68cbfd72a2e965f9793ae04f3"}, + {file = "pywinpty-2.0.5.tar.gz", hash = "sha256:e125d3f1804d8804952b13e33604ad2ca8b9b2cac92b27b521c005d1604794f8"}, +] pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, @@ -1669,111 +3023,224 @@ pyyaml-env-tag = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, ] +pyzmq = [ + {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:6b217b8f9dfb6628f74b94bdaf9f7408708cb02167d644edca33f38746ca12dd"}, + {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2841997a0d85b998cbafecb4183caf51fd19c4357075dfd33eb7efea57e4c149"}, + {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f89468059ebc519a7acde1ee50b779019535db8dcf9b8c162ef669257fef7a93"}, + {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea12133df25e3a6918718fbb9a510c6ee5d3fdd5a346320421aac3882f4feeea"}, + {file = "pyzmq-22.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c532fd68b93998aab92356be280deec5de8f8fe59cd28763d2cc8a58747b7f"}, + {file = "pyzmq-22.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f907c7359ce8bf7f7e63c82f75ad0223384105f5126f313400b7e8004d9b33c3"}, + {file = "pyzmq-22.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:902319cfe23366595d3fa769b5b751e6ee6750a0a64c5d9f757d624b2ac3519e"}, + {file = "pyzmq-22.3.0-cp310-cp310-win32.whl", hash = "sha256:67db33bea0a29d03e6eeec55a8190e033318cee3cbc732ba8fd939617cbf762d"}, + {file = "pyzmq-22.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:7661fc1d5cb73481cf710a1418a4e1e301ed7d5d924f91c67ba84b2a1b89defd"}, + {file = "pyzmq-22.3.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79244b9e97948eaf38695f4b8e6fc63b14b78cc37f403c6642ba555517ac1268"}, + {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab888624ed68930442a3f3b0b921ad7439c51ba122dbc8c386e6487a658e4a4e"}, + {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18cd854b423fce44951c3a4d3e686bac8f1243d954f579e120a1714096637cc0"}, + {file = "pyzmq-22.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:de8df0684398bd74ad160afdc2a118ca28384ac6f5e234eb0508858d8d2d9364"}, + {file = "pyzmq-22.3.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:62bcade20813796c426409a3e7423862d50ff0639f5a2a95be4b85b09a618666"}, + {file = "pyzmq-22.3.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ea5a79e808baef98c48c884effce05c31a0698c1057de8fc1c688891043c1ce1"}, + {file = "pyzmq-22.3.0-cp36-cp36m-win32.whl", hash = "sha256:3c1895c95be92600233e476fe283f042e71cf8f0b938aabf21b7aafa62a8dac9"}, + {file = "pyzmq-22.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:851977788b9caa8ed011f5f643d3ee8653af02c5fc723fa350db5125abf2be7b"}, + {file = "pyzmq-22.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b4ebed0977f92320f6686c96e9e8dd29eed199eb8d066936bac991afc37cbb70"}, + {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42abddebe2c6a35180ca549fadc7228d23c1e1f76167c5ebc8a936b5804ea2df"}, + {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1e41b32d6f7f9c26bc731a8b529ff592f31fc8b6ef2be9fa74abd05c8a342d7"}, + {file = "pyzmq-22.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:be4e0f229cf3a71f9ecd633566bd6f80d9fa6afaaff5489492be63fe459ef98c"}, + {file = "pyzmq-22.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:08c4e315a76ef26eb833511ebf3fa87d182152adf43dedee8d79f998a2162a0b"}, + {file = "pyzmq-22.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:badb868fff14cfd0e200eaa845887b1011146a7d26d579aaa7f966c203736b92"}, + {file = "pyzmq-22.3.0-cp37-cp37m-win32.whl", hash = "sha256:7c58f598d9fcc52772b89a92d72bf8829c12d09746a6d2c724c5b30076c1f11d"}, + {file = "pyzmq-22.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2b97502c16a5ec611cd52410bdfaab264997c627a46b0f98d3f666227fd1ea2d"}, + {file = "pyzmq-22.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d728b08448e5ac3e4d886b165385a262883c34b84a7fe1166277fe675e1c197a"}, + {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:480b9931bfb08bf8b094edd4836271d4d6b44150da051547d8c7113bf947a8b0"}, + {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7dc09198e4073e6015d9a8ea093fc348d4e59de49382476940c3dd9ae156fba8"}, + {file = "pyzmq-22.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ca6cd58f62a2751728016d40082008d3b3412a7f28ddfb4a2f0d3c130f69e74"}, + {file = "pyzmq-22.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:468bd59a588e276961a918a3060948ae68f6ff5a7fa10bb2f9160c18fe341067"}, + {file = "pyzmq-22.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c88fa7410e9fc471e0858638f403739ee869924dd8e4ae26748496466e27ac59"}, + {file = "pyzmq-22.3.0-cp38-cp38-win32.whl", hash = "sha256:c0f84360dcca3481e8674393bdf931f9f10470988f87311b19d23cda869bb6b7"}, + {file = "pyzmq-22.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:f762442bab706fd874064ca218b33a1d8e40d4938e96c24dafd9b12e28017f45"}, + {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:954e73c9cd4d6ae319f1c936ad159072b6d356a92dcbbabfd6e6204b9a79d356"}, + {file = "pyzmq-22.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f43b4a2e6218371dd4f41e547bd919ceeb6ebf4abf31a7a0669cd11cd91ea973"}, + {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:acebba1a23fb9d72b42471c3771b6f2f18dcd46df77482612054bd45c07dfa36"}, + {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cf98fd7a6c8aaa08dbc699ffae33fd71175696d78028281bc7b832b26f00ca57"}, + {file = "pyzmq-22.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d072f7dfbdb184f0786d63bda26e8a0882041b1e393fbe98940395f7fab4c5e2"}, + {file = "pyzmq-22.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:53f4fd13976789ffafedd4d46f954c7bb01146121812b72b4ddca286034df966"}, + {file = "pyzmq-22.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1b5d457acbadcf8b27561deeaa386b0217f47626b29672fa7bd31deb6e91e1b"}, + {file = "pyzmq-22.3.0-cp39-cp39-win32.whl", hash = "sha256:e6a02cf7271ee94674a44f4e62aa061d2d049001c844657740e156596298b70b"}, + {file = "pyzmq-22.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d3dcb5548ead4f1123851a5ced467791f6986d68c656bc63bfff1bf9e36671e2"}, + {file = "pyzmq-22.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a4c9886d61d386b2b493377d980f502186cd71d501fffdba52bd2a0880cef4f"}, + {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:80e043a89c6cadefd3a0712f8a1322038e819ebe9dbac7eca3bce1721bcb63bf"}, + {file = "pyzmq-22.3.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1621e7a2af72cced1f6ec8ca8ca91d0f76ac236ab2e8828ac8fe909512d566cb"}, + {file = "pyzmq-22.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d6157793719de168b199194f6b6173f0ccd3bf3499e6870fac17086072e39115"}, + {file = "pyzmq-22.3.0.tar.gz", hash = "sha256:8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c"}, +] requests = [ {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, ] responses = [ - {file = "responses-0.14.0-py2.py3-none-any.whl", hash = "sha256:57bab4e9d4d65f31ea5caf9de62095032c4d81f591a8fac2f5858f7777b8567b"}, - {file = "responses-0.14.0.tar.gz", hash = "sha256:93f774a762ee0e27c0d9d7e06227aeda9ff9f5f69392f72bb6c6b73f8763563e"}, + {file = "responses-0.20.0-py3-none-any.whl", hash = "sha256:18831bc2d72443b67664d98038374a6fa1f27eaaff4dd9a7d7613723416fea3c"}, + {file = "responses-0.20.0.tar.gz", hash = "sha256:644905bc4fb8a18fa37e3882b2ac05e610fe8c2f967d327eed669e314d94a541"}, ] s3fs = [ - {file = "s3fs-2022.2.0-py3-none-any.whl", hash = "sha256:62cc021e4b192942cb51667a4b5299e948476f318838df7a693ed7a3628fcb8d"}, - {file = "s3fs-2022.2.0.tar.gz", hash = "sha256:4611d0f7e41e5bc9dac3009070e0ad37da87a42f6def75b4813c06f7e404a738"}, + {file = "s3fs-2022.3.0-py3-none-any.whl", hash = "sha256:dcf5792536363a95a25c8babb2d8ef1b6c4b1a2377986da8ce03f615d10780ed"}, + {file = "s3fs-2022.3.0.tar.gz", hash = "sha256:af126157a4dae39df81e8931fbc36591f91da0c6744954fb0dd3f3c0ebdf91e3"}, +] +send2trash = [ + {file = "Send2Trash-1.8.0-py3-none-any.whl", hash = "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"}, + {file = "Send2Trash-1.8.0.tar.gz", hash = "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d"}, ] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +sniffio = [ + {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, + {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, +] +soupsieve = [ + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, +] +stack-data = [ + {file = "stack_data-0.2.0-py3-none-any.whl", hash = "sha256:999762f9c3132308789affa03e9271bbbe947bf78311851f4d485d8402ed858e"}, + {file = "stack_data-0.2.0.tar.gz", hash = "sha256:45692d41bd633a9503a5195552df22b583caf16f0b27c4e58c98d88c8b648e12"}, +] +terminado = [ + {file = "terminado-0.13.3-py3-none-any.whl", hash = "sha256:874d4ea3183536c1782d13c7c91342ef0cf4e5ee1d53633029cbc972c8760bd8"}, + {file = "terminado-0.13.3.tar.gz", hash = "sha256:94d1cfab63525993f7d5c9b469a50a18d0cdf39435b59785715539dd41e36c0d"}, +] text-unidecode = [ {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] +tinycss2 = [ + {file = "tinycss2-1.1.1-py3-none-any.whl", hash = "sha256:fe794ceaadfe3cf3e686b22155d0da5780dd0e273471a51846d0a02bc204fec8"}, + {file = "tinycss2-1.1.1.tar.gz", hash = "sha256:b2e44dd8883c360c35dd0d1b5aad0b610e5156c2cb3b33434634e539ead9d8bf"}, +] +tinynetrc = [ + {file = "tinynetrc-1.3.1-py2.py3-none-any.whl", hash = "sha256:46c7820e5f49c9434d2c4cd74de8a06edbbd45e63a8a2980a90b8a43db8facf7"}, + {file = "tinynetrc-1.3.1.tar.gz", hash = "sha256:2b9a256d2e630643b8f0985f5e826ccf0bf3716e07e596a4f67feab363d254df"}, +] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, - {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +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.63.0-py2.py3-none-any.whl", hash = "sha256:e643e071046f17139dea55b880dc9b33822ce21613b4a4f5ea57f202833dbc29"}, - {file = "tqdm-4.63.0.tar.gz", hash = "sha256:1d9835ede8e394bb8c9dcbffbca02d717217113adc679236873eeaac5bc0b3cd"}, -] -typed-ast = [ - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, - {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, - {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, - {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, - {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, - {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, - {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, - {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, - {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, - {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, + {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, + {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, +] +traitlets = [ + {file = "traitlets-5.1.1-py3-none-any.whl", hash = "sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"}, + {file = "traitlets-5.1.1.tar.gz", hash = "sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7"}, +] +types-requests = [ + {file = "types-requests-2.27.20.tar.gz", hash = "sha256:63344573cde6c4efd44d867c0158d9fb7e6beb95721cbe9882f3f857ee8a5398"}, + {file = "types_requests-2.27.20-py3-none-any.whl", hash = "sha256:68b8de86552116424ec23b77afc925e111afb6496d3821b183b7d151b3b834d4"}, +] +types-setuptools = [ + {file = "types-setuptools-57.4.14.tar.gz", hash = "sha256:df02fe1dd244f58cf4e67cfc3d0a97930a2d61a72dd89f21d81c71017cd83f9a"}, + {file = "types_setuptools-57.4.14-py3-none-any.whl", hash = "sha256:828f7e7e51e157876f47c80518b23ba0c3c36aa8081efd39d5d39f393938aec9"}, +] +types-urllib3 = [ + {file = "types-urllib3-1.26.13.tar.gz", hash = "sha256:40f8fb5e8cd7d57e8aefdee3fdd5e930aa1a1bb4179cdadd55226cea588af790"}, + {file = "types_urllib3-1.26.13-py3-none-any.whl", hash = "sha256:ff7500641824f881b2c7bde4cc57e6c3abf03d1e005bae83aca752e77213a5da"}, ] typing-extensions = [ - {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"}, - {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"}, + {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, + {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, ] urllib3 = [ {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, ] virtualenv = [ - {file = "virtualenv-20.13.3-py2.py3-none-any.whl", hash = "sha256:dd448d1ded9f14d1a4bfa6bfc0c5b96ae3be3f2d6c6c159b23ddcfd701baa021"}, - {file = "virtualenv-20.13.3.tar.gz", hash = "sha256:e9dd1a1359d70137559034c0f5433b34caf504af2dc756367be86a5a32967134"}, + {file = "virtualenv-20.14.1-py2.py3-none-any.whl", hash = "sha256:e617f16e25b42eb4f6e74096b9c9e37713cf10bf30168fb4a739f3fa8f898a3a"}, + {file = "virtualenv-20.14.1.tar.gz", hash = "sha256:ef589a79795589aada0c1c5b319486797c03b67ac3984c48c669c0e4f50df3a5"}, ] watchdog = [ - {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9693f35162dc6208d10b10ddf0458cc09ad70c30ba689d9206e02cd836ce28a3"}, - {file = "watchdog-2.1.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aba5c812f8ee8a3ff3be51887ca2d55fb8e268439ed44110d3846e4229eb0e8b"}, - {file = "watchdog-2.1.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ae38bf8ba6f39d5b83f78661273216e7db5b00f08be7592062cb1fc8b8ba542"}, - {file = "watchdog-2.1.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ad6f1796e37db2223d2a3f302f586f74c72c630b48a9872c1e7ae8e92e0ab669"}, - {file = "watchdog-2.1.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:922a69fa533cb0c793b483becaaa0845f655151e7256ec73630a1b2e9ebcb660"}, - {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b2fcf9402fde2672545b139694284dc3b665fd1be660d73eca6805197ef776a3"}, - {file = "watchdog-2.1.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3386b367e950a11b0568062b70cc026c6f645428a698d33d39e013aaeda4cc04"}, - {file = "watchdog-2.1.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f1c00aa35f504197561060ca4c21d3cc079ba29cf6dd2fe61024c70160c990b"}, - {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b52b88021b9541a60531142b0a451baca08d28b74a723d0c99b13c8c8d48d604"}, - {file = "watchdog-2.1.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8047da932432aa32c515ec1447ea79ce578d0559362ca3605f8e9568f844e3c6"}, - {file = "watchdog-2.1.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e92c2d33858c8f560671b448205a268096e17870dcf60a9bb3ac7bfbafb7f5f9"}, - {file = "watchdog-2.1.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b7d336912853d7b77f9b2c24eeed6a5065d0a0cc0d3b6a5a45ad6d1d05fb8cd8"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:cca7741c0fcc765568350cb139e92b7f9f3c9a08c4f32591d18ab0a6ac9e71b6"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_armv7l.whl", hash = "sha256:25fb5240b195d17de949588628fdf93032ebf163524ef08933db0ea1f99bd685"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_i686.whl", hash = "sha256:be9be735f827820a06340dff2ddea1fb7234561fa5e6300a62fe7f54d40546a0"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0d19fb2441947b58fbf91336638c2b9f4cc98e05e1045404d7a4cb7cddc7a65"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:3becdb380d8916c873ad512f1701f8a92ce79ec6978ffde92919fd18d41da7fb"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_s390x.whl", hash = "sha256:ae67501c95606072aafa865b6ed47343ac6484472a2f95490ba151f6347acfc2"}, - {file = "watchdog-2.1.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e0f30db709c939cabf64a6dc5babb276e6d823fd84464ab916f9b9ba5623ca15"}, - {file = "watchdog-2.1.6-py3-none-win32.whl", hash = "sha256:e02794ac791662a5eafc6ffeaf9bcc149035a0e48eb0a9d40a8feb4622605a3d"}, - {file = "watchdog-2.1.6-py3-none-win_amd64.whl", hash = "sha256:bd9ba4f332cf57b2c1f698be0728c020399ef3040577cde2939f2e045b39c1e5"}, - {file = "watchdog-2.1.6-py3-none-win_ia64.whl", hash = "sha256:a0f1c7edf116a12f7245be06120b1852275f9506a7d90227648b250755a03923"}, - {file = "watchdog-2.1.6.tar.gz", hash = "sha256:a36e75df6c767cbf46f61a91c70b3ba71811dfa0aca4a324d9407a06a8b7a2e7"}, + {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:177bae28ca723bc00846466016d34f8c1d6a621383b6caca86745918d55c7383"}, + {file = "watchdog-2.1.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d1cf7dfd747dec519486a98ef16097e6c480934ef115b16f18adb341df747a4"}, + {file = "watchdog-2.1.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7f14ce6adea2af1bba495acdde0e510aecaeb13b33f7bd2f6324e551b26688ca"}, + {file = "watchdog-2.1.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4d0e98ac2e8dd803a56f4e10438b33a2d40390a72750cff4939b4b274e7906fa"}, + {file = "watchdog-2.1.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:81982c7884aac75017a6ecc72f1a4fedbae04181a8665a34afce9539fc1b3fab"}, + {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0b4a1fe6201c6e5a1926f5767b8664b45f0fcb429b62564a41f490ff1ce1dc7a"}, + {file = "watchdog-2.1.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6e6ae29b72977f2e1ee3d0b760d7ee47896cb53e831cbeede3e64485e5633cc8"}, + {file = "watchdog-2.1.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b9777664848160449e5b4260e0b7bc1ae0f6f4992a8b285db4ec1ef119ffa0e2"}, + {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:19b36d436578eb437e029c6b838e732ed08054956366f6dd11875434a62d2b99"}, + {file = "watchdog-2.1.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b61acffaf5cd5d664af555c0850f9747cc5f2baf71e54bbac164c58398d6ca7b"}, + {file = "watchdog-2.1.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1e877c70245424b06c41ac258023ea4bd0c8e4ff15d7c1368f17cd0ae6e351dd"}, + {file = "watchdog-2.1.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d802d65262a560278cf1a65ef7cae4e2bc7ecfe19e5451349e4c67e23c9dc420"}, + {file = "watchdog-2.1.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b3750ee5399e6e9c69eae8b125092b871ee9e2fcbd657a92747aea28f9056a5c"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_aarch64.whl", hash = "sha256:ed6d9aad09a2a948572224663ab00f8975fae242aa540509737bb4507133fa2d"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_armv7l.whl", hash = "sha256:b26e13e8008dcaea6a909e91d39b629a39635d1a8a7239dd35327c74f4388601"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_i686.whl", hash = "sha256:0908bb50f6f7de54d5d31ec3da1654cb7287c6b87bce371954561e6de379d690"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64.whl", hash = "sha256:bdcbf75580bf4b960fb659bbccd00123d83119619195f42d721e002c1621602f"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:81a5861d0158a7e55fe149335fb2bbfa6f48cbcbd149b52dbe2cd9a544034bbd"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_s390x.whl", hash = "sha256:03b43d583df0f18782a0431b6e9e9965c5b3f7cf8ec36a00b930def67942c385"}, + {file = "watchdog-2.1.7-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ae934e34c11aa8296c18f70bf66ed60e9870fcdb4cc19129a04ca83ab23e7055"}, + {file = "watchdog-2.1.7-py3-none-win32.whl", hash = "sha256:49639865e3db4be032a96695c98ac09eed39bbb43fe876bb217da8f8101689a6"}, + {file = "watchdog-2.1.7-py3-none-win_amd64.whl", hash = "sha256:340b875aecf4b0e6672076a6f05cfce6686935559bb6d34cebedee04126a9566"}, + {file = "watchdog-2.1.7-py3-none-win_ia64.whl", hash = "sha256:351e09b6d9374d5bcb947e6ac47a608ec25b9d70583e9db00b2fcdb97b00b572"}, + {file = "watchdog-2.1.7.tar.gz", hash = "sha256:3fd47815353be9c44eebc94cc28fe26b2b0c5bd889dafc4a5a7cbdf924143480"}, ] 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"}, +] +websocket-client = [ + {file = "websocket-client-1.3.2.tar.gz", hash = "sha256:50b21db0058f7a953d67cc0445be4b948d7fc196ecbeb8083d68d94628e4abf6"}, + {file = "websocket_client-1.3.2-py3-none-any.whl", hash = "sha256:722b171be00f2b90e1d4fb2f2b53146a536ca38db1da8ff49c972a4e1365d0ef"}, +] wrapt = [ {file = "wrapt-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:5a9a1889cc01ed2ed5f34574c90745fab1dd06ec2eee663e8ebeefe363e8efd7"}, {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:9a3ff5fb015f6feb78340143584d9f8a0b91b6293d6b5cf4295b3e95d179b88c"}, @@ -1919,6 +3386,6 @@ yarl = [ {file = "yarl-1.7.2.tar.gz", hash = "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd"}, ] zipp = [ - {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"}, - {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"}, + {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, + {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, ] diff --git a/pyproject.toml b/pyproject.toml index 5934cefd..ca585487 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,34 +1,41 @@ [tool.poetry] name = "earthdata" -version = "0.2.0" +version = "0.3.0" description = "Client library for NASA Earthdata APIs" authors = ["Luis Lopez "] license = "MIT" readme = "README.md" [tool.poetry.dependencies] -python = "^3.7" -pydantic = "^1.6" -python-benedict = "^0.25" -python-cmr = "^0.4.1" -requests = "^2.26" -s3fs = ">=2021.11, <2023" -pqdm = "^0.1" +python = ">=3.8,<4.0" +python-cmr = ">=0.7" +python-benedict = ">=0.25" +pqdm = ">=0.1" +requests = ">=2.26" +s3fs = ">=2021.11, <2024" +tinynetrc = "^1.3.1" [tool.poetry.dev-dependencies] -mypy = "^0.812" -black = "^21.11b0" -isort = "^5" -autoflake = "^1.3" -flake8 = "^3.7" -pre-commit = "^2.4" -pytest = "^6.0" -pytest-cov = "^2.8" -pytest-watch = "^4.2" -mkdocs = "^1.1" -mkdocs-material = "^6" -markdown-include = "^0.6" -responses = "^0.14" +mypy = ">=0.812" +black = ">=21.11b0" +isort = ">=5" +autoflake = ">=1.3" +flake8 = ">=3.7" +jupyterlab = ">=3" +pre-commit = ">=2.4" +pytest = ">=6.0" +pytest-cov = ">=2.8" +pytest-watch = ">=4.2" +mkdocs = ">=1.2" +mkdocs-material = ">=7.1,<9.0" +markdown-include = ">=0.6" +mkdocstrings = ">=0.18" +mkdocs-jupyter = "=0.19.0" +pymdown-extensions = "=9.2" +pygments = "=2.11.1" +responses = ">=0.14" +types-requests = ">=0.1" +types-setuptools = ">=0.1" [build-system] requires = ["poetry>=0.12"] diff --git a/readthedocs.yml b/readthedocs.yml new file mode 100644 index 00000000..f96ef43e --- /dev/null +++ b/readthedocs.yml @@ -0,0 +1,24 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the version of Python and other tools you might need +build: + os: ubuntu-20.04 + tools: + python: "mambaforge-4.10" + +mkdocs: + configuration: mkdocs.yml + +# Optionally declare the Python requirements required to build your docs +conda: + environment: binder/environment.yml + +python: + install: + - method: pip + path: . diff --git a/scripts/docs-live.sh b/scripts/docs-live.sh index b91a0649..9d36ebf6 100755 --- a/scripts/docs-live.sh +++ b/scripts/docs-live.sh @@ -2,5 +2,6 @@ #!/usr/bin/env bash set -e +set -x mkdocs serve --dev-addr 0.0.0.0:8008 diff --git a/tests/test_auth.py b/tests/test_auth.py index 705abbf2..70868aae 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -63,3 +63,19 @@ def test_auth_can_create_proper_credentials( auth = Auth().login() self.assertEqual(auth.authenticated, True) self.assertEqual(auth.token, json_response) + + # @responses.activate + # @mock.patch("builtins.open", new_callable=mock.mock_open, read_data="data") + # def test_auth_can_read_netrc(self, mock_file) -> bool: + # json_response = {"access_token": "EDL-token-1", "expiration_date": "12/15/2021"} + + # responses.add( + # responses.GET, + # "https://urs.earthdata.nasa.gov/api/users/tokens", + # json=[], + # status=200, + # ) + # auth = Auth().login(strategy="netrc") + # self.assertEqual(auth.authenticated, True) + # mock_file.assert_called_with("path/to/open") + # self.assertEqual(auth.token, json_response) From a23f5ac0736915061bda267ad04d44d76bf515e2 Mon Sep 17 00:00:00 2001 From: "betolink:w" Date: Tue, 26 Apr 2022 09:17:40 -0600 Subject: [PATCH 2/5] update Changelog, documentation --- CHANGELOG.md | 5 + binder/environment.yml | 5 +- docs/earth.png | Bin 0 -> 16689 bytes docs/index.md | 2 +- docs/tutorials/demo.ipynb | 547 +----------------- .../collections/collections-query.md | 4 +- .../user-reference/collections/collections.md | 8 +- .../user-reference/glossary/cloud-glossary.md | 0 docs/user-reference/glossary/nasa-glossary.md | 3 + .../user-reference/granules/granules-query.md | 3 + docs/user-reference/granules/granules.md | 10 +- mkdocs.yml | 53 +- poetry.lock | 53 +- pyproject.toml | 2 + 14 files changed, 147 insertions(+), 548 deletions(-) create mode 100644 docs/earth.png create mode 100644 docs/user-reference/glossary/cloud-glossary.md create mode 100644 docs/user-reference/glossary/nasa-glossary.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 34ba8b19..4f093f39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # Changelog ## [Unreleased] +- Fixed bug with CMR tokens +- dropped python 3.7 support +- updated python-cmr to NASA fork +- added documentation for readthedocs and github +- Auth can refresh CMR tokens ## [v0.2.2] 2022-03-23 - Bug fixes to store to download multi-file granules diff --git a/binder/environment.yml b/binder/environment.yml index 2fbb537a..f6211e28 100644 --- a/binder/environment.yml +++ b/binder/environment.yml @@ -4,7 +4,6 @@ channels: - nodefaults dependencies: - python=3.9 -- jupyterlab>=3 - xarray>=0.19 - rioxarray>=0.3 - matplotlib-base>=3.3 @@ -17,6 +16,8 @@ dependencies: - zarr>=2.9.5 - earthdata # documentation +- jupyterlab>=3 +- ipywidgets - mkdocs>=1.2 - mkdocs-material>=7.1, <9.0 - markdown-include>=0.6 @@ -24,8 +25,6 @@ dependencies: - mkdocs-jupyter=0.18.0 - pymdown-extensions=9.2 - pygments=2.11.1 -- pqdm -- ipywidgets - pip - pip: - zarr-eosdis-store diff --git a/docs/earth.png b/docs/earth.png new file mode 100644 index 0000000000000000000000000000000000000000..2f78f70727e901a775327d23a137f0bc22957546 GIT binary patch literal 16689 zcmeIaRd5{5)+H)g7L&!y%*>1yGc&cA)nc}o$zo<^W@cu|0*jehmL*Mp|NM8(orrrM z&ci%R#Honx>g>I1cjl_hs)$Q^pAvzg^`)*|E&(RGXMWk|3~sK^?wfLRkHE`*lLMe z*#YcbKwS_ZWntm^FJu3bYX5&o|FOg?ZD(u&(6llGTK?;>e+i@jRu-0^k^Daf|4X9i zYy|*e@Xu&L5>lprkYxIAC_!h2>3^M?fAIM~zy0S&{w<9E1J{4x`nM4Hx0L@gyZ!^$ zzlFfRrTm}S^?w&!aQ`BA0DBOla|cm37TOHy65*H>2$yD?qzd1nwm=AR}QkAIQ&gfai^(- z)T}p=pCZe%PZz2V5c}y7uxEIzr;_G0y;^ zb#c(+j@=OXE>iKHR z&N{_=!RQoJ$zt92#I9PWRLATE-1fE~{(q@s9;^RKA$1_KU_hHe8Q;0yo;MR#Jzt{ax47p`ovN;?_LN zGhqZAUD{+46Bd*CAL?nMK)sCNq99D%rWNNG5kn1VkHqkdMwQ^Ka+rDdF-Q%KWfvzI zYTsf@?ajM)@_8c#D7s^OQrdcf!NUCmike=hyE^QZH`*wwkUQflCetDqo?bKNGDjsG zK8``Omu17SR~g!0J%~yjC+piHv#2yW+v-S?J}bf0Q2*hdS(gy2vEPEhh4}eF8tiTs$0> zTtf|{L@e0)&oHO#_C~2`^cZ^pA5mBknS`drrBoM{qk}5ZUE9M4E4uMB4X?25JZl-H z@7?QlJaO7djI1{@NVN1b80{mm93`AMbYhOn2`GA+T5s(|+^GphlrxRzLUA3{0`>RiNOA z&qj)mnS#At;A&B`JlxkPTDJN~WFqNZ=X_`JrL>HG#dHmRbB&@TbQ(joXj10Z zw0<@=55GsAvvt`4c1-VdqSioMj{-sHZ8-BHbcWH--k=I>iJj9g2L1v;tvVk0OSgM# zXFCnk>B1}xCAE-0+VB;H^%<*7WRWUKQkySvhd_8F^NZ6U`)`LO( zTkS5)WbRcglUC1*DLx|50RLwJz%;^Q%T0rqZAFiSk)rhA-n{DMR*&S~vjpP$7!5lZ z2N|px{Ff|s+{xOC+GuTR)l!Fj;T;8Dvc~cJga;A?ZPr;N+C!J6#sfRELS*9Xdu2YY zDA124*`X@$llkZOq)4kR7idK$>)`@ugy?uu`!A5(1WZsZ0{t>PUjZW6?^{)3=haht zjWj=2x^W%p*Q3eNeb{w8@@TO_q3`6$47VYiXV7nsAmk6F0Z`FbJ|wkrvq$UlROO)r zb6+UwwUi(#0%X=Yf}IK~bGoa2(y1iI$7^PRj0O+csnfDVIeEpyI?jm4#Ks<9VfTZu z86_saf4C|oo8=dW6J|5sxqADnjDDTxo0N2UwJ2e-8!Tw);R>Xc-t)6n8*5ay8B;$R z{^NLe35SqKdYDv$+d-N%yZuYz+=0-jrWX1rY~OQPE&A9LC49V}pK1KgAi(e`Dgulk zW8%8)wgb;@YQLCA^VI1K6)MtcsYcOlRv5MO^z~KHAw?$PZuyfrJDBo-!7*j}%ww_XbqOPOtONq<;{VrP)gdw|F%I0$SW}0rTZ1 zI&QpUE_5bZYh4I)sMV*x4!I49dSj7uzTpNJ>rxLZ}#>Ev>73@)}aar1=W_q;1XC)-*071 z><1Psn)BxJhF}ff=ul|vk81}cg>=;)ASl0+qkf<%fzhb+-24WEj4wD01`mw>TLMd@ zrO`EIQnjA>)rP4nrsWU!VZtV&d=73)33%86MX9vA=*p zR0%2!h8oDJCk~;xH|&W%a)B=sO_@%0k?+}a!(x`HL1vt4?N`vqB*qhUPWV-4{O~je zx zeh%p=obmTI#h)QE-c;i;A%hm3NVH@AmqUnzZS#i9gbHFm< z;tCwlzU=|=UyD#L_2m;x&_m^U=+n%L%Ii61U#zujVCGArEiQd~!bya1%fp%Uc%m#q zV`KulVVbn^E2yxF9M|WCXRCbRt3S%eV$n&k*zW){-j`a6E%#e#-FcrPBk55muCt=* ziQ@0usoHB*gdtId+Q;XRI(S3lX}agyBoY&pScowWdm$b)!A~kh@N;IyFBGY9l2r58 zQfxWTiwzFinBKjU7FCJFUNqyP-udyZ9hA&1q2ef<7BEi*F~7LWit0@V&=fFGs6p@mh3QWTE4vp9xkYZqplg?GdSl~Vhc<8ZB&2DNWyACRkHc!-A zy6G(c))5s7O&o3QzslM5hB;j?nNCthSS)!eB&FDrpz=NP_eJB*XqSg%do{AIomG+~ z`D>ADZ}W`zHOXK&899Zb`}2xSzk5cjNBj5Ud|cyGz%xJ*nNag`n-2PG5MQ^@p;<5# z=Evl=P4ygY<9kv5j0N%A<1g%%?u?DUneWyVow_b+kM81as@BrQ`_@V>#N`+Ep^k#D z_ZpSw@$s=m4KLKr>64n3zj-vJ>15txx3s1~o$Oe$aFmqXE#Jv5dC4E;NQFV3YO|Kp z%IEgZFgK3CKCP>E#bXcC8eI$ImxC6SCtHl-?H8JFZ&kvS?U1zM_oX$Bl@VwsL017+ z(M;>w0L<&XU9<7HPGJu908E8BAD)LOt zr~rEeaYd3)0J!Z6l*lKUSq8V(a*Wmpk$CtRovsBf4X#=iBn&lXBkMfVN(|A%FLBGKWW(Gxu|QluyX)C{HqNWhQ-tO-B6A*G?!|;6 zC~KtaUYKi-yY~_FiV{FU{}-)(B@~_2LzS%11582uvi)ImkjF7AK$#4r$JI#AS!A<< zo&o3KN#goxRxbmWdijaHWWu(!s$YcJ_h<_Y%ObP$#>qp(1T>WV$Y>G~;U|@tSk;G; z=$pYmlAkrYiCcE4=1C+40G0*oE!tz>-5r!PU)(Kq)c$Im+f>$iT7fOLbvJjT*3XrvX4t|yOz&< z)?YpAn&UYE96)8tN*`heCE_^gggXgMrsrc@!Hmq|J|enB)yVc{amc<6h$I^1isi4J z1m}g z*>=9URD?kHb}6uB9v)40n^0g2^N^nTq>Sqrj^UvX6<*2kJ{_>R+ham-sufqFyYtN* z4DO|$YV-FtU_`ks7mqfb(YLIF)uQH^!`uW-%crdk=dOOP2Bb_VK}7xdQD+K~38`UF z3W@palPq@ONHi31lv25NRkqs)CS-ozm4&1{NX)3Y zc$;sdzvv$+f6YfdamjN)I3&;O1F>j z3~s6X-hVZD@;%gLFGg6BVcOg}I0d49#^=;dVPXWrWTpxs=WiFP0EPDU(Vyp}uwheu zbirKxbe;sL5$WBT0n1_P2lV^CJzE2|WHktzET*C|Gr#Ad0SMt(^2s;9EFD)BxvMNIZT{{e)~(``jX+x10FV)`(mUWVn?5ax zncYt?27|5g)+vj~;U|L&kHzjsHP#JZ>RFepArm&yBvYd(b|rblpQy$cKQmHaCN1NL zgpN)*;CoH{$Cf+uyqTN!6ki>Ct(fv4F8a_4g?{yLf=wWxG{QcoFY%U!oEo;^T`0eL z>(Qr_Cf|sypAk(tQu*r^fqe5E<+_}@Ja*Yq)(d&ir9AL2{`siVszhTVJ-fxd=jX;3 zLIa(M*hKnkAO!op88lZ!I>bOHs1Nn-pv_)Xuu^lVPpLzS}k&Wpxu03e-R zzz^291@;k=F0kw)y{~sBil`~ah{kP!+c+N=GXp|s(@DPD_VD9A-J`i$;iC<>!Zm-Z znrnVnXdiI)QOVQB6J!5@YL6q+T4{ zV?99@x4z{lw`5;DL?ct4fj5AeLKHm#+k$>qzU>4ZM)FMT0`iDHRJPP7DQ1X^z6t)& z>Zu|zFL19IIKr~Qc7X9iO2OffznO`80$&?0G>vvPZF;a?i^_A2<(W1-A}brocJ%c? zDE;-a8sYAU_?sTQrgK+bF!+?$os^ULPTFJd^{>9Fw9MO*_93ha$_c^%ln;z5L%fA zrO)M)1)@bYz6EtU5_DlU0$B&P)NxUFo?Nb82BSXseubnHO4CI*Jzm++GwtQx_6vI@ zwO?7&RO7>&&tA;4KAEE@mvazoM&FC!!Gn;Xck)$?nV7}w34MHnBU7k*%Fc&}gVDPP zYo^E9LJ&SYdzCVycr^6~SI%;5XX@shBnSs3?f3f;^&P<+HtC#Tszb#uxFWI|Rbcs0 z9iL`Inw8(Gvg-n5c4qS1G{*1%0awltO^Z{uN72kT#*HI)a$Gpsk-9G0@oI9@T%ya|GsfP=QKdc^byEuHU$Yl1R?KHuvy}a^%rMVf)5kp)Yn1wHMld zjot0Hy(l|gHSqJ{s|--4;T*UsKS_iu){wY3ZcxexFHU2&UFs-QarFa=D938xeDMSON|iKSLn=zq;X?ER=sV~gSb$zbE^Q$;td?dhTj?~J1MFD zsuqBN7bw#(C%xNRTltA{8<5hU#hp6wUbf>S*v~_v)>-IMF&^8~htOk9Pf|M&L-U z0%@DdagrWx#2#kN@uVdRu{hIYNWFx66~> z#kHBsgK|}IpA`K0yj~^6Sn@}=AA!31U7osRa@+K)aR7La54l7ev`&NC_`bVye5CS8 z1`o`zFboC^^C~(0mLx}}YSQv^^sB2;)Pf^EpS)6FDHSHh+7^8*;oN8Zv+kLmLHu3^@-H0!-@W_e|yf^@4_^|zl;0gpXhmWy(5|+Gd`-T#d{K59%jriP`D#l zClC8De^Ja(sg?`5- zkr<=l!mlCyRU@DP!OlDu2B_hX_cxt-RMeEDmQ;3TmYZs)jYs zlF>|<9^QvLe?c&2-17pC*{$&6N*vba7mmm`|1neZ?+z>2O+I_PShV8%AKDn&l)F`+B3B&qET-LL&S)1$569B`Kza(>Jn@muSCN+2hok2kcn)E>hrLbqh)QAbfH1lk&E+jF z_pN&()?Px2!V%pN9Oib0d{mc{*4(T*kog^g_zd>^`ag9&50z2T!2Dsr2xW-Kra8?t7xFeltll+9m2;M5s z>fx7B!C4CrI--^FdWAds$n@d>j29SzZt}dnrA$BHGD{Md6BH=^3lxXnwXW*-mXU*8Oi0|C;Bmj{j|*X1@Gx-`*O)^Mrsz%4n<&rg@yx{b7hNF%vj zMjo!A?DSyRne^uUXclgQF702^cF`Mp9v$wgjw=4_xBBAOCE6S8NGNDtvTh2C@L5iA z4Fs;!p;ub`iL}K8MV!;nX>!%02jY!QjOs!Qi{*2Z$>*J&;c~BeL_#ED(gL&3WD=zY zgM2K2xB^JP?@T)pm=H(8Mxa{h>~CwZoP;-6vkkK6`64vF% zcAAT7tj-(036oI{(5y0%30z-5Ik1}a{3*DyFNF#>deS26LMUPKh#Cp6=7=ri8CHvr z-wIpVI|#~5(6=?G`5#j9-seSgG=fj8=t?>bBwEP%7*Z3db>yXuPoGE28XI68+-+#% z29nHdgG~#eG;pt{c7v{6(mchwFTNd!fV=-v9tdJvR@WQ7x&UuGMNc+RIDAxp8!DA4 z2&aK(-xBuF;wPzV@EAP)XBfMxt^lqVT>jGOv&q z)vIvS(>(1VduNOr00LT4p5NN}DGi(d;2VS{)?AIP{~)bF(SCn3pS52x43GbcLV|J! zvn2F)rhE?QLIH!JzJtMngj(DLtCHpk2wi;vw4xi`R{9i6%hK9=kMdk17n$$(3?>v+ z*biU(e{8Y)H?h6bB#miAiz0sAX`4?QRAxO<6W+dNVEO=?%Ujl-T2GgV2@{pVHaEMO zk&L!l)XF*fv%Yw1VkApO)P*x%s|a;pV#6vXjb2SzT4y`VVr_3dqRRoC>Y~`K9_V4n z93O0DwG@SR8}e{!D2=hm%0|iW$T+Xj75sE71AFAiV*YxoRI?7NQ5eE0SS2hErD2V} z9wAq+QW%&c-3#7y%mvB6Jllr=T8O(x#oN#Fm}qY&TAEa`Nwt)>Cv;X_-Ij6TcWxtA z>c1_}5-g9S7jsrGz$N8~Q!H9Ax%oW*dn=R>Q-QF+S zJ?5YD?|p6yhEn)yru-Y(wwS@{@W|0DFXS^CHbzE6_UetqkFP(R*;8p+uVCr)Dm4w&)?PBAMI9jI(zadjP~FP%GDYd zUUj^A7`+M7UNzo-HK6cToMuD|-Lm3f7Q4(LrYv4DBzHF~IMjQxf2hs4XWE*p4-{I@nLL0V>Ca|5EwsBN-WA z3$cn(2s13{D-r%Hk^Zv^X8t^rKj+lOXu<)k`o#umk(?=3{ka__hBqCk)#ZBvuA__Z z(dGDK)Ua}J#lWkF0oKn0jF1=OC>QR8-x|$Vra(Wo*T`*S5u1+?d5>nbngX;AaT5ks@#2)N6yXgj3rs&41fpXK_EzxCW4Wh{;N$H_ z-j)$4hpap|Jzx>7kBO^KrD=2Ud+3ykrC#@%42S2Nb0}y?IP@li?#-cuBVHY6daYy{ z#ztk{lRJlxe;=#X#|5^6@=JAidHsAY>H33Fjmy4isx7D_tO^EI*u%fB8?^tL>vJL^ zAHllkJX{5lf+ZCy=5G}O6<>2JntC6)*N>@GMS@g{-mLk2|{m)wqGZ*@3dE06=l3K${*xTUvwRuz!Gi z3J%qok=kt?8NSvNCbGPqPNBtUOX%Uq+`YGjq8{H%p^isq%)B8lPY;x)y;(~frKXVH zyzWTZ%9*^Vz@3p1luI6PKqk7H+E-0Z!xhzOBPXVFCLpEf8XB8kjy23s{@g$O5ul7Uk$ z;Afug@hm~^_kWf+ZFN*aO0Lxa3}>jxw2;<8v>0{Gi}jbik9(i!OG*wsc01pp0C!B@ z_vJy!v8`5aZML9L6#N#%iR$;sh?Y`ronHqsEO5P-?et|;M|ZxwlpQN@G~)yNb0W7Y zkui}F5T3ubQY0uufcV)XqpnMOl^SR+(yybr8yQx`!)IT9F_aDa_%lq(!Y}T_dqCf4 z2A|BGPzycQjOCz^Jh)FQ&`1|7Y$Et+`30_tA)bQbYDW#jmmnuZkM7_Q+8=Os?qrL% zGb=?S+OtLzKxNKuR4C~(**(`6_Y-d0$6YfYln6b1fo zy>Y82s1|!XHXS);U{~aYtlze!zO=8v9`>!(-yQeCL(IhAKNd+|e>S1^)q_q+B&VHK zG<|QF9HJDTA9nRF0p%Z5+k1@a~NH#ieT24n8JJXZ5;EL&dLSyy8}Hy zi9Voa{uhLWd#A&1$4DnC$Uqwumg1v{?4e9-rO{M&P-1_|!i@l9JUes3bkhvj)iBN9 zJ}cLGHM8Hr*d8Srqj#&lL|W`n8aH^q(| z3=5hPMNv2D;XFjzFe8E@i{0NS;;)NJ6xtsoyaDiB&M>sh1{CBy;rYGwPzX91-+x;& zDLBlU+L}7}S*}mXdlMGU9cAEj{FV#5g4#|guoq%hlt!Q49yhu@F)HB*XRs1I6>&48 zwi>Nk8tNzdU1yWOp32jNyEDkkuhh3b^L|OkZ(rY+H}Ut6HM77LSam&jRPBm>>3A#@ zKlw1vU=|=}kghP^V(*FNd2z&tgFSv*s)};5SNA-)9#Ej* zuto$j?b{T6%u@;M%yeMwou?E_ByH=V%ruZM{regX9>&J07S(twA*LGc_i48KwH#7j zfs@Ii1yT0Y)b*VW{*i8!zMrA>cgG-7yPm9WmNijGoA)_rP@9~ldQ2iS*|I=mq${|u z>e8nf_nxfuM>@ed!{*Avir3J`B^gsUi%Q$~`VK#X9c^})&}cgmJB5FT9%hU-Go4iz zdug9P>gV|;_o`%J2yFk ze&vhjOu$hpTO~aCta@U{$&;emIT26+WgM)gYPFNb8Y9F#}sr{&N%0$`&O=?UsRMTjQ;| zd=T`Fqt|xLV7z`rJj2ouy+KeA^IXvJ{jSJZ;f`6m9Y*3AsixQ>m6|&OGdDJNHBmnTqMAA7W3ZBoGtcynjh zR^B|__3`gB|J(T>ZF0Blzs3oWWgDj5B$U z>C0lW6_OuL$C=7WojJ}WB=%CXdCDVMhtwKHC?oY```tXOKmL28YSuzd(J-a6XKZ0- zcwTgyGf0t6APM&^Uf2sod*;%=mx2sc0W~6vQD@rjISe^!$?45kZRjv?h0@;@4Q&Mo zJlbeyQk&ds7~TYYY(I7SY@g*@NXu&*oX@CoVltPH1u`y#m4iYVyM9cl6+>S4z9jGH zg)r{~i|4NGX-71vM%ALzfnF<5hzIo}J<-T+@yUj$WwzB8*DJPyuQa(UstzJNk(O@9OpMs!#;%L2c6R5S49ARl?ss0ixe@~Q@(WI5~$8Zv2gR_dw*Te`0e z#fQDW;8j}uKtJsYt;O1STOz&<+5!&z`0Jf86GQ2h7Y2CLo?DAs z1#vadJTvqZh`yQ)=2JD8Y&dORmTR<1KH0PXEtisR(Lup_)hRg@acBD1P9QqO^6tge z4cfYmv*t^;O4SlUQr|ZhtAs#|BWSi=$-)G0L|WlAaO!v33riM~f z5EGK^$U8LXxB z0s;4kXW&rn`Q5T757q|v?Ot*n*9*pmH(_brIOjkEg8Wj*SjH4O8j^=!Pz@z7#><3SDXSME+d(eESa!P|5jas3)?=$#&=`CHyU+S zgHlFXts{ZI&vcKDB)WwFr|-<74-}c}4)sV zSk!Lg{;7HWd^o)^11^PL|6c3FEG2Q471`9UFcz<-kwsgL&fbsaG}OAxrV95tJDU8i z{;G?7qlzk?%7~@y`e|{Gtr}e*HUF2pbuYx-xOGl{s(qXpd3Fe-ls=%1{@4{4gDQ$DZuO;BQZ~p<*AGI{?rb!_O{G zsDZuXIl9S6c*!Pk%?>Chh8!Q^YuGd7jZZ}a<4F$}ul!84XeUddS!yCWF`*+!TV^?s z!aNi2lp!u1+^H}Y0 zcichP<`uwhiZ=lBVk*OtRA9isVS;WblQ(_sW?j8`*loH=S@7i zh9azq=p^fJ2A5ppT7yF~6fL0&an-z+L4=f9sUi;EQd9K2;d-)Ai-P@wkWJ&)jeJn_ zb6Pgy zdMe31yM{!cR38gSyBX{^>YKQx1m#gP1>;u1yPSSH6BBVdko)g2sx}IwhUmgsJ{n*n z%P6V))V(P4J-1E{nl1P z*eWDUJu%%yuBKkgCG$I!`pN>SJdSmcw!wPYcQ4-_=;KKbHc^u{xP+%sT9ZS@MIBn^ zW*1|%s{zTK5HBG2=yKzW!NuVu5L5-{>&xtkXCqpej zzAjHz`*q$%iq=pO!N_@|uU%`Csq2Y8Z?|(G_R`D~x4w&u)M81m=nBDZq)2%0Pg}HgVDv}k?s6tQ zk@ydSG~n?7jI!Ac6p`tEwX&@$+ZF8vBV@t4@7t&G@!7%mD^6BX|4|1jvZ}uXRb9GZ z9mW!|_xkpFxU6|@D=*BO{Lt7f>ctzn;FRB*k{=&Hh9|hl)9`E<*ME_d{wBbcfxW#P z7DxX2WIi{6qU>)YxJcT)wox>H8L|c{v1wNuv(dfte2E}7aOO(Q1=UQ471uk|1l{6X! zlmNJl)x$rVMwB6EFAcz5kb_91!MjFKriR;)pNRAo-g&ae8#JLky(?j2% z^sZ%fd?S3EZ&HbV3T0Uk-mNwjwA`h=Ta(?HNKWcEW13iXxVpyOs*qqIgHjlavDlPN zhU z;WxSW>G*|!@9|tj9X2J+*Lm3P3!?iie$h_Q4{OG^OD?BAoP6P_rrFJkH9-Ye7FIs> zH@Nb=Ax?IRoFWqxO~ta97dHTWqSgmM4>|?WG11RXxaK9gZk4fkEH)fG2VjP2->nq8 zG#P@A@^ohH#0n&+mQp(waouomq(PTQPwvW0dob3BfT(k0vBSI9<2X2G1o`E*f-k8O zX8tlr4wL_I7NM1IFG+lQmQ`C&eNMF6osh@5@Z5rPOxcVH$sCv$tL}eb^yW{nv;c#o zvA1%>_UG}PKX}A*2pBIkEI^y|5FcpA;w3mN>DUt^WysXhQBBWJdUi3nfBDwEetkW? zumFKJF)tFWxe;Y`Z$i1~$1N`ZSIKlV|9)_#fmM^%L;0m6 z(9=2VZ$#(yQO2pMk_!Q1<`#o*%QaS#;(GX{?T$3a;XZ>p2|9=KXl%{F0Y#~lG}vm> zPJ5}t@}c3&eILH$a0UDdki%YxE<}UyfM?*lg1qdq$V>5zz_^b*{bS8*+Db{5KL|m$ z1KUiSfK_>XXZqoTReq?+ZaW;Sm>(i2NXys`&ktrRM7=Elki5e0+ph_OPN9z>d}#@& z@BW)cAu);flU$jvH4P~f?xc}6*A0vHc8Xpe?P7S;iG1uC5 z5gf`tier1rxr|DqCQMGEVAV(uIZ71an=M|kA(mt3g{H-|p@U^@;gLT0Yv9Pm;jmOu z5vR6BY3L-SG$X9uzWhqY#p}`Zg0;naq6~@(z8RANWT(OCYk7HPW;68DhUFrKKLk-r zN1*O=YD2HLC@3fLKP=jGs(>G?nWdN(b0i#C`aQ4{nDMDSw(8Q~lYU{)*w*fs>4$jP zAhBF)94rcBlxy7lDUP3^Jx zYg)#eqjg%2gvfSPGN}XC)}hj;L0`U>RsE>k=nLtUkfB`hxyBC{yORd^n{gH%F6qPL zw!jJ~L;qucyryq^-|I!>ox-WopFN$6V{&{OQuNE#&vnN1kshxYW0thSheeXn>6TRp z)LglV^V8D!;s2mkKlH_h<%a&iW + ## Contributing Guide diff --git a/docs/tutorials/demo.ipynb b/docs/tutorials/demo.ipynb index 5869d7c9..260d5737 100644 --- a/docs/tutorials/demo.ipynb +++ b/docs/tutorials/demo.ipynb @@ -42,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "id": "10f6c9ed-fe58-4e03-b29b-c6c447061f84", "metadata": {}, "outputs": [ @@ -52,7 +52,7 @@ "'0.3.0'" ] }, - "execution_count": 5, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -64,12 +64,13 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "id": "2acb1926-3442-446a-8a35-fcbba8868d4d", "metadata": {}, "outputs": [], "source": [ - "auth = earthdata.Auth()" + "from earthdata import Auth, Store, DataCollections, DataGranules\n", + "auth = Auth()" ] }, { @@ -98,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "id": "caab3b4b-80cc-4790-9417-1dd12503aa55", "metadata": {}, "outputs": [ @@ -120,7 +121,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "id": "a0a5f73d-b4b9-4dad-ac72-12c7ae6278d1", "metadata": {}, "outputs": [ @@ -151,60 +152,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "8d5bf4c9-571b-4c93-af94-e66bd51cb584", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collections found: 338\n" - ] - }, - { - "data": { - "text/plain": [ - "[{\n", - " \"meta\": {\n", - " \"concept-id\": \"C1908348134-LPDAAC_ECS\",\n", - " \"granule-count\": 0,\n", - " \"provider-id\": \"LPDAAC_ECS\"\n", - " },\n", - " \"umm\": {\n", - " \"ShortName\": \"GEDI02_A\",\n", - " \"Version\": \"002\"\n", - " }\n", - " },\n", - " {\n", - " \"meta\": {\n", - " \"concept-id\": \"C1431413941-NSIDC_ECS\",\n", - " \"granule-count\": 61,\n", - " \"provider-id\": \"NSIDC_ECS\"\n", - " },\n", - " \"umm\": {\n", - " \"ShortName\": \"RDEFT4\",\n", - " \"Version\": \"1\"\n", - " }\n", - " },\n", - " {\n", - " \"meta\": {\n", - " \"concept-id\": \"C1299783579-LPDAAC_ECS\",\n", - " \"granule-count\": 0,\n", - " \"provider-id\": \"LPDAAC_ECS\"\n", - " },\n", - " \"umm\": {\n", - " \"ShortName\": \"AST14DEM\",\n", - " \"Version\": \"003\"\n", - " }\n", - " }]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# The first step is to create a DataCollections query \n", "Query = DataCollections()\n", @@ -232,21 +183,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "8cb5154c-f131-44ad-a68f-cf0fa21ce18f", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'GEDI02_A'" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "collections[0][\"umm\"][\"ShortName\"]" ] @@ -275,37 +215,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "48cdcd74-dfe3-4b83-93f4-7378a0d981df", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collections found: 502\n" - ] - }, - { - "data": { - "text/plain": [ - "{\n", - " \"meta\": {\n", - " \"concept-id\": \"C1674798938-PODAAC\",\n", - " \"granule-count\": 49150,\n", - " \"provider-id\": \"PODAAC\"\n", - " },\n", - " \"umm\": {\n", - " \"ShortName\": \"ASCATB-L2-25km\"\n", - " }\n", - "}" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# We can now search for collections using a pythonic API client for CMR.\n", "Query = DataCollections().daac(\"PODAAC\")\n", @@ -318,37 +231,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "63792353-ab3e-4f0b-963d-7750e4b89113", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Collections found: 322\n" - ] - }, - { - "data": { - "text/plain": [ - "{\n", - " \"meta\": {\n", - " \"concept-id\": \"C1940473819-POCLOUD\",\n", - " \"granule-count\": 2376387,\n", - " \"provider-id\": \"POCLOUD\"\n", - " },\n", - " \"umm\": {\n", - " \"ShortName\": \"MODIS_A-JPL-L2P-v2019.0\"\n", - " }\n", - "}" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# What if we want cloud collections\n", "Query = DataCollections().daac(\"PODAAC\").cloud_hosted(True)\n", @@ -361,30 +247,10 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "c4c5a34a-e808-4cc9-b34d-353d091a8242", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['C1940473819-POCLOUD',\n", - " 'C2075141559-POCLOUD',\n", - " 'C2075141638-POCLOUD',\n", - " 'C1940475563-POCLOUD',\n", - " 'C2036878688-POCLOUD',\n", - " 'C1996880725-POCLOUD',\n", - " 'C1996880450-POCLOUD',\n", - " 'C2036877595-POCLOUD',\n", - " 'C2075141605-POCLOUD',\n", - " 'C1996881146-POCLOUD']" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Printing the concept-id for the first 10 collections\n", "[collection.concept_id() for collection in collections]" @@ -408,45 +274,10 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "9364d737-5a79-4089-853f-76d2ad1c85a7", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", - " Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -127.0482205607256, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}\n", - " Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-10-14T00:18:55.637Z', 'EndingDateTime': '2018-10-14T00:19:19.913Z'}}\n", - " Size(MB): 3.7921009064\n", - " Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.10.14/ATL06_20181014001049_02350102_005_01.h5'],\n", - " Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", - " Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 50.741590031724314, 'StartLatitude': 59.5, 'StartDirection': 'D', 'EndLatitude': 27.0, 'EndDirection': 'D'}}}\n", - " Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-11-09T11:28:36.538Z', 'EndingDateTime': '2018-11-09T11:29:14.738Z'}}\n", - " Size(MB): 5.0780105591\n", - " Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.09/ATL06_20181109112837_06390106_005_01.h5'],\n", - " Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", - " Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -126.78857810482624, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}\n", - " Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-11-11T22:55:08.251Z', 'EndingDateTime': '2018-11-11T22:55:37.758Z'}}\n", - " Size(MB): 4.1429281235\n", - " Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.11/ATL06_20181111224708_06770102_005_01.h5'],\n", - " Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", - " Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -127.56718592349382, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}\n", - " Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-11-15T22:46:36.934Z', 'EndingDateTime': '2018-11-15T22:47:15.558Z'}}\n", - " Size(MB): 11.893447876\n", - " Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.15/ATL06_20181115223845_07380102_005_01.h5'],\n", - " Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", - " Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 51.00122639850689, 'StartLatitude': 59.5, 'StartDirection': 'D', 'EndLatitude': 27.0, 'EndDirection': 'D'}}}\n", - " Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-12-08T10:04:25.906Z', 'EndingDateTime': '2018-12-08T10:05:02.142Z'}}\n", - " Size(MB): 3.580540657\n", - " Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.12.08/ATL06_20181208100423_10810106_005_01.h5']]" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# We build our query\n", "from pprint import pprint\n", @@ -469,266 +300,10 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "66cd5f5c-a854-4a72-a831-33b8bd7ce9d2", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - "
\n", - "
\n", - "
\n", - "
\n", - "
\n", - "

Data: https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.10.14/ATL06_20181014001049_02350102_005_01.h5

\n", - "

Size: 3.79 MB

\n", - "

Spatial: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -127.0482205607256, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}

\n", - "
\n", - "
\n", - " \"Data\"Data\n", - "
\n", - "
\n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - "Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", - "Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -127.0482205607256, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}\n", - "Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-10-14T00:18:55.637Z', 'EndingDateTime': '2018-10-14T00:19:19.913Z'}}\n", - "Size(MB): 3.7921009064\n", - "Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.10.14/ATL06_20181014001049_02350102_005_01.h5']" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - "
\n", - "
\n", - "
\n", - "
\n", - "
\n", - "

Data: https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.09/ATL06_20181109112837_06390106_005_01.h5

\n", - "

Size: 5.08 MB

\n", - "

Spatial: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 50.741590031724314, 'StartLatitude': 59.5, 'StartDirection': 'D', 'EndLatitude': 27.0, 'EndDirection': 'D'}}}

\n", - "
\n", - "
\n", - " \"Data\"Data\n", - "
\n", - "
\n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - "Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", - "Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 50.741590031724314, 'StartLatitude': 59.5, 'StartDirection': 'D', 'EndLatitude': 27.0, 'EndDirection': 'D'}}}\n", - "Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-11-09T11:28:36.538Z', 'EndingDateTime': '2018-11-09T11:29:14.738Z'}}\n", - "Size(MB): 5.0780105591\n", - "Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.09/ATL06_20181109112837_06390106_005_01.h5']" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - "
\n", - "
\n", - "
\n", - "
\n", - "
\n", - "

Data: https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.11/ATL06_20181111224708_06770102_005_01.h5

\n", - "

Size: 4.14 MB

\n", - "

Spatial: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -126.78857810482624, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}

\n", - "
\n", - "
\n", - " \"Data\"Data\n", - "
\n", - "
\n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - "Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", - "Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -126.78857810482624, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}\n", - "Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-11-11T22:55:08.251Z', 'EndingDateTime': '2018-11-11T22:55:37.758Z'}}\n", - "Size(MB): 4.1429281235\n", - "Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.11/ATL06_20181111224708_06770102_005_01.h5']" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - "
\n", - "
\n", - "
\n", - "
\n", - "
\n", - "

Data: https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.15/ATL06_20181115223845_07380102_005_01.h5

\n", - "

Size: 11.89 MB

\n", - "

Spatial: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -127.56718592349382, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}

\n", - "
\n", - "
\n", - " \"Data\"Data\n", - "
\n", - "
\n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - "Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", - "Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': -127.56718592349382, 'StartLatitude': 27.0, 'StartDirection': 'A', 'EndLatitude': 59.5, 'EndDirection': 'A'}}}\n", - "Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-11-15T22:46:36.934Z', 'EndingDateTime': '2018-11-15T22:47:15.558Z'}}\n", - "Size(MB): 11.893447876\n", - "Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.11.15/ATL06_20181115223845_07380102_005_01.h5']" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "
\n", - " \n", - "
\n", - "
\n", - "
\n", - "
\n", - "
\n", - "

Data: https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.12.08/ATL06_20181208100423_10810106_005_01.h5

\n", - "

Size: 3.58 MB

\n", - "

Spatial: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 51.00122639850689, 'StartLatitude': 59.5, 'StartDirection': 'D', 'EndLatitude': 27.0, 'EndDirection': 'D'}}}

\n", - "
\n", - "
\n", - " \"Data\"Data\n", - "
\n", - "
\n", - "
\n", - "
\n", - " " - ], - "text/plain": [ - "Collection: {'EntryTitle': 'ATLAS/ICESat-2 L3A Land Ice Height V005'}\n", - "Spatial coverage: {'HorizontalSpatialDomain': {'Orbit': {'AscendingCrossing': 51.00122639850689, 'StartLatitude': 59.5, 'StartDirection': 'D', 'EndLatitude': 27.0, 'EndDirection': 'D'}}}\n", - "Temporal coverage: {'RangeDateTime': {'BeginningDateTime': '2018-12-08T10:04:25.906Z', 'EndingDateTime': '2018-12-08T10:05:02.142Z'}}\n", - "Size(MB): 3.580540657\n", - "Data: ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2018.12.08/ATL06_20181208100423_10810106_005_01.h5']" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "[None, None, None, None, None]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# printing 2 granules using display\n", "[display(granule) for granule in granules]" @@ -747,18 +322,10 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "00aa39ec-e2fb-49d1-bc54-8d8a2f0655aa", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Granules found: 4\n" - ] - } - ], + "outputs": [], "source": [ "Query = DataGranules().short_name(\"ATL06\").temporal(\"2020-03-01\", \"2020-03-30\").bounding_box(-134.7,58.9,-133.9,59.2).version(\"005\")\n", "# Always inspects the hits before retrieven the granule metadata, just because it's very verbose.\n", @@ -767,32 +334,14 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "8c493585-0d48-41bb-8815-6c83ad20ae80", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[{'links': ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2020.03.06/ATL06_20200306122320_10810606_005_01.h5'],\n", - " 'size (MB):': 2.7875404358},\n", - " {'links': ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2020.03.08/ATL06_20200308234154_11190602_005_01.h5'],\n", - " 'size (MB):': 4.3645324707},\n", - " {'links': ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2020.03.10/ATL06_20200310121504_11420606_005_01.h5'],\n", - " 'size (MB):': 2.6717844009},\n", - " {'links': ['https://n5eil01u.ecs.nsidc.org/DP7/ATLAS/ATL06.005/2020.03.12/ATL06_20200312233336_11800602_005_01.h5'],\n", - " 'size (MB):': 14.1388778687}]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Now we can print some info about these granules using the built-in methods\n", "granules = Query.get(5)\n", - "data_links = [{'links': g.data_links(), 'size (MB):': g.size()} for g in granules]\n", + "data_links = [{'links': g.data_links(access=\"on_prem\"), 'size (MB):': g.size()} for g in granules]\n", "data_links" ] }, @@ -814,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "b796fa53-60ac-4197-922d-1f6ee5dec00b", "metadata": {}, "outputs": [], @@ -832,28 +381,10 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "910e4b90-f0e0-42e5-a4e2-d5444089161f", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Granule hits: 2509\n" - ] - }, - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "Query = DataGranules().concept_id(\"C1972955240-PODAAC\").bounding_box(-134.7,54.9,-100.9,69.2)\n", "print(f\"Granule hits: {Query.hits()}\")\n", @@ -878,23 +409,7 @@ "execution_count": null, "id": "434466a3-602b-4dff-a260-f7db6901514a", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - " Getting 4 granules, approx download size: 0.14 GB\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "QUEUEING TASKS | : 100%|█████████████████████████████████████████████████████████████████████████████████| 8/8 [00:00<00:00, 267.87it/s]\n", - "PROCESSING TASKS | : 88%|██████████████████████████████████████████████████████████████████████ | 7/8 [00:27<00:03, 3.97s/it]" - ] - } - ], + "outputs": [], "source": [ "%%time\n", "files = store.get(granules[0:4], \"./data/C1972955240-PODAAC/\")" @@ -1090,7 +605,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.7" + "version": "3.9.12" } }, "nbformat": 4, diff --git a/docs/user-reference/collections/collections-query.md b/docs/user-reference/collections/collections-query.md index c2493f7a..7d6cd42b 100644 --- a/docs/user-reference/collections/collections-query.md +++ b/docs/user-reference/collections/collections-query.md @@ -1,4 +1,6 @@ -# Documentation for `Collections` +# Documentation for `DataCollections` + +### DataCollections is the class `earthdata` uses to query CMR at the **dataset** level. ::: earthdata.search.DataCollections selection: diff --git a/docs/user-reference/collections/collections.md b/docs/user-reference/collections/collections.md index e63a2728..0dbbf456 100644 --- a/docs/user-reference/collections/collections.md +++ b/docs/user-reference/collections/collections.md @@ -1,3 +1,9 @@ -# `Collections` +# Documentation for `Collection Results` +::: earthdata.search.DataCollection + selection: + inherited_members: true + rendering: + show_root_heading: true + show_source: false diff --git a/docs/user-reference/glossary/cloud-glossary.md b/docs/user-reference/glossary/cloud-glossary.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/user-reference/glossary/nasa-glossary.md b/docs/user-reference/glossary/nasa-glossary.md new file mode 100644 index 00000000..9df12b9b --- /dev/null +++ b/docs/user-reference/glossary/nasa-glossary.md @@ -0,0 +1,3 @@ +# NASA EARTHDATA GLOSSARY + +[GLOSSARY](https://earthdata.nasa.gov/learn/user-resources/glossary) diff --git a/docs/user-reference/granules/granules-query.md b/docs/user-reference/granules/granules-query.md index 9762bc10..a7bd943d 100644 --- a/docs/user-reference/granules/granules-query.md +++ b/docs/user-reference/granules/granules-query.md @@ -1,5 +1,8 @@ # Documentation for `Granules` + +### DataGranules is the class `earthdata` uses to query CMR at the **granule** level. + ::: earthdata.search.DataGranules selection: inherited_members: true diff --git a/docs/user-reference/granules/granules.md b/docs/user-reference/granules/granules.md index 96fffda6..832f3175 100644 --- a/docs/user-reference/granules/granules.md +++ b/docs/user-reference/granules/granules.md @@ -1,3 +1,11 @@ -# `Granules` +# Documentation for `Granule Results` + +::: earthdata.search.DataGranule + selection: + inherited_members: true + rendering: + show_root_heading: true + show_source: false + diff --git a/mkdocs.yml b/mkdocs.yml index 085f8f64..8eb3b974 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,22 +1,24 @@ site_name: earthdata -site_description: Client library for NASA APIs -site_url: https://github.com/betolink/earthdata +site_description: Client library for NASA Earthdata APIs +site_url: https://github.com/nsidc/earthdata theme: - name: 'material' - palette: - - scheme: default - primary: teal - toggle: - icon: material/toggle-switch-off-outline - name: Switch to dark mode - - scheme: slate - toggle: - icon: material/toggle-switch - name: Switch to light mode + name: 'material' + logo: earth.png + favicon: earth.png + palette: + - scheme: default + primary: teal + toggle: + icon: material/toggle-switch-off-outline + name: Switch to dark mode + - scheme: slate + toggle: + icon: material/toggle-switch + name: Switch to light mode repo_name: betolink/earthdata -repo_url: https://github.com/betolink/earthdata +repo_url: https://github.com/nsidc/earthdata edit_uri: '' plugins: @@ -26,17 +28,21 @@ plugins: execute: False nav: - - Overview: 'index.md' - - Tutorials: - - 'Basic usage': 'tutorials/demo.ipynb' - - 'Accessing restricted datasets': 'tutorials/restricted-datasets.ipynb' - - 'Accessing on-prem datasets': 'tutorials/onprem.md' - - 'Accessing cloud-based datasets': 'tutorials/cloud.md' - - User Reference: - - Collections: + - OVERVIEW: 'index.md' + - TUTORIALS: + - 'Basic usage': 'tutorials/demo.ipynb' + - HOW-TO: + - 'Search and access restricted datasets': 'tutorials/restricted-datasets.ipynb' + - 'Search and access on-prem datasets': 'tutorials/onprem.md' + - 'Search and cloud-based datasets': 'tutorials/cloud.md' + - USER REFERENCE: + - Glossary: + - 'NASA Glossary': 'user-reference/glossary/nasa-glossary.md' + - 'Cloud Computing Terminology': 'user-reference/glossary/cloud-glossary.md' + - Collections API: - 'Collection Queries': 'user-reference/collections/collections-query.md' - 'Collection Results': 'user-reference/collections/collections.md' - - Granules: + - Granules API: - 'Granule Queries': 'user-reference/granules/granules-query.md' - 'Granule Results': 'user-reference/granules/granules.md' @@ -46,4 +52,3 @@ markdown_extensions: - pymdownx.inlinehilite - pymdownx.snippets - pymdownx.superfences - diff --git a/poetry.lock b/poetry.lock index 4327e785..49f7de63 100644 --- a/poetry.lock +++ b/poetry.lock @@ -627,6 +627,26 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "ipywidgets" +version = "7.7.0" +description = "IPython HTML widgets for Jupyter" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ipykernel = ">=4.5.1" +ipython = {version = ">=4.0.0", markers = "python_version >= \"3.3\""} +ipython-genutils = ">=0.2.0,<0.3.0" +jupyterlab-widgets = {version = ">=1.0.0", markers = "python_version >= \"3.6\""} +nbformat = ">=4.2.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=3.6.0,<3.7.0" + +[package.extras] +test = ["pytest (>=3.6.0)", "pytest-cov", "mock"] + [[package]] name = "isort" version = "5.10.1" @@ -823,6 +843,14 @@ requests = "*" openapi = ["openapi-core (>=0.14.2)", "ruamel.yaml"] test = ["openapi-core (>=0.14.2)", "ruamel.yaml", "codecov", "ipykernel", "jupyter-server", "openapi-spec-validator (<0.5)", "pytest-console-scripts", "pytest-cov", "pytest (>=5.3.2)", "strict-rfc3339", "wheel"] +[[package]] +name = "jupyterlab-widgets" +version = "1.1.0" +description = "A JupyterLab extension." +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "jupytext" version = "1.13.8" @@ -1985,6 +2013,17 @@ docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] +[[package]] +name = "widgetsnbextension" +version = "3.6.0" +description = "IPython HTML widgets for Jupyter" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +notebook = ">=4.4.1" + [[package]] name = "wrapt" version = "1.14.0" @@ -2028,7 +2067,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = ">=3.8,<4.0" -content-hash = "05e750d567a24f619eab893d4ca282ef2c2c7e949ec02e9058090a33183dedc5" +content-hash = "e1fc69d2ef369392141260f34a12a93c51bbec1106e55e405128fca9070d593a" [metadata.files] aiobotocore = [ @@ -2498,6 +2537,10 @@ 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"}, ] +ipywidgets = [ + {file = "ipywidgets-7.7.0-py2.py3-none-any.whl", hash = "sha256:e58ff58bc94d481e91ecb6e13a5cb96a87b6b8ade135e055603d0ca24593df38"}, + {file = "ipywidgets-7.7.0.tar.gz", hash = "sha256:ab4a5596855a88b83761921c768707d65e5847068139bc1729ddfe834703542a"}, +] isort = [ {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, @@ -2546,6 +2589,10 @@ jupyterlab-server = [ {file = "jupyterlab_server-2.13.0-py3-none-any.whl", hash = "sha256:fc9e86d4e7c4b139de59b0a96b53071e670bee1ed106a3389daecd68f1221aeb"}, {file = "jupyterlab_server-2.13.0.tar.gz", hash = "sha256:2040298a133458aa22f287a877d6bb91ff973f6298d562264f9f7b75e92a5ace"}, ] +jupyterlab-widgets = [ + {file = "jupyterlab_widgets-1.1.0-py3-none-any.whl", hash = "sha256:c2a9bd3789f120f64d73268c066ed3b000c56bc1dda217be5cdc43e7b4ebad3f"}, + {file = "jupyterlab_widgets-1.1.0.tar.gz", hash = "sha256:d5f41bc1713795385f718d44dcba47e1e1473c6289f28a95aa6b2c0782ee372a"}, +] jupytext = [ {file = "jupytext-1.13.8-py3-none-any.whl", hash = "sha256:625d2d2012763cc87d3f0dd60383516cec442c11894f53ad0c5ee5aa2a52caa2"}, {file = "jupytext-1.13.8.tar.gz", hash = "sha256:60148537de5aa08bb9cbe8797500a49360b7a8eb6667736ae5b80e3ec7ba084d"}, @@ -3241,6 +3288,10 @@ websocket-client = [ {file = "websocket-client-1.3.2.tar.gz", hash = "sha256:50b21db0058f7a953d67cc0445be4b948d7fc196ecbeb8083d68d94628e4abf6"}, {file = "websocket_client-1.3.2-py3-none-any.whl", hash = "sha256:722b171be00f2b90e1d4fb2f2b53146a536ca38db1da8ff49c972a4e1365d0ef"}, ] +widgetsnbextension = [ + {file = "widgetsnbextension-3.6.0-py2.py3-none-any.whl", hash = "sha256:4fd321cad39fdcf8a8e248a657202d42917ada8e8ed5dd3f60f073e0d54ceabd"}, + {file = "widgetsnbextension-3.6.0.tar.gz", hash = "sha256:e84a7a9fcb9baf3d57106e184a7389a8f8eb935bf741a5eb9d60aa18cc029a80"}, +] wrapt = [ {file = "wrapt-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:5a9a1889cc01ed2ed5f34574c90745fab1dd06ec2eee663e8ebeefe363e8efd7"}, {file = "wrapt-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:9a3ff5fb015f6feb78340143584d9f8a0b91b6293d6b5cf4295b3e95d179b88c"}, diff --git a/pyproject.toml b/pyproject.toml index ca585487..6f93682a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,8 @@ pygments = "=2.11.1" responses = ">=0.14" types-requests = ">=0.1" types-setuptools = ">=0.1" +ipywidgets = "^7.7.0" +widgetsnbextension = "^3.6.0" [build-system] requires = ["poetry>=0.12"] From bc5e6f6b9669f73db98f97c5c1c2cbbe938f67fe Mon Sep 17 00:00:00 2001 From: "betolink:w" Date: Tue, 26 Apr 2022 09:27:42 -0600 Subject: [PATCH 3/5] removed ipywidgets from binder to se if it helps with rust? --- binder/environment.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/binder/environment.yml b/binder/environment.yml index f6211e28..4f737670 100644 --- a/binder/environment.yml +++ b/binder/environment.yml @@ -17,7 +17,6 @@ dependencies: - earthdata # documentation - jupyterlab>=3 -- ipywidgets - mkdocs>=1.2 - mkdocs-material>=7.1, <9.0 - markdown-include>=0.6 From c136ab4986e028cde994720e0f073346170f523f Mon Sep 17 00:00:00 2001 From: "betolink:w" Date: Tue, 26 Apr 2022 10:02:38 -0600 Subject: [PATCH 4/5] update docs --- docs/index.md | 6 ++++++ docs/tutorials/demo.ipynb | 1 + mkdocs.yml | 3 +++ 3 files changed, 10 insertions(+) diff --git a/docs/index.md b/docs/index.md index 1c946b90..f67cb915 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,3 +1,9 @@ +--- +hide: + - toc +--- + + # earthdata 🌍

diff --git a/docs/tutorials/demo.ipynb b/docs/tutorials/demo.ipynb index 260d5737..f78998f3 100644 --- a/docs/tutorials/demo.ipynb +++ b/docs/tutorials/demo.ipynb @@ -7,6 +7,7 @@ "tags": [] }, "source": [ + "\n", "## Overview\n", "\n", "\n", diff --git a/mkdocs.yml b/mkdocs.yml index 8eb3b974..0434d9b9 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -47,6 +47,9 @@ nav: - 'Granule Results': 'user-reference/granules/granules.md' markdown_extensions: + - meta + - toc: + toc_depth: 1 - pymdownx.highlight: anchor_linenums: true - pymdownx.inlinehilite From 0186b194b3df78231c80feab653586eb5331fd04 Mon Sep 17 00:00:00 2001 From: "betolink:w" Date: Tue, 26 Apr 2022 11:57:32 -0600 Subject: [PATCH 5/5] update poetry lock --- poetry.lock | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 37bfec8f..49f7de63 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1464,7 +1464,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] - name = "pycparser" version = "2.21" description = "C parser in Python" @@ -1490,7 +1489,7 @@ python-versions = ">=3.5" [[package]] name = "pymdown-extensions" -version = "9.3" +version = "9.2" description = "Extension pack for Python Markdown." category = "dev" optional = false @@ -2067,7 +2066,6 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" - python-versions = ">=3.8,<4.0" content-hash = "e1fc69d2ef369392141260f34a12a93c51bbec1106e55e405128fca9070d593a" @@ -2943,8 +2941,8 @@ pygments = [ {file = "Pygments-2.11.1.tar.gz", hash = "sha256:59b895e326f0fb0d733fd28c6839bd18ad0687ba20efc26d4277fd1d30b971f4"}, ] pymdown-extensions = [ - {file = "pymdown-extensions-9.3.tar.gz", hash = "sha256:a80553b243d3ed2d6c27723bcd64ca9887e560e6f4808baa96f36e93061eaf90"}, - {file = "pymdown_extensions-9.3-py3-none-any.whl", hash = "sha256:b37461a181c1c8103cfe1660081726a0361a8294cbfda88e5b02cefe976f0546"}, + {file = "pymdown-extensions-9.2.tar.gz", hash = "sha256:ed8f69a18bc158f00cbf03abc536b88b6e541b7e699156501e767c48f81d8850"}, + {file = "pymdown_extensions-9.2-py3-none-any.whl", hash = "sha256:f2fa7d9317c672a419868c893c20a28fb7ed7fc60d4ec4774c35e01398ab330c"}, ] pyparsing = [ {file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"},