From 8db837e9309dbe560022c75a8094f2e2c2e6a4bd Mon Sep 17 00:00:00 2001 From: Abdel Jaidi Date: Tue, 19 Oct 2021 15:53:28 +0100 Subject: [PATCH 1/5] Refactoring pagination config in list objects --- awswrangler/s3/_list.py | 13 +++++++++---- tests/test_s3.py | 18 +++++++++++------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/awswrangler/s3/_list.py b/awswrangler/s3/_list.py index 1232c67ef..a0e0f1e76 100644 --- a/awswrangler/s3/_list.py +++ b/awswrangler/s3/_list.py @@ -87,14 +87,19 @@ def _list_objects( # pylint: disable=too-many-branches _suffix: Union[List[str], None] = [suffix] if isinstance(suffix, str) else suffix _ignore_suffix: Union[List[str], None] = [ignore_suffix] if isinstance(ignore_suffix, str) else ignore_suffix client_s3: boto3.client = _utils.client(service_name="s3", session=boto3_session) + default_pagination: Dict[str, int] = {"PageSize": 1000} + extra_kwargs: Dict[str, Any] = {"PaginationConfig": default_pagination} if s3_additional_kwargs: - extra_kwargs: Dict[str, Any] = _fs.get_botocore_valid_kwargs( + extra_kwargs = _fs.get_botocore_valid_kwargs( function_name="list_objects_v2", s3_additional_kwargs=s3_additional_kwargs ) - else: - extra_kwargs = {} + extra_kwargs["PaginationConfig"] = ( + s3_additional_kwargs["PaginationConfig"] + if "PaginationConfig" in s3_additional_kwargs + else default_pagination + ) paginator = client_s3.get_paginator("list_objects_v2") - args: Dict[str, Any] = {"Bucket": bucket, "Prefix": prefix, "PaginationConfig": {"PageSize": 1000}, **extra_kwargs} + args: Dict[str, Any] = {"Bucket": bucket, "Prefix": prefix, **extra_kwargs} if delimiter is not None: args["Delimiter"] = delimiter _logger.debug("args: %s", args) diff --git a/tests/test_s3.py b/tests/test_s3.py index 4db1acf2a..e5f82f190 100644 --- a/tests/test_s3.py +++ b/tests/test_s3.py @@ -323,15 +323,19 @@ def test_prefix_cleanup(): assert wr.s3._list._prefix_cleanup(glob.escape("foo[]boo")) == glob.escape("foo") -def test_prefix_list(path): +@pytest.mark.parametrize( + "s3_additional_kwargs", + [None, {"FetchOwner": True}, {"PaginationConfig": {"PageSize": 100}}], +) +def test_prefix_list(path, s3_additional_kwargs): df = pd.DataFrame({"c0": [0]}) prefixes = ["foo1boo", "foo2boo", "foo3boo", "foo10boo", "foo*boo", "abc1boo", "foo1abc"] paths = [path + p for p in prefixes] for p in paths: wr.s3.to_parquet(df=df, path=p) - assert len(wr.s3.list_objects(path + "*")) == 7 - assert len(wr.s3.list_objects(path + "foo*")) == 6 - assert len(wr.s3.list_objects(path + "*boo")) == 6 - assert len(wr.s3.list_objects(path + "foo?boo")) == 4 - assert len(wr.s3.list_objects(path + "foo*boo")) == 5 - assert len(wr.s3.list_objects(path + "foo[12]boo")) == 2 + assert len(wr.s3.list_objects(path + "*", s3_additional_kwargs=s3_additional_kwargs)) == 7 + assert len(wr.s3.list_objects(path + "foo*", s3_additional_kwargs=s3_additional_kwargs)) == 6 + assert len(wr.s3.list_objects(path + "*boo", s3_additional_kwargs=s3_additional_kwargs)) == 6 + assert len(wr.s3.list_objects(path + "foo?boo", s3_additional_kwargs=s3_additional_kwargs)) == 4 + assert len(wr.s3.list_objects(path + "foo*boo", s3_additional_kwargs=s3_additional_kwargs)) == 5 + assert len(wr.s3.list_objects(path + "foo[12]boo", s3_additional_kwargs=s3_additional_kwargs)) == 2 From f37b8d4cb9c6f38c32eff176ae5c049c9b485450 Mon Sep 17 00:00:00 2001 From: Abdel Jaidi Date: Wed, 3 Nov 2021 19:38:10 +0000 Subject: [PATCH 2/5] Introducing chunked param for pagination --- README.md | 2 + awswrangler/catalog/__init__.py | 7 +- awswrangler/catalog/_add.py | 83 ++ awswrangler/catalog/_create.py | 222 ++++- awswrangler/catalog/_definitions.py | 75 ++ awswrangler/catalog/_delete.py | 4 +- awswrangler/mysql.py | 13 +- awswrangler/s3/_copy.py | 4 +- awswrangler/s3/_list.py | 50 +- awswrangler/s3/_write_parquet.py | 2 +- awswrangler/s3/_write_text.py | 274 +++++- awswrangler/timestream.py | 2 +- building/lambda/build-lambda-layer.sh | 2 +- .../_static/aws_lambda_managed_layer.png | Bin 0 -> 51690 bytes docs/source/install.rst | 83 +- poetry.lock | 897 +++++++++++------- pyproject.toml | 8 +- tests/test_catalog.py | 23 + tests/test_mysql.py | 19 + tests/test_s3_text.py | 11 +- tutorials/014 - Schema Evolution.ipynb | 102 +- 21 files changed, 1432 insertions(+), 451 deletions(-) create mode 100644 docs/source/_static/aws_lambda_managed_layer.png diff --git a/README.md b/README.md index df9652c26..d1b918b38 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,8 @@ FROM "sampleDB"."sampleTable" ORDER BY time DESC LIMIT 3 - [026 - Amazon Timestream](https://github.com/awslabs/aws-data-wrangler/blob/main/tutorials/026%20-%20Amazon%20Timestream.ipynb) - [027 - Amazon Timestream 2](https://github.com/awslabs/aws-data-wrangler/blob/main/tutorials/027%20-%20Amazon%20Timestream%202.ipynb) - [028 - Amazon DynamoDB](https://github.com/awslabs/aws-data-wrangler/blob/main/tutorials/028%20-%20DynamoDB.ipynb) + - [029 - S3 Select](https://github.com/awslabs/aws-data-wrangler/blob/main/tutorials/029%20-%20S3%20Select.ipynb) + - [030 - Data Api](https://github.com/awslabs/aws-data-wrangler/blob/main/tutorials/030%20-%20Data%20Api.ipynb) - [031 - OpenSearch](https://github.com/awslabs/aws-data-wrangler/blob/main/tutorials/031%20-%20OpenSearch.ipynb) - [**API Reference**](https://aws-data-wrangler.readthedocs.io/en/2.12.1/api.html) - [Amazon S3](https://aws-data-wrangler.readthedocs.io/en/2.12.1/api.html#amazon-s3) diff --git a/awswrangler/catalog/__init__.py b/awswrangler/catalog/__init__.py index fdecf17a3..48ec6193d 100644 --- a/awswrangler/catalog/__init__.py +++ b/awswrangler/catalog/__init__.py @@ -1,11 +1,13 @@ """Amazon Glue Catalog Module.""" -from awswrangler.catalog._add import add_column, add_csv_partitions, add_parquet_partitions # noqa +from awswrangler.catalog._add import add_column, add_csv_partitions, add_json_partitions, add_parquet_partitions # noqa from awswrangler.catalog._create import ( # noqa _create_csv_table, + _create_json_table, _create_parquet_table, create_csv_table, create_database, + create_json_table, create_parquet_table, overwrite_table_parameters, upsert_table_parameters, @@ -49,6 +51,7 @@ __all__ = [ "add_column", "add_csv_partitions", + "add_json_partitions", "add_parquet_partitions", "does_table_exist", "delete_column", @@ -59,9 +62,11 @@ "sanitize_table_name", "_create_csv_table", "_create_parquet_table", + "_create_json_table", "create_csv_table", "create_database", "create_parquet_table", + "create_json_table", "overwrite_table_parameters", "upsert_table_parameters", "_get_table_input", diff --git a/awswrangler/catalog/_add.py b/awswrangler/catalog/_add.py index 4bf36254b..3c2f028c9 100644 --- a/awswrangler/catalog/_add.py +++ b/awswrangler/catalog/_add.py @@ -10,6 +10,7 @@ from awswrangler.catalog._definitions import ( _check_column_type, _csv_partition_definition, + _json_partition_definition, _parquet_partition_definition, _update_table_definition, ) @@ -125,6 +126,88 @@ def add_csv_partitions( _add_partitions(database=database, table=table, boto3_session=boto3_session, inputs=inputs, catalog_id=catalog_id) +@apply_configs +def add_json_partitions( + database: str, + table: str, + partitions_values: Dict[str, List[str]], + bucketing_info: Optional[Tuple[List[str], int]] = None, + catalog_id: Optional[str] = None, + compression: Optional[str] = None, + serde_library: Optional[str] = None, + serde_parameters: Optional[Dict[str, str]] = None, + boto3_session: Optional[boto3.Session] = None, + columns_types: Optional[Dict[str, str]] = None, +) -> None: + r"""Add partitions (metadata) to a JSON Table in the AWS Glue Catalog. + + Parameters + ---------- + database : str + Database name. + table : str + Table name. + partitions_values: Dict[str, List[str]] + Dictionary with keys as S3 path locations and values as a list of partitions values as str + (e.g. {'s3://bucket/prefix/y=2020/m=10/': ['2020', '10']}). + bucketing_info: Tuple[List[str], int], optional + Tuple consisting of the column names used for bucketing as the first element and the number of buckets as the + second element. + Only `str`, `int` and `bool` are supported as column data types for bucketing. + catalog_id : str, optional + The ID of the Data Catalog from which to retrieve Databases. + If none is provided, the AWS account ID is used by default. + compression: str, optional + Compression style (``None``, ``gzip``, etc). + serde_library : Optional[str] + Specifies the SerDe Serialization library which will be used. You need to provide the Class library name + as a string. + If no library is provided the default is `org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe`. + serde_parameters : Optional[str] + Dictionary of initialization parameters for the SerDe. + The default is `{"field.delim": sep, "escape.delim": "\\"}`. + boto3_session : boto3.Session(), optional + Boto3 Session. The default boto3 session will be used if boto3_session receive None. + columns_types: Optional[Dict[str, str]] + Only required for Hive compability. + Dictionary with keys as column names and values as data types (e.g. {'col0': 'bigint', 'col1': 'double'}). + P.S. Only materialized columns please, not partition columns. + + Returns + ------- + None + None. + + Examples + -------- + >>> import awswrangler as wr + >>> wr.catalog.add_json_partitions( + ... database='default', + ... table='my_table', + ... partitions_values={ + ... 's3://bucket/prefix/y=2020/m=10/': ['2020', '10'], + ... 's3://bucket/prefix/y=2020/m=11/': ['2020', '11'], + ... 's3://bucket/prefix/y=2020/m=12/': ['2020', '12'] + ... } + ... ) + + """ + table = sanitize_table_name(table=table) + inputs: List[Dict[str, Any]] = [ + _json_partition_definition( + location=k, + values=v, + bucketing_info=bucketing_info, + compression=compression, + columns_types=columns_types, + serde_library=serde_library, + serde_parameters=serde_parameters, + ) + for k, v in partitions_values.items() + ] + _add_partitions(database=database, table=table, boto3_session=boto3_session, inputs=inputs, catalog_id=catalog_id) + + @apply_configs def add_parquet_partitions( database: str, diff --git a/awswrangler/catalog/_create.py b/awswrangler/catalog/_create.py index 517ea1079..85d709bb9 100644 --- a/awswrangler/catalog/_create.py +++ b/awswrangler/catalog/_create.py @@ -7,7 +7,7 @@ from awswrangler import _utils, exceptions from awswrangler._config import apply_configs -from awswrangler.catalog._definitions import _csv_table_definition, _parquet_table_definition +from awswrangler.catalog._definitions import _csv_table_definition, _json_table_definition, _parquet_table_definition from awswrangler.catalog._delete import delete_all_partitions, delete_table_if_exists from awswrangler.catalog._get import _get_table_input from awswrangler.catalog._utils import _catalog_id, sanitize_column_name, sanitize_table_name @@ -354,6 +354,75 @@ def _create_csv_table( # pylint: disable=too-many-arguments ) +def _create_json_table( # pylint: disable=too-many-arguments + database: str, + table: str, + path: str, + columns_types: Dict[str, str], + partitions_types: Optional[Dict[str, str]], + bucketing_info: Optional[Tuple[List[str], int]], + description: Optional[str], + compression: Optional[str], + parameters: Optional[Dict[str, str]], + columns_comments: Optional[Dict[str, str]], + mode: str, + catalog_versioning: bool, + schema_evolution: bool, + serde_library: Optional[str], + serde_parameters: Optional[Dict[str, str]], + boto3_session: Optional[boto3.Session], + projection_enabled: bool, + projection_types: Optional[Dict[str, str]], + projection_ranges: Optional[Dict[str, str]], + projection_values: Optional[Dict[str, str]], + projection_intervals: Optional[Dict[str, str]], + projection_digits: Optional[Dict[str, str]], + catalog_table_input: Optional[Dict[str, Any]], + catalog_id: Optional[str], +) -> None: + table = sanitize_table_name(table=table) + partitions_types = {} if partitions_types is None else partitions_types + _logger.debug("catalog_table_input: %s", catalog_table_input) + table_input: Dict[str, Any] + if schema_evolution is False: + _utils.check_schema_changes(columns_types=columns_types, table_input=catalog_table_input, mode=mode) + if (catalog_table_input is not None) and (mode in ("append", "overwrite_partitions")): + table_input = catalog_table_input + else: + table_input = _json_table_definition( + table=table, + path=path, + columns_types=columns_types, + partitions_types=partitions_types, + bucketing_info=bucketing_info, + compression=compression, + serde_library=serde_library, + serde_parameters=serde_parameters, + ) + table_exist: bool = catalog_table_input is not None + _logger.debug("table_exist: %s", table_exist) + _create_table( + database=database, + table=table, + description=description, + parameters=parameters, + columns_comments=columns_comments, + mode=mode, + catalog_versioning=catalog_versioning, + boto3_session=boto3_session, + table_input=table_input, + table_exist=table_exist, + partitions_types=partitions_types, + projection_enabled=projection_enabled, + projection_types=projection_types, + projection_ranges=projection_ranges, + projection_values=projection_values, + projection_intervals=projection_intervals, + projection_digits=projection_digits, + catalog_id=catalog_id, + ) + + @apply_configs def upsert_table_parameters( parameters: Dict[str, str], @@ -812,3 +881,154 @@ def create_csv_table( serde_library=serde_library, serde_parameters=serde_parameters, ) + + +@apply_configs +def create_json_table( + database: str, + table: str, + path: str, + columns_types: Dict[str, str], + partitions_types: Optional[Dict[str, str]] = None, + bucketing_info: Optional[Tuple[List[str], int]] = None, + compression: Optional[str] = None, + description: Optional[str] = None, + parameters: Optional[Dict[str, str]] = None, + columns_comments: Optional[Dict[str, str]] = None, + mode: str = "overwrite", + catalog_versioning: bool = False, + schema_evolution: bool = False, + serde_library: Optional[str] = None, + serde_parameters: Optional[Dict[str, str]] = None, + boto3_session: Optional[boto3.Session] = None, + projection_enabled: bool = False, + projection_types: Optional[Dict[str, str]] = None, + projection_ranges: Optional[Dict[str, str]] = None, + projection_values: Optional[Dict[str, str]] = None, + projection_intervals: Optional[Dict[str, str]] = None, + projection_digits: Optional[Dict[str, str]] = None, + catalog_id: Optional[str] = None, +) -> None: + r"""Create a JSON Table (Metadata Only) in the AWS Glue Catalog. + + 'https://docs.aws.amazon.com/athena/latest/ug/data-types.html' + + Parameters + ---------- + database : str + Database name. + table : str + Table name. + path : str + Amazon S3 path (e.g. s3://bucket/prefix/). + columns_types: Dict[str, str] + Dictionary with keys as column names and values as data types (e.g. {'col0': 'bigint', 'col1': 'double'}). + partitions_types: Dict[str, str], optional + Dictionary with keys as partition names and values as data types (e.g. {'col2': 'date'}). + bucketing_info: Tuple[List[str], int], optional + Tuple consisting of the column names used for bucketing as the first element and the number of buckets as the + second element. + Only `str`, `int` and `bool` are supported as column data types for bucketing. + compression : str, optional + Compression style (``None``, ``gzip``, etc). + description : str, optional + Table description + parameters : Dict[str, str], optional + Key/value pairs to tag the table. + columns_comments: Dict[str, str], optional + Columns names and the related comments (e.g. {'col0': 'Column 0.', 'col1': 'Column 1.', 'col2': 'Partition.'}). + mode : str + 'overwrite' to recreate any possible axisting table or 'append' to keep any possible axisting table. + catalog_versioning : bool + If True and `mode="overwrite"`, creates an archived version of the table catalog before updating it. + schema_evolution : bool + If True allows schema evolution (new or missing columns), otherwise a exception will be raised. + (Only considered if dataset=True and mode in ("append", "overwrite_partitions")) + Related tutorial: + https://aws-data-wrangler.readthedocs.io/en/2.11.0/tutorials/014%20-%20Schema%20Evolution.html + serde_library : Optional[str] + Specifies the SerDe Serialization library which will be used. You need to provide the Class library name + as a string. + If no library is provided the default is `org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe`. + serde_parameters : Optional[str] + Dictionary of initialization parameters for the SerDe. + The default is `{"field.delim": sep, "escape.delim": "\\"}`. + projection_enabled : bool + Enable Partition Projection on Athena (https://docs.aws.amazon.com/athena/latest/ug/partition-projection.html) + projection_types : Optional[Dict[str, str]] + Dictionary of partitions names and Athena projections types. + Valid types: "enum", "integer", "date", "injected" + https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html + (e.g. {'col_name': 'enum', 'col2_name': 'integer'}) + projection_ranges: Optional[Dict[str, str]] + Dictionary of partitions names and Athena projections ranges. + https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html + (e.g. {'col_name': '0,10', 'col2_name': '-1,8675309'}) + projection_values: Optional[Dict[str, str]] + Dictionary of partitions names and Athena projections values. + https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html + (e.g. {'col_name': 'A,B,Unknown', 'col2_name': 'foo,boo,bar'}) + projection_intervals: Optional[Dict[str, str]] + Dictionary of partitions names and Athena projections intervals. + https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html + (e.g. {'col_name': '1', 'col2_name': '5'}) + projection_digits: Optional[Dict[str, str]] + Dictionary of partitions names and Athena projections digits. + https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html + (e.g. {'col_name': '1', 'col2_name': '2'}) + boto3_session : boto3.Session(), optional + Boto3 Session. The default boto3 session will be used if boto3_session receive None. + catalog_id : str, optional + The ID of the Data Catalog from which to retrieve Databases. + If none is provided, the AWS account ID is used by default. + + Returns + ------- + None + None. + + Examples + -------- + >>> import awswrangler as wr + >>> wr.catalog.create_json_table( + ... database='default', + ... table='my_table', + ... path='s3://bucket/prefix/', + ... columns_types={'col0': 'bigint', 'col1': 'double'}, + ... partitions_types={'col2': 'date'}, + ... description='My very own JSON table!', + ... parameters={'source': 'postgresql'}, + ... columns_comments={'col0': 'Column 0.', 'col1': 'Column 1.', 'col2': 'Partition.'} + ... ) + + """ + session: boto3.Session = _utils.ensure_session(session=boto3_session) + catalog_table_input: Optional[Dict[str, Any]] = _get_table_input( + database=database, table=table, boto3_session=session, catalog_id=catalog_id + ) + _create_json_table( + database=database, + table=table, + path=path, + columns_types=columns_types, + partitions_types=partitions_types, + bucketing_info=bucketing_info, + catalog_id=catalog_id, + compression=compression, + description=description, + parameters=parameters, + columns_comments=columns_comments, + mode=mode, + catalog_versioning=catalog_versioning, + schema_evolution=schema_evolution, + projection_enabled=projection_enabled, + projection_types=projection_types, + projection_ranges=projection_ranges, + projection_values=projection_values, + projection_intervals=projection_intervals, + projection_digits=projection_digits, + boto3_session=boto3_session, + catalog_table_input=catalog_table_input, + serde_library=serde_library, + serde_parameters=serde_parameters, + ) diff --git a/awswrangler/catalog/_definitions.py b/awswrangler/catalog/_definitions.py index 5116dcdd0..355a8262d 100644 --- a/awswrangler/catalog/_definitions.py +++ b/awswrangler/catalog/_definitions.py @@ -183,6 +183,81 @@ def _csv_partition_definition( return definition +def _json_table_definition( + table: str, + path: str, + columns_types: Dict[str, str], + partitions_types: Dict[str, str], + bucketing_info: Optional[Tuple[List[str], int]], + compression: Optional[str], + serde_library: Optional[str], + serde_parameters: Optional[Dict[str, str]], +) -> Dict[str, Any]: + compressed: bool = compression is not None + parameters: Dict[str, str] = { + "classification": "json", + "compressionType": str(compression).lower(), + "typeOfData": "file", + } + serde_info = { + "SerializationLibrary": "org.openx.data.jsonserde.JsonSerDe" if serde_library is None else serde_library, + "Parameters": {} if serde_parameters is None else serde_parameters, + } + return { + "Name": table, + "PartitionKeys": [{"Name": cname, "Type": dtype} for cname, dtype in partitions_types.items()], + "TableType": "EXTERNAL_TABLE", + "Parameters": parameters, + "StorageDescriptor": { + "Columns": [{"Name": cname, "Type": dtype} for cname, dtype in columns_types.items()], + "Location": path, + "InputFormat": "org.apache.hadoop.mapred.TextInputFormat", + "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat", + "Compressed": compressed, + "NumberOfBuckets": -1 if bucketing_info is None else bucketing_info[1], + "SerdeInfo": serde_info, + "BucketColumns": [] if bucketing_info is None else bucketing_info[0], + "StoredAsSubDirectories": False, + "SortColumns": [], + "Parameters": parameters, + }, + } + + +def _json_partition_definition( + location: str, + values: List[str], + bucketing_info: Optional[Tuple[List[str], int]], + compression: Optional[str], + serde_library: Optional[str], + serde_parameters: Optional[Dict[str, str]], + columns_types: Optional[Dict[str, str]], +) -> Dict[str, Any]: + compressed: bool = compression is not None + serde_info = { + "SerializationLibrary": "org.openx.data.jsonserde.JsonSerDe" if serde_library is None else serde_library, + "Parameters": {} if serde_parameters is None else serde_parameters, + } + definition: Dict[str, Any] = { + "StorageDescriptor": { + "InputFormat": "org.apache.hadoop.mapred.TextInputFormat", + "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat", + "Location": location, + "Compressed": compressed, + "SerdeInfo": serde_info, + "StoredAsSubDirectories": False, + "NumberOfBuckets": -1 if bucketing_info is None else bucketing_info[1], + "BucketColumns": [] if bucketing_info is None else bucketing_info[0], + }, + "Values": values, + } + if columns_types is not None: + definition["StorageDescriptor"]["Columns"] = [ + {"Name": cname, "Type": dtype} for cname, dtype in columns_types.items() + ] + return definition + + def _check_column_type(column_type: str) -> bool: if column_type not in _LEGAL_COLUMN_TYPES: raise ValueError(f"{column_type} is not a legal data type.") diff --git a/awswrangler/catalog/_delete.py b/awswrangler/catalog/_delete.py index 5436e8346..b14893e60 100644 --- a/awswrangler/catalog/_delete.py +++ b/awswrangler/catalog/_delete.py @@ -223,7 +223,9 @@ def delete_column( ... ) """ client_glue: boto3.client = _utils.client(service_name="glue", session=boto3_session) - table_res: Dict[str, Any] = client_glue.get_table(DatabaseName=database, Name=table) + table_res: Dict[str, Any] = client_glue.get_table( + **_catalog_id(catalog_id=catalog_id, DatabaseName=database, Name=table) + ) table_input: Dict[str, Any] = _update_table_definition(table_res) table_input["StorageDescriptor"]["Columns"] = [ i for i in table_input["StorageDescriptor"]["Columns"] if i["Name"] != column_name diff --git a/awswrangler/mysql.py b/awswrangler/mysql.py index 257251b1e..7baa7491a 100644 --- a/awswrangler/mysql.py +++ b/awswrangler/mysql.py @@ -2,7 +2,7 @@ import logging import uuid -from typing import Any, Dict, Iterator, List, Optional, Tuple, Union +from typing import Any, Dict, Iterator, List, Optional, Tuple, Type, Union import boto3 import pandas as pd @@ -77,6 +77,7 @@ def connect( read_timeout: Optional[int] = None, write_timeout: Optional[int] = None, connect_timeout: int = 10, + cursorclass: Type[Cursor] = Cursor, ) -> "pymysql.connections.Connection[Any]": """Return a pymysql connection from a Glue Catalog Connection or Secrets Manager. @@ -127,6 +128,9 @@ def connect( (default: 10, min: 1, max: 31536000) This parameter is forward to pymysql. https://pymysql.readthedocs.io/en/latest/modules/connections.html + cursorclass : Cursor + Cursor class to use, e.g. SSCrusor; defaults to :class:`pymysql.cursors.Cursor` + https://pymysql.readthedocs.io/en/latest/modules/cursors.html Returns ------- @@ -158,6 +162,7 @@ def connect( read_timeout=read_timeout, write_timeout=write_timeout, connect_timeout=connect_timeout, + cursorclass=cursorclass, ) @@ -290,6 +295,7 @@ def to_sql( varchar_lengths: Optional[Dict[str, int]] = None, use_column_names: bool = False, chunksize: int = 200, + cursorclass: Type[Cursor] = Cursor, ) -> None: """Write records stored in a DataFrame into MySQL. @@ -330,6 +336,9 @@ def to_sql( inserted into the database columns `col1` and `col3`. chunksize: int Number of rows which are inserted with each SQL query. Defaults to inserting 200 rows per query. + cursorclass : Cursor + Cursor class to use, e.g. SSCrusor; defaults to :class:`pymysql.cursors.Cursor` + https://pymysql.readthedocs.io/en/latest/modules/cursors.html Returns ------- @@ -365,7 +374,7 @@ def to_sql( _db_utils.validate_mode(mode=mode, allowed_modes=allowed_modes) _validate_connection(con=con) try: - with con.cursor() as cursor: + with con.cursor(cursor=cursorclass) as cursor: _create_table( df=df, cursor=cursor, diff --git a/awswrangler/s3/_copy.py b/awswrangler/s3/_copy.py index fca198865..6c9b5249d 100644 --- a/awswrangler/s3/_copy.py +++ b/awswrangler/s3/_copy.py @@ -125,7 +125,9 @@ def merge_datasets( target_path = target_path[:-1] if target_path[-1] == "/" else target_path session: boto3.Session = _utils.ensure_session(session=boto3_session) - paths: List[str] = list_objects(path=f"{source_path}/", ignore_empty=ignore_empty, boto3_session=session) + paths: List[str] = list_objects( # type: ignore + path=f"{source_path}/", ignore_empty=ignore_empty, boto3_session=session + ) _logger.debug("len(paths): %s", len(paths)) if len(paths) < 1: return [] diff --git a/awswrangler/s3/_list.py b/awswrangler/s3/_list.py index a0e0f1e76..2711f6fda 100644 --- a/awswrangler/s3/_list.py +++ b/awswrangler/s3/_list.py @@ -3,7 +3,7 @@ import datetime import fnmatch import logging -from typing import Any, Dict, List, Optional, Sequence, Union +from typing import Any, Dict, Iterator, List, Optional, Sequence, Union import boto3 import botocore.exceptions @@ -28,7 +28,7 @@ def _path2list( _suffix: Optional[List[str]] = [suffix] if isinstance(suffix, str) else suffix _ignore_suffix: Optional[List[str]] = [ignore_suffix] if isinstance(ignore_suffix, str) else ignore_suffix if isinstance(path, str): # prefix - paths: List[str] = list_objects( + paths: List[str] = list_objects( # type: ignore path=path, suffix=_suffix, ignore_suffix=_ignore_suffix, @@ -79,7 +79,7 @@ def _list_objects( # pylint: disable=too-many-branches last_modified_end: Optional[datetime.datetime] = None, boto3_session: Optional[boto3.Session] = None, ignore_empty: bool = False, -) -> List[str]: +) -> Iterator[List[str]]: bucket: str prefix_original: str bucket, prefix_original = _utils.parse_path(path=path) @@ -132,13 +132,13 @@ def _list_objects( # pylint: disable=too-many-branches key = pfx["Prefix"] paths.append(f"s3://{bucket}/{key}") - if prefix != prefix_original: - paths = fnmatch.filter(paths, path) + if prefix != prefix_original: + paths = fnmatch.filter(paths, path) - if _ignore_suffix is not None: - paths = [p for p in paths if p.endswith(tuple(_ignore_suffix)) is False] + if _ignore_suffix is not None: + paths = [p for p in paths if p.endswith(tuple(_ignore_suffix)) is False] - return paths + yield paths def does_object_exist( @@ -208,8 +208,11 @@ def does_object_exist( def list_directories( - path: str, s3_additional_kwargs: Optional[Dict[str, Any]] = None, boto3_session: Optional[boto3.Session] = None -) -> List[str]: + path: str, + chunked: bool = False, + s3_additional_kwargs: Optional[Dict[str, Any]] = None, + boto3_session: Optional[boto3.Session] = None, +) -> Union[List[str], Iterator[List[str]]]: """List Amazon S3 objects from a prefix. This function accepts Unix shell-style wildcards in the path argument. @@ -222,6 +225,8 @@ def list_directories( ---------- path : str S3 path (e.g. s3://bucket/prefix). + chunked: bool + If True returns iterator, and a single list otherwise. False by default. s3_additional_kwargs : Optional[Dict[str, Any]] Forwarded to botocore requests. e.g. s3_additional_kwargs={'RequestPayer': 'requester'} @@ -230,7 +235,7 @@ def list_directories( Returns ------- - List[str] + Union[List[str], Iterator[List[str]]] List of objects paths. Examples @@ -249,9 +254,15 @@ def list_directories( ['s3://bucket/prefix/dir0/', 's3://bucket/prefix/dir1/', 's3://bucket/prefix/dir2/'] """ - return _list_objects( - path=path, delimiter="/", boto3_session=boto3_session, s3_additional_kwargs=s3_additional_kwargs + result_iterator = _list_objects( + path=path, + delimiter="/", + boto3_session=boto3_session, + s3_additional_kwargs=s3_additional_kwargs, ) + if chunked: + return result_iterator + return [path for paths in result_iterator for path in paths] def list_objects( @@ -261,9 +272,10 @@ def list_objects( last_modified_begin: Optional[datetime.datetime] = None, last_modified_end: Optional[datetime.datetime] = None, ignore_empty: bool = False, + chunked: bool = False, s3_additional_kwargs: Optional[Dict[str, Any]] = None, boto3_session: Optional[boto3.Session] = None, -) -> List[str]: +) -> Union[List[str], Iterator[List[str]]]: """List Amazon S3 objects from a prefix. This function accepts Unix shell-style wildcards in the path argument. @@ -292,6 +304,8 @@ def list_objects( The filter is applied only after list all s3 files. ignore_empty: bool Ignore files with 0 bytes. + chunked: bool + If True returns iterator, and a single list otherwise. False by default. s3_additional_kwargs : Optional[Dict[str, Any]] Forwarded to botocore requests. e.g. s3_additional_kwargs={'RequestPayer': 'requester'} @@ -300,7 +314,7 @@ def list_objects( Returns ------- - List[str] + Union[List[str], Iterator[List[str]]] List of objects paths. Examples @@ -319,7 +333,7 @@ def list_objects( ['s3://bucket/prefix0', 's3://bucket/prefix1', 's3://bucket/prefix2'] """ - paths: List[str] = _list_objects( + result_iterator = _list_objects( path=path, delimiter=None, suffix=suffix, @@ -330,4 +344,6 @@ def list_objects( ignore_empty=ignore_empty, s3_additional_kwargs=s3_additional_kwargs, ) - return [p for p in paths if not p.endswith("/")] + if chunked: + return result_iterator + return [path for paths in result_iterator for path in paths if not path.endswith("/")] diff --git a/awswrangler/s3/_write_parquet.py b/awswrangler/s3/_write_parquet.py index d5edec2e0..13b272901 100644 --- a/awswrangler/s3/_write_parquet.py +++ b/awswrangler/s3/_write_parquet.py @@ -306,7 +306,7 @@ def to_parquet( # pylint: disable=too-many-arguments,too-many-locals catalog_versioning : bool If True and `mode="overwrite"`, creates an archived version of the table catalog before updating it. schema_evolution : bool - If True allows schema evolution (new or missing columns), otherwise a exception will be raised. + If True allows schema evolution (new or missing columns), otherwise a exception will be raised. True by default. (Only considered if dataset=True and mode in ("append", "overwrite_partitions")) Related tutorial: https://aws-data-wrangler.readthedocs.io/en/2.12.1/tutorials/014%20-%20Schema%20Evolution.html diff --git a/awswrangler/s3/_write_text.py b/awswrangler/s3/_write_text.py index dce3da43e..8f4806b40 100644 --- a/awswrangler/s3/_write_text.py +++ b/awswrangler/s3/_write_text.py @@ -184,7 +184,7 @@ def to_csv( # pylint: disable=too-many-arguments,too-many-locals,too-many-state If True and `mode="overwrite"`, creates an archived version of the table catalog before updating it. schema_evolution : bool If True allows schema evolution (new or missing columns), otherwise a exception will be raised. - (Only considered if dataset=True and mode in ("append", "overwrite_partitions")) + (Only considered if dataset=True and mode in ("append", "overwrite_partitions")). False by default. Related tutorial: https://aws-data-wrangler.readthedocs.io/en/2.12.1/tutorials/014%20-%20Schema%20Evolution.html database : str, optional @@ -458,19 +458,18 @@ def to_csv( # pylint: disable=too-many-arguments,too-many-locals,too-many-state ) paths = [path] # type: ignore else: + compression: Optional[str] = pandas_kwargs.get("compression", None) if database and table: quoting: Optional[int] = csv.QUOTE_NONE escapechar: Optional[str] = "\\" header: Union[bool, List[str]] = pandas_kwargs.get("header", False) date_format: Optional[str] = "%Y-%m-%d %H:%M:%S.%f" pd_kwargs: Dict[str, Any] = {} - compression: Optional[str] = pandas_kwargs.get("compression", None) else: quoting = pandas_kwargs.get("quoting", None) escapechar = pandas_kwargs.get("escapechar", None) header = pandas_kwargs.get("header", True) date_format = pandas_kwargs.get("date_format", None) - compression = pandas_kwargs.get("compression", None) pd_kwargs = pandas_kwargs.copy() pd_kwargs.pop("quoting", None) pd_kwargs.pop("escapechar", None) @@ -573,14 +572,39 @@ def to_csv( # pylint: disable=too-many-arguments,too-many-locals,too-many-state return {"paths": paths, "partitions_values": partitions_values} -def to_json( +def to_json( # pylint: disable=too-many-arguments,too-many-locals,too-many-statements,too-many-branches df: pd.DataFrame, - path: str, + path: Optional[str] = None, + index: bool = True, + columns: Optional[List[str]] = None, + use_threads: Union[bool, int] = True, boto3_session: Optional[boto3.Session] = None, s3_additional_kwargs: Optional[Dict[str, Any]] = None, - use_threads: Union[bool, int] = True, + sanitize_columns: bool = False, + dataset: bool = False, + filename_prefix: Optional[str] = None, + partition_cols: Optional[List[str]] = None, + bucketing_info: Optional[Tuple[List[str], int]] = None, + concurrent_partitioning: bool = False, + mode: Optional[str] = None, + catalog_versioning: bool = False, + schema_evolution: bool = True, + database: Optional[str] = None, + table: Optional[str] = None, + dtype: Optional[Dict[str, str]] = None, + description: Optional[str] = None, + parameters: Optional[Dict[str, str]] = None, + columns_comments: Optional[Dict[str, str]] = None, + regular_partitions: bool = True, + projection_enabled: bool = False, + projection_types: Optional[Dict[str, str]] = None, + projection_ranges: Optional[Dict[str, str]] = None, + projection_values: Optional[Dict[str, str]] = None, + projection_intervals: Optional[Dict[str, str]] = None, + projection_digits: Optional[Dict[str, str]] = None, + catalog_id: Optional[str] = None, **pandas_kwargs: Any, -) -> List[str]: +) -> Union[List[str], Dict[str, Union[List[str], Dict[str, List[str]]]]]: """Write JSON file on Amazon S3. Note @@ -598,15 +622,97 @@ def to_json( Pandas DataFrame https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html path : str Amazon S3 path (e.g. s3://bucket/filename.json). + index : bool + Write row names (index). + columns : Optional[List[str]] + Columns to write. + use_threads : bool, int + True to enable concurrent requests, False to disable multiple threads. + If enabled os.cpu_count() will be used as the max number of threads. + If integer is provided, specified number is used. boto3_session : boto3.Session(), optional Boto3 Session. The default boto3 Session will be used if boto3_session receive None. s3_additional_kwargs : Optional[Dict[str, Any]] Forwarded to botocore requests. e.g. s3_additional_kwargs={'ServerSideEncryption': 'aws:kms', 'SSEKMSKeyId': 'YOUR_KMS_KEY_ARN'} - use_threads : bool, int - True to enable concurrent requests, False to disable multiple threads. - If enabled os.cpu_count() will be used as the max number of threads. - If integer is provided, specified number is used. + sanitize_columns : bool + True to sanitize columns names or False to keep it as is. + True value is forced if `dataset=True`. + dataset : bool + If True store as a dataset instead of ordinary file(s) + If True, enable all follow arguments: + partition_cols, mode, database, table, description, parameters, columns_comments, concurrent_partitioning, + catalog_versioning, projection_enabled, projection_types, projection_ranges, projection_values, + projection_intervals, projection_digits, catalog_id, schema_evolution. + filename_prefix: str, optional + If dataset=True, add a filename prefix to the output files. + partition_cols: List[str], optional + List of column names that will be used to create partitions. Only takes effect if dataset=True. + bucketing_info: Tuple[List[str], int], optional + Tuple consisting of the column names used for bucketing as the first element and the number of buckets as the + second element. + Only `str`, `int` and `bool` are supported as column data types for bucketing. + concurrent_partitioning: bool + If True will increase the parallelism level during the partitions writing. It will decrease the + writing time and increase the memory usage. + https://aws-data-wrangler.readthedocs.io/en/2.12.1/tutorials/022%20-%20Writing%20Partitions%20Concurrently.html + mode : str, optional + ``append`` (Default), ``overwrite``, ``overwrite_partitions``. Only takes effect if dataset=True. + For details check the related tutorial: + https://aws-data-wrangler.readthedocs.io/en/2.12.1/stubs/awswrangler.s3.to_parquet.html#awswrangler.s3.to_parquet + catalog_versioning : bool + If True and `mode="overwrite"`, creates an archived version of the table catalog before updating it. + schema_evolution : bool + If True allows schema evolution (new or missing columns), otherwise a exception will be raised. + (Only considered if dataset=True and mode in ("append", "overwrite_partitions")) + Related tutorial: + https://aws-data-wrangler.readthedocs.io/en/2.12.1/tutorials/014%20-%20Schema%20Evolution.html + database : str, optional + Glue/Athena catalog: Database name. + table : str, optional + Glue/Athena catalog: Table name. + dtype : Dict[str, str], optional + Dictionary of columns names and Athena/Glue types to be casted. + Useful when you have columns with undetermined or mixed data types. + (e.g. {'col name': 'bigint', 'col2 name': 'int'}) + description : str, optional + Glue/Athena catalog: Table description + parameters : Dict[str, str], optional + Glue/Athena catalog: Key/value pairs to tag the table. + columns_comments : Dict[str, str], optional + Glue/Athena catalog: + Columns names and the related comments (e.g. {'col0': 'Column 0.', 'col1': 'Column 1.', 'col2': 'Partition.'}). + regular_partitions : bool + Create regular partitions (Non projected partitions) on Glue Catalog. + Disable when you will work only with Partition Projection. + Keep enabled even when working with projections is useful to keep + Redshift Spectrum working with the regular partitions. + projection_enabled : bool + Enable Partition Projection on Athena (https://docs.aws.amazon.com/athena/latest/ug/partition-projection.html) + projection_types : Optional[Dict[str, str]] + Dictionary of partitions names and Athena projections types. + Valid types: "enum", "integer", "date", "injected" + https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html + (e.g. {'col_name': 'enum', 'col2_name': 'integer'}) + projection_ranges: Optional[Dict[str, str]] + Dictionary of partitions names and Athena projections ranges. + https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html + (e.g. {'col_name': '0,10', 'col2_name': '-1,8675309'}) + projection_values: Optional[Dict[str, str]] + Dictionary of partitions names and Athena projections values. + https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html + (e.g. {'col_name': 'A,B,Unknown', 'col2_name': 'foo,boo,bar'}) + projection_intervals: Optional[Dict[str, str]] + Dictionary of partitions names and Athena projections intervals. + https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html + (e.g. {'col_name': '1', 'col2_name': '5'}) + projection_digits: Optional[Dict[str, str]] + Dictionary of partitions names and Athena projections digits. + https://docs.aws.amazon.com/athena/latest/ug/partition-projection-supported-types.html + (e.g. {'col_name': '1', 'col2_name': '2'}) + catalog_id : str, optional + The ID of the Data Catalog from which to retrieve Databases. + If none is provided, the AWS account ID is used by default. pandas_kwargs: KEYWORD arguments forwarded to pandas.DataFrame.to_json(). You can NOT pass `pandas_kwargs` explicit, just add valid Pandas arguments in the function call and Wrangler will accept it. @@ -665,12 +771,150 @@ def to_json( f"JSON compression on S3 is not supported for Pandas version {pd.__version__}. " "The minimum acceptable version to achive it is Pandas 1.2.0 that requires Python >=3.7.1." ) - return _to_text( - file_format="json", + + _validate_args( df=df, + table=table, + database=database, + dataset=dataset, path=path, + partition_cols=partition_cols, + bucketing_info=bucketing_info, + mode=mode, + description=description, + parameters=parameters, + columns_comments=columns_comments, + ) + + # Initializing defaults + partition_cols = partition_cols if partition_cols else [] + dtype = dtype if dtype else {} + partitions_values: Dict[str, List[str]] = {} + mode = "append" if mode is None else mode + filename_prefix = filename_prefix + uuid.uuid4().hex if filename_prefix else uuid.uuid4().hex + session: boto3.Session = _utils.ensure_session(session=boto3_session) + + # Sanitize table to respect Athena's standards + if (sanitize_columns is True) or (database is not None and table is not None): + df, dtype, partition_cols = _sanitize(df=df, dtype=dtype, partition_cols=partition_cols) + + # Evaluating dtype + catalog_table_input: Optional[Dict[str, Any]] = None + if database is not None and table is not None: + catalog_table_input = catalog._get_table_input( # pylint: disable=protected-access + database=database, table=table, boto3_session=session, catalog_id=catalog_id + ) + catalog_path = catalog_table_input["StorageDescriptor"]["Location"] if catalog_table_input else None + if path is None: + if catalog_path: + path = catalog_path + else: + raise exceptions.InvalidArgumentValue( + "Glue table does not exist in the catalog. Please pass the `path` argument to create it." + ) + elif path and catalog_path: + if path.rstrip("/") != catalog_path.rstrip("/"): + raise exceptions.InvalidArgumentValue( + f"The specified path: {path}, does not match the existing Glue catalog table path: {catalog_path}" + ) + if pandas_kwargs.get("compression") not in ("gzip", "bz2", None): + raise exceptions.InvalidArgumentCombination( + "If database and table are given, you must use one of these compressions: gzip, bz2 or None." + ) + df = _apply_dtype(df=df, dtype=dtype, catalog_table_input=catalog_table_input, mode=mode) + + if dataset is False: + return _to_text( + file_format="json", + df=df, + path=path, + use_threads=use_threads, + boto3_session=session, + s3_additional_kwargs=s3_additional_kwargs, + **pandas_kwargs, + ) + + compression: Optional[str] = pandas_kwargs.get("compression", None) + df = df[columns] if columns else df + + columns_types: Dict[str, str] = {} + partitions_types: Dict[str, str] = {} + if (database is not None) and (table is not None): + columns_types, partitions_types = _data_types.athena_types_from_pandas_partitioned( + df=df, index=index, partition_cols=partition_cols, dtype=dtype + ) + if schema_evolution is False: + _utils.check_schema_changes(columns_types=columns_types, table_input=catalog_table_input, mode=mode) + paths, partitions_values = _to_dataset( + func=_to_text, + concurrent_partitioning=concurrent_partitioning, + df=df, + path_root=path, # type: ignore + filename_prefix=filename_prefix, + index=index, + compression=compression, use_threads=use_threads, - boto3_session=boto3_session, + partition_cols=partition_cols, + bucketing_info=bucketing_info, + mode=mode, + boto3_session=session, s3_additional_kwargs=s3_additional_kwargs, - **pandas_kwargs, + file_format="json", ) + if database and table: + try: + serde_info: Dict[str, Any] = {} + if catalog_table_input: + serde_info = catalog_table_input["StorageDescriptor"]["SerdeInfo"] + serde_library: Optional[str] = serde_info.get("SerializationLibrary", None) + serde_parameters: Optional[Dict[str, str]] = serde_info.get("Parameters", None) + catalog._create_json_table( # pylint: disable=protected-access + database=database, + table=table, + path=path, # type: ignore + columns_types=columns_types, + partitions_types=partitions_types, + bucketing_info=bucketing_info, + description=description, + parameters=parameters, + columns_comments=columns_comments, + boto3_session=session, + mode=mode, + catalog_versioning=catalog_versioning, + schema_evolution=schema_evolution, + projection_enabled=projection_enabled, + projection_types=projection_types, + projection_ranges=projection_ranges, + projection_values=projection_values, + projection_intervals=projection_intervals, + projection_digits=projection_digits, + catalog_table_input=catalog_table_input, + catalog_id=catalog_id, + compression=pandas_kwargs.get("compression"), + serde_library=serde_library, + serde_parameters=serde_parameters, + ) + if partitions_values and (regular_partitions is True): + _logger.debug("partitions_values:\n%s", partitions_values) + catalog.add_json_partitions( + database=database, + table=table, + partitions_values=partitions_values, + bucketing_info=bucketing_info, + boto3_session=session, + serde_library=serde_library, + serde_parameters=serde_parameters, + catalog_id=catalog_id, + columns_types=columns_types, + compression=pandas_kwargs.get("compression"), + ) + except Exception: + _logger.debug("Catalog write failed, cleaning up S3 (paths: %s).", paths) + delete_objects( + path=paths, + use_threads=use_threads, + boto3_session=session, + s3_additional_kwargs=s3_additional_kwargs, + ) + raise + return {"paths": paths, "partitions_values": partitions_values} diff --git a/awswrangler/timestream.py b/awswrangler/timestream.py index 630332f52..660b7edb5 100644 --- a/awswrangler/timestream.py +++ b/awswrangler/timestream.py @@ -251,7 +251,7 @@ def query( Returns ------- - pd.DataFrame + Union[pd.DataFrame, Iterator[pd.DataFrame]] Pandas DataFrame https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html Examples diff --git a/building/lambda/build-lambda-layer.sh b/building/lambda/build-lambda-layer.sh index 8def86925..f888e3b55 100644 --- a/building/lambda/build-lambda-layer.sh +++ b/building/lambda/build-lambda-layer.sh @@ -14,7 +14,7 @@ export ARROW_HOME=$(pwd)/dist export LD_LIBRARY_PATH=$(pwd)/dist/lib:$LD_LIBRARY_PATH git clone \ - --branch apache-arrow-5.0.0 \ + --branch apache-arrow-6.0.0 \ --single-branch \ https://github.com/apache/arrow.git diff --git a/docs/source/_static/aws_lambda_managed_layer.png b/docs/source/_static/aws_lambda_managed_layer.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d3adf4942704356e9141a7523e5112dc6114cd GIT binary patch literal 51690 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:336392948345:layer:AWSDataWrangler-Python:``. +For example: ``arn:aws:lambda:us-east-1:336392948345:layer:AWSDataWrangler-Python37:1``. +Both Python 3.7 and 3.8 are supported. + +Here is a mapping of layer version to library version: + +.. list-table:: Lambda layer to Python library versions mapping + :widths: 25 25 + :header-rows: 1 + + * - Lambda Layer Version + - Python Library Version + * - 1 + - 2.12.0 + +Custom Layer +^^^^^^^^^^^^^^ + +For AWS regions not in the above list, you can create your own Lambda layer following these instructions: + 1 - Go to `GitHub's release section `_ -and download the layer zip related to the desired version. +and download the layer zip related to the desired version. Alternatively, you can download the zip from the `public artifacts bucket `_. 2 - Go to the AWS Lambda Panel, open the layer section (left side) and click **create layer**. @@ -36,11 +75,30 @@ and press **create** to create the layer. 4 - Go to your Lambda and select your new layer! +Serverless Application Repository (SAR) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +AWS Data Wrangler layers are also available in the `AWS Serverless Application Repository `_ (SAR). + +Here is an example of how to create the Lambda layer in your CDK app: + +.. code-block:: python + + CfnApplication( + self, + "wrangler-layer", + location=CfnApplication.ApplicationLocationProperty( + application_id="arn:aws:serverlessrepo:us-east-1:336392948345:applications/aws-data-wrangler-layer-py3-8", + semantic_version="2.12.0", + ), + ) + + AWS Glue Python Shell Jobs -------------------------- 1 - Go to `GitHub's release page `_ and download the wheel file -(.whl) related to the desired version. +(.whl) related to the desired version. Alternatively, you can download the wheel from the `public artifacts bucket `_. 2 - Upload the wheel file to any Amazon S3 location. @@ -69,7 +127,7 @@ To install a specific version, set the value for above Job parameter as follows: `Official Glue PySpark Reference `_ Public Artifacts ---------------------- +----------------- Lambda zipped layers and Python wheels are stored in a publicly accessible S3 bucket for all versions. @@ -81,24 +139,7 @@ Lambda zipped layers and Python wheels are stored in a publicly accessible S3 bu * Python wheel: ``awswrangler--py3-none-any.whl`` -Here is an example of how to reference the Lambda layer in your CDK app: - -.. code-block:: python - - wrangler_layer = LayerVersion( - self, - "wrangler-layer", - compatible_runtimes=[Runtime.PYTHON_3_8], - code=S3Code( - bucket=Bucket.from_bucket_arn( - self, - "wrangler-bucket", - bucket_arn="arn:aws:s3:::aws-data-wrangler-public-artifacts", - ), - key="releases/2.12.1/awswrangler-layer-2.12.1-py3.8.zip", - ), - layer_version_name="aws-data-wrangler" - ) +For example: ``s3://aws-data-wrangler-public-artifacts/releases/2.12.1/awswrangler-layer-2.12.1-py3.8.zip`` Amazon SageMaker Notebook ------------------------- diff --git a/poetry.lock b/poetry.lock index b2e8d693a..4b7f44110 100644 --- a/poetry.lock +++ b/poetry.lock @@ -18,23 +18,26 @@ boto3 = ["boto3 (>=1.17.106,<1.17.107)"] [[package]] name = "aiohttp" -version = "3.7.4.post0" +version = "3.8.0" description = "Async http client/server framework (asyncio)" category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] -async-timeout = ">=3.0,<4.0" +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" -chardet = ">=2.0,<5.0" +charset-normalizer = ">=2.0,<3.0" +frozenlist = ">=1.1.1" idna-ssl = {version = ">=1.0", markers = "python_version < \"3.7\""} multidict = ">=4.5,<7.0" -typing-extensions = ">=3.6.5" +typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} yarl = ">=1.0,<2.0" [package.extras] -speedups = ["aiodns", "brotlipy", "cchardet"] +speedups = ["aiodns", "brotli", "cchardet"] [[package]] name = "aioitertools" @@ -47,6 +50,17 @@ python-versions = ">=3.6" [package.dependencies] typing_extensions = {version = ">=3.7", markers = "python_version < \"3.8\""} +[[package]] +name = "aiosignal" +version = "1.2.0" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +frozenlist = ">=1.1.0" + [[package]] name = "alabaster" version = "0.7.12" @@ -108,7 +122,7 @@ python-versions = "*" [[package]] name = "astroid" -version = "2.8.3" +version = "2.8.4" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false @@ -130,11 +144,22 @@ python-versions = ">=3.5" [[package]] name = "async-timeout" -version = "3.0.1" +version = "4.0.0" description = "Timeout context manager for asyncio programs" category = "dev" optional = false -python-versions = ">=3.5.3" +python-versions = ">=3.6" + +[package.dependencies] +typing-extensions = ">=3.6.5" + +[[package]] +name = "asynctest" +version = "0.13.0" +description = "Enhance the standard unittest package with features for testing asyncio libraries" +category = "dev" +optional = false +python-versions = ">=3.5" [[package]] name = "atomicwrites" @@ -209,7 +234,7 @@ lxml = ["lxml"] [[package]] name = "black" -version = "21.9b0" +version = "21.10b0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -228,9 +253,9 @@ typing-extensions = ">=3.10.0.0" [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -python2 = ["typed-ast (>=1.4.2)"] +python2 = ["typed-ast (>=1.4.3)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] @@ -302,14 +327,6 @@ python-versions = "*" [package.dependencies] pycparser = "*" -[[package]] -name = "chardet" -version = "4.0.0" -description = "Universal encoding detector for Python 2 and 3" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - [[package]] name = "charset-normalizer" version = "2.0.7" @@ -354,7 +371,7 @@ immutables = ">=0.9" [[package]] name = "coverage" -version = "6.0.2" +version = "6.1.1" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -468,7 +485,7 @@ testing = ["pre-commit"] [[package]] name = "filelock" -version = "3.3.1" +version = "3.3.2" description = "A platform independent file lock." category = "dev" optional = false @@ -492,6 +509,14 @@ mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.8.0,<2.9.0" pyflakes = ">=2.4.0,<2.5.0" +[[package]] +name = "frozenlist" +version = "1.2.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "dev" +optional = false +python-versions = ">=3.6" + [[package]] name = "fsspec" version = "2021.10.1" @@ -581,7 +606,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [[package]] name = "importlib-resources" -version = "5.2.3" +version = "5.4.0" description = "Read resources from Python packages" category = "dev" optional = false @@ -775,7 +800,7 @@ test = ["codecov", "coverage", "ipykernel", "ipython", "mock", "mypy", "pre-comm [[package]] name = "jupyter-core" -version = "4.8.1" +version = "4.9.1" description = "Jupyter core package. A base package on which Jupyter projects rely." category = "dev" optional = false @@ -787,7 +812,7 @@ traitlets = "*" [[package]] name = "jupyter-server" -version = "1.11.1" +version = "1.11.2" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." category = "dev" optional = false @@ -804,7 +829,6 @@ nbconvert = "*" nbformat = "*" prometheus-client = "*" pyzmq = ">=17" -requests-unixsocket = "*" Send2Trash = "*" terminado = ">=0.8.3" tornado = ">=6.1.0" @@ -816,7 +840,7 @@ test = ["coverage", "pytest (>=6.0)", "pytest-cov", "pytest-mock", "requests", " [[package]] name = "jupyterlab" -version = "3.2.0" +version = "3.2.1" description = "JupyterLab computational environment" category = "dev" optional = false @@ -924,7 +948,7 @@ python-versions = ">=3.5" [[package]] name = "moto" -version = "2.2.10" +version = "2.2.12" description = "A library that allows your python tests to easily mock out the boto library" category = "dev" optional = false @@ -946,19 +970,20 @@ werkzeug = "*" xmltodict = "*" [package.extras] -all = ["PyYAML (>=5.1)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (<0.15)", "docker (>=2.5.1)", "jsondiff (>=1.1.2)", "aws-xray-sdk (>=0.93,!=0.96)", "idna (>=2.5,<3)", "cfn-lint (>=0.4.0)", "sshpubkeys (>=3.1.0)", "setuptools"] +all = ["PyYAML (>=5.1)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (<0.15)", "docker (>=2.5.1)", "jsondiff (>=1.1.2)", "aws-xray-sdk (>=0.93,!=0.96)", "idna (>=2.5,<4)", "cfn-lint (>=0.4.0)", "sshpubkeys (>=3.1.0)", "setuptools"] apigateway = ["python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (<0.15)"] awslambda = ["docker (>=2.5.1)"] batch = ["docker (>=2.5.1)"] cloudformation = ["docker (>=2.5.1)", "PyYAML (>=5.1)", "cfn-lint (>=0.4.0)"] cognitoidp = ["python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (<0.15)"] +ds = ["sshpubkeys (>=3.1.0)"] dynamodb2 = ["docker (>=2.5.1)"] dynamodbstreams = ["docker (>=2.5.1)"] ec2 = ["sshpubkeys (>=3.1.0)"] efs = ["sshpubkeys (>=3.1.0)"] iotdata = ["jsondiff (>=1.1.2)"] s3 = ["PyYAML (>=5.1)"] -server = ["PyYAML (>=5.1)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (<0.15)", "docker (>=2.5.1)", "jsondiff (>=1.1.2)", "aws-xray-sdk (>=0.93,!=0.96)", "idna (>=2.5,<3)", "cfn-lint (>=0.4.0)", "sshpubkeys (>=3.1.0)", "setuptools", "flask", "flask-cors"] +server = ["PyYAML (>=5.1)", "python-jose[cryptography] (>=3.1.0,<4.0.0)", "ecdsa (<0.15)", "docker (>=2.5.1)", "jsondiff (>=1.1.2)", "aws-xray-sdk (>=0.93,!=0.96)", "idna (>=2.5,<4)", "cfn-lint (>=0.4.0)", "sshpubkeys (>=3.1.0)", "setuptools", "flask", "flask-cors"] ssm = ["PyYAML (>=5.1)", "dataclasses"] xray = ["aws-xray-sdk (>=0.93,!=0.96)", "setuptools"] @@ -998,8 +1023,8 @@ python-versions = "*" [[package]] name = "nbclassic" -version = "0.3.2" -description = "Jupyter Notebook as a Jupyter Server Extension." +version = "0.3.4" +description = "Jupyter Notebook as a Jupyter Server extension." category = "dev" optional = false python-versions = ">=3.6" @@ -1117,7 +1142,7 @@ python-versions = ">=3.5" [[package]] name = "notebook" -version = "6.4.4" +version = "6.4.5" description = "A web-based notebook environment for interactive computing" category = "dev" optional = false @@ -1182,14 +1207,14 @@ requests = ["requests (>=2.4.0,<3.0.0)"] [[package]] name = "packaging" -version = "21.0" +version = "21.2" description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.6" [package.dependencies] -pyparsing = ">=2.0.2" +pyparsing = ">=2.0.2,<3" [[package]] name = "pandas" @@ -1291,7 +1316,7 @@ ptyprocess = ">=0.5" [[package]] name = "pg8000" -version = "1.21.3" +version = "1.22.0" description = "PostgreSQL interface library" category = "main" optional = false @@ -1361,7 +1386,7 @@ tests = ["flake8 (>=3.7.7)", "pytest (>=4.6.9)", "pytest-cov (>=2.6.1)", "freeze [[package]] name = "prometheus-client" -version = "0.11.0" +version = "0.12.0" description = "Python client for the Prometheus monitoring system." category = "dev" optional = false @@ -1372,7 +1397,7 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.20" +version = "3.0.21" description = "Library for building powerful interactive command lines in Python" category = "dev" optional = false @@ -1399,7 +1424,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pyarrow" -version = "5.0.0" +version = "6.0.0" description = "Python library for Apache Arrow" category = "main" optional = false @@ -1655,7 +1680,7 @@ python-versions = "*" [[package]] name = "pywinpty" -version = "1.1.4" +version = "1.1.5" description = "Pseudo terminal support for Windows from Python." category = "dev" optional = false @@ -1675,7 +1700,7 @@ py = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "redshift-connector" -version = "2.0.888" +version = "2.0.889" description = "Redshift interface library" category = "main" optional = false @@ -1696,7 +1721,7 @@ full = ["numpy", "pandas"] [[package]] name = "regex" -version = "2021.10.8" +version = "2021.11.1" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -1732,21 +1757,9 @@ python-versions = "*" requests = "*" six = "*" -[[package]] -name = "requests-unixsocket" -version = "0.2.0" -description = "Use requests to talk HTTP via a UNIX domain socket" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -requests = ">=1.1" -urllib3 = ">=1.8" - [[package]] name = "responses" -version = "0.14.0" +version = "0.15.0" description = "A utility library for mocking out the `requests` Python library." category = "dev" optional = false @@ -1972,7 +1985,7 @@ test = ["pytest"] [[package]] name = "stevedore" -version = "3.4.0" +version = "3.5.0" description = "Manage dynamic plugins for Python applications" category = "dev" optional = false @@ -2019,7 +2032,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tomli" -version = "1.2.1" +version = "1.2.2" description = "A lil' TOML parser" category = "dev" optional = false @@ -2103,7 +2116,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.8.1" +version = "20.10.0" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -2112,14 +2125,14 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [package.dependencies] "backports.entry-points-selectable" = ">=1.0.4" distlib = ">=0.3.1,<1" -filelock = ">=3.0.0,<4" +filelock = ">=3.2,<4" importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} importlib-resources = {version = ">=1.0", markers = "python_version < \"3.7\""} platformdirs = ">=2,<3" six = ">=1.9.0,<2" [package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] +docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] [[package]] @@ -2166,7 +2179,7 @@ watchdog = ["watchdog"] [[package]] name = "wrapt" -version = "1.13.2" +version = "1.13.3" description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false @@ -2203,7 +2216,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "yarl" -version = "1.7.0" +version = "1.7.2" description = "Yet another URL library" category = "dev" optional = false @@ -2232,55 +2245,94 @@ sqlserver = ["pyodbc"] [metadata] lock-version = "1.1" python-versions = ">=3.6.2, <3.10" -content-hash = "7b90e239333fa0c8a3bc9ccd0fa96580150ed862d286981dd6da88aa2f2b6af2" +content-hash = "74d02d68cbb9b232b4af30b65fc9f18dccca30dd14cd471c9d262255c2a6be07" [metadata.files] aiobotocore = [ {file = "aiobotocore-1.4.2.tar.gz", hash = "sha256:c2f4ef325aaa839e9e2a53346b4c1c203656783a4985ab36fd4c2a9ef2dc1d2b"}, ] aiohttp = [ - {file = "aiohttp-3.7.4.post0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5"}, - {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8"}, - {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95"}, - {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:393f389841e8f2dfc86f774ad22f00923fdee66d238af89b70ea314c4aefd290"}, - {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:c6e9dcb4cb338d91a73f178d866d051efe7c62a7166653a91e7d9fb18274058f"}, - {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:5df68496d19f849921f05f14f31bd6ef53ad4b00245da3195048c69934521809"}, - {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:0563c1b3826945eecd62186f3f5c7d31abb7391fedc893b7e2b26303b5a9f3fe"}, - {file = "aiohttp-3.7.4.post0-cp36-cp36m-win32.whl", hash = "sha256:3d78619672183be860b96ed96f533046ec97ca067fd46ac1f6a09cd9b7484287"}, - {file = "aiohttp-3.7.4.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:f705e12750171c0ab4ef2a3c76b9a4024a62c4103e3a55dd6f99265b9bc6fcfc"}, - {file = "aiohttp-3.7.4.post0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:230a8f7e24298dea47659251abc0fd8b3c4e38a664c59d4b89cca7f6c09c9e87"}, - {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2e19413bf84934d651344783c9f5e22dee452e251cfd220ebadbed2d9931dbf0"}, - {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e4b2b334e68b18ac9817d828ba44d8fcb391f6acb398bcc5062b14b2cbeac970"}, - {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:d012ad7911653a906425d8473a1465caa9f8dea7fcf07b6d870397b774ea7c0f"}, - {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:40eced07f07a9e60e825554a31f923e8d3997cfc7fb31dbc1328c70826e04cde"}, - {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:209b4a8ee987eccc91e2bd3ac36adee0e53a5970b8ac52c273f7f8fd4872c94c"}, - {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:14762875b22d0055f05d12abc7f7d61d5fd4fe4642ce1a249abdf8c700bf1fd8"}, - {file = "aiohttp-3.7.4.post0-cp37-cp37m-win32.whl", hash = "sha256:7615dab56bb07bff74bc865307aeb89a8bfd9941d2ef9d817b9436da3a0ea54f"}, - {file = "aiohttp-3.7.4.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:d9e13b33afd39ddeb377eff2c1c4f00544e191e1d1dee5b6c51ddee8ea6f0cf5"}, - {file = "aiohttp-3.7.4.post0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:547da6cacac20666422d4882cfcd51298d45f7ccb60a04ec27424d2f36ba3eaf"}, - {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:af9aa9ef5ba1fd5b8c948bb11f44891968ab30356d65fd0cc6707d989cd521df"}, - {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:64322071e046020e8797117b3658b9c2f80e3267daec409b350b6a7a05041213"}, - {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bb437315738aa441251214dad17428cafda9cdc9729499f1d6001748e1d432f4"}, - {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:e54962802d4b8b18b6207d4a927032826af39395a3bd9196a5af43fc4e60b009"}, - {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:a00bb73540af068ca7390e636c01cbc4f644961896fa9363154ff43fd37af2f5"}, - {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:79ebfc238612123a713a457d92afb4096e2148be17df6c50fb9bf7a81c2f8013"}, - {file = "aiohttp-3.7.4.post0-cp38-cp38-win32.whl", hash = "sha256:515dfef7f869a0feb2afee66b957cc7bbe9ad0cdee45aec7fdc623f4ecd4fb16"}, - {file = "aiohttp-3.7.4.post0-cp38-cp38-win_amd64.whl", hash = "sha256:114b281e4d68302a324dd33abb04778e8557d88947875cbf4e842c2c01a030c5"}, - {file = "aiohttp-3.7.4.post0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:7b18b97cf8ee5452fa5f4e3af95d01d84d86d32c5e2bfa260cf041749d66360b"}, - {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:15492a6368d985b76a2a5fdd2166cddfea5d24e69eefed4630cbaae5c81d89bd"}, - {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bdb230b4943891321e06fc7def63c7aace16095be7d9cf3b1e01be2f10fba439"}, - {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:cffe3ab27871bc3ea47df5d8f7013945712c46a3cc5a95b6bee15887f1675c22"}, - {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a"}, - {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:a5ca29ee66f8343ed336816c553e82d6cade48a3ad702b9ffa6125d187e2dedb"}, - {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:17c073de315745a1510393a96e680d20af8e67e324f70b42accbd4cb3315c9fb"}, - {file = "aiohttp-3.7.4.post0-cp39-cp39-win32.whl", hash = "sha256:932bb1ea39a54e9ea27fc9232163059a0b8855256f4052e776357ad9add6f1c9"}, - {file = "aiohttp-3.7.4.post0-cp39-cp39-win_amd64.whl", hash = "sha256:02f46fc0e3c5ac58b80d4d56eb0a7c7d97fcef69ace9326289fb9f1955e65cfe"}, - {file = "aiohttp-3.7.4.post0.tar.gz", hash = "sha256:493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf"}, + {file = "aiohttp-3.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:48f218a5257b6bc16bcf26a91d97ecea0c7d29c811a90d965f3dd97c20f016d6"}, + {file = "aiohttp-3.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a2fee4d656a7cc9ab47771b2a9e8fad8a9a33331c1b59c3057ecf0ac858f5bfe"}, + {file = "aiohttp-3.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:688a1eb8c1a5f7e795c7cb67e0fe600194e6723ba35f138dfae0db20c0cb8f94"}, + {file = "aiohttp-3.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ba09bb3dcb0b7ec936a485db2b64be44fe14cdce0a5eac56f50e55da3627385"}, + {file = "aiohttp-3.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7715daf84f10bcebc083ad137e3eced3e1c8e7fa1f096ade9a8d02b08f0d91c"}, + {file = "aiohttp-3.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e3f81fbbc170418e22918a9585fd7281bbc11d027064d62aa4b507552c92671"}, + {file = "aiohttp-3.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1fa9f50aa1f114249b7963c98e20dc35c51be64096a85bc92433185f331de9cc"}, + {file = "aiohttp-3.8.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8a50150419b741ee048b53146c39c47053f060cb9d98e78be08fdbe942eaa3c4"}, + {file = "aiohttp-3.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a84c335337b676d832c1e2bc47c3a97531b46b82de9f959dafb315cbcbe0dfcd"}, + {file = "aiohttp-3.8.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:88d4917c30fcd7f6404fb1dc713fa21de59d3063dcc048f4a8a1a90e6bbbd739"}, + {file = "aiohttp-3.8.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b76669b7c058b8020b11008283c3b8e9c61bfd978807c45862956119b77ece45"}, + {file = "aiohttp-3.8.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:84fe1732648c1bc303a70faa67cbc2f7f2e810c8a5bca94f6db7818e722e4c0a"}, + {file = "aiohttp-3.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:730b7c2b7382194d9985ffdc32ab317e893bca21e0665cb1186bdfbb4089d990"}, + {file = "aiohttp-3.8.0-cp310-cp310-win32.whl", hash = "sha256:0a96473a1f61d7920a9099bc8e729dc8282539d25f79c12573ee0fdb9c8b66a8"}, + {file = "aiohttp-3.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:764c7c6aa1f78bd77bd9674fc07d1ec44654da1818d0eef9fb48aa8371a3c847"}, + {file = "aiohttp-3.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9951c2696c4357703001e1fe6edc6ae8e97553ac630492ea1bf64b429cb712a3"}, + {file = "aiohttp-3.8.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0af379221975054162959e00daf21159ff69a712fc42ed0052caddbd70d52ff4"}, + {file = "aiohttp-3.8.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9689af0f0a89e5032426c143fa3683b0451f06c83bf3b1e27902bd33acfae769"}, + {file = "aiohttp-3.8.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe4a327da0c6b6e59f2e474ae79d6ee7745ac3279fd15f200044602fa31e3d79"}, + {file = "aiohttp-3.8.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ecb314e59bedb77188017f26e6b684b1f6d0465e724c3122a726359fa62ca1ba"}, + {file = "aiohttp-3.8.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a5399a44a529083951b55521cf4ecbf6ad79fd54b9df57dbf01699ffa0549fc9"}, + {file = "aiohttp-3.8.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:09754a0d5eaab66c37591f2f8fac8f9781a5f61d51aa852a3261c4805ca6b984"}, + {file = "aiohttp-3.8.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:adf0cb251b1b842c9dee5cfcdf880ba0aae32e841b8d0e6b6feeaef002a267c5"}, + {file = "aiohttp-3.8.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:a4759e85a191de58e0ea468ab6fd9c03941986eee436e0518d7a9291fab122c8"}, + {file = "aiohttp-3.8.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:28369fe331a59d80393ec82df3d43307c7461bfaf9217999e33e2acc7984ff7c"}, + {file = "aiohttp-3.8.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2f44d1b1c740a9e2275160d77c73a11f61e8a916191c572876baa7b282bcc934"}, + {file = "aiohttp-3.8.0-cp36-cp36m-win32.whl", hash = "sha256:e27cde1e8d17b09730801ce97b6e0c444ba2a1f06348b169fd931b51d3402f0d"}, + {file = "aiohttp-3.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:15a660d06092b7c92ed17c1dbe6c1eab0a02963992d60e3e8b9d5fa7fa81f01e"}, + {file = "aiohttp-3.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:257f4fad1714d26d562572095c8c5cd271d5a333252795cb7a002dca41fdbad7"}, + {file = "aiohttp-3.8.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6074a3b2fa2d0c9bf0963f8dfc85e1e54a26114cc8594126bc52d3fa061c40e"}, + {file = "aiohttp-3.8.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a315ceb813208ef32bdd6ec3a85cbe3cb3be9bbda5fd030c234592fa9116993"}, + {file = "aiohttp-3.8.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a52b141ff3b923a9166595de6e3768a027546e75052ffba267d95b54267f4ab"}, + {file = "aiohttp-3.8.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a038cb1e6e55b26bb5520ccffab7f539b3786f5553af2ee47eb2ec5cbd7084e"}, + {file = "aiohttp-3.8.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98b1ea2763b33559dd9ec621d67fc17b583484cb90735bfb0ec3614c17b210e4"}, + {file = "aiohttp-3.8.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9e8723c3256641e141cd18f6ce478d54a004138b9f1a36e41083b36d9ecc5fc5"}, + {file = "aiohttp-3.8.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:14a6f026eca80dfa3d52e86be89feb5cd878f6f4a6adb34457e2c689fd85229b"}, + {file = "aiohttp-3.8.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c62d4791a8212c885b97a63ef5f3974b2cd41930f0cd224ada9c6ee6654f8150"}, + {file = "aiohttp-3.8.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:90a97c2ed2830e7974cbe45f0838de0aefc1c123313f7c402e21c29ec063fbb4"}, + {file = "aiohttp-3.8.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dcc4d5dd5fba3affaf4fd08f00ef156407573de8c63338787614ccc64f96b321"}, + {file = "aiohttp-3.8.0-cp37-cp37m-win32.whl", hash = "sha256:de42f513ed7a997bc821bddab356b72e55e8396b1b7ba1bf39926d538a76a90f"}, + {file = "aiohttp-3.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7d76e8a83396e06abe3df569b25bd3fc88bf78b7baa2c8e4cf4aaf5983af66a3"}, + {file = "aiohttp-3.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d79174d96446a02664e2bffc95e7b6fa93b9e6d8314536c5840dff130d0878b"}, + {file = "aiohttp-3.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a6551057a846bf72c7a04f73de3fcaca269c0bd85afe475ceb59d261c6a938c"}, + {file = "aiohttp-3.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:871d4fdc56288caa58b1094c20f2364215f7400411f76783ea19ad13be7c8e19"}, + {file = "aiohttp-3.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ba08a71caa42eef64357257878fb17f3fba3fba6e81a51d170e32321569e079"}, + {file = "aiohttp-3.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51f90dabd9933b1621260b32c2f0d05d36923c7a5a909eb823e429dba0fd2f3e"}, + {file = "aiohttp-3.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f348ebd20554e8bc26e8ef3ed8a134110c0f4bf015b3b4da6a4ddf34e0515b19"}, + {file = "aiohttp-3.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d5f8c04574efa814a24510122810e3a3c77c0552f9f6ff65c9862f1f046be2c3"}, + {file = "aiohttp-3.8.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ecffdc748d3b40dd3618ede0170e4f5e1d3c9647cfb410d235d19e62cb54ee0"}, + {file = "aiohttp-3.8.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:577cc2c7b807b174814dac2d02e673728f2e46c7f90ceda3a70ea4bb6d90b769"}, + {file = "aiohttp-3.8.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6b79f6c31e68b6dafc0317ec453c83c86dd8db1f8f0c6f28e97186563fca87a0"}, + {file = "aiohttp-3.8.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:2bdd655732e38b40f8a8344d330cfae3c727fb257585df923316aabbd489ccb8"}, + {file = "aiohttp-3.8.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:63fa57a0708573d3c059f7b5527617bd0c291e4559298473df238d502e4ab98c"}, + {file = "aiohttp-3.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d3f90ee275b1d7c942e65b5c44c8fb52d55502a0b9a679837d71be2bd8927661"}, + {file = "aiohttp-3.8.0-cp38-cp38-win32.whl", hash = "sha256:fa818609357dde5c4a94a64c097c6404ad996b1d38ca977a72834b682830a722"}, + {file = "aiohttp-3.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:097ecf52f6b9859b025c1e36401f8aa4573552e887d1b91b4b999d68d0b5a3b3"}, + {file = "aiohttp-3.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:be03a7483ad9ea60388f930160bb3728467dd0af538aa5edc60962ee700a0bdc"}, + {file = "aiohttp-3.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:78d51e35ed163783d721b6f2ce8ce3f82fccfe471e8e50a10fba13a766d31f5a"}, + {file = "aiohttp-3.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bda75d73e7400e81077b0910c9a60bf9771f715420d7e35fa7739ae95555f195"}, + {file = "aiohttp-3.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:707adc30ea6918fba725c3cb3fe782d271ba352b22d7ae54a7f9f2e8a8488c41"}, + {file = "aiohttp-3.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f58aa995b905ab82fe228acd38538e7dc1509e01508dcf307dad5046399130f"}, + {file = "aiohttp-3.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c996eb91bfbdab1e01e2c02e7ff678c51e2b28e3a04e26e41691991cc55795"}, + {file = "aiohttp-3.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d6a1a66bb8bac9bc2892c2674ea363486bfb748b86504966a390345a11b1680e"}, + {file = "aiohttp-3.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dafc01a32b4a1d7d3ef8bfd3699406bb44f7b2e0d3eb8906d574846e1019b12f"}, + {file = "aiohttp-3.8.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:949a605ef3907254b122f845baa0920407080cdb1f73aa64f8d47df4a7f4c4f9"}, + {file = "aiohttp-3.8.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0d7b056fd3972d353cb4bc305c03f9381583766b7f8c7f1c44478dba69099e33"}, + {file = "aiohttp-3.8.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f1d39a744101bf4043fa0926b3ead616607578192d0a169974fb5265ab1e9d2"}, + {file = "aiohttp-3.8.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:67ca7032dfac8d001023fadafc812d9f48bf8a8c3bb15412d9cdcf92267593f4"}, + {file = "aiohttp-3.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cb751ef712570d3bda9a73fd765ff3e1aba943ec5d52a54a0c2e89c7eef9da1e"}, + {file = "aiohttp-3.8.0-cp39-cp39-win32.whl", hash = "sha256:6d3e027fe291b77f6be9630114a0200b2c52004ef20b94dc50ca59849cd623b3"}, + {file = "aiohttp-3.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:3c5e9981e449d54308c6824f172ec8ab63eb9c5f922920970249efee83f7e919"}, + {file = "aiohttp-3.8.0.tar.gz", hash = "sha256:d3b19d8d183bcfd68b25beebab8dc3308282fe2ca3d6ea3cb4cd101b3c279f8d"}, ] aioitertools = [ {file = "aioitertools-0.8.0-py3-none-any.whl", hash = "sha256:3a141f01d1050ac8c01917aee248d262736dab875ce0471f0dba5f619346b452"}, {file = "aioitertools-0.8.0.tar.gz", hash = "sha256:8b02facfbc9b0f1867739949a223f3d3267ed8663691cc95abd94e2c1d8c2b46"}, ] +aiosignal = [ + {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, + {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, +] alabaster = [ {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, @@ -2311,16 +2363,20 @@ asn1crypto = [ {file = "asn1crypto-1.4.0.tar.gz", hash = "sha256:f4f6e119474e58e04a2b1af817eb585b4fd72bdd89b998624712b5c99be7641c"}, ] astroid = [ - {file = "astroid-2.8.3-py3-none-any.whl", hash = "sha256:f9d66e3a4a0e5b52819b2ff41ac2b179df9d180697db71c92beb33a60c661794"}, - {file = "astroid-2.8.3.tar.gz", hash = "sha256:0e361da0744d5011d4f5d57e64473ba9b7ab4da1e2d45d6631ebd67dd28c3cce"}, + {file = "astroid-2.8.4-py3-none-any.whl", hash = "sha256:0755c998e7117078dcb7d0bda621391dd2a85da48052d948c7411ab187325346"}, + {file = "astroid-2.8.4.tar.gz", hash = "sha256:1e83a69fd51b013ebf5912d26b9338d6643a55fec2f20c787792680610eed4a2"}, ] async-generator = [ {file = "async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b"}, {file = "async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144"}, ] async-timeout = [ - {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, - {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, + {file = "async-timeout-4.0.0.tar.gz", hash = "sha256:7d87a4e8adba8ededb52e579ce6bc8276985888913620c935094c2276fd83382"}, + {file = "async_timeout-4.0.0-py3-none-any.whl", hash = "sha256:f3303dddf6cafa748a92747ab6c2ecf60e0aeca769aee4c151adfce243a05d9b"}, +] +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"}, @@ -2347,8 +2403,8 @@ beautifulsoup4 = [ {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, ] black = [ - {file = "black-21.9b0-py3-none-any.whl", hash = "sha256:380f1b5da05e5a1429225676655dddb96f5ae8c75bdf91e53d798871b902a115"}, - {file = "black-21.9b0.tar.gz", hash = "sha256:7de4cfc7eb6b710de325712d40125689101d21d25283eed7e9998722cf10eb91"}, + {file = "black-21.10b0-py3-none-any.whl", hash = "sha256:6eb7448da9143ee65b856a5f3676b7dda98ad9abe0f87fce8c59291f15e82a5b"}, + {file = "black-21.10b0.tar.gz", hash = "sha256:a9952229092e325fe5f3dae56d81f639b23f7131eb840781947e4b2886030f33"}, ] bleach = [ {file = "bleach-4.1.0-py2.py3-none-any.whl", hash = "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994"}, @@ -2422,10 +2478,6 @@ cffi = [ {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, ] -chardet = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, -] charset-normalizer = [ {file = "charset-normalizer-2.0.7.tar.gz", hash = "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0"}, {file = "charset_normalizer-2.0.7-py3-none-any.whl", hash = "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"}, @@ -2442,39 +2494,52 @@ contextvars = [ {file = "contextvars-2.4.tar.gz", hash = "sha256:f38c908aaa59c14335eeea12abea5f443646216c4e29380d7bf34d2018e2c39e"}, ] coverage = [ - {file = "coverage-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1549e1d08ce38259de2bc3e9a0d5f3642ff4a8f500ffc1b2df73fd621a6cdfc0"}, - {file = "coverage-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcae10fccb27ca2a5f456bf64d84110a5a74144be3136a5e598f9d9fb48c0caa"}, - {file = "coverage-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:53a294dc53cfb39c74758edaa6305193fb4258a30b1f6af24b360a6c8bd0ffa7"}, - {file = "coverage-6.0.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8251b37be1f2cd9c0e5ccd9ae0380909c24d2a5ed2162a41fcdbafaf59a85ebd"}, - {file = "coverage-6.0.2-cp310-cp310-win32.whl", hash = "sha256:db42baa892cba723326284490283a68d4de516bfb5aaba369b4e3b2787a778b7"}, - {file = "coverage-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:bbffde2a68398682623d9dd8c0ca3f46fda074709b26fcf08ae7a4c431a6ab2d"}, - {file = "coverage-6.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:60e51a3dd55540bec686d7fff61b05048ca31e804c1f32cbb44533e6372d9cc3"}, - {file = "coverage-6.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a6a9409223a27d5ef3cca57dd7cd4dfcb64aadf2fad5c3b787830ac9223e01a"}, - {file = "coverage-6.0.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4b34ae4f51bbfa5f96b758b55a163d502be3dcb24f505d0227858c2b3f94f5b9"}, - {file = "coverage-6.0.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3bbda1b550e70fa6ac40533d3f23acd4f4e9cb4e6e77251ce77fdf41b3309fb2"}, - {file = "coverage-6.0.2-cp36-cp36m-win32.whl", hash = "sha256:4e28d2a195c533b58fc94a12826f4431726d8eb029ac21d874345f943530c122"}, - {file = "coverage-6.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a82d79586a0a4f5fd1cf153e647464ced402938fbccb3ffc358c7babd4da1dd9"}, - {file = "coverage-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3be1206dc09fb6298de3fce70593e27436862331a85daee36270b6d0e1c251c4"}, - {file = "coverage-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9cd3828bbe1a40070c11fe16a51df733fd2f0cb0d745fb83b7b5c1f05967df7"}, - {file = "coverage-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d036dc1ed8e1388e995833c62325df3f996675779541f682677efc6af71e96cc"}, - {file = "coverage-6.0.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:04560539c19ec26995ecfb3d9307ff154fbb9a172cb57e3b3cfc4ced673103d1"}, - {file = "coverage-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:e4fb7ced4d9dec77d6cf533acfbf8e1415fe799430366affb18d69ee8a3c6330"}, - {file = "coverage-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:77b1da5767ed2f44611bc9bc019bc93c03fa495728ec389759b6e9e5039ac6b1"}, - {file = "coverage-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61b598cbdbaae22d9e34e3f675997194342f866bb1d781da5d0be54783dce1ff"}, - {file = "coverage-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36e9040a43d2017f2787b28d365a4bb33fcd792c7ff46a047a04094dc0e2a30d"}, - {file = "coverage-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9f1627e162e3864a596486774876415a7410021f4b67fd2d9efdf93ade681afc"}, - {file = "coverage-6.0.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e7a0b42db2a47ecb488cde14e0f6c7679a2c5a9f44814393b162ff6397fcdfbb"}, - {file = "coverage-6.0.2-cp38-cp38-win32.whl", hash = "sha256:a1b73c7c4d2a42b9d37dd43199c5711d91424ff3c6c22681bc132db4a4afec6f"}, - {file = "coverage-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:1db67c497688fd4ba85b373b37cc52c50d437fd7267520ecd77bddbd89ea22c9"}, - {file = "coverage-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f2f184bf38e74f152eed7f87e345b51f3ab0b703842f447c22efe35e59942c24"}, - {file = "coverage-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1cf1deb3d5544bd942356364a2fdc8959bad2b6cf6eb17f47d301ea34ae822"}, - {file = "coverage-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ad9b8c1206ae41d46ec7380b78ba735ebb77758a650643e841dd3894966c31d0"}, - {file = "coverage-6.0.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:381d773d896cc7f8ba4ff3b92dee4ed740fb88dfe33b6e42efc5e8ab6dfa1cfe"}, - {file = "coverage-6.0.2-cp39-cp39-win32.whl", hash = "sha256:424c44f65e8be58b54e2b0bd1515e434b940679624b1b72726147cfc6a9fc7ce"}, - {file = "coverage-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:abbff240f77347d17306d3201e14431519bf64495648ca5a49571f988f88dee9"}, - {file = "coverage-6.0.2-pp36-none-any.whl", hash = "sha256:7092eab374346121805fb637572483270324407bf150c30a3b161fc0c4ca5164"}, - {file = "coverage-6.0.2-pp37-none-any.whl", hash = "sha256:30922626ce6f7a5a30bdba984ad21021529d3d05a68b4f71ea3b16bda35b8895"}, - {file = "coverage-6.0.2.tar.gz", hash = "sha256:6807947a09510dc31fa86f43595bf3a14017cd60bf633cc746d52141bfa6b149"}, + {file = "coverage-6.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:42a1fb5dee3355df90b635906bb99126faa7936d87dfc97eacc5293397618cb7"}, + {file = "coverage-6.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a00284dbfb53b42e35c7dd99fc0e26ef89b4a34efff68078ed29d03ccb28402a"}, + {file = "coverage-6.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:51a441011a30d693e71dea198b2a6f53ba029afc39f8e2aeb5b77245c1b282ef"}, + {file = "coverage-6.1.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e76f017b6d4140a038c5ff12be1581183d7874e41f1c0af58ecf07748d36a336"}, + {file = "coverage-6.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7833c872718dc913f18e51ee97ea0dece61d9930893a58b20b3daf09bb1af6b6"}, + {file = "coverage-6.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8186b5a4730c896cbe1e4b645bdc524e62d874351ae50e1db7c3e9f5dc81dc26"}, + {file = "coverage-6.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bbca34dca5a2d60f81326d908d77313816fad23d11b6069031a3d6b8c97a54f9"}, + {file = "coverage-6.1.1-cp310-cp310-win32.whl", hash = "sha256:72bf437d54186d104388cbae73c9f2b0f8a3e11b6e8d7deb593bd14625c96026"}, + {file = "coverage-6.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:994ce5a7b3d20981b81d83618aa4882f955bfa573efdbef033d5632b58597ba9"}, + {file = "coverage-6.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ab6a0fe4c96f8058d41948ddf134420d3ef8c42d5508b5a341a440cce7a37a1d"}, + {file = "coverage-6.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10ab138b153e4cc408b43792cb7f518f9ee02f4ff55cd1ab67ad6fd7e9905c7e"}, + {file = "coverage-6.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7e083d32965d2eb6638a77e65b622be32a094fdc0250f28ce6039b0732fbcaa8"}, + {file = "coverage-6.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:359a32515e94e398a5c0fa057e5887a42e647a9502d8e41165cf5cb8d3d1ca67"}, + {file = "coverage-6.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:bf656cd74ff7b4ed7006cdb2a6728150aaad69c7242b42a2a532f77b63ea233f"}, + {file = "coverage-6.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:dc5023be1c2a8b0a0ab5e31389e62c28b2453eb31dd069f4b8d1a0f9814d951a"}, + {file = "coverage-6.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:557594a50bfe3fb0b1b57460f6789affe8850ad19c1acf2d14a3e12b2757d489"}, + {file = "coverage-6.1.1-cp36-cp36m-win32.whl", hash = "sha256:9eb0a1923354e0fdd1c8a6f53f5db2e6180d670e2b587914bf2e79fa8acfd003"}, + {file = "coverage-6.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:04a92a6cf9afd99f9979c61348ec79725a9f9342fb45e63c889e33c04610d97b"}, + {file = "coverage-6.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:479228e1b798d3c246ac89b09897ee706c51b3e5f8f8d778067f38db73ccc717"}, + {file = "coverage-6.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78287731e3601ea5ce9d6468c82d88a12ef8fe625d6b7bdec9b45d96c1ad6533"}, + {file = "coverage-6.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c95257aa2ccf75d3d91d772060538d5fea7f625e48157f8ca44594f94d41cb33"}, + {file = "coverage-6.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9ad5895938a894c368d49d8470fe9f519909e5ebc6b8f8ea5190bd0df6aa4271"}, + {file = "coverage-6.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:326d944aad0189603733d646e8d4a7d952f7145684da973c463ec2eefe1387c2"}, + {file = "coverage-6.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e7d5606b9240ed4def9cbdf35be4308047d11e858b9c88a6c26974758d6225ce"}, + {file = "coverage-6.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:572f917267f363101eec375c109c9c1118037c7cc98041440b5eabda3185ac7b"}, + {file = "coverage-6.1.1-cp37-cp37m-win32.whl", hash = "sha256:35cd2230e1ed76df7d0081a997f0fe705be1f7d8696264eb508076e0d0b5a685"}, + {file = "coverage-6.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:65ad3ff837c89a229d626b8004f0ee32110f9bfdb6a88b76a80df36ccc60d926"}, + {file = "coverage-6.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:977ce557d79577a3dd510844904d5d968bfef9489f512be65e2882e1c6eed7d8"}, + {file = "coverage-6.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62512c0ec5d307f56d86504c58eace11c1bc2afcdf44e3ff20de8ca427ca1d0e"}, + {file = "coverage-6.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2e5b9c17a56b8bf0c0a9477fcd30d357deb486e4e1b389ed154f608f18556c8a"}, + {file = "coverage-6.1.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:666c6b32b69e56221ad1551d377f718ed00e6167c7a1b9257f780b105a101271"}, + {file = "coverage-6.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fb2fa2f6506c03c48ca42e3fe5a692d7470d290c047ee6de7c0f3e5fa7639ac9"}, + {file = "coverage-6.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f0f80e323a17af63eac6a9db0c9188c10f1fd815c3ab299727150cc0eb92c7a4"}, + {file = "coverage-6.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:738e823a746841248b56f0f3bd6abf3b73af191d1fd65e4c723b9c456216f0ad"}, + {file = "coverage-6.1.1-cp38-cp38-win32.whl", hash = "sha256:8605add58e6a960729aa40c0fd9a20a55909dd9b586d3e8104cc7f45869e4c6b"}, + {file = "coverage-6.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:6e994003e719458420e14ffb43c08f4c14990e20d9e077cb5cad7a3e419bbb54"}, + {file = "coverage-6.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e3c4f5211394cd0bf6874ac5d29684a495f9c374919833dcfff0bd6d37f96201"}, + {file = "coverage-6.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e14bceb1f3ae8a14374be2b2d7bc12a59226872285f91d66d301e5f41705d4d6"}, + {file = "coverage-6.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0147f7833c41927d84f5af9219d9b32f875c0689e5e74ac8ca3cb61e73a698f9"}, + {file = "coverage-6.1.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b1d0a1bce919de0dd8da5cff4e616b2d9e6ebf3bd1410ff645318c3dd615010a"}, + {file = "coverage-6.1.1-cp39-cp39-win32.whl", hash = "sha256:a11a2c019324fc111485e79d55907e7289e53d0031275a6c8daed30690bc50c0"}, + {file = "coverage-6.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:4d8b453764b9b26b0dd2afb83086a7c3f9379134e340288d2a52f8a91592394b"}, + {file = "coverage-6.1.1-pp36-none-any.whl", hash = "sha256:3b270c6b48d3ff5a35deb3648028ba2643ad8434b07836782b1139cf9c66313f"}, + {file = "coverage-6.1.1-pp37-none-any.whl", hash = "sha256:ffa8fee2b1b9e60b531c4c27cf528d6b5d5da46b1730db1f4d6eee56ff282e07"}, + {file = "coverage-6.1.1-pp38-none-any.whl", hash = "sha256:4cd919057636f63ab299ccb86ea0e78b87812400c76abab245ca385f17d19fb5"}, + {file = "coverage-6.1.1.tar.gz", hash = "sha256:b8e4f15b672c9156c1154249a9c5746e86ac9ae9edc3799ee3afebc323d9d9e0"}, ] cryptography = [ {file = "cryptography-35.0.0-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:d57e0cdc1b44b6cdf8af1d01807db06886f10177469312fbde8f44ccbb284bc9"}, @@ -2535,13 +2600,87 @@ execnet = [ {file = "execnet-1.9.0.tar.gz", hash = "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"}, ] filelock = [ - {file = "filelock-3.3.1-py3-none-any.whl", hash = "sha256:2b5eb3589e7fdda14599e7eb1a50e09b4cc14f34ed98b8ba56d33bfaafcbef2f"}, - {file = "filelock-3.3.1.tar.gz", hash = "sha256:34a9f35f95c441e7b38209775d6e0337f9a3759f3565f6c5798f19618527c76f"}, + {file = "filelock-3.3.2-py3-none-any.whl", hash = "sha256:bb2a1c717df74c48a2d00ed625e5a66f8572a3a30baacb7657add1d7bac4097b"}, + {file = "filelock-3.3.2.tar.gz", hash = "sha256:7afc856f74fa7006a289fd10fa840e1eebd8bbff6bffb69c26c54a0512ea8cf8"}, ] flake8 = [ {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.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:977a1438d0e0d96573fd679d291a1542097ea9f4918a8b6494b06610dfeefbf9"}, + {file = "frozenlist-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8d86547a5e98d9edd47c432f7a14b0c5592624b496ae9880fb6332f34af1edc"}, + {file = "frozenlist-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:181754275d5d32487431a0a29add4f897968b7157204bc1eaaf0a0ce80c5ba7d"}, + {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5df31bb2b974f379d230a25943d9bf0d3bc666b4b0807394b131a28fca2b0e5f"}, + {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4766632cd8a68e4f10f156a12c9acd7b1609941525569dd3636d859d79279ed3"}, + {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16eef427c51cb1203a7c0ab59d1b8abccaba9a4f58c4bfca6ed278fc896dc193"}, + {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:01d79515ed5aa3d699b05f6bdcf1fe9087d61d6b53882aa599a10853f0479c6c"}, + {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:28e164722ea0df0cf6d48c4d5bdf3d19e87aaa6dfb39b0ba91153f224b912020"}, + {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e63ad0beef6ece06475d29f47d1f2f29727805376e09850ebf64f90777962792"}, + {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41de4db9b9501679cf7cddc16d07ac0f10ef7eb58c525a1c8cbff43022bddca4"}, + {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a9d84ee6427b65a81fc24e6ef589cb794009f5ca4150151251c062773e7ed2"}, + {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:f5f3b2942c3b8b9bfe76b408bbaba3d3bb305ee3693e8b1d631fe0a0d4f93673"}, + {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c98d3c04701773ad60d9545cd96df94d955329efc7743fdb96422c4b669c633b"}, + {file = "frozenlist-1.2.0-cp310-cp310-win32.whl", hash = "sha256:72cfbeab7a920ea9e74b19aa0afe3b4ad9c89471e3badc985d08756efa9b813b"}, + {file = "frozenlist-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:11ff401951b5ac8c0701a804f503d72c048173208490c54ebb8d7bb7c07a6d00"}, + {file = "frozenlist-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b46f997d5ed6d222a863b02cdc9c299101ee27974d9bbb2fd1b3c8441311c408"}, + {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:351686ca020d1bcd238596b1fa5c8efcbc21bffda9d0efe237aaa60348421e2a"}, + {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfbaa08cf1452acad9cb1c1d7b89394a41e712f88df522cea1a0f296b57782a0"}, + {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2ae2f5e9fa10805fb1c9adbfefaaecedd9e31849434be462c3960a0139ed729"}, + {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6790b8d96bbb74b7a6f4594b6f131bd23056c25f2aa5d816bd177d95245a30e3"}, + {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:41f62468af1bd4e4b42b5508a3fe8cc46a693f0cdd0ca2f443f51f207893d837"}, + {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:ec6cf345771cdb00791d271af9a0a6fbfc2b6dd44cb753f1eeaa256e21622adb"}, + {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:14a5cef795ae3e28fb504b73e797c1800e9249f950e1c964bb6bdc8d77871161"}, + {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8b54cdd2fda15467b9b0bfa78cee2ddf6dbb4585ef23a16e14926f4b076dfae4"}, + {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f025f1d6825725b09c0038775acab9ae94264453a696cc797ce20c0769a7b367"}, + {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:84e97f59211b5b9083a2e7a45abf91cfb441369e8bb6d1f5287382c1c526def3"}, + {file = "frozenlist-1.2.0-cp36-cp36m-win32.whl", hash = "sha256:c5328ed53fdb0a73c8a50105306a3bc013e5ca36cca714ec4f7bd31d38d8a97f"}, + {file = "frozenlist-1.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9ade70aea559ca98f4b1b1e5650c45678052e76a8ab2f76d90f2ac64180215a2"}, + {file = "frozenlist-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0d3ffa8772464441b52489b985d46001e2853a3b082c655ec5fad9fb6a3d618"}, + {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3457f8cf86deb6ce1ba67e120f1b0128fcba1332a180722756597253c465fc1d"}, + {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a72eecf37eface331636951249d878750db84034927c997d47f7f78a573b72b"}, + {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:acc4614e8d1feb9f46dd829a8e771b8f5c4b1051365d02efb27a3229048ade8a"}, + {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:87521e32e18a2223311afc2492ef2d99946337da0779ddcda77b82ee7319df59"}, + {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b4c7665a17c3a5430edb663e4ad4e1ad457614d1b2f2b7f87052e2ef4fa45ca"}, + {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ed58803563a8c87cf4c0771366cf0ad1aa265b6b0ae54cbbb53013480c7ad74d"}, + {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:aa44c4740b4e23fcfa259e9dd52315d2b1770064cde9507457e4c4a65a04c397"}, + {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:2de5b931701257d50771a032bba4e448ff958076380b049fd36ed8738fdb375b"}, + {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:6e105013fa84623c057a4381dc8ea0361f4d682c11f3816cc80f49a1f3bc17c6"}, + {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:705c184b77565955a99dc360f359e8249580c6b7eaa4dc0227caa861ef46b27a"}, + {file = "frozenlist-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:a37594ad6356e50073fe4f60aa4187b97d15329f2138124d252a5a19c8553ea4"}, + {file = "frozenlist-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:25b358aaa7dba5891b05968dd539f5856d69f522b6de0bf34e61f133e077c1a4"}, + {file = "frozenlist-1.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af2a51c8a381d76eabb76f228f565ed4c3701441ecec101dd18be70ebd483cfd"}, + {file = "frozenlist-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:82d22f6e6f2916e837c91c860140ef9947e31194c82aaeda843d6551cec92f19"}, + {file = "frozenlist-1.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cfe6fef507f8bac40f009c85c7eddfed88c1c0d38c75e72fe10476cef94e10f"}, + {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f602e380a5132880fa245c92030abb0fc6ff34e0c5500600366cedc6adb06a"}, + {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ad065b2ebd09f32511ff2be35c5dfafee6192978b5a1e9d279a5c6e121e3b03"}, + {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc93f5f62df3bdc1f677066327fc81f92b83644852a31c6aa9b32c2dde86ea7d"}, + {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:89fdfc84c6bf0bff2ff3170bb34ecba8a6911b260d318d377171429c4be18c73"}, + {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:47b2848e464883d0bbdcd9493c67443e5e695a84694efff0476f9059b4cb6257"}, + {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4f52d0732e56906f8ddea4bd856192984650282424049c956857fed43697ea43"}, + {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:16ef7dd5b7d17495404a2e7a49bac1bc13d6d20c16d11f4133c757dd94c4144c"}, + {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1cf63243bc5f5c19762943b0aa9e0d3fb3723d0c514d820a18a9b9a5ef864315"}, + {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:54a1e09ab7a69f843cd28fefd2bcaf23edb9e3a8d7680032c8968b8ac934587d"}, + {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:954b154a4533ef28bd3e83ffdf4eadf39deeda9e38fb8feaf066d6069885e034"}, + {file = "frozenlist-1.2.0-cp38-cp38-win32.whl", hash = "sha256:cb3957c39668d10e2b486acc85f94153520a23263b6401e8f59422ef65b9520d"}, + {file = "frozenlist-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0a7c7cce70e41bc13d7d50f0e5dd175f14a4f1837a8549b0936ed0cbe6170bf9"}, + {file = "frozenlist-1.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4c457220468d734e3077580a3642b7f682f5fd9507f17ddf1029452450912cdc"}, + {file = "frozenlist-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e74f8b4d8677ebb4015ac01fcaf05f34e8a1f22775db1f304f497f2f88fdc697"}, + {file = "frozenlist-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fbd4844ff111449f3bbe20ba24fbb906b5b1c2384d0f3287c9f7da2354ce6d23"}, + {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0081a623c886197ff8de9e635528fd7e6a387dccef432149e25c13946cb0cd0"}, + {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9b6e21e5770df2dea06cb7b6323fbc008b13c4a4e3b52cb54685276479ee7676"}, + {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:406aeb340613b4b559db78d86864485f68919b7141dec82aba24d1477fd2976f"}, + {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:878ebe074839d649a1cdb03a61077d05760624f36d196884a5cafb12290e187b"}, + {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1fef737fd1388f9b93bba8808c5f63058113c10f4e3c0763ced68431773f72f9"}, + {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a495c3d513573b0b3f935bfa887a85d9ae09f0627cf47cad17d0cc9b9ba5c38"}, + {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e7d0dd3e727c70c2680f5f09a0775525229809f1a35d8552b92ff10b2b14f2c2"}, + {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:66a518731a21a55b7d3e087b430f1956a36793acc15912e2878431c7aec54210"}, + {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:94728f97ddf603d23c8c3dd5cae2644fa12d33116e69f49b1644a71bb77b89ae"}, + {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c1e8e9033d34c2c9e186e58279879d78c94dd365068a3607af33f2bc99357a53"}, + {file = "frozenlist-1.2.0-cp39-cp39-win32.whl", hash = "sha256:83334e84a290a158c0c4cc4d22e8c7cfe0bba5b76d37f1c2509dabd22acafe15"}, + {file = "frozenlist-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:735f386ec522e384f511614c01d2ef9cf799f051353876b4c6fb93ef67a6d1ee"}, + {file = "frozenlist-1.2.0.tar.gz", hash = "sha256:68201be60ac56aff972dc18085800b6ee07973c49103a8aba669dee3d71079de"}, +] fsspec = [ {file = "fsspec-2021.10.1-py3-none-any.whl", hash = "sha256:7164a488f3f5bf6a0fb39674978b756dda84e011a5db411a79791b7c38a36ff7"}, {file = "fsspec-2021.10.1.tar.gz", hash = "sha256:c245626e3cb8de5cd91485840b215a385fa6f2b0f6ab87978305e99e2d842753"}, @@ -2591,8 +2730,8 @@ importlib-metadata = [ {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, ] importlib-resources = [ - {file = "importlib_resources-5.2.3-py3-none-any.whl", hash = "sha256:ae35ed1cfe8c0d6c1a53ecd168167f01fa93b893d51a62cdf23aea044c67211b"}, - {file = "importlib_resources-5.2.3.tar.gz", hash = "sha256:203d70dda34cfbfbb42324a8d4211196e7d3e858de21a5eb68c6d1cdd99e4e98"}, + {file = "importlib_resources-5.4.0-py3-none-any.whl", hash = "sha256:33a95faed5fc19b4bc16b29a6eeae248a3fe69dd55d4d229d2b480e23eeaad45"}, + {file = "importlib_resources-5.4.0.tar.gz", hash = "sha256:d756e2f85dd4de2ba89be0b21dba2a3bbec2e871a42a3a16719258a11f87506b"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -2644,16 +2783,16 @@ jupyter-client = [ {file = "jupyter_client-7.0.6.tar.gz", hash = "sha256:8b6e06000eb9399775e0a55c52df6c1be4766666209c22f90c2691ded0e338dc"}, ] jupyter-core = [ - {file = "jupyter_core-4.8.1-py3-none-any.whl", hash = "sha256:8dd262ec8afae95bd512518eb003bc546b76adbf34bf99410e9accdf4be9aa3a"}, - {file = "jupyter_core-4.8.1.tar.gz", hash = "sha256:ef210dcb4fca04de07f2ead4adf408776aca94d17151d6f750ad6ded0b91ea16"}, + {file = "jupyter_core-4.9.1-py3-none-any.whl", hash = "sha256:1c091f3bbefd6f2a8782f2c1db662ca8478ac240e962ae2c66f0b87c818154ea"}, + {file = "jupyter_core-4.9.1.tar.gz", hash = "sha256:dce8a7499da5a53ae3afd5a9f4b02e5df1d57250cf48f3ad79da23b4778cd6fa"}, ] jupyter-server = [ - {file = "jupyter_server-1.11.1-py3-none-any.whl", hash = "sha256:618aba127b1ff35f50e274b6055dfeff006a6008e94d4e9511c251a2d99131e5"}, - {file = "jupyter_server-1.11.1.tar.gz", hash = "sha256:ab7ab1cc38512f15026cbcbb96300fb46ec8b24aa162263d9edd00e0a749b1e8"}, + {file = "jupyter_server-1.11.2-py3-none-any.whl", hash = "sha256:eb247b555f5bdfb4a219d78e86bc8769456a1a712d8e30a4dbe06e3fe7e8a278"}, + {file = "jupyter_server-1.11.2.tar.gz", hash = "sha256:c1f32e0c1807ab2de37bf70af97a36b4436db0bc8af3124632b1f4441038bf95"}, ] jupyterlab = [ - {file = "jupyterlab-3.2.0-py3-none-any.whl", hash = "sha256:650104613543108b7ad3c2b62ac23f9270ef3bb06adc22a4e1d632e0727efb54"}, - {file = "jupyterlab-3.2.0.tar.gz", hash = "sha256:ff761b4b43db119aeabd25326c775e8c595a05a8ae0a0926845d99f13e5de090"}, + {file = "jupyterlab-3.2.1-py3-none-any.whl", hash = "sha256:6fe0240f1880cde1325072b9ff1ef2f442784de4aed5df1ab802a027c9791f62"}, + {file = "jupyterlab-3.2.1.tar.gz", hash = "sha256:54466941bcd9b52f23373a32038fbb4e50fd652d4536df6179b53e1ffb8ef431"}, ] jupyterlab-pygments = [ {file = "jupyterlab_pygments-0.1.2-py2.py3-none-any.whl", hash = "sha256:abfb880fd1561987efaefcb2d2ac75145d2a5d0139b1876d5be806e32f630008"}, @@ -2784,8 +2923,8 @@ more-itertools = [ {file = "more_itertools-8.10.0-py3-none-any.whl", hash = "sha256:56ddac45541718ba332db05f464bebfb0768110111affd27f66e0051f276fa43"}, ] moto = [ - {file = "moto-2.2.10-py2.py3-none-any.whl", hash = "sha256:d646625c8bcd918d60f1c43dfb902b3166516b623dea91ae3f4bb87d2e10a7a3"}, - {file = "moto-2.2.10.tar.gz", hash = "sha256:2a29da1d06a13a1a5f2dc2bf7742b31f6dc8e71069c7626c2300e18c84bec9e3"}, + {file = "moto-2.2.12-py2.py3-none-any.whl", hash = "sha256:bc6d77f7ff51af7cdecb28975d7a795faac3d04decb99bacfecc603b58a5ce81"}, + {file = "moto-2.2.12.tar.gz", hash = "sha256:e83ff38cbbf901a11b21c344c101f6e18810868145e2e2f8ff34857025f06a5f"}, ] multidict = [ {file = "multidict-5.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3822c5894c72e3b35aae9909bef66ec83e44522faf767c0ad39e0e2de11d3b55"}, @@ -2891,8 +3030,8 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] nbclassic = [ - {file = "nbclassic-0.3.2-py3-none-any.whl", hash = "sha256:57936a39410a18261442ca3b298421f859c9012272b87bf55e17b5507f052f4d"}, - {file = "nbclassic-0.3.2.tar.gz", hash = "sha256:863462bf6a6e0e5e502dcc479ce2ea1edf60437c969f1850d0c0823dba0c39b7"}, + {file = "nbclassic-0.3.4-py3-none-any.whl", hash = "sha256:9c7b7987a148ecdd1827b47fe6f6968b2ddabf663142f81254000cb77ee5bd10"}, + {file = "nbclassic-0.3.4.tar.gz", hash = "sha256:f00b07ef4908fc38fd332d2676ccd3ceea5076528feaf21bd27e809ef20f5578"}, ] nbclient = [ {file = "nbclient-0.5.4-py3-none-any.whl", hash = "sha256:95a300c6fbe73721736cf13972a46d8d666f78794b832866ed7197a504269e11"}, @@ -2919,8 +3058,8 @@ nest-asyncio = [ {file = "nest_asyncio-1.5.1.tar.gz", hash = "sha256:afc5a1c515210a23c461932765691ad39e8eba6551c055ac8d5546e69250d0aa"}, ] notebook = [ - {file = "notebook-6.4.4-py3-none-any.whl", hash = "sha256:33488bdcc5cbef23c3cfa12cd51b0b5459a211945b5053d17405980611818149"}, - {file = "notebook-6.4.4.tar.gz", hash = "sha256:26b0095c568e307a310fd78818ad8ebade4f00462dada4c0e34cbad632b9085d"}, + {file = "notebook-6.4.5-py3-none-any.whl", hash = "sha256:f7b4362698fed34f44038de0517b2e5136c1e7c379797198c1736121d3d597bd"}, + {file = "notebook-6.4.5.tar.gz", hash = "sha256:872e20da9ae518bbcac3e4e0092d5bd35454e847dedb8cb9739e9f3b68406be0"}, ] numpy = [ {file = "numpy-1.19.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff"}, @@ -2967,8 +3106,8 @@ opensearch-py = [ {file = "opensearch_py-1.0.0-py2.py3-none-any.whl", hash = "sha256:17afebc25dc890b96c4e9ec8692dcfdb6842c028ce8c2d252e8f55c587960177"}, ] packaging = [ - {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, - {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, + {file = "packaging-21.2-py3-none-any.whl", hash = "sha256:14317396d1e8cdb122989b916fa2c7e9ca8e2be9e8060a6eff75b6b7b4d8a7e0"}, + {file = "packaging-21.2.tar.gz", hash = "sha256:096d689d78ca690e4cd8a89568ba06d07ca097e3306a4381635073ca91479966"}, ] pandas = [ {file = "pandas-1.1.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bf23a3b54d128b50f4f9d4675b3c1857a688cc6731a32f931837d72effb2698d"}, @@ -3059,8 +3198,8 @@ pexpect = [ {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, ] pg8000 = [ - {file = "pg8000-1.21.3-py3-none-any.whl", hash = "sha256:d001ccaee61c4edf9788bb7837589addd218e5b4d27b075a3ec1315a3934edc0"}, - {file = "pg8000-1.21.3.tar.gz", hash = "sha256:f73f1d477cda12a7b784be73c8a0c06c71e4284ef90cae4883cbc7c524b95fbf"}, + {file = "pg8000-1.22.0-py3-none-any.whl", hash = "sha256:a0e82542f4a56b2139c41ff09c1aeff294c10b6500bb6c57890c0c1c551cbc03"}, + {file = "pg8000-1.22.0.tar.gz", hash = "sha256:c5172252fc92142ec104cd5e7231be4580a1a0a814403707bafbf7bb8383a29a"}, ] pickleshare = [ {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, @@ -3083,12 +3222,12 @@ progressbar2 = [ {file = "progressbar2-3.55.0.tar.gz", hash = "sha256:86835d1f1a9317ab41aeb1da5e4184975e2306586839d66daf63067c102f8f04"}, ] prometheus-client = [ - {file = "prometheus_client-0.11.0-py2.py3-none-any.whl", hash = "sha256:b014bc76815eb1399da8ce5fc84b7717a3e63652b0c0f8804092c9363acab1b2"}, - {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"}, + {file = "prometheus_client-0.12.0-py2.py3-none-any.whl", hash = "sha256:317453ebabff0a1b02df7f708efbab21e3489e7072b61cb6957230dd004a0af0"}, + {file = "prometheus_client-0.12.0.tar.gz", hash = "sha256:1b12ba48cee33b9b0b9de64a1047cbd3c5f2d0ab6ebcead7ddda613a750ec3c5"}, ] prompt-toolkit = [ - {file = "prompt_toolkit-3.0.20-py3-none-any.whl", hash = "sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c"}, - {file = "prompt_toolkit-3.0.20.tar.gz", hash = "sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"}, + {file = "prompt_toolkit-3.0.21-py3-none-any.whl", hash = "sha256:62b3d3ea5a3ccee94dc1aac018279cf64866a76837156ebe159b981c42dd20a8"}, + {file = "prompt_toolkit-3.0.21.tar.gz", hash = "sha256:27f13ff4e4850fe8f860b77414c7880f67c6158076a7b099062cc8570f1562e5"}, ] ptyprocess = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, @@ -3099,34 +3238,42 @@ py = [ {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, ] pyarrow = [ - {file = "pyarrow-5.0.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:e9ec80f4a77057498cf4c5965389e42e7f6a618b6859e6dd615e57505c9167a6"}, - {file = "pyarrow-5.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b1453c2411b5062ba6bf6832dbc4df211ad625f678c623a2ee177aee158f199b"}, - {file = "pyarrow-5.0.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:9e04d3621b9f2f23898eed0d044203f66c156d880f02c5534a7f9947ebb1a4af"}, - {file = "pyarrow-5.0.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:64f30aa6b28b666a925d11c239344741850eb97c29d3aa0f7187918cf82494f7"}, - {file = "pyarrow-5.0.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:99c8b0f7e2ce2541dd4c0c0101d9944bb8e592ae3295fe7a2f290ab99222666d"}, - {file = "pyarrow-5.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:456a4488ae810a0569d1adf87dbc522bcc9a0e4a8d1809b934ca28c163d8edce"}, - {file = "pyarrow-5.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:c5493d2414d0d690a738aac8dd6d38518d1f9b870e52e24f89d8d7eb3afd4161"}, - {file = "pyarrow-5.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1832709281efefa4f199c639e9f429678286329860188e53beeda71750775923"}, - {file = "pyarrow-5.0.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:b6387d2058d95fa48ccfedea810a768187affb62f4a3ef6595fa30bf9d1a65cf"}, - {file = "pyarrow-5.0.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:bbe2e439bec2618c74a3bb259700c8a7353dc2ea0c5a62686b6cf04a50ab1e0d"}, - {file = "pyarrow-5.0.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5c0d1b68e67bb334a5af0cecdf9b6a702aaa4cc259c5cbb71b25bbed40fcedaf"}, - {file = "pyarrow-5.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6e937ce4a40ea0cc7896faff96adecadd4485beb53fbf510b46858e29b2e75ae"}, - {file = "pyarrow-5.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:7560332e5846f0e7830b377c14c93624e24a17f91c98f0b25dafb0ca1ea6ba02"}, - {file = "pyarrow-5.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53e550dec60d1ab86cba3afa1719dc179a8bc9632a0e50d9fe91499cf0a7f2bc"}, - {file = "pyarrow-5.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2d26186ca9748a1fb89ae6c1fa04fb343a4279b53f118734ea8096f15d66c820"}, - {file = "pyarrow-5.0.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7c4edd2bacee3eea6c8c28bddb02347f9d41a55ec9692c71c6de6e47c62a7f0d"}, - {file = "pyarrow-5.0.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:601b0aabd6fb066429e706282934d4d8d38f53bdb8d82da9576be49f07eedf5c"}, - {file = "pyarrow-5.0.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ff21711f6ff3b0bc90abc8ca8169e676faeb2401ddc1a0bc1c7dc181708a3406"}, - {file = "pyarrow-5.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ed135a99975380c27077f9d0e210aea8618ed9fadcec0e71f8a3190939557afe"}, - {file = "pyarrow-5.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:6e1f0e4374061116f40e541408a8a170c170d0a070b788717e18165ebfdd2a54"}, - {file = "pyarrow-5.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:4341ac0f552dc04c450751e049976940c7f4f8f2dae03685cc465ebe0a61e231"}, - {file = "pyarrow-5.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c3fc856f107ca2fb3c9391d7ea33bbb33f3a1c2b4a0e2b41f7525c626214cc03"}, - {file = "pyarrow-5.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:357605665fbefb573d40939b13a684c2490b6ed1ab4a5de8dd246db4ab02e5a4"}, - {file = "pyarrow-5.0.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f4db312e9ba80e730cefcae0a05b63ea5befc7634c28df56682b628ad8e1c25c"}, - {file = "pyarrow-5.0.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:1d9485741e497ccc516cb0a0c8f56e22be55aea815be185c3f9a681323b0e614"}, - {file = "pyarrow-5.0.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:b3115df938b8d7a7372911a3cb3904196194bcea8bb48911b4b3eafee3ab8d90"}, - {file = "pyarrow-5.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d8adda1892ef4553c4804af7f67cce484f4d6371564e2d8374b8e2bc85293e2"}, - {file = "pyarrow-5.0.0.tar.gz", hash = "sha256:24e64ea33eed07441cc0e80c949e3a1b48211a1add8953268391d250f4d39922"}, + {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_universal2.whl", hash = "sha256:c7a6e7e0bf8779e9c3428ced85507541f3da9a0675e2f4781d4eb2c7042cbf81"}, + {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:7a683f71b848eb6310b4ec48c0def55dac839e9994c1ac874c9b2d3d5625def1"}, + {file = "pyarrow-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5144bd9db2920c7cb566c96462d62443cc239104f94771d110f74393f2fb42a2"}, + {file = "pyarrow-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed0be080cf595ea15ff1c9ff4097bbf1fcc4b50847d98c0a3c0412fbc6ede7e9"}, + {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:072c1a0fca4509eefd7d018b78542fb7e5c63aaf5698f1c0a6e45628ae17ba44"}, + {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5bed4f948c032c40597302e9bdfa65f62295240306976ecbe43a54924c6f94f"}, + {file = "pyarrow-6.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:465f87fa0be0b2928b2beeba22b5813a0203fb05d90fd8563eea48e08ecc030e"}, + {file = "pyarrow-6.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:ddf2e6e3b321adaaf716f2d5af8e92d205a9671e0cb7c0779710a567fd1dd580"}, + {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:0204e80777ab8f4e9abd3a765a8ec07ed1e3c4630bacda50d2ce212ef0f3826f"}, + {file = "pyarrow-6.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:82fe80309e01acf29e3943a1f6d3c98ec109fe1d356bc1ac37d639bcaadcf684"}, + {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:281ce5fa03621d786a9beb514abb09846db7f0221b50eabf543caa24037eaacd"}, + {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5408fa8d623e66a0445f3fb0e4027fd219bf99bfb57422d543d7b7876e2c5b55"}, + {file = "pyarrow-6.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a19e58dfb04e451cd8b7bdec3ac8848373b95dfc53492c9a69789aa9074a3c1b"}, + {file = "pyarrow-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b86d175262db1eb46afdceb36d459409eb6f8e532d3dec162f8bf572c7f57623"}, + {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2d2c681659396c745e4f1988d5dd41dcc3ad557bb8d4a8c2e44030edafc08a91"}, + {file = "pyarrow-6.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c666bc6a1cebf01206e2dc1ab05f25f39f35d3a499e0ef5cd635225e07306ca"}, + {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8d41dfb09ba9236cca6245f33088eb42f3c54023da281139241e0f9f3b4b754e"}, + {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c746ef42c039348a288584800e299456c80c5691401bb9b19aa9c02a427b7"}, + {file = "pyarrow-6.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c38263ea438a1666b13372e7565450cfeec32dbcd1c2595749476a58465eaec"}, + {file = "pyarrow-6.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e81508239a71943759cee272ce625ae208092dd36ef2c6713fccee30bbcf52bb"}, + {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:a50d2f77b86af38ceabf45617208b9105d20e7a5eebc584e7c8c0acededd82ce"}, + {file = "pyarrow-6.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbda7595f24a639bcef3419ecfac17216efacb09f7b0f1b4c4c97f900d65ca0e"}, + {file = "pyarrow-6.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bf3400780c4d3c9cb43b1e8a1aaf2e1b7199a0572d0a645529d2784e4d0d8497"}, + {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:15dc0d673d3f865ca63c877bd7a2eced70b0a08969fb733a28247134b8a1f18b"}, + {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1d9a2f4ee812ed0bd4182cabef99ea914ac297274f0de086f2488093d284ef"}, + {file = "pyarrow-6.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d046dc78a9337baa6415be915c5a16222505233e238a1017f368243c89817eea"}, + {file = "pyarrow-6.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:ea64a48a85c631eb2a0ea13ccdec5143c85b5897836b16331ee4289d27a57247"}, + {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_universal2.whl", hash = "sha256:cc1d4a70efd583befe92d4ea6f74ed2e0aa31ccdde767cd5cae8e77c65a1c2d4"}, + {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:004185e0babc6f3c3fba6ba4f106e406a0113d0f82bb9ad9a8571a1978c45d04"}, + {file = "pyarrow-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c23f8cdecd3d9e49f9b0f9a651ae5549d1d32fd4901fb1bdc2d327edfba844f"}, + {file = "pyarrow-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb701ec4a94b92102606d4e88f0b8eba34f09a5ad8e014eaa4af76f42b7f62ae"}, + {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da7860688c33ca88ac05f1a487d32d96d9caa091412496c35f3d1d832145675a"}, + {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac941a147d14993987cc8b605b721735a34b3e54d167302501fb4db1ad7382c7"}, + {file = "pyarrow-6.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6163d82cca7541774b00503c295fe86a1722820eddb958b57f091bb6f5b0a6db"}, + {file = "pyarrow-6.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:376c4b5f248ae63df21fe15c194e9013753164be2d38f4b3fb8bde63ac5a1958"}, + {file = "pyarrow-6.0.0.tar.gz", hash = "sha256:5be62679201c441356d3f2a739895dcc8d4d299f2a6eabcd2163bfb6a898abba"}, ] pycodestyle = [ {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, @@ -3254,11 +3401,12 @@ pywin32 = [ {file = "pywin32-302-cp39-cp39-win_amd64.whl", hash = "sha256:af5aea18167a31efcacc9f98a2ca932c6b6a6d91ebe31f007509e293dea12580"}, ] pywinpty = [ - {file = "pywinpty-1.1.4-cp36-none-win_amd64.whl", hash = "sha256:fb975976ad92be44801de95fdf2b0366747767cb0528478553aff85dd63ebb09"}, - {file = "pywinpty-1.1.4-cp37-none-win_amd64.whl", hash = "sha256:5d25b30a2f87105778bc2f57cb1271f58aaa25568921ef042faf001b3b0a7307"}, - {file = "pywinpty-1.1.4-cp38-none-win_amd64.whl", hash = "sha256:c5c3550100689632f6663f39865ef8716835dab1838a9eb9b472644af92673f8"}, - {file = "pywinpty-1.1.4-cp39-none-win_amd64.whl", hash = "sha256:ad60a336d92ac38e2159320db6d5999c4c2726a141c3ed3f9694021feb6a234e"}, - {file = "pywinpty-1.1.4.tar.gz", hash = "sha256:cc700c9d5a9fcebf677ac93a4943ca9a24db6e2f11a5f0e7e8e226184c5036f7"}, + {file = "pywinpty-1.1.5-cp310-none-win_amd64.whl", hash = "sha256:59e38276f732121b7b708b488055132c695ab7f8790b6ebee9b5b277e30c40e1"}, + {file = "pywinpty-1.1.5-cp36-none-win_amd64.whl", hash = "sha256:0f73bea7f4ecc4711d3706bb0adea0b426c384ff38b619e169d58e20bc307eb0"}, + {file = "pywinpty-1.1.5-cp37-none-win_amd64.whl", hash = "sha256:4cefeef61ab82e9e2bfe228d83a49117e33899931766dd18d576ea5c9187c1e0"}, + {file = "pywinpty-1.1.5-cp38-none-win_amd64.whl", hash = "sha256:44c78a9a74f1b6bff957f8b0acad0525f48f716ac61fd9d39e1eb6f87f1a46a0"}, + {file = "pywinpty-1.1.5-cp39-none-win_amd64.whl", hash = "sha256:ad12ddf276446e0440a760b7c0ba128d39602bc8e6641e0ef8447f1a466a8346"}, + {file = "pywinpty-1.1.5.tar.gz", hash = "sha256:92125f0f8e4e64bb5f3bf270a182c9206dc1765542c59bc07441908a9db17504"}, ] pyzmq = [ {file = "pyzmq-22.3.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:6b217b8f9dfb6628f74b94bdaf9f7408708cb02167d644edca33f38746ca12dd"}, @@ -3300,50 +3448,58 @@ pyzmq = [ {file = "pyzmq-22.3.0.tar.gz", hash = "sha256:8eddc033e716f8c91c6a2112f0a8ebc5e00532b4a6ae1eb0ccc48e027f9c671c"}, ] redshift-connector = [ - {file = "redshift_connector-2.0.888-py3-none-any.whl", hash = "sha256:c8654636ad45d2f391ef61076d0f3b5de5eb1baa85709214c4d9e38d45a9bced"}, + {file = "redshift_connector-2.0.889-py3-none-any.whl", hash = "sha256:9f58781f8229c6684aa748a3832c11b8e638a5c9e74df4322c056d95e3785dbc"}, ] regex = [ - {file = "regex-2021.10.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981c786293a3115bc14c103086ae54e5ee50ca57f4c02ce7cf1b60318d1e8072"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51feefd58ac38eb91a21921b047da8644155e5678e9066af7bcb30ee0dca7361"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea8de658d7db5987b11097445f2b1f134400e2232cb40e614e5f7b6f5428710e"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1ce02f420a7ec3b2480fe6746d756530f69769292eca363218c2291d0b116a01"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39079ebf54156be6e6902f5c70c078f453350616cfe7bfd2dd15bdb3eac20ccc"}, - {file = "regex-2021.10.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ff24897f6b2001c38a805d53b6ae72267025878d35ea225aa24675fbff2dba7f"}, - {file = "regex-2021.10.8-cp310-cp310-win32.whl", hash = "sha256:c6569ba7b948c3d61d27f04e2b08ebee24fec9ff8e9ea154d8d1e975b175bfa7"}, - {file = "regex-2021.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:45cb0f7ff782ef51bc79e227a87e4e8f24bc68192f8de4f18aae60b1d60bc152"}, - {file = "regex-2021.10.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fab3ab8aedfb443abb36729410403f0fe7f60ad860c19a979d47fb3eb98ef820"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e55f8d66f1b41d44bc44c891bcf2c7fad252f8f323ee86fba99d71fd1ad5e3"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d52c5e089edbdb6083391faffbe70329b804652a53c2fdca3533e99ab0580d9"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1abbd95cbe9e2467cac65c77b6abd9223df717c7ae91a628502de67c73bf6838"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b5c215f3870aa9b011c00daeb7be7e1ae4ecd628e9beb6d7e6107e07d81287"}, - {file = "regex-2021.10.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f540f153c4f5617bc4ba6433534f8916d96366a08797cbbe4132c37b70403e92"}, - {file = "regex-2021.10.8-cp36-cp36m-win32.whl", hash = "sha256:1f51926db492440e66c89cd2be042f2396cf91e5b05383acd7372b8cb7da373f"}, - {file = "regex-2021.10.8-cp36-cp36m-win_amd64.whl", hash = "sha256:5f55c4804797ef7381518e683249310f7f9646da271b71cb6b3552416c7894ee"}, - {file = "regex-2021.10.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb2baff66b7d2267e07ef71e17d01283b55b3cc51a81b54cc385e721ae172ba4"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e527ab1c4c7cf2643d93406c04e1d289a9d12966529381ce8163c4d2abe4faf"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c98b013273e9da5790ff6002ab326e3f81072b4616fd95f06c8fa733d2745f"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:55ef044899706c10bc0aa052f2fc2e58551e2510694d6aae13f37c50f3f6ff61"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa0ab3530a279a3b7f50f852f1bab41bc304f098350b03e30a3876b7dd89840e"}, - {file = "regex-2021.10.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a37305eb3199d8f0d8125ec2fb143ba94ff6d6d92554c4b8d4a8435795a6eccd"}, - {file = "regex-2021.10.8-cp37-cp37m-win32.whl", hash = "sha256:2efd47704bbb016136fe34dfb74c805b1ef5c7313aef3ce6dcb5ff844299f432"}, - {file = "regex-2021.10.8-cp37-cp37m-win_amd64.whl", hash = "sha256:924079d5590979c0e961681507eb1773a142553564ccae18d36f1de7324e71ca"}, - {file = "regex-2021.10.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b09d3904bf312d11308d9a2867427479d277365b1617e48ad09696fa7dfcdf59"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f125fce0a0ae4fd5c3388d369d7a7d78f185f904c90dd235f7ecf8fe13fa741"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f199419a81c1016e0560c39773c12f0bd924c37715bffc64b97140d2c314354"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:09e1031e2059abd91177c302da392a7b6859ceda038be9e015b522a182c89e4f"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c070d5895ac6aeb665bd3cd79f673775caf8d33a0b569e98ac434617ecea57d"}, - {file = "regex-2021.10.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:176796cb7f82a7098b0c436d6daac82f57b9101bb17b8e8119c36eecf06a60a3"}, - {file = "regex-2021.10.8-cp38-cp38-win32.whl", hash = "sha256:5e5796d2f36d3c48875514c5cd9e4325a1ca172fc6c78b469faa8ddd3d770593"}, - {file = "regex-2021.10.8-cp38-cp38-win_amd64.whl", hash = "sha256:e4204708fa116dd03436a337e8e84261bc8051d058221ec63535c9403a1582a1"}, - {file = "regex-2021.10.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b8b6ee6555b6fbae578f1468b3f685cdfe7940a65675611365a7ea1f8d724991"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973499dac63625a5ef9dfa4c791aa33a502ddb7615d992bdc89cf2cc2285daa3"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88dc3c1acd3f0ecfde5f95c32fcb9beda709dbdf5012acdcf66acbc4794468eb"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4786dae85c1f0624ac77cb3813ed99267c9adb72e59fdc7297e1cf4d6036d493"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe6ce4f3d3c48f9f402da1ceb571548133d3322003ce01b20d960a82251695d2"}, - {file = "regex-2021.10.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9e3e2cea8f1993f476a6833ef157f5d9e8c75a59a8d8b0395a9a6887a097243b"}, - {file = "regex-2021.10.8-cp39-cp39-win32.whl", hash = "sha256:82cfb97a36b1a53de32b642482c6c46b6ce80803854445e19bc49993655ebf3b"}, - {file = "regex-2021.10.8-cp39-cp39-win_amd64.whl", hash = "sha256:b04e512eb628ea82ed86eb31c0f7fc6842b46bf2601b66b1356a7008327f7700"}, - {file = "regex-2021.10.8.tar.gz", hash = "sha256:26895d7c9bbda5c52b3635ce5991caa90fbb1ddfac9c9ff1c7ce505e2282fb2a"}, + {file = "regex-2021.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce0625900e4d6d9a43f50e897f6aaa1a52e5e4931f994a1b8e9f6a4e49185e4e"}, + {file = "regex-2021.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:197331fffc684af34534328a9e4a7d0a118d9a838b393b80abb7af4f709acad7"}, + {file = "regex-2021.11.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8228e75d340e48b360d5e963acf1332b5c9080f73ec6ce8cf483ec7e0542f2dd"}, + {file = "regex-2021.11.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b0bd3cccb9e6e61ed64a01075353ded1e012b8c4af222496eb5478dc48a5c0b4"}, + {file = "regex-2021.11.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:767cb9ba1e6151692fd27449f06550fbdbd82b42236b5a31bac862a1da628860"}, + {file = "regex-2021.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c61568c1633abfddd21552a261d3e1a83eda7e3fb1d46e148d61fd41d5541a8d"}, + {file = "regex-2021.11.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86baabf4f346b612665ab9f5f38377def21f824c89574e71c67e5c38e4971e5c"}, + {file = "regex-2021.11.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2f189743257300e9b3a3b4fdea10f46bf6d33ef580856b2a6bfc2073653c2287"}, + {file = "regex-2021.11.1-cp310-cp310-win32.whl", hash = "sha256:50ceaaaa88abec74393301336a2494734386cf3cafa51dde26367b139fe86336"}, + {file = "regex-2021.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:78c80cd9939b42eeac4f0556f689a6eda987b81678149071853391b922d98f64"}, + {file = "regex-2021.11.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8ae9d75bbfebd402e1254b09a721c037ec9f018750a5091bea8c705729bbf5c1"}, + {file = "regex-2021.11.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cef78eab573f07378f26662f24d28c706e6765a95980cce98a91d025d481ab95"}, + {file = "regex-2021.11.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75ad34d49fdd9faef0f4ccf9286c63ee9610d4664d92b13cdb4c4407e834921c"}, + {file = "regex-2021.11.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5867bc04011ee03ed3160df2f378cdee732aa3ed070b4760b029ebefbea6116c"}, + {file = "regex-2021.11.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1f3b0f23437eea6c1781bcc7d1d14f7c8a3032142ac660dc7ca43ba1a139e30"}, + {file = "regex-2021.11.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a394085589dc549ad976290c93f688620af898ac49d46269ad6cdf3ef29bc58"}, + {file = "regex-2021.11.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:495d98445daaa4657093fc54a5d53cffe41acec5c1edac901aac8061fc7c2f85"}, + {file = "regex-2021.11.1-cp36-cp36m-win32.whl", hash = "sha256:a5bb5637a2fe6d8710d5f0b5600556c64fb3d49449502e9dece2038a9753e8b8"}, + {file = "regex-2021.11.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4f6741b5506cbad28bfc46397c2e267ca59b357c075ea6b68f7781c5a8b150a"}, + {file = "regex-2021.11.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a3abab9f5d487061b0d99beb5ff2d1619a3652c8b785bc66aca7682d8b7d4116"}, + {file = "regex-2021.11.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dfb06ef5c47b41dcb3bf4fdf2983c048711e16a3bf74814be14089a1933b3c"}, + {file = "regex-2021.11.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea372838910264443ad233a92a20279574b7f0e9743b5e5de526e274895b7274"}, + {file = "regex-2021.11.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b77c919379409ae92a5b13ef2452c509632efaa40b926fab9eac7839ae9a266a"}, + {file = "regex-2021.11.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e829fc2a1bcbb18c6579fd5fb563b93f25973b0451cf4e2a22933c991792e2cb"}, + {file = "regex-2021.11.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c26d8d18ae84584d58e34c9ac5c8528110483d080dca77626fd62cdb316c0a2"}, + {file = "regex-2021.11.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:724a1601ae73521e1e9fda0a3015915ae0d1931772802fcf7f0dd83f111d11d2"}, + {file = "regex-2021.11.1-cp37-cp37m-win32.whl", hash = "sha256:69e047c969f7b952bc55274e2b5189117ff2322b049a4c9143f94af8976b55f6"}, + {file = "regex-2021.11.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5b4036abc6b3307146a81358cd4d4d091bd9a2fe3edaca9b95f66e7ba6d06e20"}, + {file = "regex-2021.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cc93c277d6793a26cdb9bcadc6d6d9db9c6a6cf2aae207bbaef2f16d53570d43"}, + {file = "regex-2021.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aa74d18236f8a31b911caafc28aed2a8444bcca8e61eb377949771f84710ada"}, + {file = "regex-2021.11.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b4d2b514c30a9c8f80f5d78ec978719f1c3823662a5ba0809c03f0cad4c5de6"}, + {file = "regex-2021.11.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd31271de74c8f3e296644f9a12d9ad60bdc3fc8d3b8e8a26ccbf777169e5a0d"}, + {file = "regex-2021.11.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ef40aa8e39dff52480e21c38b36486a0c256b3b93d0094e7a06ab517a246994"}, + {file = "regex-2021.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05d8ddf6bb4f50342ecddee4deb621588a013afe13d9c77cf6eb58c5ad1bc21f"}, + {file = "regex-2021.11.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95fa9665d8dac10c109a3dcc7d476b7f27b32fe22190b433c2a2b7eb903aa646"}, + {file = "regex-2021.11.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7f44ee70fa7f346551550f8ec4650a4354b9494c0d1dfa08100fe056d6910388"}, + {file = "regex-2021.11.1-cp38-cp38-win32.whl", hash = "sha256:1b4cf110002a8b6d039d2d4bed15095e5ddf3d9e4aa5eb67476eba0256c93893"}, + {file = "regex-2021.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:68939d7fdc417174ee4975fd78aec41ae484de606add311d1387011484ce1da3"}, + {file = "regex-2021.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b06599e60c421fb0512a2cef8553e6ea072a72081e51158f487e2d207b947aa9"}, + {file = "regex-2021.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6a1ed9aef9748d76cf39e08529be9209bdfcf34e70c9133abf966d954a59bc6d"}, + {file = "regex-2021.11.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b3f8852cf597388851c1d3d1073fb3694e5647303c002813aa230d41a9ec5fc"}, + {file = "regex-2021.11.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ed2819b7c9d83ae3dfbbfea770f0d0780c732b5cbbd8269aa910dbe0205361"}, + {file = "regex-2021.11.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b662e04e0fc8f3b99d9beacecc5e000b9a68bdb25ba5b64211ebe263e907f3a2"}, + {file = "regex-2021.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf725b99f897b8e6d24d8b102320a31551530d7aae1e2fe42eb1ee85173f57b6"}, + {file = "regex-2021.11.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0da1b6e39affa1b6da2106745c9d73f576ffe4484cbdfbd5e1c9b9872532eec8"}, + {file = "regex-2021.11.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:09c9ff0c67f4949f14b2ddf935bc36cafd0fd4db6d3334a3e5a24a532773b2d1"}, + {file = "regex-2021.11.1-cp39-cp39-win32.whl", hash = "sha256:3383f0d47e5e343fa5facd87a6f95de101c488d0aec1f41da00fcc019179aefc"}, + {file = "regex-2021.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9108787c320940acc6676000716c3dc1734db9e14facbd98c13920972aee21b"}, + {file = "regex-2021.11.1.tar.gz", hash = "sha256:20675d8bd3c2cc8dbfafd60a220ec04d0018564f101f80a64e56f4e4ed0afe55"}, ] requests = [ {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, @@ -3353,13 +3509,9 @@ requests-aws4auth = [ {file = "requests-aws4auth-1.1.1.tar.gz", hash = "sha256:c0883346ce30b5018903a67da88df72f73ff06e1a320845bba9cd85e811ba0ba"}, {file = "requests_aws4auth-1.1.1-py2.py3-none-any.whl", hash = "sha256:dfd9f930ffde48a756b72b55698a8522875ea6358dcffbcc44a66700ace31783"}, ] -requests-unixsocket = [ - {file = "requests-unixsocket-0.2.0.tar.gz", hash = "sha256:9e5c1a20afc3cf786197ae59c79bcdb0e7565f218f27df5f891307ee8817c1ea"}, - {file = "requests_unixsocket-0.2.0-py2.py3-none-any.whl", hash = "sha256:014d07bfb66dc805a011a8b4b306cf4ec96d2eddb589f6b2b5765e626f0dc0cc"}, -] 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.15.0-py2.py3-none-any.whl", hash = "sha256:5955ad3468fe8eb5fb736cdab4943457b7768f8670fa3624b4e26ff52dfe20c0"}, + {file = "responses-0.15.0.tar.gz", hash = "sha256:866757987d1962aa908d9c8b3185739faefd72a359e95459de0c2e4e5369c9b2"}, ] restructuredtext-lint = [ {file = "restructuredtext_lint-1.3.2.tar.gz", hash = "sha256:d3b10a1fe2ecac537e51ae6d151b223b78de9fafdd50e5eb6b08c243df173c80"}, @@ -3429,8 +3581,8 @@ sphinxcontrib-serializinghtml = [ {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] stevedore = [ - {file = "stevedore-3.4.0-py3-none-any.whl", hash = "sha256:920ce6259f0b2498aaa4545989536a27e4e4607b8318802d7ddc3a533d3d069e"}, - {file = "stevedore-3.4.0.tar.gz", hash = "sha256:59b58edb7f57b11897f150475e7bc0c39c5381f0b8e3fa9f5c20ce6c89ec4aa1"}, + {file = "stevedore-3.5.0-py3-none-any.whl", hash = "sha256:a547de73308fd7e90075bb4d301405bebf705292fa90a90fc3bcf9133f58616c"}, + {file = "stevedore-3.5.0.tar.gz", hash = "sha256:f40253887d8712eaa2bb0ea3830374416736dc8ec0e22f5a65092c1174c44335"}, ] terminado = [ {file = "terminado-0.12.1-py3-none-any.whl", hash = "sha256:09fdde344324a1c9c6e610ee4ca165c4bb7f5bbf982fceeeb38998a988ef8452"}, @@ -3445,8 +3597,8 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tomli = [ - {file = "tomli-1.2.1-py3-none-any.whl", hash = "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f"}, - {file = "tomli-1.2.1.tar.gz", hash = "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442"}, + {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"}, + {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"}, ] tornado = [ {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, @@ -3541,8 +3693,8 @@ urllib3 = [ {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, ] virtualenv = [ - {file = "virtualenv-20.8.1-py2.py3-none-any.whl", hash = "sha256:10062e34c204b5e4ec5f62e6ef2473f8ba76513a9a617e873f1f8fb4a519d300"}, - {file = "virtualenv-20.8.1.tar.gz", hash = "sha256:bcc17f0b3a29670dd777d6f0755a4c04f28815395bca279cdcb213b97199a6b8"}, + {file = "virtualenv-20.10.0-py2.py3-none-any.whl", hash = "sha256:4b02e52a624336eece99c96e3ab7111f469c24ba226a53ec474e8e787b365814"}, + {file = "virtualenv-20.10.0.tar.gz", hash = "sha256:576d05b46eace16a9c348085f7d0dc8ef28713a2cabaa1cf0aea41e8f12c9218"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, @@ -3561,50 +3713,57 @@ werkzeug = [ {file = "Werkzeug-2.0.2.tar.gz", hash = "sha256:aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a"}, ] wrapt = [ - {file = "wrapt-1.13.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3de7b4d3066cc610054e7aa2c005645e308df2f92be730aae3a47d42e910566a"}, - {file = "wrapt-1.13.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:8164069f775c698d15582bf6320a4f308c50d048c1c10cf7d7a341feaccf5df7"}, - {file = "wrapt-1.13.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9adee1891253670575028279de8365c3a02d3489a74a66d774c321472939a0b1"}, - {file = "wrapt-1.13.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:a70d876c9aba12d3bd7f8f1b05b419322c6789beb717044eea2c8690d35cb91b"}, - {file = "wrapt-1.13.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3f87042623530bcffea038f824b63084180513c21e2e977291a9a7e65a66f13b"}, - {file = "wrapt-1.13.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:e634136f700a21e1fcead0c137f433dde928979538c14907640607d43537d468"}, - {file = "wrapt-1.13.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:3e33c138d1e3620b1e0cc6fd21e46c266393ed5dae0d595b7ed5a6b73ed57aa0"}, - {file = "wrapt-1.13.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:283e402e5357e104ac1e3fba5791220648e9af6fb14ad7d9cc059091af2b31d2"}, - {file = "wrapt-1.13.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:ccb34ce599cab7f36a4c90318697ead18312c67a9a76327b3f4f902af8f68ea1"}, - {file = "wrapt-1.13.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:fbad5ba74c46517e6488149514b2e2348d40df88cd6b52a83855b7a8bf04723f"}, - {file = "wrapt-1.13.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:724ed2bc9c91a2b9026e5adce310fa60c6e7c8760b03391445730b9789b9d108"}, - {file = "wrapt-1.13.2-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:83f2793ec6f3ef513ad8d5b9586f5ee6081cad132e6eae2ecb7eac1cc3decae0"}, - {file = "wrapt-1.13.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:0473d1558b93e314e84313cc611f6c86be779369f9d3734302bf185a4d2625b1"}, - {file = "wrapt-1.13.2-cp35-cp35m-win32.whl", hash = "sha256:15eee0e6fd07f48af2f66d0e6f2ff1916ffe9732d464d5e2390695296872cad9"}, - {file = "wrapt-1.13.2-cp35-cp35m-win_amd64.whl", hash = "sha256:bc85d17d90201afd88e3d25421da805e4e135012b5d1f149e4de2981394b2a52"}, - {file = "wrapt-1.13.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c6ee5f8734820c21b9b8bf705e99faba87f21566d20626568eeb0d62cbeaf23c"}, - {file = "wrapt-1.13.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:53c6706a1bcfb6436f1625511b95b812798a6d2ccc51359cd791e33722b5ea32"}, - {file = "wrapt-1.13.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fbe6aebc9559fed7ea27de51c2bf5c25ba2a4156cf0017556f72883f2496ee9a"}, - {file = "wrapt-1.13.2-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:0582180566e7a13030f896c2f1ac6a56134ab5f3c3f4c5538086f758b1caf3f2"}, - {file = "wrapt-1.13.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:bff0a59387a0a2951cb869251257b6553663329a1b5525b5226cab8c88dcbe7e"}, - {file = "wrapt-1.13.2-cp36-cp36m-win32.whl", hash = "sha256:df3eae297a5f1594d1feb790338120f717dac1fa7d6feed7b411f87e0f2401c7"}, - {file = "wrapt-1.13.2-cp36-cp36m-win_amd64.whl", hash = "sha256:1eb657ed84f4d3e6ad648483c8a80a0cf0a78922ef94caa87d327e2e1ad49b48"}, - {file = "wrapt-1.13.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0cdedf681db878416c05e1831ec69691b0e6577ac7dca9d4f815632e3549580"}, - {file = "wrapt-1.13.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:87ee3c73bdfb4367b26c57259995935501829f00c7b3eed373e2ad19ec21e4e4"}, - {file = "wrapt-1.13.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3e0d16eedc242d01a6f8cf0623e9cdc3b869329da3f97a15961d8864111d8cf0"}, - {file = "wrapt-1.13.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:8318088860968c07e741537030b1abdd8908ee2c71fbe4facdaade624a09e006"}, - {file = "wrapt-1.13.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d90520616fce71c05dedeac3a0fe9991605f0acacd276e5f821842e454485a70"}, - {file = "wrapt-1.13.2-cp37-cp37m-win32.whl", hash = "sha256:22142afab65daffc95863d78effcbd31c19a8003eca73de59f321ee77f73cadb"}, - {file = "wrapt-1.13.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d0d717e10f952df7ea41200c507cc7e24458f4c45b56c36ad418d2e79dacd1d4"}, - {file = "wrapt-1.13.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:593cb049ce1c391e0288523b30426c4430b26e74c7e6f6e2844bd99ac7ecc831"}, - {file = "wrapt-1.13.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8860c8011a6961a651b1b9f46fdbc589ab63b0a50d645f7d92659618a3655867"}, - {file = "wrapt-1.13.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ada5e29e59e2feb710589ca1c79fd989b1dd94d27079dc1d199ec954a6ecc724"}, - {file = "wrapt-1.13.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:fdede980273aeca591ad354608778365a3a310e0ecdd7a3587b38bc5be9b1808"}, - {file = "wrapt-1.13.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:af9480de8e63c5f959a092047aaf3d7077422ded84695b3398f5d49254af3e90"}, - {file = "wrapt-1.13.2-cp38-cp38-win32.whl", hash = "sha256:c65e623ea7556e39c4f0818200a046cbba7575a6b570ff36122c276fdd30ab0a"}, - {file = "wrapt-1.13.2-cp38-cp38-win_amd64.whl", hash = "sha256:b20703356cae1799080d0ad15085dc3213c1ac3f45e95afb9f12769b98231528"}, - {file = "wrapt-1.13.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c5c4cf188b5643a97e87e2110bbd4f5bc491d54a5b90633837b34d5df6a03fe"}, - {file = "wrapt-1.13.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:82223f72eba6f63eafca87a0f614495ae5aa0126fe54947e2b8c023969e9f2d7"}, - {file = "wrapt-1.13.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:81a4cf257263b299263472d669692785f9c647e7dca01c18286b8f116dbf6b38"}, - {file = "wrapt-1.13.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:728e2d9b7a99dd955d3426f237b940fc74017c4a39b125fec913f575619ddfe9"}, - {file = "wrapt-1.13.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:7574de567dcd4858a2ffdf403088d6df8738b0e1eabea220553abf7c9048f59e"}, - {file = "wrapt-1.13.2-cp39-cp39-win32.whl", hash = "sha256:c7ac2c7a8e34bd06710605b21dd1f3576764443d68e069d2afba9b116014d072"}, - {file = "wrapt-1.13.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e6d1a8eeef415d7fb29fe017de0e48f45e45efd2d1bfda28fc50b7b330859ef"}, - {file = "wrapt-1.13.2.tar.gz", hash = "sha256:dca56cc5963a5fd7c2aa8607017753f534ee514e09103a6c55d2db70b50e7447"}, + {file = "wrapt-1.13.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a"}, + {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489"}, + {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909"}, + {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229"}, + {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af"}, + {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de"}, + {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb"}, + {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80"}, + {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca"}, + {file = "wrapt-1.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44"}, + {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056"}, + {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785"}, + {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096"}, + {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33"}, + {file = "wrapt-1.13.3-cp310-cp310-win32.whl", hash = "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f"}, + {file = "wrapt-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e"}, + {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d"}, + {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179"}, + {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3"}, + {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755"}, + {file = "wrapt-1.13.3-cp35-cp35m-win32.whl", hash = "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851"}, + {file = "wrapt-1.13.3-cp35-cp35m-win_amd64.whl", hash = "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13"}, + {file = "wrapt-1.13.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918"}, + {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade"}, + {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc"}, + {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf"}, + {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125"}, + {file = "wrapt-1.13.3-cp36-cp36m-win32.whl", hash = "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36"}, + {file = "wrapt-1.13.3-cp36-cp36m-win_amd64.whl", hash = "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10"}, + {file = "wrapt-1.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068"}, + {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709"}, + {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df"}, + {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2"}, + {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b"}, + {file = "wrapt-1.13.3-cp37-cp37m-win32.whl", hash = "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829"}, + {file = "wrapt-1.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea"}, + {file = "wrapt-1.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9"}, + {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554"}, + {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c"}, + {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b"}, + {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce"}, + {file = "wrapt-1.13.3-cp38-cp38-win32.whl", hash = "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79"}, + {file = "wrapt-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb"}, + {file = "wrapt-1.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb"}, + {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32"}, + {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7"}, + {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e"}, + {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640"}, + {file = "wrapt-1.13.3-cp39-cp39-win32.whl", hash = "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374"}, + {file = "wrapt-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb"}, + {file = "wrapt-1.13.3.tar.gz", hash = "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185"}, ] xlrd = [ {file = "xlrd-2.0.1-py2.py3-none-any.whl", hash = "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd"}, @@ -3619,78 +3778,78 @@ xmltodict = [ {file = "xmltodict-0.12.0.tar.gz", hash = "sha256:50d8c638ed7ecb88d90561beedbf720c9b4e851a9fa6c47ebd64e99d166d8a21"}, ] yarl = [ - {file = "yarl-1.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e35d8230e4b08d86ea65c32450533b906a8267a87b873f2954adeaecede85169"}, - {file = "yarl-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eb4b3f277880c314e47720b4b6bb2c85114ab3c04c5442c9bc7006b3787904d8"}, - {file = "yarl-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7015dcedb91d90a138eebdc7e432aec8966e0147ab2a55f2df27b1904fa7291"}, - {file = "yarl-1.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb3e478175e15e00d659fb0354a6a8db71a7811a2a5052aed98048bc972e5d2b"}, - {file = "yarl-1.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8c409aa3a7966647e7c1c524846b362a6bcbbe120bf8a176431f940d2b9a2e"}, - {file = "yarl-1.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b22ea41c7e98170474a01e3eded1377d46b2dfaef45888a0005c683eaaa49285"}, - {file = "yarl-1.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a7dfc46add4cfe5578013dbc4127893edc69fe19132d2836ff2f6e49edc5ecd6"}, - {file = "yarl-1.7.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:82ff6f85f67500a4f74885d81659cd270eb24dfe692fe44e622b8a2fd57e7279"}, - {file = "yarl-1.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f3cd2158b2ed0fb25c6811adfdcc47224efe075f2d68a750071dacc03a7a66e4"}, - {file = "yarl-1.7.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:59c0f13f9592820c51280d1cf811294d753e4a18baf90f0139d1dc93d4b6fc5f"}, - {file = "yarl-1.7.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7f7655ad83d1a8afa48435a449bf2f3009293da1604f5dd95b5ddcf5f673bd69"}, - {file = "yarl-1.7.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aa9f0d9b62d15182341b3e9816582f46182cab91c1a57b2d308b9a3c4e2c4f78"}, - {file = "yarl-1.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fdd1b90c225a653b1bd1c0cae8edf1957892b9a09c8bf7ee6321eeb8208eac0f"}, - {file = "yarl-1.7.0-cp310-cp310-win32.whl", hash = "sha256:7c8d0bb76eabc5299db203e952ec55f8f4c53f08e0df4285aac8c92bd9e12675"}, - {file = "yarl-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:622a36fa779efb4ff9eff5fe52730ff17521431379851a31e040958fc251670c"}, - {file = "yarl-1.7.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d461b7a8e139b9e4b41f62eb417ffa0b98d1c46d4caf14c845e6a3b349c0bb1"}, - {file = "yarl-1.7.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81cfacdd1e40bc931b5519499342efa388d24d262c30a3d31187bfa04f4a7001"}, - {file = "yarl-1.7.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:821b978f2152be7695d4331ef0621d207aedf9bbd591ba23a63412a3efc29a01"}, - {file = "yarl-1.7.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b64bd24c8c9a487f4a12260dc26732bf41028816dbf0c458f17864fbebdb3131"}, - {file = "yarl-1.7.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:98c9ddb92b60a83c21be42c776d3d9d5ec632a762a094c41bda37b7dfbd2cd83"}, - {file = "yarl-1.7.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a532d75ca74431c053a88a802e161fb3d651b8bf5821a3440bc3616e38754583"}, - {file = "yarl-1.7.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:053e09817eafb892e94e172d05406c1b3a22a93bc68f6eff5198363a3d764459"}, - {file = "yarl-1.7.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:98c51f02d542945d306c8e934aa2c1e66ba5e9c1c86b5bf37f3a51c8a747067e"}, - {file = "yarl-1.7.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:15ec41a5a5fdb7bace6d7b16701f9440007a82734f69127c0fbf6d87e10f4a1e"}, - {file = "yarl-1.7.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a7f08819dba1e1255d6991ed37448a1bf4b1352c004bcd899b9da0c47958513d"}, - {file = "yarl-1.7.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8e3ffab21db0542ffd1887f3b9575ddd58961f2cf61429cb6458afc00c4581e0"}, - {file = "yarl-1.7.0-cp36-cp36m-win32.whl", hash = "sha256:50127634f519b2956005891507e3aa4ac345f66a7ea7bbc2d7dcba7401f41898"}, - {file = "yarl-1.7.0-cp36-cp36m-win_amd64.whl", hash = "sha256:36ec44f15193f6d5288d42ebb8e751b967ebdfb72d6830983838d45ab18edb4f"}, - {file = "yarl-1.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ec1b5a25a25c880c976d0bb3d107def085bb08dbb3db7f4442e0a2b980359d24"}, - {file = "yarl-1.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b36f5a63c891f813c6f04ef19675b382efc190fd5ce7e10ab19386d2548bca06"}, - {file = "yarl-1.7.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38173b8c3a29945e7ecade9a3f6ff39581eee8201338ee6a2c8882db5df3e806"}, - {file = "yarl-1.7.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ba402f32184f0b405fb281b93bd0d8ab7e3257735b57b62a6ed2e94cdf4fe50"}, - {file = "yarl-1.7.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:be52bc5208d767cdd8308a9e93059b3b36d1e048fecbea0e0346d0d24a76adc0"}, - {file = "yarl-1.7.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:08c2044a956f4ef30405f2f433ce77f1f57c2c773bf81ae43201917831044d5a"}, - {file = "yarl-1.7.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:484d61c047c45670ef5967653a1d0783e232c54bf9dd786a7737036828fa8d54"}, - {file = "yarl-1.7.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b7de92a4af85cfcaf4081f8aa6165b1d63ee5de150af3ee85f954145f93105a7"}, - {file = "yarl-1.7.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:376e41775aab79c5575534924a386c8e0f1a5d91db69fc6133fd27a489bcaf10"}, - {file = "yarl-1.7.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:8a8b10d0e7bac154f959b709fcea593cda527b234119311eb950096653816a86"}, - {file = "yarl-1.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f46cd4c43e6175030e2a56def8f1d83b64e6706eeb2bb9ab0ef4756f65eab23f"}, - {file = "yarl-1.7.0-cp37-cp37m-win32.whl", hash = "sha256:b28cfb46140efe1a6092b8c5c4994a1fe70dc83c38fbcea4992401e0c6fb9cce"}, - {file = "yarl-1.7.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9624154ec9c02a776802da1086eed7f5034bd1971977f5146233869c2ac80297"}, - {file = "yarl-1.7.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:69945d13e1bbf81784a9bc48824feb9cd66491e6a503d4e83f6cd7c7cc861361"}, - {file = "yarl-1.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:46a742ed9e363bd01be64160ce7520e92e11989bd4cb224403cfd31c101cc83d"}, - {file = "yarl-1.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb4ff1ac7cb4500f43581b3f4cbd627d702143aa6be1fdc1fa3ebffaf4dc1be5"}, - {file = "yarl-1.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ad51e17cd65ea3debb0e10f0120cf8dd987c741fe423ed2285087368090b33d"}, - {file = "yarl-1.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7e37786ea89a5d3ffbbf318ea9790926f8dfda83858544f128553c347ad143c6"}, - {file = "yarl-1.7.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c63c1e208f800daad71715786bfeb1cecdc595d87e2e9b1cd234fd6e597fd71d"}, - {file = "yarl-1.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91cbe24300c11835ef186436363352b3257db7af165e0a767f4f17aa25761388"}, - {file = "yarl-1.7.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e510dbec7c59d32eaa61ffa48173d5e3d7170a67f4a03e8f5e2e9e3971aca622"}, - {file = "yarl-1.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3def6e681cc02397e5d8141ee97b41d02932b2bcf0fb34532ad62855eab7c60e"}, - {file = "yarl-1.7.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:263c81b94e6431942b27f6f671fa62f430a0a5c14bb255f2ab69eeb9b2b66ff7"}, - {file = "yarl-1.7.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:e78c91faefe88d601ddd16e3882918dbde20577a2438e2320f8239c8b7507b8f"}, - {file = "yarl-1.7.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:22b2430c49713bfb2f0a0dd4a8d7aab218b28476ba86fd1c78ad8899462cbcf2"}, - {file = "yarl-1.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e7ad9db939082f5d0b9269cfd92c025cb8f2fbbb1f1b9dc5a393c639db5bd92"}, - {file = "yarl-1.7.0-cp38-cp38-win32.whl", hash = "sha256:3a31e4a8dcb1beaf167b7e7af61b88cb961b220db8d3ba1c839723630e57eef7"}, - {file = "yarl-1.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:d579957439933d752358c6a300c93110f84aae67b63dd0c19dde6ecbf4056f6b"}, - {file = "yarl-1.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:87721b549505a546eb003252185103b5ec8147de6d3ad3714d148a5a67b6fe53"}, - {file = "yarl-1.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1fa866fa24d9f4108f9e58ea8a2135655419885cdb443e36b39a346e1181532"}, - {file = "yarl-1.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d3b8449dfedfe94eaff2b77954258b09b24949f6818dfa444b05dbb05ae1b7e"}, - {file = "yarl-1.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db2372e350794ce8b9f810feb094c606b7e0e4aa6807141ac4fadfe5ddd75bb0"}, - {file = "yarl-1.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a06d9d0b9a97fa99b84fee71d9dd11e69e21ac8a27229089f07b5e5e50e8d63c"}, - {file = "yarl-1.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a3455c2456d6307bcfa80bc1157b8603f7d93573291f5bdc7144489ca0df4628"}, - {file = "yarl-1.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d30d67e3486aea61bb2cbf7cf81385364c2e4f7ce7469a76ed72af76a5cdfe6b"}, - {file = "yarl-1.7.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c18a4b286e8d780c3a40c31d7b79836aa93b720f71d5743f20c08b7e049ca073"}, - {file = "yarl-1.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d54c925396e7891666cabc0199366ca55b27d003393465acef63fd29b8b7aa92"}, - {file = "yarl-1.7.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:64773840952de17851a1c7346ad7f71688c77e74248d1f0bc230e96680f84028"}, - {file = "yarl-1.7.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:acbf1756d9dc7cd0ae943d883be72e84e04396f6c2ff93a6ddeca929d562039f"}, - {file = "yarl-1.7.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:2e48f27936aa838939c798f466c851ba4ae79e347e8dfce43b009c64b930df12"}, - {file = "yarl-1.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1beef4734ca1ad40a9d8c6b20a76ab46e3a2ed09f38561f01e4aa2ea82cafcef"}, - {file = "yarl-1.7.0-cp39-cp39-win32.whl", hash = "sha256:8ee78c9a5f3c642219d4607680a4693b59239c27a3aa608b64ef79ddc9698039"}, - {file = "yarl-1.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:d750503682605088a14d29a4701548c15c510da4f13c8b17409c4097d5b04c52"}, - {file = "yarl-1.7.0.tar.gz", hash = "sha256:8e7ebaf62e19c2feb097ffb7c94deb0f0c9fab52590784c8cd679d30ab009162"}, + {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95"}, + {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b"}, + {file = "yarl-1.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125"}, + {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739"}, + {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72"}, + {file = "yarl-1.7.2-cp310-cp310-win32.whl", hash = "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c"}, + {file = "yarl-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265"}, + {file = "yarl-1.7.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c"}, + {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa"}, + {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d"}, + {file = "yarl-1.7.2-cp36-cp36m-win32.whl", hash = "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1"}, + {file = "yarl-1.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913"}, + {file = "yarl-1.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e"}, + {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4"}, + {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b"}, + {file = "yarl-1.7.2-cp37-cp37m-win32.whl", hash = "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1"}, + {file = "yarl-1.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d"}, + {file = "yarl-1.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1"}, + {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8"}, + {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b"}, + {file = "yarl-1.7.2-cp38-cp38-win32.whl", hash = "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef"}, + {file = "yarl-1.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1"}, + {file = "yarl-1.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b"}, + {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8"}, + {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8"}, + {file = "yarl-1.7.2-cp39-cp39-win32.whl", hash = "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d"}, + {file = "yarl-1.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58"}, + {file = "yarl-1.7.2.tar.gz", hash = "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd"}, ] zipp = [ {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, diff --git a/pyproject.toml b/pyproject.toml index 5c33aa6e8..cad7b82e0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,10 +36,10 @@ pandas = [ { version = "^1.2.0", markers = "python_full_version >= '3.7.1' and python_full_version < '4.0.0'" }, ] numpy = "^1.18.0" -pyarrow = ">=2.0.0, <5.1.0" -redshift-connector = "~2.0.887" +pyarrow = ">=2.0.0, <6.1.0" +redshift-connector = "~2.0.889" pymysql = ">=0.9.0, <1.1.0" -pg8000 = ">=1.16.0, <1.22.0" +pg8000 = ">=1.16.0, <1.23.0" openpyxl = "~3.0.0" requests-aws4auth = "^1.1.1" jsonpath-ng = "^1.5.3" @@ -55,7 +55,7 @@ sqlserver = ["pyodbc"] [tool.poetry.dev-dependencies] wheel = "^0.36.2" isort = "^5.9.2" -black = "^21.9b0" +black = "^21.10b0" pylint = "^2.11.1" flake8 = "^4.0.0" mypy = "^0.910" diff --git a/tests/test_catalog.py b/tests/test_catalog.py index 0e1af0486..728f66656 100644 --- a/tests/test_catalog.py +++ b/tests/test_catalog.py @@ -358,3 +358,26 @@ def test_create_database(random_glue_database: str, account_id: str, use_catalog r = glue_client.get_database(Name=random_glue_database) assert r["Database"]["Name"] == random_glue_database assert r["Database"]["Description"] == description + + +def test_catalog_json(path: str, glue_database: str, glue_table: str, account_id: str): + # Create JSON table + assert not wr.catalog.does_table_exist(database=glue_database, table=glue_table) + wr.catalog.create_json_table( + database=glue_database, + table=glue_table, + path=path, + columns_types={"id": "int", "value": "string"}, + partitions_types={"y": "int", "m": "int"}, + compression="snappy", + ) + assert wr.catalog.does_table_exist(database=glue_database, table=glue_table) + # Add JSON partitions + wr.catalog.add_json_partitions( + database=glue_database, + table=glue_table, + partitions_values={f"{path}y=2020/m=1/": ["2020", "1"], f"{path}y=2021/m=2/": ["2021", "2"]}, + compression="snappy", + ) + partitions_values = wr.catalog.get_partitions(database=glue_database, table=glue_table) + assert len(partitions_values) == 2 diff --git a/tests/test_mysql.py b/tests/test_mysql.py index 07f21a25a..805c1403f 100644 --- a/tests/test_mysql.py +++ b/tests/test_mysql.py @@ -5,6 +5,7 @@ import pyarrow as pa import pymysql import pytest +from pymysql.cursors import SSCursor import awswrangler as wr @@ -27,6 +28,13 @@ def mysql_con_ssl(): con.close() +@pytest.fixture(scope="function") +def mysql_con_sscursor(): + con = wr.mysql.connect("aws-data-wrangler-mysql", cursorclass=SSCursor) + yield con + con.close() + + @pytest.mark.parametrize("connection", ["aws-data-wrangler-mysql", "aws-data-wrangler-mysql-ssl"]) def test_connection(connection): wr.mysql.connect(connection, connect_timeout=10).close() @@ -45,11 +53,22 @@ def test_read_sql_query_simple(databases_parameters): assert df.shape == (1, 1) +def test_conn_cursor(): + con = wr.mysql.connect("aws-data-wrangler-mysql", cursorclass=SSCursor) + + assert con.cursorclass == SSCursor + + def test_to_sql_simple(mysql_table, mysql_con): df = pd.DataFrame({"c0": [1, 2, 3], "c1": ["foo", "boo", "bar"]}) wr.mysql.to_sql(df, mysql_con, mysql_table, "test", "overwrite", True) +def test_to_sql_simple_sscursor(mysql_table, mysql_con_sscursor): + df = pd.DataFrame({"c0": [1, 2, 3], "c1": ["foo", "boo", "bar"]}) + wr.mysql.to_sql(df, mysql_con_sscursor, mysql_table, "test", "overwrite", True) + + def test_to_sql_simple_ssl(mysql_table, mysql_con_ssl): df = pd.DataFrame({"c0": [1, 2, 3], "c1": ["foo", "boo", "bar"]}) wr.mysql.to_sql(df, mysql_con_ssl, mysql_table, "test", "overwrite", True) diff --git a/tests/test_s3_text.py b/tests/test_s3_text.py index 65243ffe0..be74270e9 100644 --- a/tests/test_s3_text.py +++ b/tests/test_s3_text.py @@ -41,7 +41,7 @@ def test_csv_encoding(path, encoding, strings, wrong_encoding, exception, line_t @pytest.mark.parametrize("use_threads", [True, False, 2]) @pytest.mark.parametrize("chunksize", [None, 1]) -def test_read_partitioned_json(path, use_threads, chunksize): +def test_read_partitioned_json_paths(path, use_threads, chunksize): df = pd.DataFrame({"c0": [0, 1], "c1": ["foo", "boo"]}) paths = [f"{path}year={y}/month={m}/0.json" for y, m in [(2020, 1), (2020, 2), (2021, 1)]] for p in paths: @@ -57,7 +57,7 @@ def test_read_partitioned_json(path, use_threads, chunksize): @pytest.mark.parametrize("use_threads", [True, False, 2]) @pytest.mark.parametrize("chunksize", [None, 1]) -def test_read_partitioned_csv(path, use_threads, chunksize): +def test_read_partitioned_csv_paths(path, use_threads, chunksize): df = pd.DataFrame({"c0": [0, 1], "c1": ["foo", "boo"]}) paths = [f"{path}year={y}/month={m}/0.csv" for y, m in [(2020, 1), (2020, 2), (2021, 1)]] for p in paths: @@ -176,6 +176,13 @@ def test_json(path): assert df1.equals(wr.s3.read_json(path=[path0, path1], use_threads=True)) +def test_to_json_partitioned(path, glue_database, glue_table): + df = pd.DataFrame({"c0": [0, 1, 2], "c1": [3, 4, 5], "c2": [6, 7, 8]}) + partitions = wr.s3.to_json(df, path, dataset=True, database=glue_database, table=glue_table, partition_cols=["c0"]) + assert len(partitions["paths"]) == 3 + assert len(partitions["partitions_values"]) == 3 + + @pytest.mark.parametrize("filename_prefix", [None, "my_prefix"]) @pytest.mark.parametrize("use_threads", [True, False]) def test_to_text_filename_prefix(compare_filename_prefix, path, filename_prefix, use_threads): diff --git a/tutorials/014 - Schema Evolution.ipynb b/tutorials/014 - Schema Evolution.ipynb index c8a852431..34910ad68 100644 --- a/tutorials/014 - Schema Evolution.ipynb +++ b/tutorials/014 - Schema Evolution.ipynb @@ -8,10 +8,11 @@ "\n", "# 14 - Schema Evolution\n", "\n", - "Wrangler support new **columns** on Parquet Dataset through:\n", + "Wrangler support new **columns** on Parquet and CSV datasets through:\n", "\n", "- [wr.s3.to_parquet()](https://aws-data-wrangler.readthedocs.io/en/2.12.1/stubs/awswrangler.s3.to_parquet.html#awswrangler.s3.to_parquet)\n", - "- [wr.s3.store_parquet_metadata()](https://aws-data-wrangler.readthedocs.io/en/2.12.1/stubs/awswrangler.s3.store_parquet_metadata.html#awswrangler.s3.store_parquet_metadata) i.e. \"Crawler\"" + "- [wr.s3.store_parquet_metadata()](https://aws-data-wrangler.readthedocs.io/en/2.12.1/stubs/awswrangler.s3.store_parquet_metadata.html#awswrangler.s3.store_parquet_metadata) i.e. \"Crawler\"\n", + "- [wr.s3.to_csv()](https://aws-data-wrangler.readthedocs.io/en/2.12.1/stubs/awswrangler.s3.to_csv.html#awswrangler.s3.to_csv)" ] }, { @@ -55,7 +56,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Creating the Dataset" + "## Creating the Dataset\n", + "### Parquet" ] }, { @@ -132,6 +134,43 @@ "wr.s3.read_parquet(path, dataset=True)" ] }, + { + "cell_type": "markdown", + "source": [ + "### CSV" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "df = pd.DataFrame({\n", + " \"id\": [1, 2],\n", + " \"value\": [\"foo\", \"boo\"],\n", + "})\n", + "\n", + "wr.s3.to_csv(\n", + " df=df,\n", + " path=path,\n", + " dataset=True,\n", + " mode=\"overwrite\",\n", + " database=\"aws_data_wrangler\",\n", + " table=\"my_table\"\n", + ")\n", + "\n", + "wr.s3.read_csv(path, dataset=True)" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, { "cell_type": "markdown", "metadata": {}, @@ -150,7 +189,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Appending with NEW COLUMNS" + "## Appending with NEW COLUMNS\n", + "### Parquet" ] }, { @@ -252,6 +292,49 @@ "wr.s3.read_parquet(path, dataset=True, validate_schema=False)" ] }, + { + "cell_type": "markdown", + "source": [ + "### CSV\n", + "\n", + "Note: for CSV datasets due to [column ordering](https://docs.aws.amazon.com/athena/latest/ug/types-of-updates.html#updates-add-columns-beginning-middle-of-table), by default, schema evolution is disabled. Enable it by passing `schema_evolution=True` flag" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "df = pd.DataFrame({\n", + " \"id\": [3, 4],\n", + " \"value\": [\"bar\", None],\n", + " \"date\": [date(2020, 1, 3), date(2020, 1, 4)],\n", + " \"flag\": [True, False]\n", + "})\n", + "\n", + "wr.s3.to_csv(\n", + " df=df,\n", + " path=path,\n", + " dataset=True,\n", + " mode=\"append\",\n", + " database=\"aws_data_wrangler\",\n", + " table=\"my_table\",\n", + " schema_evolution=True,\n", + " catalog_versioning=True # Optional\n", + ")\n", + "\n", + "wr.s3.read_csv(path, dataset=True, validate_schema=False)" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, { "cell_type": "markdown", "metadata": {}, @@ -401,17 +484,8 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.10" - }, - "pycharm": { - "stem_cell": { - "cell_type": "raw", - "metadata": { - "collapsed": false - }, - "source": [] - } } }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file From 80eb5b499c857ef28d3033d2f4dab2feb4204118 Mon Sep 17 00:00:00 2001 From: Abdel Jaidi Date: Wed, 3 Nov 2021 22:22:12 +0000 Subject: [PATCH 3/5] Minor - Missing filter --- awswrangler/s3/_list.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/awswrangler/s3/_list.py b/awswrangler/s3/_list.py index 2711f6fda..2de0552ad 100644 --- a/awswrangler/s3/_list.py +++ b/awswrangler/s3/_list.py @@ -333,11 +333,16 @@ def list_objects( ['s3://bucket/prefix0', 's3://bucket/prefix1', 's3://bucket/prefix2'] """ + ignore_suffix_acc = set("/") + if isinstance(ignore_suffix, str): + ignore_suffix_acc.add(ignore_suffix) + elif isinstance(ignore_suffix, list): + ignore_suffix_acc.update(ignore_suffix) result_iterator = _list_objects( path=path, delimiter=None, suffix=suffix, - ignore_suffix=ignore_suffix, + ignore_suffix=list(ignore_suffix_acc), boto3_session=boto3_session, last_modified_begin=last_modified_begin, last_modified_end=last_modified_end, @@ -346,4 +351,4 @@ def list_objects( ) if chunked: return result_iterator - return [path for paths in result_iterator for path in paths if not path.endswith("/")] + return [path for paths in result_iterator for path in paths] From 2e85d6bce6b6b5dc3e38389f4965141a9bf60b45 Mon Sep 17 00:00:00 2001 From: Abdel Jaidi Date: Thu, 4 Nov 2021 10:16:12 +0000 Subject: [PATCH 4/5] Minor - Adding clarifying comment --- awswrangler/s3/_list.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/awswrangler/s3/_list.py b/awswrangler/s3/_list.py index 2de0552ad..d34aa1a57 100644 --- a/awswrangler/s3/_list.py +++ b/awswrangler/s3/_list.py @@ -333,11 +333,13 @@ def list_objects( ['s3://bucket/prefix0', 's3://bucket/prefix1', 's3://bucket/prefix2'] """ + # On top of user provided ignore_suffix input, add "/" ignore_suffix_acc = set("/") if isinstance(ignore_suffix, str): ignore_suffix_acc.add(ignore_suffix) elif isinstance(ignore_suffix, list): ignore_suffix_acc.update(ignore_suffix) + result_iterator = _list_objects( path=path, delimiter=None, From f3201fef831c2a8d889934f887edaf32c4eee97a Mon Sep 17 00:00:00 2001 From: Abdel Jaidi Date: Fri, 5 Nov 2021 16:56:36 +0000 Subject: [PATCH 5/5] Missing emptying the paths list --- awswrangler/s3/_list.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/awswrangler/s3/_list.py b/awswrangler/s3/_list.py index d34aa1a57..8efa8c44e 100644 --- a/awswrangler/s3/_list.py +++ b/awswrangler/s3/_list.py @@ -138,7 +138,9 @@ def _list_objects( # pylint: disable=too-many-branches if _ignore_suffix is not None: paths = [p for p in paths if p.endswith(tuple(_ignore_suffix)) is False] - yield paths + if paths: + yield paths + paths = [] def does_object_exist(