Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions homeworks/At0mn1yIvan/6/code/Main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from typing import Final

from loguru import logger
from to_start import start


def main():
"""The Main method do this code to be the starting point of our program."""
try:
start(EMAILS_PATH, JSON_PATH)
except Exception as ex:
logger.exception('Something went wrong.', ex)


if __name__ == '__main__':
EMAILS_PATH: Final = '../files/emails/email.csv'
JSON_PATH: Final = 'https://jsonplaceholder.typicode.com/users/'
try:
main()
except KeyboardInterrupt:
logger.critical('Something went wrong.')
59 changes: 59 additions & 0 deletions homeworks/At0mn1yIvan/6/code/Writer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
from xml.etree import ElementTree as Et # noqa: S405

from loguru import logger


def _remove_enter(string: str) -> str:
return string.replace('\n', '')


def _append_elem(root, name_new_root: str, text: str = None):
name = Et.Element(name_new_root)
if text is not None:
name.text = text
root.append(name)


def _append_type_info(root, name_new_root: str, user_all_info: dict):
names = Et.Element(name_new_root)

for user_info in user_all_info.get(name_new_root):
name = Et.Element(name_new_root[:-1])
names.append(name)
_append_elem(name, 'id', str(user_info.get('id')))
_append_elem(name, 'title', _remove_enter(str(user_info.get('title'))))

if name_new_root == 'posts':
body = _remove_enter(str(user_info.get('body')))
_append_elem(name, 'body', body)
elif name_new_root == 'todos':
completed = _remove_enter(str(user_info.get('completed')))
_append_elem(name, 'completed', completed)
root.append(names)


def write(user_id: str, user_email: str, user_info: dict, types_info: list, path: str): # noqa: E501
"""
Creates ET.Element tree and writes the user info to xml file.
:param user_id
:param user_email
:param user_info : user information from the website (PATH_JSON)
:param types_info : 'posts', 'albums', 'todos'
:param path : the path to the recording file
"""
root = Et.Element('user')
_append_elem(root, 'id', user_id)
_append_elem(root, 'email', user_email)
for type_info in types_info:
_append_type_info(root, type_info, user_info)

etree = Et.ElementTree(root)
Et.indent(etree)
with open(path, 'wb') as xml_file:
etree.write(xml_file, encoding='utf-8', xml_declaration=True)

logger.info('Saved {0}/{1}.xml for user with email `{2}`'.format(
path,
user_id,
user_email,
))
Empty file.
37 changes: 37 additions & 0 deletions homeworks/At0mn1yIvan/6/code/parsing_json.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import requests
from loguru import logger


def get_user_info(path: str, user_id: str, info_types: list) -> dict:
"""Receives the user information
('posts', 'albums', 'todos')
by the id from the website."""
user_info: dict[str:list] = {}
logger.info('Parsing for ID: {0} : Start.'.format(user_id))
for info_type in info_types:
response = requests.get(path + '{0}/{1}'.format(user_id, info_type))
user_info[info_type] = response.json()
logger.info('Request for ID {0} to get {1} took {2}'.format(
user_id,
info_types,
response.elapsed,
))
logger.info('Parsing for ID: {0} : Finish.'.format(user_id))
return user_info


def get_email_id(path: str) -> dict:
"""Receives the user ID by the email from the website."""
user_email_id: dict[str:int] = {}
user = 1
logger.info('Requests from the website: Begin.')
while True:
response = requests.get(path + '/{0}'.format(user))
user_info = response.json()
if not user_info:
break
user_email_id[user_info.get('email')] = user_info.get('id')
user += 1
logger.info('Requests from the website: Finish.')

return user_email_id
15 changes: 15 additions & 0 deletions homeworks/At0mn1yIvan/6/code/read_csv.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import csv

from loguru import logger


def read(path: str = None) -> tuple:
"""Read the csv file."""
with open(path) as file:
emails: list[str] = []
reader = csv.reader(file, delimiter=',', quotechar='"')
for line in reader:
emails.extend(line)
logger.info('{0} users were read from csv file'.format(len(emails)))

return tuple(emails)
43 changes: 43 additions & 0 deletions homeworks/At0mn1yIvan/6/code/to_start.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import re

from loguru import logger
from parsing_json import get_email_id, get_user_info
from read_csv import read
from writer import write


def start(emails_path: str, json_path: str):
"""This method calls other methods to make the program work."""
types_info = ['posts', 'albums', 'todos']
_user_xml_write(emails_path, json_path, types_info)


def _user_xml_write(emails_path: str, json_path: str, types_info: list):
emails_id = _get_emails_id(emails_path, json_path)
for key in emails_id:
user_info = get_user_info(json_path, str(emails_id.get(key)), types_info) # noqa: E501
path = '../files/users/{0}.xml'.format(str(emails_id.get(key)))
user_id = str(emails_id.get(key))
write(user_id, str(key), user_info, types_info, path)


def _get_emails_id(emails_path: str, json_path: str) -> dict:
emails = read(str(emails_path))
all_emails_id = get_email_id(str(json_path))
emails_id = dict()
for key in emails:
if _is_email(key):
user_id = all_emails_id.get(key)
if user_id is None:
logger.warning('{0} is missing from the website'.format(key))
else:
emails_id[key] = user_id
else:
logger.warning('{0} is not valid email address'.format(key))
logger.info('{0} users were found on the website.'.format(len(emails_id)))
return emails_id


def _is_email(email: str) -> bool:
regex = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+') # noqa: E501
return re.fullmatch(regex, email) is not None
1 change: 1 addition & 0 deletions homeworks/At0mn1yIvan/6/files/emails/email.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"Sincere@april.biz","Shanna@melissa.tv","anastasia.net"
201 changes: 201 additions & 0 deletions homeworks/At0mn1yIvan/6/files/users/1.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
<?xml version='1.0' encoding='utf-8'?>
<user>
<id>1</id>
<email>Sincere@april.biz</email>
<posts>
<post>
<id>1</id>
<title>sunt aut facere repellat provident occaecati excepturi optio reprehenderit</title>
<body>quia et suscipitsuscipit recusandae consequuntur expedita et cumreprehenderit molestiae ut ut quas totamnostrum rerum est autem sunt rem eveniet architecto</body>
</post>
<post>
<id>2</id>
<title>qui est esse</title>
<body>est rerum tempore vitaesequi sint nihil reprehenderit dolor beatae ea dolores nequefugiat blanditiis voluptate porro vel nihil molestiae ut reiciendisqui aperiam non debitis possimus qui neque nisi nulla</body>
</post>
<post>
<id>3</id>
<title>ea molestias quasi exercitationem repellat qui ipsa sit aut</title>
<body>et iusto sed quo iurevoluptatem occaecati omnis eligendi aut advoluptatem doloribus vel accusantium quis pariaturmolestiae porro eius odio et labore et velit aut</body>
</post>
<post>
<id>4</id>
<title>eum et est occaecati</title>
<body>ullam et saepe reiciendis voluptatem adipiscisit amet autem assumenda provident rerum culpaquis hic commodi nesciunt rem tenetur doloremque ipsam iurequis sunt voluptatem rerum illo velit</body>
</post>
<post>
<id>5</id>
<title>nesciunt quas odio</title>
<body>repudiandae veniam quaerat sunt sedalias aut fugiat sit autem sed estvoluptatem omnis possimus esse voluptatibus quisest aut tenetur dolor neque</body>
</post>
<post>
<id>6</id>
<title>dolorem eum magni eos aperiam quia</title>
<body>ut aspernatur corporis harum nihil quis provident sequimollitia nobis aliquid molestiaeperspiciatis et ea nemo ab reprehenderit accusantium quasvoluptate dolores velit et doloremque molestiae</body>
</post>
<post>
<id>7</id>
<title>magnam facilis autem</title>
<body>dolore placeat quibusdam ea quo vitaemagni quis enim qui quis quo nemo aut saepequidem repellat excepturi ut quiasunt ut sequi eos ea sed quas</body>
</post>
<post>
<id>8</id>
<title>dolorem dolore est ipsam</title>
<body>dignissimos aperiam dolorem qui eumfacilis quibusdam animi sint suscipit qui sint possimus cumquaerat magni maiores excepturiipsam ut commodi dolor voluptatum modi aut vitae</body>
</post>
<post>
<id>9</id>
<title>nesciunt iure omnis dolorem tempora et accusantium</title>
<body>consectetur animi nesciunt iure doloreenim quia adveniam autem ut quam aut nobiset est aut quod aut provident voluptas autem voluptas</body>
</post>
<post>
<id>10</id>
<title>optio molestias id quia eum</title>
<body>quo et expedita modi cum officia vel magnidoloribus qui repudiandaevero nisi sitquos veniam quod sed accusamus veritatis error</body>
</post>
</posts>
<albums>
<album>
<id>1</id>
<title>quidem molestiae enim</title>
</album>
<album>
<id>2</id>
<title>sunt qui excepturi placeat culpa</title>
</album>
<album>
<id>3</id>
<title>omnis laborum odio</title>
</album>
<album>
<id>4</id>
<title>non esse culpa molestiae omnis sed optio</title>
</album>
<album>
<id>5</id>
<title>eaque aut omnis a</title>
</album>
<album>
<id>6</id>
<title>natus impedit quibusdam illo est</title>
</album>
<album>
<id>7</id>
<title>quibusdam autem aliquid et et quia</title>
</album>
<album>
<id>8</id>
<title>qui fuga est a eum</title>
</album>
<album>
<id>9</id>
<title>saepe unde necessitatibus rem</title>
</album>
<album>
<id>10</id>
<title>distinctio laborum qui</title>
</album>
</albums>
<todos>
<todo>
<id>1</id>
<title>delectus aut autem</title>
<completed>False</completed>
</todo>
<todo>
<id>2</id>
<title>quis ut nam facilis et officia qui</title>
<completed>False</completed>
</todo>
<todo>
<id>3</id>
<title>fugiat veniam minus</title>
<completed>False</completed>
</todo>
<todo>
<id>4</id>
<title>et porro tempora</title>
<completed>True</completed>
</todo>
<todo>
<id>5</id>
<title>laboriosam mollitia et enim quasi adipisci quia provident illum</title>
<completed>False</completed>
</todo>
<todo>
<id>6</id>
<title>qui ullam ratione quibusdam voluptatem quia omnis</title>
<completed>False</completed>
</todo>
<todo>
<id>7</id>
<title>illo expedita consequatur quia in</title>
<completed>False</completed>
</todo>
<todo>
<id>8</id>
<title>quo adipisci enim quam ut ab</title>
<completed>True</completed>
</todo>
<todo>
<id>9</id>
<title>molestiae perspiciatis ipsa</title>
<completed>False</completed>
</todo>
<todo>
<id>10</id>
<title>illo est ratione doloremque quia maiores aut</title>
<completed>True</completed>
</todo>
<todo>
<id>11</id>
<title>vero rerum temporibus dolor</title>
<completed>True</completed>
</todo>
<todo>
<id>12</id>
<title>ipsa repellendus fugit nisi</title>
<completed>True</completed>
</todo>
<todo>
<id>13</id>
<title>et doloremque nulla</title>
<completed>False</completed>
</todo>
<todo>
<id>14</id>
<title>repellendus sunt dolores architecto voluptatum</title>
<completed>True</completed>
</todo>
<todo>
<id>15</id>
<title>ab voluptatum amet voluptas</title>
<completed>True</completed>
</todo>
<todo>
<id>16</id>
<title>accusamus eos facilis sint et aut voluptatem</title>
<completed>True</completed>
</todo>
<todo>
<id>17</id>
<title>quo laboriosam deleniti aut qui</title>
<completed>True</completed>
</todo>
<todo>
<id>18</id>
<title>dolorum est consequatur ea mollitia in culpa</title>
<completed>False</completed>
</todo>
<todo>
<id>19</id>
<title>molestiae ipsa aut voluptatibus pariatur dolor nihil</title>
<completed>True</completed>
</todo>
<todo>
<id>20</id>
<title>ullam nobis libero sapiente ad optio sint</title>
<completed>True</completed>
</todo>
</todos>
</user>
Loading