diff --git a/homeworks/Namxobick/6/files/email/email.csv b/homeworks/Namxobick/6/files/email/email.csv
new file mode 100644
index 0000000..16a1bdb
--- /dev/null
+++ b/homeworks/Namxobick/6/files/email/email.csv
@@ -0,0 +1,2 @@
+"Sincere@april.biz","Shanna@melissa.tv","anastasia.net"
+"yurinsin@gmail.com","Lucio_Hettinger@annie.ca"
\ No newline at end of file
diff --git a/homeworks/Namxobick/6/files/users/1.xml b/homeworks/Namxobick/6/files/users/1.xml
new file mode 100644
index 0000000..1e0c5ed
--- /dev/null
+++ b/homeworks/Namxobick/6/files/users/1.xml
@@ -0,0 +1,201 @@
+
+
+ 1
+ Sincere@april.biz
+
+
+ 1
+ sunt aut facere repellat provident occaecati excepturi optio reprehenderit
+ quia et suscipitsuscipit recusandae consequuntur expedita et cumreprehenderit molestiae ut ut quas totamnostrum rerum est autem sunt rem eveniet architecto
+
+
+ 2
+ qui est esse
+ 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
+
+
+ 3
+ ea molestias quasi exercitationem repellat qui ipsa sit aut
+ et iusto sed quo iurevoluptatem occaecati omnis eligendi aut advoluptatem doloribus vel accusantium quis pariaturmolestiae porro eius odio et labore et velit aut
+
+
+ 4
+ eum et est occaecati
+ 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
+
+
+ 5
+ nesciunt quas odio
+ repudiandae veniam quaerat sunt sedalias aut fugiat sit autem sed estvoluptatem omnis possimus esse voluptatibus quisest aut tenetur dolor neque
+
+
+ 6
+ dolorem eum magni eos aperiam quia
+ ut aspernatur corporis harum nihil quis provident sequimollitia nobis aliquid molestiaeperspiciatis et ea nemo ab reprehenderit accusantium quasvoluptate dolores velit et doloremque molestiae
+
+
+ 7
+ magnam facilis autem
+ dolore placeat quibusdam ea quo vitaemagni quis enim qui quis quo nemo aut saepequidem repellat excepturi ut quiasunt ut sequi eos ea sed quas
+
+
+ 8
+ dolorem dolore est ipsam
+ dignissimos aperiam dolorem qui eumfacilis quibusdam animi sint suscipit qui sint possimus cumquaerat magni maiores excepturiipsam ut commodi dolor voluptatum modi aut vitae
+
+
+ 9
+ nesciunt iure omnis dolorem tempora et accusantium
+ consectetur animi nesciunt iure doloreenim quia adveniam autem ut quam aut nobiset est aut quod aut provident voluptas autem voluptas
+
+
+ 10
+ optio molestias id quia eum
+ quo et expedita modi cum officia vel magnidoloribus qui repudiandaevero nisi sitquos 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/Namxobick/6/files/users/2.xml b/homeworks/Namxobick/6/files/users/2.xml
new file mode 100644
index 0000000..964471e
--- /dev/null
+++ b/homeworks/Namxobick/6/files/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 voluptatibusaccusamus in eum beatae sitvel qui neque voluptates ut commodi qui inciduntut animi commodi
+
+
+ 12
+ in quibusdam tempore odit est dolorem
+ itaque id aut magnampraesentium quia et ea odit et ea voluptas etsapiente quia nihil amet occaecati quia id voluptatemincidunt ea est distinctio odio
+
+
+ 13
+ dolorum ut in voluptas mollitia et saepe quo animi
+ aut dicta possimus sint mollitia voluptas commodi quo doloremqueiste corrupti reiciendis voluptatem eius rerumsit cumque quod eligendi laborum minimaperferendis recusandae assumenda consectetur porro architecto ipsum ipsam
+
+
+ 14
+ voluptatem eligendi optio
+ fuga et accusamus dolorum perferendis illo voluptasnon doloremque neque faceread qui dolorum molestiae beataesed aut voluptas totam sit illum
+
+
+ 15
+ eveniet quod temporibus
+ reprehenderit quos placeatvelit minima officia dolores impedit repudiandae molestiae namvoluptas recusandae quis delectusofficiis harum fugiat vitae
+
+
+ 16
+ sint suscipit perspiciatis velit dolorum rerum ipsa laboriosam odio
+ suscipit nam nisi quo aperiam autasperiores eos fugit maiores voluptatibus quiavoluptatem quis ullam qui in alias quia estconsequatur magni mollitia accusamus ea nisi voluptate dicta
+
+
+ 17
+ fugit voluptas sed molestias voluptatem provident
+ eos voluptas et aut odit natus earumaspernatur fuga molestiae ullamdeserunt ratione qui eosqui nihil ratione nemo velit ut aut id quo
+
+
+ 18
+ voluptate et itaque vero tempora molestiae
+ eveniet quo quislaborum totam consequatur non dolorut et est repudiandaeest voluptatem vel debitis et magnam
+
+
+ 19
+ adipisci placeat illum aut reiciendis qui
+ illum quis cupiditate provident sit magnamea sed aut omnisveniam maiores ullam consequatur atqueadipisci quo iste expedita sit quos voluptas
+
+
+ 20
+ doloribus ad provident suscipit at
+ qui consequuntur ducimus possimus quisquam amet similiquesuscipit porro ipsam ameteos veritatis officiis exercitationem vel fugit aut necessitatibus totamomnis 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/Namxobick/6/files/users/5.xml b/homeworks/Namxobick/6/files/users/5.xml
new file mode 100644
index 0000000..bb5866e
--- /dev/null
+++ b/homeworks/Namxobick/6/files/users/5.xml
@@ -0,0 +1,201 @@
+
+
+ 5
+ Lucio_Hettinger@annie.ca
+
+
+ 41
+ non est facere
+ molestias id nostrumexcepturi molestiae dolore omnis repellendus quaerat saepeconsectetur iste quaerat tenetur asperiores accusamus ex utnam quidem est ducimus sunt debitis saepe
+
+
+ 42
+ commodi ullam sint et excepturi error explicabo praesentium voluptas
+ odio fugit voluptatum ducimus earum autem est incidunt voluptatemodit reiciendis aliquam sunt sequi nulla doloremnon facere repellendus voluptates quiaratione harum vitae ut
+
+
+ 43
+ eligendi iste nostrum consequuntur adipisci praesentium sit beatae perferendis
+ similique fugit estillum et dolorum harum et voluptate eaque quidemexercitationem quos nam commodi possimus cum odio nihil nulladolorum exercitationem magnam ex et a et distinctio debitis
+
+
+ 44
+ optio dolor molestias sit
+ temporibus est consectetur doloreet libero debitis vel velit laboriosam quiaipsum quibusdam qui itaque fuga rem autea et iure quam sed maxime ut distinctio quae
+
+
+ 45
+ ut numquam possimus omnis eius suscipit laudantium iure
+ est natus reiciendis nihil possimus aut providentex et dolorrepellat pariatur estnobis rerum repellendus dolorem autem
+
+
+ 46
+ aut quo modi neque nostrum ducimus
+ voluptatem quisquam istevoluptatibus natus officiis facilis doloremquis quas ipsamvel et voluptatum in aliquid
+
+
+ 47
+ quibusdam cumque rem aut deserunt
+ voluptatem assumenda ut qui ut cupiditate aut impedit veniamoccaecati nemo illum voluptatem laudantiummolestiae beatae rerum ea iure soluta nostrumeligendi et voluptate
+
+
+ 48
+ ut voluptatem illum ea doloribus itaque eos
+ voluptates quo voluptatem facilis iure occaecativel assumenda rerum officia etillum perspiciatis ab delenitilaudantium repellat ad ut et autem reprehenderit
+
+
+ 49
+ laborum non sunt aut ut assumenda perspiciatis voluptas
+ inventore ab sintnatus fugit id nulla sequi architecto nihil quaerateos tenetur in in eum veritatis nonquibusdam officiis aspernatur cumque aut commodi aut
+
+
+ 50
+ repellendus qui recusandae incidunt voluptates tenetur qui omnis exercitationem
+ error suscipit maxime adipisci consequuntur recusandaevoluptas eligendi et est et voluptatesquia distinctio ab amet quaerat molestiae et vitaeadipisci impedit sequi nesciunt quis consectetur
+
+
+
+
+ 41
+ ea voluptates maiores eos accusantium officiis tempore mollitia consequatur
+
+
+ 42
+ tenetur explicabo ea
+
+
+ 43
+ aperiam doloremque nihil
+
+
+ 44
+ sapiente cum numquam officia consequatur vel natus quos suscipit
+
+
+ 45
+ tenetur quos ea unde est enim corrupti qui
+
+
+ 46
+ molestiae voluptate non
+
+
+ 47
+ temporibus molestiae aut
+
+
+ 48
+ modi consequatur culpa aut quam soluta alias perspiciatis laudantium
+
+
+ 49
+ ut aut vero repudiandae voluptas ullam voluptas at consequatur
+
+
+ 50
+ sed qui sed quas sit ducimus dolor
+
+
+
+
+ 81
+ suscipit qui totam
+ True
+
+
+ 82
+ voluptates eum voluptas et dicta
+ False
+
+
+ 83
+ quidem at rerum quis ex aut sit quam
+ True
+
+
+ 84
+ sunt veritatis ut voluptate
+ False
+
+
+ 85
+ et quia ad iste a
+ True
+
+
+ 86
+ incidunt ut saepe autem
+ True
+
+
+ 87
+ laudantium quae eligendi consequatur quia et vero autem
+ True
+
+
+ 88
+ vitae aut excepturi laboriosam sint aliquam et et accusantium
+ False
+
+
+ 89
+ sequi ut omnis et
+ True
+
+
+ 90
+ molestiae nisi accusantium tenetur dolorem et
+ True
+
+
+ 91
+ nulla quis consequatur saepe qui id expedita
+ True
+
+
+ 92
+ in omnis laboriosam
+ True
+
+
+ 93
+ odio iure consequatur molestiae quibusdam necessitatibus quia sint
+ True
+
+
+ 94
+ facilis modi saepe mollitia
+ False
+
+
+ 95
+ vel nihil et molestiae iusto assumenda nemo quo ut
+ True
+
+
+ 96
+ nobis suscipit ducimus enim asperiores voluptas
+ False
+
+
+ 97
+ dolorum laboriosam eos qui iure aliquam
+ False
+
+
+ 98
+ debitis accusantium ut quo facilis nihil quis sapiente necessitatibus
+ True
+
+
+ 99
+ neque voluptates ratione
+ False
+
+
+ 100
+ excepturi a et neque qui expedita vel voluptate
+ False
+
+
+
\ No newline at end of file
diff --git a/homeworks/Namxobick/6/poetry.lock b/homeworks/Namxobick/6/poetry.lock
new file mode 100644
index 0000000..a38c4c7
--- /dev/null
+++ b/homeworks/Namxobick/6/poetry.lock
@@ -0,0 +1,848 @@
+[[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 = "astor"
+version = "0.8.1"
+description = "Read/rewrite/write Python ASTs"
+category = "main"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
+
+[[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 = "bandit"
+version = "1.7.4"
+description = "Security oriented static analyser for python code."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""}
+GitPython = ">=1.0.1"
+PyYAML = ">=5.3.1"
+stevedore = ">=1.20.0"
+
+[package.extras]
+test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "toml"]
+toml = ["toml"]
+yaml = ["PyYAML"]
+
+[[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 = "darglint"
+version = "1.8.1"
+description = "A utility for ensuring Google-style docstrings stay up to date with the source code."
+category = "main"
+optional = false
+python-versions = ">=3.6,<4.0"
+
+[[package]]
+name = "docutils"
+version = "0.19"
+description = "Docutils -- Python Documentation Utilities"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "eradicate"
+version = "2.1.0"
+description = "Removes commented-out code."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "flake8"
+version = "4.0.1"
+description = "the modular source code checker: pep8 pyflakes and co"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+mccabe = ">=0.6.0,<0.7.0"
+pycodestyle = ">=2.8.0,<2.9.0"
+pyflakes = ">=2.4.0,<2.5.0"
+
+[[package]]
+name = "flake8-bandit"
+version = "3.0.0"
+description = "Automated security testing with bandit and flake8."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+bandit = ">=1.7.3"
+flake8 = "*"
+flake8-polyfill = "*"
+pycodestyle = "*"
+
+[[package]]
+name = "flake8-broken-line"
+version = "0.5.0"
+description = "Flake8 plugin to forbid backslashes for line breaks"
+category = "main"
+optional = false
+python-versions = ">=3.6,<4.0"
+
+[package.dependencies]
+flake8 = ">=3.5,<6"
+
+[[package]]
+name = "flake8-bugbear"
+version = "22.10.27"
+description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+attrs = ">=19.2.0"
+flake8 = ">=3.0.0"
+
+[package.extras]
+dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit", "tox"]
+
+[[package]]
+name = "flake8-commas"
+version = "2.1.0"
+description = "Flake8 lint for trailing commas."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+flake8 = ">=2"
+
+[[package]]
+name = "flake8-comprehensions"
+version = "3.10.1"
+description = "A flake8 plugin to help you write better list/set/dict comprehensions."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+flake8 = ">=3.0,<3.2.0 || >3.2.0"
+
+[[package]]
+name = "flake8-debugger"
+version = "4.1.2"
+description = "ipdb/pdb statement checker plugin for flake8"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+flake8 = ">=3.0"
+pycodestyle = "*"
+
+[[package]]
+name = "flake8-docstrings"
+version = "1.6.0"
+description = "Extension for flake8 which uses pydocstyle to check docstrings"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+flake8 = ">=3"
+pydocstyle = ">=2.1"
+
+[[package]]
+name = "flake8-eradicate"
+version = "1.4.0"
+description = "Flake8 plugin to find commented out code"
+category = "main"
+optional = false
+python-versions = ">=3.7,<4.0"
+
+[package.dependencies]
+attrs = "*"
+eradicate = ">=2.0,<3.0"
+flake8 = ">=3.5,<6"
+
+[[package]]
+name = "flake8-isort"
+version = "4.2.0"
+description = "flake8 plugin that integrates isort ."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+flake8 = ">=3.2.1,<6"
+isort = ">=4.3.5,<6"
+
+[package.extras]
+test = ["pytest-cov"]
+
+[[package]]
+name = "flake8-polyfill"
+version = "1.0.2"
+description = "Polyfill package for Flake8 plugins"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+flake8 = "*"
+
+[[package]]
+name = "flake8-quotes"
+version = "3.3.1"
+description = "Flake8 lint for quotes."
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+flake8 = "*"
+
+[[package]]
+name = "flake8-rst-docstrings"
+version = "0.2.7"
+description = "Python docstring reStructuredText (RST) validator"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+flake8 = ">=3.0.0"
+pygments = "*"
+restructuredtext-lint = "*"
+
+[[package]]
+name = "flake8-string-format"
+version = "0.3.0"
+description = "string format checker, plugin for flake8"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+flake8 = "*"
+
+[[package]]
+name = "gitdb"
+version = "4.0.9"
+description = "Git Object Database"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+smmap = ">=3.0.1,<6"
+
+[[package]]
+name = "gitpython"
+version = "3.1.29"
+description = "GitPython is a python library used to interact with Git repositories"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+gitdb = ">=4.0.1,<5"
+
+[[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 = "mccabe"
+version = "0.6.1"
+description = "McCabe checker, plugin for flake8"
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "pbr"
+version = "5.11.0"
+description = "Python Build Reasonableness"
+category = "main"
+optional = false
+python-versions = ">=2.6"
+
+[[package]]
+name = "pep8-naming"
+version = "0.13.2"
+description = "Check PEP-8 naming conventions, plugin for flake8"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+flake8 = ">=3.9.1"
+
+[[package]]
+name = "pycodestyle"
+version = "2.8.0"
+description = "Python style guide checker"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+
+[[package]]
+name = "pydocstyle"
+version = "6.1.1"
+description = "Python docstring style checker"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+snowballstemmer = "*"
+
+[package.extras]
+toml = ["toml"]
+
+[[package]]
+name = "pyflakes"
+version = "2.4.0"
+description = "passive checker of Python programs"
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+
+[[package]]
+name = "pygments"
+version = "2.13.0"
+description = "Pygments is a syntax highlighting package written in Python."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.extras]
+plugins = ["importlib-metadata"]
+
+[[package]]
+name = "pyyaml"
+version = "6.0"
+description = "YAML parser and emitter for Python"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[package]]
+name = "requests"
+version = "2.28.1"
+description = "Python HTTP for Humans."
+category = "main"
+optional = false
+python-versions = ">=3.7, <4"
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+charset-normalizer = ">=2,<3"
+idna = ">=2.5,<4"
+urllib3 = ">=1.21.1,<1.27"
+
+[package.extras]
+socks = ["PySocks (>=1.5.6,!=1.5.7)"]
+use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
+
+[[package]]
+name = "restructuredtext-lint"
+version = "1.4.0"
+description = "reStructuredText linter"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+docutils = ">=0.11,<1.0"
+
+[[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 = "smmap"
+version = "5.0.0"
+description = "A pure Python implementation of a sliding window memory map manager"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[[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 = "snowballstemmer"
+version = "2.2.0"
+description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
+category = "main"
+optional = false
+python-versions = "*"
+
+[[package]]
+name = "stevedore"
+version = "4.1.1"
+description = "Manage dynamic plugins for Python applications"
+category = "main"
+optional = false
+python-versions = ">=3.8"
+
+[package.dependencies]
+pbr = ">=2.0.0,<2.1.0 || >2.1.0"
+
+[[package]]
+name = "typing-extensions"
+version = "4.4.0"
+description = "Backported and Experimental Type Hints for Python 3.7+"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[[package]]
+name = "urllib3"
+version = "1.26.12"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+category = "main"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4"
+
+[package.extras]
+brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"]
+secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
+socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
+
+[[package]]
+name = "wemake-python-styleguide"
+version = "0.17.0"
+description = "The strictest and most opinionated python linter ever"
+category = "main"
+optional = false
+python-versions = ">=3.7,<4.0"
+
+[package.dependencies]
+astor = ">=0.8,<0.9"
+attrs = "*"
+darglint = ">=1.2,<2.0"
+flake8 = ">=3.7,<5"
+flake8-bandit = ">=2.1,<4"
+flake8-broken-line = ">=0.5,<0.6"
+flake8-bugbear = ">=22.9,<23.0"
+flake8-commas = ">=2.0,<3.0"
+flake8-comprehensions = ">=3.1,<4.0"
+flake8-debugger = ">=4.0,<5.0"
+flake8-docstrings = ">=1.3,<2.0"
+flake8-eradicate = ">=1.0,<2.0"
+flake8-isort = ">=4.0,<5.0"
+flake8-quotes = ">=3.0,<4.0"
+flake8-rst-docstrings = ">=0.2,<0.3"
+flake8-string-format = ">=0.3,<0.4"
+pep8-naming = ">=0.13,<0.14"
+pygments = ">=2.4,<3.0"
+typing_extensions = ">=4.0,<5.0"
+
+[[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)"]
+
+[metadata]
+lock-version = "1.1"
+python-versions = "^3.10"
+content-hash = "f6b798cf013c89838aecdcdd4a5af5b969d7875b189e69fa33df0072d052a2ec"
+
+[metadata.files]
+anyio = [
+ {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"},
+ {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"},
+]
+astor = [
+ {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"},
+ {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"},
+]
+attrs = [
+ {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"},
+ {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"},
+]
+bandit = [
+ {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"},
+ {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"},
+]
+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"},
+]
+darglint = [
+ {file = "darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d"},
+ {file = "darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da"},
+]
+docutils = [
+ {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"},
+ {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"},
+]
+eradicate = [
+ {file = "eradicate-2.1.0-py3-none-any.whl", hash = "sha256:8bfaca181db9227dc88bdbce4d051a9627604c2243e7d85324f6d6ce0fd08bb2"},
+ {file = "eradicate-2.1.0.tar.gz", hash = "sha256:aac7384ab25b1bf21c4c012de9b4bf8398945a14c98c911545b2ea50ab558014"},
+]
+flake8 = [
+ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"},
+ {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"},
+]
+flake8-bandit = [
+ {file = "flake8_bandit-3.0.0-py2.py3-none-any.whl", hash = "sha256:61b617f4f7cdaa0e2b1e6bf7b68afb2b619a227bb3e3ae00dd36c213bd17900a"},
+ {file = "flake8_bandit-3.0.0.tar.gz", hash = "sha256:54d19427e6a8d50322a7b02e1841c0a7c22d856975f3459803320e0e18e2d6a1"},
+]
+flake8-broken-line = [
+ {file = "flake8-broken-line-0.5.0.tar.gz", hash = "sha256:7c98de9dd1385b71e888709c7f2aee3f0514107ecb5875bc95d0c03392191c97"},
+ {file = "flake8_broken_line-0.5.0-py3-none-any.whl", hash = "sha256:daafb19b67eead0410ce7ba155d51a15b9d020ebe7630d87de9c2b93cedb6703"},
+]
+flake8-bugbear = [
+ {file = "flake8-bugbear-22.10.27.tar.gz", hash = "sha256:a6708608965c9e0de5fff13904fed82e0ba21ac929fe4896459226a797e11cd5"},
+ {file = "flake8_bugbear-22.10.27-py3-none-any.whl", hash = "sha256:6ad0ab754507319060695e2f2be80e6d8977cfcea082293089a9226276bd825d"},
+]
+flake8-commas = [
+ {file = "flake8-commas-2.1.0.tar.gz", hash = "sha256:940441ab8ee544df564ae3b3f49f20462d75d5c7cac2463e0b27436e2050f263"},
+ {file = "flake8_commas-2.1.0-py2.py3-none-any.whl", hash = "sha256:ebb96c31e01d0ef1d0685a21f3f0e2f8153a0381430e748bf0bbbb5d5b453d54"},
+]
+flake8-comprehensions = [
+ {file = "flake8-comprehensions-3.10.1.tar.gz", hash = "sha256:412052ac4a947f36b891143430fef4859705af11b2572fbb689f90d372cf26ab"},
+ {file = "flake8_comprehensions-3.10.1-py3-none-any.whl", hash = "sha256:d763de3c74bc18a79c039a7ec732e0a1985b0c79309ceb51e56401ad0a2cd44e"},
+]
+flake8-debugger = [
+ {file = "flake8-debugger-4.1.2.tar.gz", hash = "sha256:52b002560941e36d9bf806fca2523dc7fb8560a295d5f1a6e15ac2ded7a73840"},
+ {file = "flake8_debugger-4.1.2-py3-none-any.whl", hash = "sha256:0a5e55aeddcc81da631ad9c8c366e7318998f83ff00985a49e6b3ecf61e571bf"},
+]
+flake8-docstrings = [
+ {file = "flake8-docstrings-1.6.0.tar.gz", hash = "sha256:9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b"},
+ {file = "flake8_docstrings-1.6.0-py2.py3-none-any.whl", hash = "sha256:99cac583d6c7e32dd28bbfbef120a7c0d1b6dde4adb5a9fd441c4227a6534bde"},
+]
+flake8-eradicate = [
+ {file = "flake8-eradicate-1.4.0.tar.gz", hash = "sha256:3088cfd6717d1c9c6c3ac45ef2e5f5b6c7267f7504d5a74b781500e95cb9c7e1"},
+ {file = "flake8_eradicate-1.4.0-py3-none-any.whl", hash = "sha256:e3bbd0871be358e908053c1ab728903c114f062ba596b4d40c852fd18f473d56"},
+]
+flake8-isort = [
+ {file = "flake8-isort-4.2.0.tar.gz", hash = "sha256:26571500cd54976bbc0cf1006ffbcd1a68dd102f816b7a1051b219616ba9fee0"},
+ {file = "flake8_isort-4.2.0-py3-none-any.whl", hash = "sha256:5b87630fb3719bf4c1833fd11e0d9534f43efdeba524863e15d8f14a7ef6adbf"},
+]
+flake8-polyfill = [
+ {file = "flake8-polyfill-1.0.2.tar.gz", hash = "sha256:e44b087597f6da52ec6393a709e7108b2905317d0c0b744cdca6208e670d8eda"},
+ {file = "flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9"},
+]
+flake8-quotes = [
+ {file = "flake8-quotes-3.3.1.tar.gz", hash = "sha256:633adca6fb8a08131536af0d750b44d6985b9aba46f498871e21588c3e6f525a"},
+]
+flake8-rst-docstrings = [
+ {file = "flake8-rst-docstrings-0.2.7.tar.gz", hash = "sha256:2740067ab9237559dd45a3434d8c987792c7b259ca563621a3b95efe201f5382"},
+ {file = "flake8_rst_docstrings-0.2.7-py3-none-any.whl", hash = "sha256:5d56075dce360bcc9c6775bfe7cb431aa395de600ca7e8d40580a28d50b2a803"},
+]
+flake8-string-format = [
+ {file = "flake8-string-format-0.3.0.tar.gz", hash = "sha256:65f3da786a1461ef77fca3780b314edb2853c377f2e35069723348c8917deaa2"},
+ {file = "flake8_string_format-0.3.0-py2.py3-none-any.whl", hash = "sha256:812ff431f10576a74c89be4e85b8e075a705be39bc40c4b4278b5b13e2afa9af"},
+]
+gitdb = [
+ {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"},
+ {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"},
+]
+gitpython = [
+ {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"},
+ {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"},
+]
+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"},
+]
+mccabe = [
+ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
+ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
+]
+pbr = [
+ {file = "pbr-5.11.0-py2.py3-none-any.whl", hash = "sha256:db2317ff07c84c4c63648c9064a79fe9d9f5c7ce85a9099d4b6258b3db83225a"},
+ {file = "pbr-5.11.0.tar.gz", hash = "sha256:b97bc6695b2aff02144133c2e7399d5885223d42b7912ffaec2ca3898e673bfe"},
+]
+pep8-naming = [
+ {file = "pep8-naming-0.13.2.tar.gz", hash = "sha256:93eef62f525fd12a6f8c98f4dcc17fa70baae2f37fa1f73bec00e3e44392fa48"},
+ {file = "pep8_naming-0.13.2-py3-none-any.whl", hash = "sha256:59e29e55c478db69cffbe14ab24b5bd2cd615c0413edf790d47d3fb7ba9a4e23"},
+]
+pycodestyle = [
+ {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"},
+ {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"},
+]
+pydocstyle = [
+ {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"},
+ {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"},
+]
+pyflakes = [
+ {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"},
+ {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"},
+]
+pygments = [
+ {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"},
+ {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"},
+]
+pyyaml = [
+ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
+ {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
+ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
+ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
+ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
+ {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
+ {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
+ {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"},
+ {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"},
+ {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"},
+ {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"},
+ {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"},
+ {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"},
+ {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"},
+ {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
+ {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
+ {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
+ {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
+ {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
+ {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
+ {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
+ {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
+ {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
+ {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
+ {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
+ {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
+ {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
+ {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
+ {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
+ {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
+ {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
+ {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
+ {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
+ {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
+ {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
+ {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
+ {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
+ {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
+ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
+ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
+]
+requests = [
+ {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"},
+ {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"},
+]
+restructuredtext-lint = [
+ {file = "restructuredtext_lint-1.4.0.tar.gz", hash = "sha256:1b235c0c922341ab6c530390892eb9e92f90b9b75046063e047cacfb0f050c45"},
+]
+rfc3986 = [
+ {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"},
+ {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"},
+]
+smmap = [
+ {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"},
+ {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"},
+]
+sniffio = [
+ {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"},
+ {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"},
+]
+snowballstemmer = [
+ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
+ {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
+]
+stevedore = [
+ {file = "stevedore-4.1.1-py3-none-any.whl", hash = "sha256:aa6436565c069b2946fe4ebff07f5041e0c8bf18c7376dd29edf80cf7d524e4e"},
+ {file = "stevedore-4.1.1.tar.gz", hash = "sha256:7f8aeb6e3f90f96832c301bff21a7eb5eefbe894c88c506483d355565d88cc1a"},
+]
+typing-extensions = [
+ {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"},
+ {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"},
+]
+urllib3 = [
+ {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"},
+ {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"},
+]
+wemake-python-styleguide = [
+ {file = "wemake-python-styleguide-0.17.0.tar.gz", hash = "sha256:c8869fac392019c2bb3eae4287399245d10d2726b23f1b3c68d1564909c3a71a"},
+ {file = "wemake_python_styleguide-0.17.0-py3-none-any.whl", hash = "sha256:d10b953bbe4fba83a34f4c224a0e1849ede89e486eacfc760690e6c87a28eaae"},
+]
+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"},
+]
diff --git a/homeworks/Namxobick/6/pyproject.toml b/homeworks/Namxobick/6/pyproject.toml
new file mode 100644
index 0000000..ec806fc
--- /dev/null
+++ b/homeworks/Namxobick/6/pyproject.toml
@@ -0,0 +1,18 @@
+[tool.poetry]
+name = "hw6"
+version = "0.1.0"
+description = ""
+authors = ["Namxobick "]
+readme = "README.md"
+
+[tool.poetry.dependencies]
+python = "^3.10"
+loguru = "^0.6.0"
+requests = "^2.28.1"
+wemake-python-styleguide = "^0.17.0"
+httpx = "^0.23.1"
+
+
+[build-system]
+requires = ["poetry-core"]
+build-backend = "poetry.core.masonry.api"
diff --git a/homeworks/Namxobick/6/setup.cfg b/homeworks/Namxobick/6/setup.cfg
new file mode 100644
index 0000000..8e9eda3
--- /dev/null
+++ b/homeworks/Namxobick/6/setup.cfg
@@ -0,0 +1,97 @@
+# All configuration for plugins and other utils is defined here.
+# Read more about `setup.cfg`:
+# https://docs.python.org/3/distutils/configfile.html
+
+[flake8]
+# Base flake8 configuration:
+# https://flake8.pycqa.org/en/latest/user/configuration.html
+format = wemake
+show-source = true
+statistics = false
+doctests = true
+
+# darglint configuration:
+# https://github.com/terrencepreilly/darglint
+strictness = long
+docstring-style = numpy
+
+# Plugins:
+max-complexity = 6
+max-line-length = 80
+
+# wemake-python-styleguide settings:
+i-control-code = false
+
+# Disable some pydocstyle checks:
+# Exclude some pydoctest checks globally:
+ignore = D100, D104, D106, D401, W504, X100, RST303, RST304, DAR103, DAR203
+
+# Excluding some directories:
+exclude =
+ .git
+ __pycache__
+ .venv
+ .eggs
+ *.egg
+
+# Ignoring some errors in some files:
+per-file-ignores =
+ # Enable `assert` keyword and magic numbers for tests:
+ tests/*.py: S101, WPS226, WPS432
+
+
+[isort]
+# isort configuration:
+# https://pycqa.github.io/isort/docs/configuration/options.html
+profile = wemake
+
+
+[tool:pytest]
+# Directories that are not visited by pytest collector:
+norecursedirs = *.egg .eggs dist build docs .tox .git __pycache__
+
+# Strict `@xfail` by default:
+xfail_strict = true
+
+# Extra options:
+addopts =
+ --strict-markers
+ --strict-config
+ --tb=short
+ --doctest-modules
+ --cov={{ cookiecutter.project_name.lower().replace('-', '_') }}
+ --cov-report=term-missing:skip-covered
+ --cov-report=html
+ --cov-report=xml
+ --cov-branch
+ --cov-fail-under=100
+
+
+[mypy]
+# mypy configurations: http://bit.ly/2zEl9WI
+enable_error_code = truthy-bool, redundant-expr, unused-awaitable
+
+allow_redefinition = false
+check_untyped_defs = true
+disallow_any_explicit = true
+disallow_any_generics = true
+disallow_untyped_calls = true
+ignore_errors = false
+ignore_missing_imports = true
+implicit_reexport = false
+local_partial_types = true
+strict_optional = true
+strict_equality = true
+no_implicit_optional = true
+warn_no_return = true
+warn_unused_ignores = true
+warn_redundant_casts = true
+warn_unused_configs = true
+warn_unreachable = true
+
+
+[doc8]
+# doc8 configuration: https://pypi.org/project/doc8/
+ignore-path = docs/_build
+max-line-length = 80
+sphinx = true
\ No newline at end of file
diff --git a/homeworks/Namxobick/6/todo/__init__.py b/homeworks/Namxobick/6/todo/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/homeworks/Namxobick/6/todo/__main__.py b/homeworks/Namxobick/6/todo/__main__.py
new file mode 100644
index 0000000..3a99b33
--- /dev/null
+++ b/homeworks/Namxobick/6/todo/__main__.py
@@ -0,0 +1,25 @@
+from datetime import datetime
+from typing import Final
+
+from basic import basic
+from loguru import logger
+
+
+def main():
+ """Main method. Entry point."""
+ start_time = datetime.now()
+ try:
+ basic(PATH_EMAIL, PATH_JSON)
+ except Exception as ex:
+ logger.critical('You have done something wrong!', ex)
+ end_time = datetime.now()
+ logger.info('Took {0}'.format(end_time - start_time))
+
+
+if __name__ == '__main__':
+ PATH_EMAIL: Final = '../files/email/email.csv'
+ PATH_JSON: Final = 'https://jsonplaceholder.typicode.com/users/'
+ try:
+ main()
+ except KeyboardInterrupt:
+ logger.critical('Shutting down, bye!')
diff --git a/homeworks/Namxobick/6/todo/basic.py b/homeworks/Namxobick/6/todo/basic.py
new file mode 100644
index 0000000..3633ebd
--- /dev/null
+++ b/homeworks/Namxobick/6/todo/basic.py
@@ -0,0 +1,51 @@
+import re
+
+import json_parser as scraping
+import reader_csv_file as csv
+from loguru import logger
+from writer_xml import write_xml
+
+
+def basic(path_email: str, path_json: str):
+ """
+ Basic method.
+
+ Connects other methods.
+
+ :param path_email : path to PATH_EMAIL
+ :param path_json : path to PATH_JSON
+ """
+ types_info = ['posts', 'albums', 'todos']
+ _user_xml(types_info, path_email, path_json)
+
+
+def _is_email(entry: str) -> bool:
+ regex = re.compile(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+(\.[A-Z|a-z]{2,})+')
+ return re.match(regex, entry) is not None
+
+
+def _get_emails_id(path_email: str, path_json: str) -> dict:
+ all_emails_id = scraping.get_email_id(path_json)
+ emails = csv.read(path_email)
+
+ emails_id = {}
+ for key in emails:
+ if _is_email(key):
+ user_id = all_emails_id.get(key)
+ if user_id is None:
+ logger.warning('{0} missing from the website'.format(key))
+ else:
+ emails_id[key] = user_id
+ else:
+ logger.warning('{0} is not valid email'.format(key))
+ logger.info('{0} users were found in website'.format(len(emails_id)))
+ return emails_id
+
+
+def _user_xml(types_info: list, path_email: str, path_json: str):
+ emails_id = _get_emails_id(path_email, path_json)
+ for key in emails_id:
+ path = '../files/users/{0}.xml'.format(str(emails_id.get(key)))
+ user_id = str(emails_id.get(key))
+ user_info = scraping.get_user_info(path_json, user_id, types_info)
+ write_xml(user_id, str(key), user_info, types_info, path)
diff --git a/homeworks/Namxobick/6/todo/json_parser.py b/homeworks/Namxobick/6/todo/json_parser.py
new file mode 100644
index 0000000..bdb9e89
--- /dev/null
+++ b/homeworks/Namxobick/6/todo/json_parser.py
@@ -0,0 +1,59 @@
+import requests
+from loguru import logger
+
+
+def get_all_info(path: str) -> dict:
+ """
+ Gets all the information from the website.
+
+ :param path : path PATH_JSON
+ :return dict : information from the website
+ """
+ response = requests.get(path)
+ return response.json()
+
+
+def get_email_id(path: str) -> dict:
+ """
+ Receives the user ID by email from the website.
+
+ :param path : path PATH_JSON
+ :return dict : email:id
+ """
+ logger.info('The beginning of requests users from the site')
+ user_email_id: dict[str:int] = {}
+
+ response = requests.get(path)
+ users_info = response.json()
+ for user_info in users_info:
+ user_email_id[user_info.get('email')] = user_info.get('id')
+
+ logger.info('The ending of requests users from the site: took {0}'.format(
+ response.elapsed,
+ ))
+ logger.info('Users: {0}'.format(user_email_id))
+ return user_email_id
+
+
+def get_user_info(path: str, user_id: str, types_info: list) -> dict:
+ """
+ Receives the user info ('posts', 'albums', 'todos') by id from the website.
+
+ :param path : path PATH_JSON
+ :param user_id
+ :param types_info : ['posts', 'albums', 'todos']
+ :return dict : email:id
+ """
+ user_info: dict[str:list] = {}
+ logger.info('Starts parsing for ID: {0}'.format(user_id))
+ for type_info in types_info:
+ response = requests.get(path + '{0}/{1}/'.format(user_id, type_info))
+ user_info[type_info] = response.json()
+ logger.info(('Request to ID: {1} for get {0}: took {2}'.format(
+ type_info,
+ user_id,
+ response.elapsed,
+ )))
+ logger.info('Ends parsing for ID: {0}'.format(user_id))
+
+ return user_info
diff --git a/homeworks/Namxobick/6/todo/reader_csv_file.py b/homeworks/Namxobick/6/todo/reader_csv_file.py
new file mode 100644
index 0000000..4d698c8
--- /dev/null
+++ b/homeworks/Namxobick/6/todo/reader_csv_file.py
@@ -0,0 +1,20 @@
+import csv
+
+from loguru import logger
+
+
+def read(path: str = None) -> tuple:
+ """
+ Read the csv file.
+
+ :param path :path to email.csv
+ :return tuple : tuple of emails
+ """
+ with open(path) as csv_file:
+ emails: list[str] = []
+ reader = csv.reader(csv_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)
diff --git a/homeworks/Namxobick/6/todo/writer_xml.py b/homeworks/Namxobick/6/todo/writer_xml.py
new file mode 100644
index 0000000..28c60f3
--- /dev/null
+++ b/homeworks/Namxobick/6/todo/writer_xml.py
@@ -0,0 +1,61 @@
+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'))))
+
+ match name_new_root:
+ case 'posts':
+ body = _remove_enter(str(user_info.get('body')))
+ _append_elem(name, 'body', body)
+ case 'todos':
+ completed = _remove_enter(str(user_info.get('completed')))
+ _append_elem(name, 'completed', completed)
+ root.append(names)
+
+
+def write_xml(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,
+ ))