From ced1d7ae95087b6281472274591980c259219d14 Mon Sep 17 00:00:00 2001 From: DanYunin Date: Mon, 21 Nov 2022 11:01:22 +0300 Subject: [PATCH 1/3] Init project --- homeworks/DDYunin/7/hw_7/__init__.py | 0 homeworks/DDYunin/7/hw_7/__main__.py | 5 +++++ homeworks/DDYunin/7/poetry.lock | 8 ++++++++ homeworks/DDYunin/7/pyproject.toml | 15 +++++++++++++++ 4 files changed, 28 insertions(+) create mode 100644 homeworks/DDYunin/7/hw_7/__init__.py create mode 100644 homeworks/DDYunin/7/hw_7/__main__.py create mode 100644 homeworks/DDYunin/7/poetry.lock create mode 100644 homeworks/DDYunin/7/pyproject.toml diff --git a/homeworks/DDYunin/7/hw_7/__init__.py b/homeworks/DDYunin/7/hw_7/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/homeworks/DDYunin/7/hw_7/__main__.py b/homeworks/DDYunin/7/hw_7/__main__.py new file mode 100644 index 0000000..dd2ab28 --- /dev/null +++ b/homeworks/DDYunin/7/hw_7/__main__.py @@ -0,0 +1,5 @@ +def main(): + print('Init project') + +if __name__ == '__main__': + main() diff --git a/homeworks/DDYunin/7/poetry.lock b/homeworks/DDYunin/7/poetry.lock new file mode 100644 index 0000000..e968c09 --- /dev/null +++ b/homeworks/DDYunin/7/poetry.lock @@ -0,0 +1,8 @@ +package = [] + +[metadata] +lock-version = "1.1" +python-versions = "^3.11" +content-hash = "81b2fa642d7f2d1219cf80112ace12d689d053d81be7f7addb98144d56fc0fb2" + +[metadata.files] diff --git a/homeworks/DDYunin/7/pyproject.toml b/homeworks/DDYunin/7/pyproject.toml new file mode 100644 index 0000000..b43024b --- /dev/null +++ b/homeworks/DDYunin/7/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "7" +version = "0.1.0" +description = "" +authors = ["DanYunin "] +readme = "README.md" +packages = [{include = "hw_7"}] + +[tool.poetry.dependencies] +python = "^3.11" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" From f17d1bb5a2a901734efb2bbdd5baaaafff7ea3c9 Mon Sep 17 00:00:00 2001 From: DanYunin Date: Mon, 21 Nov 2022 22:48:55 +0300 Subject: [PATCH 2/3] I think, that it is async version --- homeworks/DDYunin/7/hw_7/__main__.py | 35 +- homeworks/DDYunin/7/hw_7/emails_file.csv | 1 + homeworks/DDYunin/7/hw_7/get_data.py | 34 ++ homeworks/DDYunin/7/hw_7/parser.py | 47 ++ homeworks/DDYunin/7/hw_7/prog.py | 163 +++++ homeworks/DDYunin/7/hw_7/temp.py | 132 ++++ homeworks/DDYunin/7/hw_7/users/1.xml | 201 ++++++ homeworks/DDYunin/7/hw_7/users/2.xml | 201 ++++++ homeworks/DDYunin/7/hw_7/users/None.xml | 8 + homeworks/DDYunin/7/hw_7/write_data.py | 84 +++ homeworks/DDYunin/7/poetry.lock | 747 ++++++++++++++++++++++- homeworks/DDYunin/7/pyproject.toml | 6 + 12 files changed, 1653 insertions(+), 6 deletions(-) create mode 100644 homeworks/DDYunin/7/hw_7/emails_file.csv create mode 100644 homeworks/DDYunin/7/hw_7/get_data.py create mode 100644 homeworks/DDYunin/7/hw_7/parser.py create mode 100644 homeworks/DDYunin/7/hw_7/prog.py create mode 100644 homeworks/DDYunin/7/hw_7/temp.py create mode 100644 homeworks/DDYunin/7/hw_7/users/1.xml create mode 100644 homeworks/DDYunin/7/hw_7/users/2.xml create mode 100644 homeworks/DDYunin/7/hw_7/users/None.xml create mode 100644 homeworks/DDYunin/7/hw_7/write_data.py diff --git a/homeworks/DDYunin/7/hw_7/__main__.py b/homeworks/DDYunin/7/hw_7/__main__.py index dd2ab28..19b8260 100644 --- a/homeworks/DDYunin/7/hw_7/__main__.py +++ b/homeworks/DDYunin/7/hw_7/__main__.py @@ -1,5 +1,32 @@ -def main(): - print('Init project') +import aiohttp +import asyncio +import time +import httpx +from hw_7.parser import start_parsing -if __name__ == '__main__': - main() +# _url = 'https://jsonplaceholder.typicode.com/users/{0}' + +# async def get_response(url: str): +# async with httpx.AsyncClient() as client: +# resp = await client.get(url) +# print(resp.json()) +# print() +# resp.raise_for_status() +# return resp + +# async def main(): +# await start_parsing() + # result = await asyncio.gather(*[ + # get_response(_url.format(number)) + # for number in list(range(1, 10)) + # ]) + + # for index in result: + # print(index) + +# if __name__ == '__main__': +# start = time.monotonic() +# loop = asyncio.new_event_loop() +# loop.run_until_complete(main()) +# loop.close() +# print('It took', time.monotonic() - start) \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/emails_file.csv b/homeworks/DDYunin/7/hw_7/emails_file.csv new file mode 100644 index 0000000..a963658 --- /dev/null +++ b/homeworks/DDYunin/7/hw_7/emails_file.csv @@ -0,0 +1 @@ +"Sincere@april.biz","Shanna@melissa.tv","anastasia.net" \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/get_data.py b/homeworks/DDYunin/7/hw_7/get_data.py new file mode 100644 index 0000000..e908cbe --- /dev/null +++ b/homeworks/DDYunin/7/hw_7/get_data.py @@ -0,0 +1,34 @@ +import time + +import httpx +from loguru import logger + + +async def get_user_data_posts(usr_id): + async with httpx.AsyncClient() as client: + url = 'https://jsonplaceholder.typicode.com/users/{0}/posts'.format(usr_id) + start_time = time.monotonic() + response = await client.get(url) + end_time = time.monotonic() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + return response.json() + + +async def get_user_data_albums(usr_id): + async with httpx.AsyncClient() as client: + url = 'https://jsonplaceholder.typicode.com/users/{0}/albums'.format(usr_id) + start_time = time.monotonic() + response = await client.get(url) + end_time = time.monotonic() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + return response.json() + + +async def get_user_data_todos(usr_id): + async with httpx.AsyncClient() as client: + url = 'https://jsonplaceholder.typicode.com/users/{0}/todos'.format(usr_id) + start_time = time.monotonic() + response = await client.get(url) + end_time = time.monotonic() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + return response.json() \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/parser.py b/homeworks/DDYunin/7/hw_7/parser.py new file mode 100644 index 0000000..1cd7e58 --- /dev/null +++ b/homeworks/DDYunin/7/hw_7/parser.py @@ -0,0 +1,47 @@ +from loguru import logger +import time +import csv +import httpx +from hw_7.write_data import write_data_xml + +async def start_parsing(): + all_emails_not_flatten = parse_emails_from_csv_file() + # Вытягиваю list of lists в простой list и преобразую его в dict + emails_ids = dict.fromkeys(flatten(all_emails_not_flatten)) + logger.info('This program work with {number_users} users'.format(number_users = len(emails_ids))) + people_data = await get_data_json() + emails_ids = get_ready_dict_with_emails_and_ids(people_data, emails_ids) + print(emails_ids) + await write_data_xml(emails_ids) + + +def parse_emails_from_csv_file(): + emails = [] + start_time = time.monotonic() + with open('hw_7/emails_file.csv') as csv_file: + reader = csv.reader(csv_file) + end_time = time.monotonic() + logger.info('Request lasted {0} seconds'.format(end_time - start_time)) + emails = list(reader) + return emails + + +def flatten(lst_emails): + return [lst_element for sublist in lst_emails for lst_element in sublist] + + +async def get_data_json(): + async with httpx.AsyncClient() as client: + url = 'https://jsonplaceholder.typicode.com/users/' + start_time = time.monotonic() + response = await client.get(url) + end_time = time.monotonic() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + return response.json() + + +def get_ready_dict_with_emails_and_ids(people_data, emails_ids): + for person_data in people_data: + if person_data['email'] in emails_ids: + emails_ids[person_data.get('email')] = person_data['id'] + return emails_ids \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/prog.py b/homeworks/DDYunin/7/hw_7/prog.py new file mode 100644 index 0000000..ad7df6c --- /dev/null +++ b/homeworks/DDYunin/7/hw_7/prog.py @@ -0,0 +1,163 @@ +# Сначала напишу реализацию в один файл +import aiohttp +import asyncio +import time +import httpx +import csv +from loguru import logger +import os +import shutil +import xml.etree.ElementTree as et + +def parse_csv_file(): # Не надо делать асинхронные вызовы + emails = [] + start_time = time.monotonic() + with open('hw_7/emails_file.csv') as csv_file: + reader = csv.reader(csv_file) + logger.info('Request lasted {0} seconds'.format(time.monotonic() - start_time)) + emails = list(reader) + return emails + +def flatten(lst_emails): # не надо делать асинхронные вызовы + return [lst_element for sublist in lst_emails for lst_element in sublist] + +async def get_data_json(): + async with httpx.AsyncClient() as client: + url = 'https://jsonplaceholder.typicode.com/users/' + start_time = time.monotonic() + response = await client.get(url) + end_time = time.monotonic() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + return response.json() + +def get_ready_dict_with_emails_and_ids(people_data, emails_ids): + for person_data in people_data: + if person_data['email'] in emails_ids: + emails_ids[person_data.get('email')] = person_data['id'] + return emails_ids + +########################################################## + +def create_catalog_users(): + if os.path.exists('hw_7/users'): + shutil.rmtree('hw_7/users') + os.mkdir('hw_7/users') + +def create_struct_xml_file(user_email, all_data): + struct = et.Element('user') + id_element = et.SubElement(struct, 'id') + id_element.text = '{0}'.format(all_data[user_email]) + email_element = et.SubElement(struct, 'email') + email_element.text = '{0}'.format(user_email) + return struct + +async def add_posts_in_xml_file(xml_struct, user_email, all_data): + data_posts = await get_user_data_posts(all_data[user_email]) + posts_element = et.SubElement(xml_struct, 'posts') + if not data_posts: + posts_element.text = '' + for post in data_posts: + post_element = et.SubElement(posts_element, 'post') + et.SubElement(post_element, 'id').text = '{0}'.format(post['id']) + et.SubElement(post_element, 'title').text = '{0}'.format(post['title']) + str_body = '{0}'.format(post['body']) + et.SubElement(post_element, 'body').text = str_body.replace('\n', ' ') + return xml_struct + +async def get_user_data_posts(usr_id): + async with httpx.AsyncClient() as client: + url = 'https://jsonplaceholder.typicode.com/users/{0}/posts'.format(usr_id) + start_time = time.monotonic() + response = await client.get(url) + end_time = time.monotonic() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + return response.json() + +async def get_user_data_albums(usr_id): + async with httpx.AsyncClient() as client: + url = 'https://jsonplaceholder.typicode.com/users/{0}/albums'.format(usr_id) + start_time = time.monotonic() + response = await client.get(url) + end_time = time.monotonic() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + return response.json() + + +async def get_user_data_todos(usr_id): + async with httpx.AsyncClient() as client: + url = 'https://jsonplaceholder.typicode.com/users/{0}/todos'.format(usr_id) + start_time = time.monotonic() + response = await client.get(url) + end_time = time.monotonic() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + return response.json() + +async def add_albums_in_xml_file(xml_struct, user_email, all_data): + data_albums = await get_user_data_albums(all_data[user_email]) + albums_element = et.SubElement(xml_struct, 'albums') + if not data_albums: + albums_element.text = '' + for album in data_albums: + album_element = et.SubElement(albums_element, 'album') + et.SubElement(album_element, 'id').text = '{0}'.format(album['id']) + et.SubElement(album_element, 'title').text = '{0}'.format(album['title']) + return xml_struct + + +async def add_todos_in_xml_file(xml_struct, user_email, all_data): + data_todos = await get_user_data_todos(all_data[user_email]) + todos_element = et.SubElement(xml_struct, 'todos') + if not data_todos: + todos_element.text = '' + for todo in data_todos: + todo_element = et.SubElement(todos_element, 'todo') + et.SubElement(todo_element, 'id').text = '{0}'.format(todo['id']) + et.SubElement(todo_element, 'title').text = '{0}'.format(todo['title']) + et.SubElement(todo_element, 'completed').text = '{0}'.format(todo['completed']) + return xml_struct + + +def save_ready_xml_file(xml_struct, user_email, all_data): + xml_file = et.ElementTree(xml_struct) + et.indent(xml_file) + start_time = time.monotonic() + with open('hw_7/users/{0}.xml'.format(all_data[user_email]), 'wb') as xml_fl: + xml_file.write(xml_fl, encoding='UTF-8', short_empty_elements=False, xml_declaration=True) + end_time = time.monotonic() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + +async def user_operation_async(email, all_data): + print('Operation for {email}'.format(email=email)) + logger.info('Starts parsing for {0}'.format(email)) + xml_struct = create_struct_xml_file(email, all_data) + xml_struct = await add_posts_in_xml_file(xml_struct, email, all_data) + xml_struct = await add_albums_in_xml_file(xml_struct, email, all_data) + xml_struct = await add_todos_in_xml_file(xml_struct, email, all_data) + save_ready_xml_file(xml_struct, email, all_data) + print('Operation ends for {email}'.format(email=email)) + +async def write_data_xml(emails_and_ids): # А вот тут уже нужна асинхронность + # у меня есть список эмейлов и для каждого пользователя хорошо было бы делать всё асинхронно + create_catalog_users() + await asyncio.gather(*[ + user_operation_async(email, emails_and_ids) + for email in emails_and_ids + ]) + +################################################## + +async def main(): + emails = parse_csv_file() + emails = dict.fromkeys(flatten(emails)) + logger.info('This program work with {number_users} users'.format(number_users = len(emails))) + people_data = await get_data_json() + emails = get_ready_dict_with_emails_and_ids(people_data, emails) + print(emails) + await write_data_xml(emails) + +if __name__ == '__main__': + start = time.monotonic() + loop = asyncio.new_event_loop() + loop.run_until_complete(main()) + loop.close() + print('It took', time.monotonic() - start) \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/temp.py b/homeworks/DDYunin/7/hw_7/temp.py new file mode 100644 index 0000000..0984d95 --- /dev/null +++ b/homeworks/DDYunin/7/hw_7/temp.py @@ -0,0 +1,132 @@ +import os +import shutil +from datetime import datetime + +from loguru import logger + +from hw_6.get_data import (get_user_data_albums, get_user_data_posts, + get_user_data_todos) + + +def write_data_xml(emails_and_ids): + create_catalog_users() + for email in emails_and_ids: + logger.info('Starts parsing for {0}'.format(email)) + xml_struct = create_struct_xml_file(email, emails_and_ids) + xml_struct = add_posts_in_xml_file(xml_struct, email, emails_and_ids) + xml_struct = add_albums_in_xml_file(xml_struct, email, emails_and_ids) + xml_struct = add_todos_in_xml_file(xml_struct, email, emails_and_ids) + save_ready_xml_file(xml_struct, email, emails_and_ids) + + +def create_struct_xml_file(user_email, all_data): + struct = et.Element('user') + id_element = et.SubElement(struct, 'id') + id_element.text = '{0}'.format(all_data[user_email]) + email_element = et.SubElement(struct, 'email') + email_element.text = '{0}'.format(user_email) + return struct + + +def add_posts_in_xml_file(xml_struct, user_email, all_data): + data_posts = get_user_data_posts(all_data[user_email]) + posts_element = et.SubElement(xml_struct, 'posts') + if not data_posts: + posts_element.text = '' + for post in data_posts: + post_element = et.SubElement(posts_element, 'post') + et.SubElement(post_element, 'id').text = '{0}'.format(post['id']) + et.SubElement(post_element, 'title').text = '{0}'.format(post['title']) + str_body = '{0}'.format(post['body']) + et.SubElement(post_element, 'body').text = str_body.replace('\n', ' ') + return xml_struct + + +def add_albums_in_xml_file(xml_struct, user_email, all_data): + data_albums = get_user_data_albums(all_data[user_email]) + albums_element = et.SubElement(xml_struct, 'albums') + if not data_albums: + albums_element.text = '' + for album in data_albums: + album_element = et.SubElement(albums_element, 'album') + et.SubElement(album_element, 'id').text = '{0}'.format(album['id']) + et.SubElement(album_element, 'title').text = '{0}'.format(album['title']) + return xml_struct + + +def add_todos_in_xml_file(xml_struct, user_email, all_data): + data_todos = get_user_data_todos(all_data[user_email]) + todos_element = et.SubElement(xml_struct, 'todos') + if not data_todos: + todos_element.text = '' + for todo in data_todos: + todo_element = et.SubElement(todos_element, 'todo') + et.SubElement(todo_element, 'id').text = '{0}'.format(todo['id']) + et.SubElement(todo_element, 'title').text = '{0}'.format(todo['title']) + et.SubElement(todo_element, 'completed').text = '{0}'.format(todo['completed']) + return xml_struct + + +def save_ready_xml_file(xml_struct, user_email, all_data): + xml_file = et.ElementTree(xml_struct) + start_time = datetime.now() + with open('hw_6/users/{0}.xml'.format(all_data[user_email]), 'wb') as xml_fl: + xml_file.write(xml_fl, encoding='UTF-8', pretty_print=True, xml_declaration=True) + end_time = datetime.now() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + + +def create_catalog_users(): + if os.path.exists('hw_6/users'): + shutil.rmtree('hw_6/users') + os.mkdir('hw_6/users') + + + +########################################################################### + +import csv +from datetime import datetime + +from loguru import logger + +from hw_6.write_data import write_data_xml + +# TODO +# Добавить логи +# Раскидать содержимое модуля на разные модули, ибо слишком много и сложно! + + + + +#################################################################################### + +from datetime import datetime +from loguru import logger + + +def get_user_data_posts(usr_id): + url = 'https://jsonplaceholder.typicode.com/users/{0}/posts'.format(usr_id) + start_time = datetime.now() + response = requests.get(url) + end_time = datetime.now() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + return response.json() + + +def get_user_data_albums(usr_id): + url = 'https://jsonplaceholder.typicode.com/users/{0}/albums'.format(usr_id) + start_time = datetime.now() + response = requests.get(url) + end_time = datetime.now() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + return response.json() + + +def get_user_data_todos(usr_id): + url = 'https://jsonplaceholder.typicode.com/users/{0}/todos'.format(usr_id) + start_time = datetime.now() + response = requests.get(url) + end_time = datetime.now() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + return response.json() \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/users/1.xml b/homeworks/DDYunin/7/hw_7/users/1.xml new file mode 100644 index 0000000..fea7e6a --- /dev/null +++ b/homeworks/DDYunin/7/hw_7/users/1.xml @@ -0,0 +1,201 @@ + + + 1 + Sincere@april.biz + + + 1 + sunt aut facere repellat provident occaecati excepturi optio reprehenderit + quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto + + + 2 + qui est esse + est rerum tempore vitae sequi sint nihil reprehenderit dolor beatae ea dolores neque fugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis qui aperiam non debitis possimus qui neque nisi nulla + + + 3 + ea molestias quasi exercitationem repellat qui ipsa sit aut + et iusto sed quo iure voluptatem occaecati omnis eligendi aut ad voluptatem doloribus vel accusantium quis pariatur molestiae porro eius odio et labore et velit aut + + + 4 + eum et est occaecati + ullam et saepe reiciendis voluptatem adipisci sit amet autem assumenda provident rerum culpa quis hic commodi nesciunt rem tenetur doloremque ipsam iure quis sunt voluptatem rerum illo velit + + + 5 + nesciunt quas odio + repudiandae veniam quaerat sunt sed alias aut fugiat sit autem sed est voluptatem omnis possimus esse voluptatibus quis est aut tenetur dolor neque + + + 6 + dolorem eum magni eos aperiam quia + ut aspernatur corporis harum nihil quis provident sequi mollitia nobis aliquid molestiae perspiciatis et ea nemo ab reprehenderit accusantium quas voluptate dolores velit et doloremque molestiae + + + 7 + magnam facilis autem + dolore placeat quibusdam ea quo vitae magni quis enim qui quis quo nemo aut saepe quidem repellat excepturi ut quia sunt ut sequi eos ea sed quas + + + 8 + dolorem dolore est ipsam + dignissimos aperiam dolorem qui eum facilis quibusdam animi sint suscipit qui sint possimus cum quaerat magni maiores excepturi ipsam ut commodi dolor voluptatum modi aut vitae + + + 9 + nesciunt iure omnis dolorem tempora et accusantium + consectetur animi nesciunt iure dolore enim quia ad veniam autem ut quam aut nobis et est aut quod aut provident voluptas autem voluptas + + + 10 + optio molestias id quia eum + quo et expedita modi cum officia vel magni doloribus qui repudiandae vero nisi sit quos veniam quod sed accusamus veritatis error + + + + + 1 + quidem molestiae enim + + + 2 + sunt qui excepturi placeat culpa + + + 3 + omnis laborum odio + + + 4 + non esse culpa molestiae omnis sed optio + + + 5 + eaque aut omnis a + + + 6 + natus impedit quibusdam illo est + + + 7 + quibusdam autem aliquid et et quia + + + 8 + qui fuga est a eum + + + 9 + saepe unde necessitatibus rem + + + 10 + distinctio laborum qui + + + + + 1 + delectus aut autem + False + + + 2 + quis ut nam facilis et officia qui + False + + + 3 + fugiat veniam minus + False + + + 4 + et porro tempora + True + + + 5 + laboriosam mollitia et enim quasi adipisci quia provident illum + False + + + 6 + qui ullam ratione quibusdam voluptatem quia omnis + False + + + 7 + illo expedita consequatur quia in + False + + + 8 + quo adipisci enim quam ut ab + True + + + 9 + molestiae perspiciatis ipsa + False + + + 10 + illo est ratione doloremque quia maiores aut + True + + + 11 + vero rerum temporibus dolor + True + + + 12 + ipsa repellendus fugit nisi + True + + + 13 + et doloremque nulla + False + + + 14 + repellendus sunt dolores architecto voluptatum + True + + + 15 + ab voluptatum amet voluptas + True + + + 16 + accusamus eos facilis sint et aut voluptatem + True + + + 17 + quo laboriosam deleniti aut qui + True + + + 18 + dolorum est consequatur ea mollitia in culpa + False + + + 19 + molestiae ipsa aut voluptatibus pariatur dolor nihil + True + + + 20 + ullam nobis libero sapiente ad optio sint + True + + + \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/users/2.xml b/homeworks/DDYunin/7/hw_7/users/2.xml new file mode 100644 index 0000000..d662d67 --- /dev/null +++ b/homeworks/DDYunin/7/hw_7/users/2.xml @@ -0,0 +1,201 @@ + + + 2 + Shanna@melissa.tv + + + 11 + et ea vero quia laudantium autem + delectus reiciendis molestiae occaecati non minima eveniet qui voluptatibus accusamus in eum beatae sit vel qui neque voluptates ut commodi qui incidunt ut animi commodi + + + 12 + in quibusdam tempore odit est dolorem + itaque id aut magnam praesentium quia et ea odit et ea voluptas et sapiente quia nihil amet occaecati quia id voluptatem incidunt ea est distinctio odio + + + 13 + dolorum ut in voluptas mollitia et saepe quo animi + aut dicta possimus sint mollitia voluptas commodi quo doloremque iste corrupti reiciendis voluptatem eius rerum sit cumque quod eligendi laborum minima perferendis recusandae assumenda consectetur porro architecto ipsum ipsam + + + 14 + voluptatem eligendi optio + fuga et accusamus dolorum perferendis illo voluptas non doloremque neque facere ad qui dolorum molestiae beatae sed aut voluptas totam sit illum + + + 15 + eveniet quod temporibus + reprehenderit quos placeat velit minima officia dolores impedit repudiandae molestiae nam voluptas recusandae quis delectus officiis harum fugiat vitae + + + 16 + sint suscipit perspiciatis velit dolorum rerum ipsa laboriosam odio + suscipit nam nisi quo aperiam aut asperiores eos fugit maiores voluptatibus quia voluptatem quis ullam qui in alias quia est consequatur magni mollitia accusamus ea nisi voluptate dicta + + + 17 + fugit voluptas sed molestias voluptatem provident + eos voluptas et aut odit natus earum aspernatur fuga molestiae ullam deserunt ratione qui eos qui nihil ratione nemo velit ut aut id quo + + + 18 + voluptate et itaque vero tempora molestiae + eveniet quo quis laborum totam consequatur non dolor ut et est repudiandae est voluptatem vel debitis et magnam + + + 19 + adipisci placeat illum aut reiciendis qui + illum quis cupiditate provident sit magnam ea sed aut omnis veniam maiores ullam consequatur atque adipisci quo iste expedita sit quos voluptas + + + 20 + doloribus ad provident suscipit at + qui consequuntur ducimus possimus quisquam amet similique suscipit porro ipsam amet eos veritatis officiis exercitationem vel fugit aut necessitatibus totam omnis rerum consequatur expedita quidem cumque explicabo + + + + + 11 + quam nostrum impedit mollitia quod et dolor + + + 12 + consequatur autem doloribus natus consectetur + + + 13 + ab rerum non rerum consequatur ut ea unde + + + 14 + ducimus molestias eos animi atque nihil + + + 15 + ut pariatur rerum ipsum natus repellendus praesentium + + + 16 + voluptatem aut maxime inventore autem magnam atque repellat + + + 17 + aut minima voluptatem ut velit + + + 18 + nesciunt quia et doloremque + + + 19 + velit pariatur quaerat similique libero omnis quia + + + 20 + voluptas rerum iure ut enim + + + + + 21 + suscipit repellat esse quibusdam voluptatem incidunt + False + + + 22 + distinctio vitae autem nihil ut molestias quo + True + + + 23 + et itaque necessitatibus maxime molestiae qui quas velit + False + + + 24 + adipisci non ad dicta qui amet quaerat doloribus ea + False + + + 25 + voluptas quo tenetur perspiciatis explicabo natus + True + + + 26 + aliquam aut quasi + True + + + 27 + veritatis pariatur delectus + True + + + 28 + nesciunt totam sit blanditiis sit + False + + + 29 + laborum aut in quam + False + + + 30 + nemo perspiciatis repellat ut dolor libero commodi blanditiis omnis + True + + + 31 + repudiandae totam in est sint facere fuga + False + + + 32 + earum doloribus ea doloremque quis + False + + + 33 + sint sit aut vero + False + + + 34 + porro aut necessitatibus eaque distinctio + False + + + 35 + repellendus veritatis molestias dicta incidunt + True + + + 36 + excepturi deleniti adipisci voluptatem et neque optio illum ad + True + + + 37 + sunt cum tempora + False + + + 38 + totam quia non + False + + + 39 + doloremque quibusdam asperiores libero corrupti illum qui omnis + False + + + 40 + totam atque quo nesciunt + True + + + \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/users/None.xml b/homeworks/DDYunin/7/hw_7/users/None.xml new file mode 100644 index 0000000..fa1685c --- /dev/null +++ b/homeworks/DDYunin/7/hw_7/users/None.xml @@ -0,0 +1,8 @@ + + + None + anastasia.net + + + + \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/write_data.py b/homeworks/DDYunin/7/hw_7/write_data.py new file mode 100644 index 0000000..c413477 --- /dev/null +++ b/homeworks/DDYunin/7/hw_7/write_data.py @@ -0,0 +1,84 @@ +import os +import shutil +from datetime import datetime + +from loguru import logger +import xml.etree.ElementTree as et + +from hw_7.get_data import (get_user_data_albums, get_user_data_posts, + get_user_data_todos) + + +async def write_data_xml(emails_and_ids): + create_catalog_users() + for email in emails_and_ids: + logger.info('Starts parsing for {0}'.format(email)) + xml_struct = create_struct_xml_file(email, emails_and_ids) + xml_struct = add_posts_in_xml_file(xml_struct, email, emails_and_ids) + xml_struct = add_albums_in_xml_file(xml_struct, email, emails_and_ids) + xml_struct = add_todos_in_xml_file(xml_struct, email, emails_and_ids) + save_ready_xml_file(xml_struct, email, emails_and_ids) + + +def create_struct_xml_file(user_email, all_data): + struct = et.Element('user') + id_element = et.SubElement(struct, 'id') + id_element.text = '{0}'.format(all_data[user_email]) + email_element = et.SubElement(struct, 'email') + email_element.text = '{0}'.format(user_email) + return struct + + +async def add_posts_in_xml_file(xml_struct, user_email, all_data): + data_posts = await get_user_data_posts(all_data[user_email]) + posts_element = et.SubElement(xml_struct, 'posts') + if not data_posts: + posts_element.text = '' + for post in data_posts: + post_element = et.SubElement(posts_element, 'post') + et.SubElement(post_element, 'id').text = '{0}'.format(post['id']) + et.SubElement(post_element, 'title').text = '{0}'.format(post['title']) + str_body = '{0}'.format(post['body']) + et.SubElement(post_element, 'body').text = str_body.replace('\n', ' ') + return xml_struct + + +async def add_albums_in_xml_file(xml_struct, user_email, all_data): + data_albums = await get_user_data_albums(all_data[user_email]) + albums_element = et.SubElement(xml_struct, 'albums') + if not data_albums: + albums_element.text = '' + for album in data_albums: + album_element = et.SubElement(albums_element, 'album') + et.SubElement(album_element, 'id').text = '{0}'.format(album['id']) + et.SubElement(album_element, 'title').text = '{0}'.format(album['title']) + return xml_struct + + +async def add_todos_in_xml_file(xml_struct, user_email, all_data): + data_todos = await get_user_data_todos(all_data[user_email]) + todos_element = et.SubElement(xml_struct, 'todos') + if not data_todos: + todos_element.text = '' + for todo in data_todos: + todo_element = et.SubElement(todos_element, 'todo') + et.SubElement(todo_element, 'id').text = '{0}'.format(todo['id']) + et.SubElement(todo_element, 'title').text = '{0}'.format(todo['title']) + et.SubElement(todo_element, 'completed').text = '{0}'.format(todo['completed']) + return xml_struct + + +def save_ready_xml_file(xml_struct, user_email, all_data): + xml_file = et.ElementTree(xml_struct) + et.indent(xml_file) + start_time = datetime.now() + with open('hw_7/users/{0}.xml'.format(all_data[user_email]), 'wb') as xml_fl: + xml_file.write(xml_fl, encoding='UTF-8', short_empty_elements=True, xml_declaration=True) + end_time = datetime.now() + logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + + +def create_catalog_users(): + if os.path.exists('hw_7/users'): + shutil.rmtree('hw_7/users') + os.mkdir('hw_7/users') \ No newline at end of file diff --git a/homeworks/DDYunin/7/poetry.lock b/homeworks/DDYunin/7/poetry.lock index e968c09..ce22516 100644 --- a/homeworks/DDYunin/7/poetry.lock +++ b/homeworks/DDYunin/7/poetry.lock @@ -1,8 +1,751 @@ -package = [] +[[package]] +name = "aiohttp" +version = "3.8.3" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "anyio" +version = "3.6.2" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16,<0.22)"] + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "asyncio" +version = "3.4.3" +description = "reference implementation of PEP 3156" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "attrs" +version = "22.1.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] +docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] +tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] +tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] + +[[package]] +name = "certifi" +version = "2022.9.24" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "charset-normalizer" +version = "2.1.1" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.extras] +unicode-backport = ["unicodedata2"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" + +[[package]] +name = "flake8" +version = "5.0.4" +description = "the modular source code checker: pep8 pyflakes and co" +category = "main" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" + +[[package]] +name = "frozenlist" +version = "1.3.3" +description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "httpcore" +version = "0.16.1" +description = "A minimal low-level HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "httpx" +version = "0.23.1" +description = "The next generation HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +certifi = "*" +httpcore = ">=0.15.0,<0.17.0" +rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "isort" +version = "5.10.1" +description = "A Python utility / library to sort Python imports." +category = "main" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +colors = ["colorama (>=0.4.3,<0.5.0)"] +pipfile-deprecated-finder = ["pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "loguru" +version = "0.6.0" +description = "Python logging made (stupidly) simple" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (>=4.1.1)", "black (>=19.10b0)", "colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "isort (>=5.1.1)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "tox (>=3.9.0)"] + +[[package]] +name = "lxml" +version = "4.9.1" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.7)"] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "multidict" +version = "6.0.2" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "pycodestyle" +version = "2.9.1" +description = "Python style guide checker" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pyflakes" +version = "2.5.0" +description = "passive checker of Python programs" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "rfc3986" +version = "1.5.0" +description = "Validating URI References per RFC 3986" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[package]] +name = "yarl" +version = "1.8.1" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" [metadata] lock-version = "1.1" python-versions = "^3.11" -content-hash = "81b2fa642d7f2d1219cf80112ace12d689d053d81be7f7addb98144d56fc0fb2" +content-hash = "f284f0b5e7a9c6448f3d249f1439bb08ef87db02ee7a1f41af0846afde45f350" [metadata.files] +aiohttp = [ + {file = "aiohttp-3.8.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ba71c9b4dcbb16212f334126cc3d8beb6af377f6703d9dc2d9fb3874fd667ee9"}, + {file = "aiohttp-3.8.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d24b8bb40d5c61ef2d9b6a8f4528c2f17f1c5d2d31fed62ec860f6006142e83e"}, + {file = "aiohttp-3.8.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f88df3a83cf9df566f171adba39d5bd52814ac0b94778d2448652fc77f9eb491"}, + {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97decbb3372d4b69e4d4c8117f44632551c692bb1361b356a02b97b69e18a62"}, + {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309aa21c1d54b8ef0723181d430347d7452daaff93e8e2363db8e75c72c2fb2d"}, + {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad5383a67514e8e76906a06741febd9126fc7c7ff0f599d6fcce3e82b80d026f"}, + {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20acae4f268317bb975671e375493dbdbc67cddb5f6c71eebdb85b34444ac46b"}, + {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05a3c31c6d7cd08c149e50dc7aa2568317f5844acd745621983380597f027a18"}, + {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6f76310355e9fae637c3162936e9504b4767d5c52ca268331e2756e54fd4ca5"}, + {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:256deb4b29fe5e47893fa32e1de2d73c3afe7407738bd3c63829874661d4822d"}, + {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5c59fcd80b9049b49acd29bd3598cada4afc8d8d69bd4160cd613246912535d7"}, + {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:059a91e88f2c00fe40aed9031b3606c3f311414f86a90d696dd982e7aec48142"}, + {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2feebbb6074cdbd1ac276dbd737b40e890a1361b3cc30b74ac2f5e24aab41f7b"}, + {file = "aiohttp-3.8.3-cp310-cp310-win32.whl", hash = "sha256:5bf651afd22d5f0c4be16cf39d0482ea494f5c88f03e75e5fef3a85177fecdeb"}, + {file = "aiohttp-3.8.3-cp310-cp310-win_amd64.whl", hash = "sha256:653acc3880459f82a65e27bd6526e47ddf19e643457d36a2250b85b41a564715"}, + {file = "aiohttp-3.8.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:86fc24e58ecb32aee09f864cb11bb91bc4c1086615001647dbfc4dc8c32f4008"}, + {file = "aiohttp-3.8.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75e14eac916f024305db517e00a9252714fce0abcb10ad327fb6dcdc0d060f1d"}, + {file = "aiohttp-3.8.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d1fde0f44029e02d02d3993ad55ce93ead9bb9b15c6b7ccd580f90bd7e3de476"}, + {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab94426ddb1ecc6a0b601d832d5d9d421820989b8caa929114811369673235c"}, + {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89d2e02167fa95172c017732ed7725bc8523c598757f08d13c5acca308e1a061"}, + {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02f9a2c72fc95d59b881cf38a4b2be9381b9527f9d328771e90f72ac76f31ad8"}, + {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7149272fb5834fc186328e2c1fa01dda3e1fa940ce18fded6d412e8f2cf76d"}, + {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:512bd5ab136b8dc0ffe3fdf2dfb0c4b4f49c8577f6cae55dca862cd37a4564e2"}, + {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7018ecc5fe97027214556afbc7c502fbd718d0740e87eb1217b17efd05b3d276"}, + {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88c70ed9da9963d5496d38320160e8eb7e5f1886f9290475a881db12f351ab5d"}, + {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:da22885266bbfb3f78218dc40205fed2671909fbd0720aedba39b4515c038091"}, + {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:e65bc19919c910127c06759a63747ebe14f386cda573d95bcc62b427ca1afc73"}, + {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:08c78317e950e0762c2983f4dd58dc5e6c9ff75c8a0efeae299d363d439c8e34"}, + {file = "aiohttp-3.8.3-cp311-cp311-win32.whl", hash = "sha256:45d88b016c849d74ebc6f2b6e8bc17cabf26e7e40c0661ddd8fae4c00f015697"}, + {file = "aiohttp-3.8.3-cp311-cp311-win_amd64.whl", hash = "sha256:96372fc29471646b9b106ee918c8eeb4cca423fcbf9a34daa1b93767a88a2290"}, + {file = "aiohttp-3.8.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c971bf3786b5fad82ce5ad570dc6ee420f5b12527157929e830f51c55dc8af77"}, + {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff25f48fc8e623d95eca0670b8cc1469a83783c924a602e0fbd47363bb54aaca"}, + {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e381581b37db1db7597b62a2e6b8b57c3deec95d93b6d6407c5b61ddc98aca6d"}, + {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db19d60d846283ee275d0416e2a23493f4e6b6028825b51290ac05afc87a6f97"}, + {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25892c92bee6d9449ffac82c2fe257f3a6f297792cdb18ad784737d61e7a9a85"}, + {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:398701865e7a9565d49189f6c90868efaca21be65c725fc87fc305906be915da"}, + {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4a4fbc769ea9b6bd97f4ad0b430a6807f92f0e5eb020f1e42ece59f3ecfc4585"}, + {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:b29bfd650ed8e148f9c515474a6ef0ba1090b7a8faeee26b74a8ff3b33617502"}, + {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:1e56b9cafcd6531bab5d9b2e890bb4937f4165109fe98e2b98ef0dcfcb06ee9d"}, + {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ec40170327d4a404b0d91855d41bfe1fe4b699222b2b93e3d833a27330a87a6d"}, + {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2df5f139233060578d8c2c975128fb231a89ca0a462b35d4b5fcf7c501ebdbe1"}, + {file = "aiohttp-3.8.3-cp36-cp36m-win32.whl", hash = "sha256:f973157ffeab5459eefe7b97a804987876dd0a55570b8fa56b4e1954bf11329b"}, + {file = "aiohttp-3.8.3-cp36-cp36m-win_amd64.whl", hash = "sha256:437399385f2abcd634865705bdc180c8314124b98299d54fe1d4c8990f2f9494"}, + {file = "aiohttp-3.8.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:09e28f572b21642128ef31f4e8372adb6888846f32fecb288c8b0457597ba61a"}, + {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f3553510abdbec67c043ca85727396ceed1272eef029b050677046d3387be8d"}, + {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e168a7560b7c61342ae0412997b069753f27ac4862ec7867eff74f0fe4ea2ad9"}, + {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db4c979b0b3e0fa7e9e69ecd11b2b3174c6963cebadeecfb7ad24532ffcdd11a"}, + {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e164e0a98e92d06da343d17d4e9c4da4654f4a4588a20d6c73548a29f176abe2"}, + {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8a78079d9a39ca9ca99a8b0ac2fdc0c4d25fc80c8a8a82e5c8211509c523363"}, + {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:21b30885a63c3f4ff5b77a5d6caf008b037cb521a5f33eab445dc566f6d092cc"}, + {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4b0f30372cef3fdc262f33d06e7b411cd59058ce9174ef159ad938c4a34a89da"}, + {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:8135fa153a20d82ffb64f70a1b5c2738684afa197839b34cc3e3c72fa88d302c"}, + {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:ad61a9639792fd790523ba072c0555cd6be5a0baf03a49a5dd8cfcf20d56df48"}, + {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:978b046ca728073070e9abc074b6299ebf3501e8dee5e26efacb13cec2b2dea0"}, + {file = "aiohttp-3.8.3-cp37-cp37m-win32.whl", hash = "sha256:0d2c6d8c6872df4a6ec37d2ede71eff62395b9e337b4e18efd2177de883a5033"}, + {file = "aiohttp-3.8.3-cp37-cp37m-win_amd64.whl", hash = "sha256:21d69797eb951f155026651f7e9362877334508d39c2fc37bd04ff55b2007091"}, + {file = "aiohttp-3.8.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ca9af5f8f5812d475c5259393f52d712f6d5f0d7fdad9acdb1107dd9e3cb7eb"}, + {file = "aiohttp-3.8.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d90043c1882067f1bd26196d5d2db9aa6d268def3293ed5fb317e13c9413ea4"}, + {file = "aiohttp-3.8.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d737fc67b9a970f3234754974531dc9afeea11c70791dcb7db53b0cf81b79784"}, + {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf909ea0a3fc9596e40d55d8000702a85e27fd578ff41a5500f68f20fd32e6c"}, + {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5835f258ca9f7c455493a57ee707b76d2d9634d84d5d7f62e77be984ea80b849"}, + {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da37dcfbf4b7f45d80ee386a5f81122501ec75672f475da34784196690762f4b"}, + {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f44875f2804bc0511a69ce44a9595d5944837a62caecc8490bbdb0e18b1342"}, + {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:527b3b87b24844ea7865284aabfab08eb0faf599b385b03c2aa91fc6edd6e4b6"}, + {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5ba88df9aa5e2f806650fcbeedbe4f6e8736e92fc0e73b0400538fd25a4dd96"}, + {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e7b8813be97cab8cb52b1375f41f8e6804f6507fe4660152e8ca5c48f0436017"}, + {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:2dea10edfa1a54098703cb7acaa665c07b4e7568472a47f4e64e6319d3821ccf"}, + {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:713d22cd9643ba9025d33c4af43943c7a1eb8547729228de18d3e02e278472b6"}, + {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2d252771fc85e0cf8da0b823157962d70639e63cb9b578b1dec9868dd1f4f937"}, + {file = "aiohttp-3.8.3-cp38-cp38-win32.whl", hash = "sha256:66bd5f950344fb2b3dbdd421aaa4e84f4411a1a13fca3aeb2bcbe667f80c9f76"}, + {file = "aiohttp-3.8.3-cp38-cp38-win_amd64.whl", hash = "sha256:84b14f36e85295fe69c6b9789b51a0903b774046d5f7df538176516c3e422446"}, + {file = "aiohttp-3.8.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16c121ba0b1ec2b44b73e3a8a171c4f999b33929cd2397124a8c7fcfc8cd9e06"}, + {file = "aiohttp-3.8.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8d6aaa4e7155afaf994d7924eb290abbe81a6905b303d8cb61310a2aba1c68ba"}, + {file = "aiohttp-3.8.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43046a319664a04b146f81b40e1545d4c8ac7b7dd04c47e40bf09f65f2437346"}, + {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599418aaaf88a6d02a8c515e656f6faf3d10618d3dd95866eb4436520096c84b"}, + {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92a2964319d359f494f16011e23434f6f8ef0434acd3cf154a6b7bec511e2fb7"}, + {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73a4131962e6d91109bca6536416aa067cf6c4efb871975df734f8d2fd821b37"}, + {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598adde339d2cf7d67beaccda3f2ce7c57b3b412702f29c946708f69cf8222aa"}, + {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75880ed07be39beff1881d81e4a907cafb802f306efd6d2d15f2b3c69935f6fb"}, + {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0239da9fbafd9ff82fd67c16704a7d1bccf0d107a300e790587ad05547681c8"}, + {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4e3a23ec214e95c9fe85a58470b660efe6534b83e6cbe38b3ed52b053d7cb6ad"}, + {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:47841407cc89a4b80b0c52276f3cc8138bbbfba4b179ee3acbd7d77ae33f7ac4"}, + {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:54d107c89a3ebcd13228278d68f1436d3f33f2dd2af5415e3feaeb1156e1a62c"}, + {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c37c5cce780349d4d51739ae682dec63573847a2a8dcb44381b174c3d9c8d403"}, + {file = "aiohttp-3.8.3-cp39-cp39-win32.whl", hash = "sha256:f178d2aadf0166be4df834c4953da2d7eef24719e8aec9a65289483eeea9d618"}, + {file = "aiohttp-3.8.3-cp39-cp39-win_amd64.whl", hash = "sha256:88e5be56c231981428f4f506c68b6a46fa25c4123a2e86d156c58a8369d31ab7"}, + {file = "aiohttp-3.8.3.tar.gz", hash = "sha256:3828fb41b7203176b82fe5d699e0d845435f2374750a44b480ea6b930f6be269"}, +] +aiosignal = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] +anyio = [ + {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, + {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, +] +async-timeout = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] +asyncio = [ + {file = "asyncio-3.4.3-cp33-none-win32.whl", hash = "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de"}, + {file = "asyncio-3.4.3-cp33-none-win_amd64.whl", hash = "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c"}, + {file = "asyncio-3.4.3-py3-none-any.whl", hash = "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d"}, + {file = "asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41"}, +] +attrs = [ + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] +certifi = [ + {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, + {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, +] +colorama = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +flake8 = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] +frozenlist = [ + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, + {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, + {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, + {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, + {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, + {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, + {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, + {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, + {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, + {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, + {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, + {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, + {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, + {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, + {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, + {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, + {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, + {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, + {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, + {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, + {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, + {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, + {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, + {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, + {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, + {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, +] +h11 = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] +httpcore = [ + {file = "httpcore-0.16.1-py3-none-any.whl", hash = "sha256:8d393db683cc8e35cc6ecb02577c5e1abfedde52b38316d038932a84b4875ecb"}, + {file = "httpcore-0.16.1.tar.gz", hash = "sha256:3d3143ff5e1656a5740ea2f0c167e8e9d48c5a9bbd7f00ad1f8cff5711b08543"}, +] +httpx = [ + {file = "httpx-0.23.1-py3-none-any.whl", hash = "sha256:0b9b1f0ee18b9978d637b0776bfd7f54e2ca278e063e3586d8f01cda89e042a8"}, + {file = "httpx-0.23.1.tar.gz", hash = "sha256:202ae15319be24efe9a8bd4ed4360e68fde7b38bcc2ce87088d416f026667d19"}, +] +idna = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +loguru = [ + {file = "loguru-0.6.0-py3-none-any.whl", hash = "sha256:4e2414d534a2ab57573365b3e6d0234dfb1d84b68b7f3b948e6fb743860a77c3"}, + {file = "loguru-0.6.0.tar.gz", hash = "sha256:066bd06758d0a513e9836fd9c6b5a75bfb3fd36841f4b996bc60b547a309d41c"}, +] +lxml = [ + {file = "lxml-4.9.1-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:98cafc618614d72b02185ac583c6f7796202062c41d2eeecdf07820bad3295ed"}, + {file = "lxml-4.9.1-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c62e8dd9754b7debda0c5ba59d34509c4688f853588d75b53c3791983faa96fc"}, + {file = "lxml-4.9.1-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21fb3d24ab430fc538a96e9fbb9b150029914805d551deeac7d7822f64631dfc"}, + {file = "lxml-4.9.1-cp27-cp27m-win32.whl", hash = "sha256:86e92728ef3fc842c50a5cb1d5ba2bc66db7da08a7af53fb3da79e202d1b2cd3"}, + {file = "lxml-4.9.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4cfbe42c686f33944e12f45a27d25a492cc0e43e1dc1da5d6a87cbcaf2e95627"}, + {file = "lxml-4.9.1-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dad7b164905d3e534883281c050180afcf1e230c3d4a54e8038aa5cfcf312b84"}, + {file = "lxml-4.9.1-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a614e4afed58c14254e67862456d212c4dcceebab2eaa44d627c2ca04bf86837"}, + {file = "lxml-4.9.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f9ced82717c7ec65a67667bb05865ffe38af0e835cdd78728f1209c8fffe0cad"}, + {file = "lxml-4.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:d9fc0bf3ff86c17348dfc5d322f627d78273eba545db865c3cd14b3f19e57fa5"}, + {file = "lxml-4.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e5f66bdf0976ec667fc4594d2812a00b07ed14d1b44259d19a41ae3fff99f2b8"}, + {file = "lxml-4.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fe17d10b97fdf58155f858606bddb4e037b805a60ae023c009f760d8361a4eb8"}, + {file = "lxml-4.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8caf4d16b31961e964c62194ea3e26a0e9561cdf72eecb1781458b67ec83423d"}, + {file = "lxml-4.9.1-cp310-cp310-win32.whl", hash = "sha256:4780677767dd52b99f0af1f123bc2c22873d30b474aa0e2fc3fe5e02217687c7"}, + {file = "lxml-4.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:b122a188cd292c4d2fcd78d04f863b789ef43aa129b233d7c9004de08693728b"}, + {file = "lxml-4.9.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:be9eb06489bc975c38706902cbc6888f39e946b81383abc2838d186f0e8b6a9d"}, + {file = "lxml-4.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f1be258c4d3dc609e654a1dc59d37b17d7fef05df912c01fc2e15eb43a9735f3"}, + {file = "lxml-4.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:927a9dd016d6033bc12e0bf5dee1dde140235fc8d0d51099353c76081c03dc29"}, + {file = "lxml-4.9.1-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9232b09f5efee6a495a99ae6824881940d6447debe272ea400c02e3b68aad85d"}, + {file = "lxml-4.9.1-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:04da965dfebb5dac2619cb90fcf93efdb35b3c6994fea58a157a834f2f94b318"}, + {file = "lxml-4.9.1-cp35-cp35m-win32.whl", hash = "sha256:4d5bae0a37af799207140652a700f21a85946f107a199bcb06720b13a4f1f0b7"}, + {file = "lxml-4.9.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4878e667ebabe9b65e785ac8da4d48886fe81193a84bbe49f12acff8f7a383a4"}, + {file = "lxml-4.9.1-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:1355755b62c28950f9ce123c7a41460ed9743c699905cbe664a5bcc5c9c7c7fb"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:bcaa1c495ce623966d9fc8a187da80082334236a2a1c7e141763ffaf7a405067"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6eafc048ea3f1b3c136c71a86db393be36b5b3d9c87b1c25204e7d397cee9536"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:13c90064b224e10c14dcdf8086688d3f0e612db53766e7478d7754703295c7c8"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206a51077773c6c5d2ce1991327cda719063a47adc02bd703c56a662cdb6c58b"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e8f0c9d65da595cfe91713bc1222af9ecabd37971762cb830dea2fc3b3bb2acf"}, + {file = "lxml-4.9.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8f0a4d179c9a941eb80c3a63cdb495e539e064f8054230844dcf2fcb812b71d3"}, + {file = "lxml-4.9.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:830c88747dce8a3e7525defa68afd742b4580df6aa2fdd6f0855481e3994d391"}, + {file = "lxml-4.9.1-cp36-cp36m-win32.whl", hash = "sha256:1e1cf47774373777936c5aabad489fef7b1c087dcd1f426b621fda9dcc12994e"}, + {file = "lxml-4.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:5974895115737a74a00b321e339b9c3f45c20275d226398ae79ac008d908bff7"}, + {file = "lxml-4.9.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:1423631e3d51008871299525b541413c9b6c6423593e89f9c4cfbe8460afc0a2"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:2aaf6a0a6465d39b5ca69688fce82d20088c1838534982996ec46633dc7ad6cc"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:9f36de4cd0c262dd9927886cc2305aa3f2210db437aa4fed3fb4940b8bf4592c"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae06c1e4bc60ee076292e582a7512f304abdf6c70db59b56745cca1684f875a4"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:57e4d637258703d14171b54203fd6822fda218c6c2658a7d30816b10995f29f3"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6d279033bf614953c3fc4a0aa9ac33a21e8044ca72d4fa8b9273fe75359d5cca"}, + {file = "lxml-4.9.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a60f90bba4c37962cbf210f0188ecca87daafdf60271f4c6948606e4dabf8785"}, + {file = "lxml-4.9.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6ca2264f341dd81e41f3fffecec6e446aa2121e0b8d026fb5130e02de1402785"}, + {file = "lxml-4.9.1-cp37-cp37m-win32.whl", hash = "sha256:27e590352c76156f50f538dbcebd1925317a0f70540f7dc8c97d2931c595783a"}, + {file = "lxml-4.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:eea5d6443b093e1545ad0210e6cf27f920482bfcf5c77cdc8596aec73523bb7e"}, + {file = "lxml-4.9.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f05251bbc2145349b8d0b77c0d4e5f3b228418807b1ee27cefb11f69ed3d233b"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:487c8e61d7acc50b8be82bda8c8d21d20e133c3cbf41bd8ad7eb1aaeb3f07c97"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d1a92d8e90b286d491e5626af53afef2ba04da33e82e30744795c71880eaa21"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:b570da8cd0012f4af9fa76a5635cd31f707473e65a5a335b186069d5c7121ff2"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ef87fca280fb15342726bd5f980f6faf8b84a5287fcc2d4962ea8af88b35130"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:93e414e3206779ef41e5ff2448067213febf260ba747fc65389a3ddaa3fb8715"}, + {file = "lxml-4.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6653071f4f9bac46fbc30f3c7838b0e9063ee335908c5d61fb7a4a86c8fd2036"}, + {file = "lxml-4.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:32a73c53783becdb7eaf75a2a1525ea8e49379fb7248c3eeefb9412123536387"}, + {file = "lxml-4.9.1-cp38-cp38-win32.whl", hash = "sha256:1a7c59c6ffd6ef5db362b798f350e24ab2cfa5700d53ac6681918f314a4d3b94"}, + {file = "lxml-4.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:1436cf0063bba7888e43f1ba8d58824f085410ea2025befe81150aceb123e345"}, + {file = "lxml-4.9.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:4beea0f31491bc086991b97517b9683e5cfb369205dac0148ef685ac12a20a67"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:41fb58868b816c202e8881fd0f179a4644ce6e7cbbb248ef0283a34b73ec73bb"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bd34f6d1810d9354dc7e35158aa6cc33456be7706df4420819af6ed966e85448"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:edffbe3c510d8f4bf8640e02ca019e48a9b72357318383ca60e3330c23aaffc7"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d949f53ad4fc7cf02c44d6678e7ff05ec5f5552b235b9e136bd52e9bf730b91"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:079b68f197c796e42aa80b1f739f058dcee796dc725cc9a1be0cdb08fc45b000"}, + {file = "lxml-4.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9c3a88d20e4fe4a2a4a84bf439a5ac9c9aba400b85244c63a1ab7088f85d9d25"}, + {file = "lxml-4.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4e285b5f2bf321fc0857b491b5028c5f276ec0c873b985d58d7748ece1d770dd"}, + {file = "lxml-4.9.1-cp39-cp39-win32.whl", hash = "sha256:ef72013e20dd5ba86a8ae1aed7f56f31d3374189aa8b433e7b12ad182c0d2dfb"}, + {file = "lxml-4.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:10d2017f9150248563bb579cd0d07c61c58da85c922b780060dcc9a3aa9f432d"}, + {file = "lxml-4.9.1-pp37-pypy37_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538747a9d7827ce3e16a8fdd201a99e661c7dee3c96c885d8ecba3c35d1032c"}, + {file = "lxml-4.9.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0645e934e940107e2fdbe7c5b6fb8ec6232444260752598bc4d09511bd056c0b"}, + {file = "lxml-4.9.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6daa662aba22ef3258934105be2dd9afa5bb45748f4f702a3b39a5bf53a1f4dc"}, + {file = "lxml-4.9.1-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:603a464c2e67d8a546ddaa206d98e3246e5db05594b97db844c2f0a1af37cf5b"}, + {file = "lxml-4.9.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c4b2e0559b68455c085fb0f6178e9752c4be3bba104d6e881eb5573b399d1eb2"}, + {file = "lxml-4.9.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0f3f0059891d3254c7b5fb935330d6db38d6519ecd238ca4fce93c234b4a0f73"}, + {file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c852b1530083a620cb0de5f3cd6826f19862bafeaf77586f1aef326e49d95f0c"}, + {file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:287605bede6bd36e930577c5925fcea17cb30453d96a7b4c63c14a257118dbb9"}, + {file = "lxml-4.9.1.tar.gz", hash = "sha256:fe749b052bb7233fe5d072fcb549221a8cb1a16725c47c37e42b0b9cb3ff2c3f"}, +] +mccabe = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] +multidict = [ + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389"}, + {file = "multidict-6.0.2-cp310-cp310-win32.whl", hash = "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293"}, + {file = "multidict-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658"}, + {file = "multidict-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15"}, + {file = "multidict-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc"}, + {file = "multidict-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d"}, + {file = "multidict-6.0.2-cp38-cp38-win32.whl", hash = "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57"}, + {file = "multidict-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937"}, + {file = "multidict-6.0.2-cp39-cp39-win32.whl", hash = "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a"}, + {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, + {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, +] +pycodestyle = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] +pyflakes = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] +rfc3986 = [ + {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, + {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, +] +sniffio = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] +win32-setctime = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] +yarl = [ + {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:abc06b97407868ef38f3d172762f4069323de52f2b70d133d096a48d72215d28"}, + {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07b21e274de4c637f3e3b7104694e53260b5fc10d51fb3ec5fed1da8e0f754e3"}, + {file = "yarl-1.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9de955d98e02fab288c7718662afb33aab64212ecb368c5dc866d9a57bf48880"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ec362167e2c9fd178f82f252b6d97669d7245695dc057ee182118042026da40"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20df6ff4089bc86e4a66e3b1380460f864df3dd9dccaf88d6b3385d24405893b"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5999c4662631cb798496535afbd837a102859568adc67d75d2045e31ec3ac497"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed19b74e81b10b592084a5ad1e70f845f0aacb57577018d31de064e71ffa267a"}, + {file = "yarl-1.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e4808f996ca39a6463f45182e2af2fae55e2560be586d447ce8016f389f626f"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2d800b9c2eaf0684c08be5f50e52bfa2aa920e7163c2ea43f4f431e829b4f0fd"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6628d750041550c5d9da50bb40b5cf28a2e63b9388bac10fedd4f19236ef4957"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f5af52738e225fcc526ae64071b7e5342abe03f42e0e8918227b38c9aa711e28"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:76577f13333b4fe345c3704811ac7509b31499132ff0181f25ee26619de2c843"}, + {file = "yarl-1.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0c03f456522d1ec815893d85fccb5def01ffaa74c1b16ff30f8aaa03eb21e453"}, + {file = "yarl-1.8.1-cp310-cp310-win32.whl", hash = "sha256:ea30a42dc94d42f2ba4d0f7c0ffb4f4f9baa1b23045910c0c32df9c9902cb272"}, + {file = "yarl-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:9130ddf1ae9978abe63808b6b60a897e41fccb834408cde79522feb37fb72fb0"}, + {file = "yarl-1.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0ab5a138211c1c366404d912824bdcf5545ccba5b3ff52c42c4af4cbdc2c5035"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0fb2cb4204ddb456a8e32381f9a90000429489a25f64e817e6ff94879d432fc"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85cba594433915d5c9a0d14b24cfba0339f57a2fff203a5d4fd070e593307d0b"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca7e596c55bd675432b11320b4eacc62310c2145d6801a1f8e9ad160685a231"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0f77539733e0ec2475ddcd4e26777d08996f8cd55d2aef82ec4d3896687abda"}, + {file = "yarl-1.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29e256649f42771829974e742061c3501cc50cf16e63f91ed8d1bf98242e5507"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7fce6cbc6c170ede0221cc8c91b285f7f3c8b9fe28283b51885ff621bbe0f8ee"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:59ddd85a1214862ce7c7c66457f05543b6a275b70a65de366030d56159a979f0"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:12768232751689c1a89b0376a96a32bc7633c08da45ad985d0c49ede691f5c0d"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:b19255dde4b4f4c32e012038f2c169bb72e7f081552bea4641cab4d88bc409dd"}, + {file = "yarl-1.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6c8148e0b52bf9535c40c48faebb00cb294ee577ca069d21bd5c48d302a83780"}, + {file = "yarl-1.8.1-cp37-cp37m-win32.whl", hash = "sha256:de839c3a1826a909fdbfe05f6fe2167c4ab033f1133757b5936efe2f84904c07"}, + {file = "yarl-1.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:dd032e8422a52e5a4860e062eb84ac94ea08861d334a4bcaf142a63ce8ad4802"}, + {file = "yarl-1.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:19cd801d6f983918a3f3a39f3a45b553c015c5aac92ccd1fac619bd74beece4a"}, + {file = "yarl-1.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6347f1a58e658b97b0a0d1ff7658a03cb79bdbda0331603bed24dd7054a6dea1"}, + {file = "yarl-1.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c0da7e44d0c9108d8b98469338705e07f4bb7dab96dbd8fa4e91b337db42548"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5587bba41399854703212b87071c6d8638fa6e61656385875f8c6dff92b2e461"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31a9a04ecccd6b03e2b0e12e82131f1488dea5555a13a4d32f064e22a6003cfe"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:205904cffd69ae972a1707a1bd3ea7cded594b1d773a0ce66714edf17833cdae"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea513a25976d21733bff523e0ca836ef1679630ef4ad22d46987d04b372d57fc"}, + {file = "yarl-1.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0b51530877d3ad7a8d47b2fff0c8df3b8f3b8deddf057379ba50b13df2a5eae"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d2b8f245dad9e331540c350285910b20dd913dc86d4ee410c11d48523c4fd546"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ab2a60d57ca88e1d4ca34a10e9fb4ab2ac5ad315543351de3a612bbb0560bead"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:449c957ffc6bc2309e1fbe67ab7d2c1efca89d3f4912baeb8ead207bb3cc1cd4"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a165442348c211b5dea67c0206fc61366212d7082ba8118c8c5c1c853ea4d82e"}, + {file = "yarl-1.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b3ded839a5c5608eec8b6f9ae9a62cb22cd037ea97c627f38ae0841a48f09eae"}, + {file = "yarl-1.8.1-cp38-cp38-win32.whl", hash = "sha256:c1445a0c562ed561d06d8cbc5c8916c6008a31c60bc3655cdd2de1d3bf5174a0"}, + {file = "yarl-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:56c11efb0a89700987d05597b08a1efcd78d74c52febe530126785e1b1a285f4"}, + {file = "yarl-1.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e80ed5a9939ceb6fda42811542f31c8602be336b1fb977bccb012e83da7e4936"}, + {file = "yarl-1.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6afb336e23a793cd3b6476c30f030a0d4c7539cd81649683b5e0c1b0ab0bf350"}, + {file = "yarl-1.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c322cbaa4ed78a8aac89b2174a6df398faf50e5fc12c4c191c40c59d5e28357"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fae37373155f5ef9b403ab48af5136ae9851151f7aacd9926251ab26b953118b"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5395da939ffa959974577eff2cbfc24b004a2fb6c346918f39966a5786874e54"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:076eede537ab978b605f41db79a56cad2e7efeea2aa6e0fa8f05a26c24a034fb"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d1a50e461615747dd93c099f297c1994d472b0f4d2db8a64e55b1edf704ec1c"}, + {file = "yarl-1.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7de89c8456525650ffa2bb56a3eee6af891e98f498babd43ae307bd42dca98f6"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a88510731cd8d4befaba5fbd734a7dd914de5ab8132a5b3dde0bbd6c9476c64"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2d93a049d29df172f48bcb09acf9226318e712ce67374f893b460b42cc1380ae"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:21ac44b763e0eec15746a3d440f5e09ad2ecc8b5f6dcd3ea8cb4773d6d4703e3"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d0272228fabe78ce00a3365ffffd6f643f57a91043e119c289aaba202f4095b0"}, + {file = "yarl-1.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:99449cd5366fe4608e7226c6cae80873296dfa0cde45d9b498fefa1de315a09e"}, + {file = "yarl-1.8.1-cp39-cp39-win32.whl", hash = "sha256:8b0af1cf36b93cee99a31a545fe91d08223e64390c5ecc5e94c39511832a4bb6"}, + {file = "yarl-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:de49d77e968de6626ba7ef4472323f9d2e5a56c1d85b7c0e2a190b2173d3b9be"}, + {file = "yarl-1.8.1.tar.gz", hash = "sha256:af887845b8c2e060eb5605ff72b6f2dd2aab7a761379373fd89d314f4752abbf"}, +] diff --git a/homeworks/DDYunin/7/pyproject.toml b/homeworks/DDYunin/7/pyproject.toml index b43024b..4425654 100644 --- a/homeworks/DDYunin/7/pyproject.toml +++ b/homeworks/DDYunin/7/pyproject.toml @@ -8,6 +8,12 @@ packages = [{include = "hw_7"}] [tool.poetry.dependencies] python = "^3.11" +loguru = "^0.6.0" +isort = "^5.10.1" +flake8 = "^5.0.4" +asyncio = "^3.4.3" +httpx = "^0.23.1" +aiohttp = "^3.8.3" [build-system] From b96580277be1446aeb509a8e7a6d4d73f71590a4 Mon Sep 17 00:00:00 2001 From: DanYunin Date: Wed, 23 Nov 2022 16:11:08 +0300 Subject: [PATCH 3/3] Ready hw --- homeworks/DDYunin/7/hw_7/__main__.py | 47 +++--- homeworks/DDYunin/7/hw_7/get_data.py | 26 ++- homeworks/DDYunin/7/hw_7/parser.py | 29 ++-- homeworks/DDYunin/7/hw_7/prog.py | 163 ------------------- homeworks/DDYunin/7/hw_7/temp.py | 132 ---------------- homeworks/DDYunin/7/hw_7/users/1.xml | 201 ------------------------ homeworks/DDYunin/7/hw_7/users/2.xml | 201 ------------------------ homeworks/DDYunin/7/hw_7/users/None.xml | 8 - homeworks/DDYunin/7/hw_7/write_data.py | 66 +++++--- 9 files changed, 95 insertions(+), 778 deletions(-) delete mode 100644 homeworks/DDYunin/7/hw_7/prog.py delete mode 100644 homeworks/DDYunin/7/hw_7/temp.py delete mode 100644 homeworks/DDYunin/7/hw_7/users/1.xml delete mode 100644 homeworks/DDYunin/7/hw_7/users/2.xml delete mode 100644 homeworks/DDYunin/7/hw_7/users/None.xml diff --git a/homeworks/DDYunin/7/hw_7/__main__.py b/homeworks/DDYunin/7/hw_7/__main__.py index 19b8260..4bd6cd2 100644 --- a/homeworks/DDYunin/7/hw_7/__main__.py +++ b/homeworks/DDYunin/7/hw_7/__main__.py @@ -1,32 +1,27 @@ -import aiohttp import asyncio import time -import httpx -from hw_7.parser import start_parsing -# _url = 'https://jsonplaceholder.typicode.com/users/{0}' +from loguru import logger -# async def get_response(url: str): -# async with httpx.AsyncClient() as client: -# resp = await client.get(url) -# print(resp.json()) -# print() -# resp.raise_for_status() -# return resp +from hw_7.parser import (flatten, get_data_json, + get_ready_dict_with_emails_and_ids, parse_csv_file) +from hw_7.write_data import write_data_xml -# async def main(): -# await start_parsing() - # result = await asyncio.gather(*[ - # get_response(_url.format(number)) - # for number in list(range(1, 10)) - # ]) - - # for index in result: - # print(index) -# if __name__ == '__main__': -# start = time.monotonic() -# loop = asyncio.new_event_loop() -# loop.run_until_complete(main()) -# loop.close() -# print('It took', time.monotonic() - start) \ No newline at end of file +async def main(): + emails = parse_csv_file() + emails = dict.fromkeys(flatten(emails)) + logger.info('This program work with {number_users} users'.format( + number_users=len(emails)) + ) + people_data = await get_data_json() + emails = get_ready_dict_with_emails_and_ids(people_data, emails) + print(emails) + await write_data_xml(emails) + +if __name__ == '__main__': + start = time.monotonic() + loop = asyncio.new_event_loop() + loop.run_until_complete(main()) + loop.close() + print('It took', time.monotonic() - start) diff --git a/homeworks/DDYunin/7/hw_7/get_data.py b/homeworks/DDYunin/7/hw_7/get_data.py index e908cbe..4c1f4ca 100644 --- a/homeworks/DDYunin/7/hw_7/get_data.py +++ b/homeworks/DDYunin/7/hw_7/get_data.py @@ -6,29 +6,41 @@ async def get_user_data_posts(usr_id): async with httpx.AsyncClient() as client: - url = 'https://jsonplaceholder.typicode.com/users/{0}/posts'.format(usr_id) + url = 'https://jsonplaceholder.typicode.com/users/{0}/posts'.format( + usr_id + ) start_time = time.monotonic() response = await client.get(url) end_time = time.monotonic() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + logger.info('The request lasted {0} seconds'.format( + end_time - start_time) + ) return response.json() async def get_user_data_albums(usr_id): async with httpx.AsyncClient() as client: - url = 'https://jsonplaceholder.typicode.com/users/{0}/albums'.format(usr_id) + url = 'https://jsonplaceholder.typicode.com/users/{0}/albums'.format( + usr_id + ) start_time = time.monotonic() response = await client.get(url) end_time = time.monotonic() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + logger.info('The request lasted {0} seconds'.format( + end_time - start_time) + ) return response.json() async def get_user_data_todos(usr_id): async with httpx.AsyncClient() as client: - url = 'https://jsonplaceholder.typicode.com/users/{0}/todos'.format(usr_id) + url = 'https://jsonplaceholder.typicode.com/users/{0}/todos'.format( + usr_id + ) start_time = time.monotonic() response = await client.get(url) end_time = time.monotonic() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) - return response.json() \ No newline at end of file + logger.info('The request lasted {0} seconds'.format( + end_time - start_time) + ) + return response.json() diff --git a/homeworks/DDYunin/7/hw_7/parser.py b/homeworks/DDYunin/7/hw_7/parser.py index 1cd7e58..e4f8321 100644 --- a/homeworks/DDYunin/7/hw_7/parser.py +++ b/homeworks/DDYunin/7/hw_7/parser.py @@ -1,27 +1,18 @@ -from loguru import logger -import time import csv -import httpx -from hw_7.write_data import write_data_xml +import time -async def start_parsing(): - all_emails_not_flatten = parse_emails_from_csv_file() - # Вытягиваю list of lists в простой list и преобразую его в dict - emails_ids = dict.fromkeys(flatten(all_emails_not_flatten)) - logger.info('This program work with {number_users} users'.format(number_users = len(emails_ids))) - people_data = await get_data_json() - emails_ids = get_ready_dict_with_emails_and_ids(people_data, emails_ids) - print(emails_ids) - await write_data_xml(emails_ids) +import httpx +from loguru import logger -def parse_emails_from_csv_file(): +def parse_csv_file(): emails = [] start_time = time.monotonic() with open('hw_7/emails_file.csv') as csv_file: reader = csv.reader(csv_file) - end_time = time.monotonic() - logger.info('Request lasted {0} seconds'.format(end_time - start_time)) + logger.info('Request lasted {0} seconds'.format( + time.monotonic() - start_time) + ) emails = list(reader) return emails @@ -36,7 +27,9 @@ async def get_data_json(): start_time = time.monotonic() response = await client.get(url) end_time = time.monotonic() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + logger.info('The request lasted {0} seconds'.format( + end_time - start_time) + ) return response.json() @@ -44,4 +37,4 @@ def get_ready_dict_with_emails_and_ids(people_data, emails_ids): for person_data in people_data: if person_data['email'] in emails_ids: emails_ids[person_data.get('email')] = person_data['id'] - return emails_ids \ No newline at end of file + return emails_ids diff --git a/homeworks/DDYunin/7/hw_7/prog.py b/homeworks/DDYunin/7/hw_7/prog.py deleted file mode 100644 index ad7df6c..0000000 --- a/homeworks/DDYunin/7/hw_7/prog.py +++ /dev/null @@ -1,163 +0,0 @@ -# Сначала напишу реализацию в один файл -import aiohttp -import asyncio -import time -import httpx -import csv -from loguru import logger -import os -import shutil -import xml.etree.ElementTree as et - -def parse_csv_file(): # Не надо делать асинхронные вызовы - emails = [] - start_time = time.monotonic() - with open('hw_7/emails_file.csv') as csv_file: - reader = csv.reader(csv_file) - logger.info('Request lasted {0} seconds'.format(time.monotonic() - start_time)) - emails = list(reader) - return emails - -def flatten(lst_emails): # не надо делать асинхронные вызовы - return [lst_element for sublist in lst_emails for lst_element in sublist] - -async def get_data_json(): - async with httpx.AsyncClient() as client: - url = 'https://jsonplaceholder.typicode.com/users/' - start_time = time.monotonic() - response = await client.get(url) - end_time = time.monotonic() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) - return response.json() - -def get_ready_dict_with_emails_and_ids(people_data, emails_ids): - for person_data in people_data: - if person_data['email'] in emails_ids: - emails_ids[person_data.get('email')] = person_data['id'] - return emails_ids - -########################################################## - -def create_catalog_users(): - if os.path.exists('hw_7/users'): - shutil.rmtree('hw_7/users') - os.mkdir('hw_7/users') - -def create_struct_xml_file(user_email, all_data): - struct = et.Element('user') - id_element = et.SubElement(struct, 'id') - id_element.text = '{0}'.format(all_data[user_email]) - email_element = et.SubElement(struct, 'email') - email_element.text = '{0}'.format(user_email) - return struct - -async def add_posts_in_xml_file(xml_struct, user_email, all_data): - data_posts = await get_user_data_posts(all_data[user_email]) - posts_element = et.SubElement(xml_struct, 'posts') - if not data_posts: - posts_element.text = '' - for post in data_posts: - post_element = et.SubElement(posts_element, 'post') - et.SubElement(post_element, 'id').text = '{0}'.format(post['id']) - et.SubElement(post_element, 'title').text = '{0}'.format(post['title']) - str_body = '{0}'.format(post['body']) - et.SubElement(post_element, 'body').text = str_body.replace('\n', ' ') - return xml_struct - -async def get_user_data_posts(usr_id): - async with httpx.AsyncClient() as client: - url = 'https://jsonplaceholder.typicode.com/users/{0}/posts'.format(usr_id) - start_time = time.monotonic() - response = await client.get(url) - end_time = time.monotonic() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) - return response.json() - -async def get_user_data_albums(usr_id): - async with httpx.AsyncClient() as client: - url = 'https://jsonplaceholder.typicode.com/users/{0}/albums'.format(usr_id) - start_time = time.monotonic() - response = await client.get(url) - end_time = time.monotonic() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) - return response.json() - - -async def get_user_data_todos(usr_id): - async with httpx.AsyncClient() as client: - url = 'https://jsonplaceholder.typicode.com/users/{0}/todos'.format(usr_id) - start_time = time.monotonic() - response = await client.get(url) - end_time = time.monotonic() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) - return response.json() - -async def add_albums_in_xml_file(xml_struct, user_email, all_data): - data_albums = await get_user_data_albums(all_data[user_email]) - albums_element = et.SubElement(xml_struct, 'albums') - if not data_albums: - albums_element.text = '' - for album in data_albums: - album_element = et.SubElement(albums_element, 'album') - et.SubElement(album_element, 'id').text = '{0}'.format(album['id']) - et.SubElement(album_element, 'title').text = '{0}'.format(album['title']) - return xml_struct - - -async def add_todos_in_xml_file(xml_struct, user_email, all_data): - data_todos = await get_user_data_todos(all_data[user_email]) - todos_element = et.SubElement(xml_struct, 'todos') - if not data_todos: - todos_element.text = '' - for todo in data_todos: - todo_element = et.SubElement(todos_element, 'todo') - et.SubElement(todo_element, 'id').text = '{0}'.format(todo['id']) - et.SubElement(todo_element, 'title').text = '{0}'.format(todo['title']) - et.SubElement(todo_element, 'completed').text = '{0}'.format(todo['completed']) - return xml_struct - - -def save_ready_xml_file(xml_struct, user_email, all_data): - xml_file = et.ElementTree(xml_struct) - et.indent(xml_file) - start_time = time.monotonic() - with open('hw_7/users/{0}.xml'.format(all_data[user_email]), 'wb') as xml_fl: - xml_file.write(xml_fl, encoding='UTF-8', short_empty_elements=False, xml_declaration=True) - end_time = time.monotonic() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) - -async def user_operation_async(email, all_data): - print('Operation for {email}'.format(email=email)) - logger.info('Starts parsing for {0}'.format(email)) - xml_struct = create_struct_xml_file(email, all_data) - xml_struct = await add_posts_in_xml_file(xml_struct, email, all_data) - xml_struct = await add_albums_in_xml_file(xml_struct, email, all_data) - xml_struct = await add_todos_in_xml_file(xml_struct, email, all_data) - save_ready_xml_file(xml_struct, email, all_data) - print('Operation ends for {email}'.format(email=email)) - -async def write_data_xml(emails_and_ids): # А вот тут уже нужна асинхронность - # у меня есть список эмейлов и для каждого пользователя хорошо было бы делать всё асинхронно - create_catalog_users() - await asyncio.gather(*[ - user_operation_async(email, emails_and_ids) - for email in emails_and_ids - ]) - -################################################## - -async def main(): - emails = parse_csv_file() - emails = dict.fromkeys(flatten(emails)) - logger.info('This program work with {number_users} users'.format(number_users = len(emails))) - people_data = await get_data_json() - emails = get_ready_dict_with_emails_and_ids(people_data, emails) - print(emails) - await write_data_xml(emails) - -if __name__ == '__main__': - start = time.monotonic() - loop = asyncio.new_event_loop() - loop.run_until_complete(main()) - loop.close() - print('It took', time.monotonic() - start) \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/temp.py b/homeworks/DDYunin/7/hw_7/temp.py deleted file mode 100644 index 0984d95..0000000 --- a/homeworks/DDYunin/7/hw_7/temp.py +++ /dev/null @@ -1,132 +0,0 @@ -import os -import shutil -from datetime import datetime - -from loguru import logger - -from hw_6.get_data import (get_user_data_albums, get_user_data_posts, - get_user_data_todos) - - -def write_data_xml(emails_and_ids): - create_catalog_users() - for email in emails_and_ids: - logger.info('Starts parsing for {0}'.format(email)) - xml_struct = create_struct_xml_file(email, emails_and_ids) - xml_struct = add_posts_in_xml_file(xml_struct, email, emails_and_ids) - xml_struct = add_albums_in_xml_file(xml_struct, email, emails_and_ids) - xml_struct = add_todos_in_xml_file(xml_struct, email, emails_and_ids) - save_ready_xml_file(xml_struct, email, emails_and_ids) - - -def create_struct_xml_file(user_email, all_data): - struct = et.Element('user') - id_element = et.SubElement(struct, 'id') - id_element.text = '{0}'.format(all_data[user_email]) - email_element = et.SubElement(struct, 'email') - email_element.text = '{0}'.format(user_email) - return struct - - -def add_posts_in_xml_file(xml_struct, user_email, all_data): - data_posts = get_user_data_posts(all_data[user_email]) - posts_element = et.SubElement(xml_struct, 'posts') - if not data_posts: - posts_element.text = '' - for post in data_posts: - post_element = et.SubElement(posts_element, 'post') - et.SubElement(post_element, 'id').text = '{0}'.format(post['id']) - et.SubElement(post_element, 'title').text = '{0}'.format(post['title']) - str_body = '{0}'.format(post['body']) - et.SubElement(post_element, 'body').text = str_body.replace('\n', ' ') - return xml_struct - - -def add_albums_in_xml_file(xml_struct, user_email, all_data): - data_albums = get_user_data_albums(all_data[user_email]) - albums_element = et.SubElement(xml_struct, 'albums') - if not data_albums: - albums_element.text = '' - for album in data_albums: - album_element = et.SubElement(albums_element, 'album') - et.SubElement(album_element, 'id').text = '{0}'.format(album['id']) - et.SubElement(album_element, 'title').text = '{0}'.format(album['title']) - return xml_struct - - -def add_todos_in_xml_file(xml_struct, user_email, all_data): - data_todos = get_user_data_todos(all_data[user_email]) - todos_element = et.SubElement(xml_struct, 'todos') - if not data_todos: - todos_element.text = '' - for todo in data_todos: - todo_element = et.SubElement(todos_element, 'todo') - et.SubElement(todo_element, 'id').text = '{0}'.format(todo['id']) - et.SubElement(todo_element, 'title').text = '{0}'.format(todo['title']) - et.SubElement(todo_element, 'completed').text = '{0}'.format(todo['completed']) - return xml_struct - - -def save_ready_xml_file(xml_struct, user_email, all_data): - xml_file = et.ElementTree(xml_struct) - start_time = datetime.now() - with open('hw_6/users/{0}.xml'.format(all_data[user_email]), 'wb') as xml_fl: - xml_file.write(xml_fl, encoding='UTF-8', pretty_print=True, xml_declaration=True) - end_time = datetime.now() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) - - -def create_catalog_users(): - if os.path.exists('hw_6/users'): - shutil.rmtree('hw_6/users') - os.mkdir('hw_6/users') - - - -########################################################################### - -import csv -from datetime import datetime - -from loguru import logger - -from hw_6.write_data import write_data_xml - -# TODO -# Добавить логи -# Раскидать содержимое модуля на разные модули, ибо слишком много и сложно! - - - - -#################################################################################### - -from datetime import datetime -from loguru import logger - - -def get_user_data_posts(usr_id): - url = 'https://jsonplaceholder.typicode.com/users/{0}/posts'.format(usr_id) - start_time = datetime.now() - response = requests.get(url) - end_time = datetime.now() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) - return response.json() - - -def get_user_data_albums(usr_id): - url = 'https://jsonplaceholder.typicode.com/users/{0}/albums'.format(usr_id) - start_time = datetime.now() - response = requests.get(url) - end_time = datetime.now() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) - return response.json() - - -def get_user_data_todos(usr_id): - url = 'https://jsonplaceholder.typicode.com/users/{0}/todos'.format(usr_id) - start_time = datetime.now() - response = requests.get(url) - end_time = datetime.now() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) - return response.json() \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/users/1.xml b/homeworks/DDYunin/7/hw_7/users/1.xml deleted file mode 100644 index fea7e6a..0000000 --- a/homeworks/DDYunin/7/hw_7/users/1.xml +++ /dev/null @@ -1,201 +0,0 @@ - - - 1 - Sincere@april.biz - - - 1 - sunt aut facere repellat provident occaecati excepturi optio reprehenderit - quia et suscipit suscipit recusandae consequuntur expedita et cum reprehenderit molestiae ut ut quas totam nostrum rerum est autem sunt rem eveniet architecto - - - 2 - qui est esse - est rerum tempore vitae sequi sint nihil reprehenderit dolor beatae ea dolores neque fugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis qui aperiam non debitis possimus qui neque nisi nulla - - - 3 - ea molestias quasi exercitationem repellat qui ipsa sit aut - et iusto sed quo iure voluptatem occaecati omnis eligendi aut ad voluptatem doloribus vel accusantium quis pariatur molestiae porro eius odio et labore et velit aut - - - 4 - eum et est occaecati - ullam et saepe reiciendis voluptatem adipisci sit amet autem assumenda provident rerum culpa quis hic commodi nesciunt rem tenetur doloremque ipsam iure quis sunt voluptatem rerum illo velit - - - 5 - nesciunt quas odio - repudiandae veniam quaerat sunt sed alias aut fugiat sit autem sed est voluptatem omnis possimus esse voluptatibus quis est aut tenetur dolor neque - - - 6 - dolorem eum magni eos aperiam quia - ut aspernatur corporis harum nihil quis provident sequi mollitia nobis aliquid molestiae perspiciatis et ea nemo ab reprehenderit accusantium quas voluptate dolores velit et doloremque molestiae - - - 7 - magnam facilis autem - dolore placeat quibusdam ea quo vitae magni quis enim qui quis quo nemo aut saepe quidem repellat excepturi ut quia sunt ut sequi eos ea sed quas - - - 8 - dolorem dolore est ipsam - dignissimos aperiam dolorem qui eum facilis quibusdam animi sint suscipit qui sint possimus cum quaerat magni maiores excepturi ipsam ut commodi dolor voluptatum modi aut vitae - - - 9 - nesciunt iure omnis dolorem tempora et accusantium - consectetur animi nesciunt iure dolore enim quia ad veniam autem ut quam aut nobis et est aut quod aut provident voluptas autem voluptas - - - 10 - optio molestias id quia eum - quo et expedita modi cum officia vel magni doloribus qui repudiandae vero nisi sit quos veniam quod sed accusamus veritatis error - - - - - 1 - quidem molestiae enim - - - 2 - sunt qui excepturi placeat culpa - - - 3 - omnis laborum odio - - - 4 - non esse culpa molestiae omnis sed optio - - - 5 - eaque aut omnis a - - - 6 - natus impedit quibusdam illo est - - - 7 - quibusdam autem aliquid et et quia - - - 8 - qui fuga est a eum - - - 9 - saepe unde necessitatibus rem - - - 10 - distinctio laborum qui - - - - - 1 - delectus aut autem - False - - - 2 - quis ut nam facilis et officia qui - False - - - 3 - fugiat veniam minus - False - - - 4 - et porro tempora - True - - - 5 - laboriosam mollitia et enim quasi adipisci quia provident illum - False - - - 6 - qui ullam ratione quibusdam voluptatem quia omnis - False - - - 7 - illo expedita consequatur quia in - False - - - 8 - quo adipisci enim quam ut ab - True - - - 9 - molestiae perspiciatis ipsa - False - - - 10 - illo est ratione doloremque quia maiores aut - True - - - 11 - vero rerum temporibus dolor - True - - - 12 - ipsa repellendus fugit nisi - True - - - 13 - et doloremque nulla - False - - - 14 - repellendus sunt dolores architecto voluptatum - True - - - 15 - ab voluptatum amet voluptas - True - - - 16 - accusamus eos facilis sint et aut voluptatem - True - - - 17 - quo laboriosam deleniti aut qui - True - - - 18 - dolorum est consequatur ea mollitia in culpa - False - - - 19 - molestiae ipsa aut voluptatibus pariatur dolor nihil - True - - - 20 - ullam nobis libero sapiente ad optio sint - True - - - \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/users/2.xml b/homeworks/DDYunin/7/hw_7/users/2.xml deleted file mode 100644 index d662d67..0000000 --- a/homeworks/DDYunin/7/hw_7/users/2.xml +++ /dev/null @@ -1,201 +0,0 @@ - - - 2 - Shanna@melissa.tv - - - 11 - et ea vero quia laudantium autem - delectus reiciendis molestiae occaecati non minima eveniet qui voluptatibus accusamus in eum beatae sit vel qui neque voluptates ut commodi qui incidunt ut animi commodi - - - 12 - in quibusdam tempore odit est dolorem - itaque id aut magnam praesentium quia et ea odit et ea voluptas et sapiente quia nihil amet occaecati quia id voluptatem incidunt ea est distinctio odio - - - 13 - dolorum ut in voluptas mollitia et saepe quo animi - aut dicta possimus sint mollitia voluptas commodi quo doloremque iste corrupti reiciendis voluptatem eius rerum sit cumque quod eligendi laborum minima perferendis recusandae assumenda consectetur porro architecto ipsum ipsam - - - 14 - voluptatem eligendi optio - fuga et accusamus dolorum perferendis illo voluptas non doloremque neque facere ad qui dolorum molestiae beatae sed aut voluptas totam sit illum - - - 15 - eveniet quod temporibus - reprehenderit quos placeat velit minima officia dolores impedit repudiandae molestiae nam voluptas recusandae quis delectus officiis harum fugiat vitae - - - 16 - sint suscipit perspiciatis velit dolorum rerum ipsa laboriosam odio - suscipit nam nisi quo aperiam aut asperiores eos fugit maiores voluptatibus quia voluptatem quis ullam qui in alias quia est consequatur magni mollitia accusamus ea nisi voluptate dicta - - - 17 - fugit voluptas sed molestias voluptatem provident - eos voluptas et aut odit natus earum aspernatur fuga molestiae ullam deserunt ratione qui eos qui nihil ratione nemo velit ut aut id quo - - - 18 - voluptate et itaque vero tempora molestiae - eveniet quo quis laborum totam consequatur non dolor ut et est repudiandae est voluptatem vel debitis et magnam - - - 19 - adipisci placeat illum aut reiciendis qui - illum quis cupiditate provident sit magnam ea sed aut omnis veniam maiores ullam consequatur atque adipisci quo iste expedita sit quos voluptas - - - 20 - doloribus ad provident suscipit at - qui consequuntur ducimus possimus quisquam amet similique suscipit porro ipsam amet eos veritatis officiis exercitationem vel fugit aut necessitatibus totam omnis rerum consequatur expedita quidem cumque explicabo - - - - - 11 - quam nostrum impedit mollitia quod et dolor - - - 12 - consequatur autem doloribus natus consectetur - - - 13 - ab rerum non rerum consequatur ut ea unde - - - 14 - ducimus molestias eos animi atque nihil - - - 15 - ut pariatur rerum ipsum natus repellendus praesentium - - - 16 - voluptatem aut maxime inventore autem magnam atque repellat - - - 17 - aut minima voluptatem ut velit - - - 18 - nesciunt quia et doloremque - - - 19 - velit pariatur quaerat similique libero omnis quia - - - 20 - voluptas rerum iure ut enim - - - - - 21 - suscipit repellat esse quibusdam voluptatem incidunt - False - - - 22 - distinctio vitae autem nihil ut molestias quo - True - - - 23 - et itaque necessitatibus maxime molestiae qui quas velit - False - - - 24 - adipisci non ad dicta qui amet quaerat doloribus ea - False - - - 25 - voluptas quo tenetur perspiciatis explicabo natus - True - - - 26 - aliquam aut quasi - True - - - 27 - veritatis pariatur delectus - True - - - 28 - nesciunt totam sit blanditiis sit - False - - - 29 - laborum aut in quam - False - - - 30 - nemo perspiciatis repellat ut dolor libero commodi blanditiis omnis - True - - - 31 - repudiandae totam in est sint facere fuga - False - - - 32 - earum doloribus ea doloremque quis - False - - - 33 - sint sit aut vero - False - - - 34 - porro aut necessitatibus eaque distinctio - False - - - 35 - repellendus veritatis molestias dicta incidunt - True - - - 36 - excepturi deleniti adipisci voluptatem et neque optio illum ad - True - - - 37 - sunt cum tempora - False - - - 38 - totam quia non - False - - - 39 - doloremque quibusdam asperiores libero corrupti illum qui omnis - False - - - 40 - totam atque quo nesciunt - True - - - \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/users/None.xml b/homeworks/DDYunin/7/hw_7/users/None.xml deleted file mode 100644 index fa1685c..0000000 --- a/homeworks/DDYunin/7/hw_7/users/None.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - None - anastasia.net - - - - \ No newline at end of file diff --git a/homeworks/DDYunin/7/hw_7/write_data.py b/homeworks/DDYunin/7/hw_7/write_data.py index c413477..511efa1 100644 --- a/homeworks/DDYunin/7/hw_7/write_data.py +++ b/homeworks/DDYunin/7/hw_7/write_data.py @@ -1,23 +1,19 @@ +import asyncio import os import shutil -from datetime import datetime +import time +import xml.etree.ElementTree as et from loguru import logger -import xml.etree.ElementTree as et from hw_7.get_data import (get_user_data_albums, get_user_data_posts, get_user_data_todos) -async def write_data_xml(emails_and_ids): - create_catalog_users() - for email in emails_and_ids: - logger.info('Starts parsing for {0}'.format(email)) - xml_struct = create_struct_xml_file(email, emails_and_ids) - xml_struct = add_posts_in_xml_file(xml_struct, email, emails_and_ids) - xml_struct = add_albums_in_xml_file(xml_struct, email, emails_and_ids) - xml_struct = add_todos_in_xml_file(xml_struct, email, emails_and_ids) - save_ready_xml_file(xml_struct, email, emails_and_ids) +def create_catalog_users(): + if os.path.exists('hw_7/users'): + shutil.rmtree('hw_7/users') + os.mkdir('hw_7/users') def create_struct_xml_file(user_email, all_data): @@ -51,7 +47,9 @@ async def add_albums_in_xml_file(xml_struct, user_email, all_data): for album in data_albums: album_element = et.SubElement(albums_element, 'album') et.SubElement(album_element, 'id').text = '{0}'.format(album['id']) - et.SubElement(album_element, 'title').text = '{0}'.format(album['title']) + et.SubElement(album_element, 'title').text = '{0}'.format( + album['title'] + ) return xml_struct @@ -64,21 +62,45 @@ async def add_todos_in_xml_file(xml_struct, user_email, all_data): todo_element = et.SubElement(todos_element, 'todo') et.SubElement(todo_element, 'id').text = '{0}'.format(todo['id']) et.SubElement(todo_element, 'title').text = '{0}'.format(todo['title']) - et.SubElement(todo_element, 'completed').text = '{0}'.format(todo['completed']) + et.SubElement(todo_element, 'completed').text = '{0}'.format( + todo['completed'] + ) return xml_struct def save_ready_xml_file(xml_struct, user_email, all_data): xml_file = et.ElementTree(xml_struct) et.indent(xml_file) - start_time = datetime.now() - with open('hw_7/users/{0}.xml'.format(all_data[user_email]), 'wb') as xml_fl: - xml_file.write(xml_fl, encoding='UTF-8', short_empty_elements=True, xml_declaration=True) - end_time = datetime.now() - logger.info('The request lasted {0} seconds'.format(end_time - start_time)) + start_time = time.monotonic() + with open('hw_7/users/{0}.xml'.format( + all_data[user_email]), 'wb' + ) as xml_fl: + xml_file.write( + xml_fl, + encoding='UTF-8', + short_empty_elements=False, + xml_declaration=True + ) + end_time = time.monotonic() + logger.info('The request lasted {0} seconds'.format( + end_time - start_time) + ) + + +async def user_operation_async(email, all_data): + print('Operation for {email}'.format(email=email)) + logger.info('Starts parsing for {0}'.format(email)) + xml_struct = create_struct_xml_file(email, all_data) + xml_struct = await add_posts_in_xml_file(xml_struct, email, all_data) + xml_struct = await add_albums_in_xml_file(xml_struct, email, all_data) + xml_struct = await add_todos_in_xml_file(xml_struct, email, all_data) + save_ready_xml_file(xml_struct, email, all_data) + print('Operation ends for {email}'.format(email=email)) -def create_catalog_users(): - if os.path.exists('hw_7/users'): - shutil.rmtree('hw_7/users') - os.mkdir('hw_7/users') \ No newline at end of file +async def write_data_xml(emails_and_ids): + create_catalog_users() + await asyncio.gather(*[ + user_operation_async(email, emails_and_ids) + for email in emails_and_ids + ])