diff --git a/information_system_and_programming/term_5/db_management_and_automation/poetry.lock b/information_system_and_programming/term_5/db_management_and_automation/poetry.lock index e726dd4..7c036dc 100644 --- a/information_system_and_programming/term_5/db_management_and_automation/poetry.lock +++ b/information_system_and_programming/term_5/db_management_and_automation/poetry.lock @@ -241,6 +241,73 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "coverage" +version = "7.4.0" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"}, + {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"}, + {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"}, + {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"}, + {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"}, + {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"}, + {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"}, + {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"}, + {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"}, + {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"}, + {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"}, + {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"}, + {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"}, + {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"}, + {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"}, + {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"}, + {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"}, + {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"}, + {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"}, + {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"}, + {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"}, + {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + [[package]] name = "cryptography" version = "41.0.7" @@ -405,6 +472,22 @@ files = [ fastapi-users = ">=10.0.0" sqlalchemy = {version = ">=2.0.0,<2.1.0", extras = ["asyncio"]} +[[package]] +name = "flake8" +version = "7.0.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"}, + {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.2.0,<3.3.0" + [[package]] name = "greenlet" version = "3.0.3" @@ -710,6 +793,75 @@ files = [ {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mypy" +version = "1.8.0" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, + {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, + {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, + {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, + {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, + {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, + {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, + {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, + {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, + {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, + {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, + {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, + {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, + {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, + {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, + {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, + {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, + {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + [[package]] name = "orjson" version = "3.9.10" @@ -815,6 +967,17 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "pycodestyle" +version = "2.11.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, + {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, +] + [[package]] name = "pycparser" version = "2.21" @@ -994,6 +1157,17 @@ files = [ pydantic = ">=2.3.0" python-dotenv = ">=0.21.0" +[[package]] +name = "pyflakes" +version = "3.2.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, + {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, +] + [[package]] name = "pyjwt" version = "2.8.0" @@ -1036,6 +1210,24 @@ tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest-cov" +version = "4.1.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + [[package]] name = "python-dotenv" version = "1.0.0" @@ -1575,4 +1767,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "2729a7a2f6e7fd1129785ebf6520444265a044dd7c45ae7027e2c96a27769d95" +content-hash = "016b51f25ab994435bb7d61752487fabe74646550c2ce91ea1ebe70b39afd19a" diff --git a/information_system_and_programming/term_5/db_management_and_automation/pyproject.toml b/information_system_and_programming/term_5/db_management_and_automation/pyproject.toml index 096ee2d..1215f22 100644 --- a/information_system_and_programming/term_5/db_management_and_automation/pyproject.toml +++ b/information_system_and_programming/term_5/db_management_and_automation/pyproject.toml @@ -17,10 +17,17 @@ fastapi-users = {extras = ["sqlalchemy"], version = "^12.1.2"} [tool.poetry.group.dev.dependencies] pytest = "^7.4.4" +flake8 = "^7.0.0" +mypy = "^1.8.0" +pytest-cov = "^4.1.0" + +[tool.pytest.ini_options] +pythonpath = ". src" + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.poetry.scripts] -app = "servicemanager.main:run_app" +app = "src.app:run_app" diff --git a/information_system_and_programming/term_5/db_management_and_automation/pytest.ini b/information_system_and_programming/term_5/db_management_and_automation/pytest.ini deleted file mode 100644 index f9965b9..0000000 --- a/information_system_and_programming/term_5/db_management_and_automation/pytest.ini +++ /dev/null @@ -1,4 +0,0 @@ -[pytest] -pythonpath = . src -; env_files = -; .test.env diff --git a/information_system_and_programming/term_5/db_management_and_automation/src/main.py b/information_system_and_programming/term_5/db_management_and_automation/src/app.py similarity index 95% rename from information_system_and_programming/term_5/db_management_and_automation/src/main.py rename to information_system_and_programming/term_5/db_management_and_automation/src/app.py index f0ba71e..51e6882 100644 --- a/information_system_and_programming/term_5/db_management_and_automation/src/main.py +++ b/information_system_and_programming/term_5/db_management_and_automation/src/app.py @@ -1,8 +1,8 @@ import asyncio import sys -import uvicorn from fastapi import FastAPI +import uvicorn from api.routes import api_router from frontend.routes import site_router @@ -13,7 +13,7 @@ async def generate_test_data(): Создание БД и наполнение ее данными """ from backend.database import create_db_and_tables - from backend.queries.user import UserORM + from backend.queries import UserORM await create_db_and_tables() await UserORM.insert_admin() diff --git a/information_system_and_programming/term_5/db_management_and_automation/src/backend/database.py b/information_system_and_programming/term_5/db_management_and_automation/src/backend/database.py index db45af2..739c2bf 100644 --- a/information_system_and_programming/term_5/db_management_and_automation/src/backend/database.py +++ b/information_system_and_programming/term_5/db_management_and_automation/src/backend/database.py @@ -1,14 +1,17 @@ -import datetime -from typing import Annotated, AsyncGenerator +from typing import AsyncGenerator from fastapi import Depends from fastapi_users.db import SQLAlchemyUserDatabase -from sqlalchemy import text -from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine -from sqlalchemy.orm import DeclarativeBase, mapped_column +from sqlalchemy.ext.asyncio import ( + AsyncSession, + async_sessionmaker, + create_async_engine, +) from config import settings +from backend.models import Base, User + async_engine = create_async_engine(settings.DATABASE_URL_asyncpg) async_session_maker = async_sessionmaker( async_engine, @@ -16,26 +19,6 @@ async_session_maker = async_sessionmaker( expire_on_commit=False, ) -intpk = Annotated[int, mapped_column(primary_key=True)] -created_at = Annotated[ - datetime.datetime, - mapped_column(server_default=text("TIMEZONE('utc', now())")), -] -updated_at = Annotated[ - datetime.datetime, - mapped_column( - server_default=text("TIMEZONE('utc', now())"), - onupdate=datetime.datetime.utcnow, - ), -] - - -class Base(DeclarativeBase): - pass - - -from backend.models.user import User - async def create_db_and_tables(): async with async_engine.begin() as conn: diff --git a/information_system_and_programming/term_5/db_management_and_automation/src/backend/models.py b/information_system_and_programming/term_5/db_management_and_automation/src/backend/models.py new file mode 100644 index 0000000..cd8b98b --- /dev/null +++ b/information_system_and_programming/term_5/db_management_and_automation/src/backend/models.py @@ -0,0 +1,108 @@ +from datetime import datetime +from typing import List, Annotated + +from fastapi_users.db import SQLAlchemyBaseUserTable +from sqlalchemy import ForeignKey, text +from sqlalchemy.orm import Mapped, mapped_column, relationship, DeclarativeBase + + +intpk = Annotated[int, mapped_column(primary_key=True)] +created_at = Annotated[ + datetime, + mapped_column(server_default=text("TIMEZONE('utc', now())")), +] +updated_at = Annotated[ + datetime, + mapped_column( + server_default=text("TIMEZONE('utc', now())"), + onupdate=datetime.utcnow, + ), +] + + +class Base(DeclarativeBase): + pass + + +class UserRoleAssociation(Base): + """ + Модель таблицы связи Many2Many для Role & User + """ + + __tablename__ = "user_role_association" + user_id: Mapped[int] = mapped_column( + ForeignKey("user.id"), + primary_key=True, + ) + role_id: Mapped[int] = mapped_column( + ForeignKey("role.id"), + primary_key=True, + ) + role: Mapped["Role"] = relationship() + + +class Role(Base): + """ + Модель таблицы role + """ + + __tablename__ = "role" + + id: Mapped[intpk] + role: Mapped[str] + + +class User(SQLAlchemyBaseUserTable[int], Base): + """ + Модель таблицы user + """ + + __tablename__ = "user" + id: Mapped[intpk] + roles: Mapped[List["UserRoleAssociation"]] = relationship() + + +class ClientLocationAssociation(Base): + __tablename__ = "client_location_association" + client_id: Mapped[int] = mapped_column( + ForeignKey("client.id"), + primary_key=True, + ) + location_id: Mapped[int] = mapped_column( + ForeignKey("location.id"), primary_key=True + ) + location: Mapped["Location"] = relationship() + + +class Client(Base): + """ + Клиенты и отделы организации у которых обслуживается оборудование + """ + + __tablename__ = "client" + id: Mapped[intpk] + name: Mapped[str] + equipment: Mapped[int] + locations: Mapped[List[ClientLocationAssociation]] = relationship() + + +class Location(Base): + """ + Адреса клиентов где установленно оборудование + """ + + __tablename__ = "location" + id: Mapped[intpk] + address: Mapped[str] + client: Mapped[int] + + +class Equipment(Base): + __tablename__ = "equipment" + id: Mapped[intpk] + name: Mapped[str] + eq_type: Mapped[int] + # location: Mapped[List["Location"]] = relationship() + put_into_operation_at: Mapped[datetime] + # user_id: Mapped[int] = mapped_column(ForeignKey("user.id")) + # child: Mapped["User"] = relationship() diff --git a/information_system_and_programming/term_5/db_management_and_automation/src/backend/models/__init__.py b/information_system_and_programming/term_5/db_management_and_automation/src/backend/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/information_system_and_programming/term_5/db_management_and_automation/src/backend/models/user.py b/information_system_and_programming/term_5/db_management_and_automation/src/backend/models/user.py deleted file mode 100644 index 5548414..0000000 --- a/information_system_and_programming/term_5/db_management_and_automation/src/backend/models/user.py +++ /dev/null @@ -1,40 +0,0 @@ -from typing import List, Optional - -from fastapi_users.db import SQLAlchemyBaseUserTable -from sqlalchemy import ForeignKey -from sqlalchemy.orm import Mapped, mapped_column, relationship - -from backend.database import Base, intpk - - -class UserRoleAssociation(Base): - """ - Модель таблицы связи Many2Many для Role & User - """ - - __tablename__ = "user_role_association" - user_id: Mapped[int] = mapped_column(ForeignKey("user.id"), primary_key=True) - role_id: Mapped[int] = mapped_column(ForeignKey("role.id"), primary_key=True) - extra_data: Mapped[Optional[str]] - child: Mapped["Role"] = relationship() - - -class Role(Base): - """ - Модель таблицы role - """ - - __tablename__ = "role" - - id: Mapped[intpk] - role: Mapped[str] - - -class User(SQLAlchemyBaseUserTable[int], Base): - """ - Модель таблицы user - """ - - __tablename__ = "user" - id: Mapped[intpk] - children: Mapped[List["UserRoleAssociation"]] = relationship() diff --git a/information_system_and_programming/term_5/db_management_and_automation/src/backend/queries/user.py b/information_system_and_programming/term_5/db_management_and_automation/src/backend/queries.py similarity index 92% rename from information_system_and_programming/term_5/db_management_and_automation/src/backend/queries/user.py rename to information_system_and_programming/term_5/db_management_and_automation/src/backend/queries.py index 4c2a42e..d6848ce 100644 --- a/information_system_and_programming/term_5/db_management_and_automation/src/backend/queries/user.py +++ b/information_system_and_programming/term_5/db_management_and_automation/src/backend/queries.py @@ -1,5 +1,5 @@ from backend.database import async_session_maker -from backend.models.user import Role, User +from backend.models import User class UserORM: diff --git a/information_system_and_programming/term_5/db_management_and_automation/src/backend/queries/__init__.py b/information_system_and_programming/term_5/db_management_and_automation/src/backend/queries/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/information_system_and_programming/term_5/db_management_and_automation/src/config.py b/information_system_and_programming/term_5/db_management_and_automation/src/config.py index 5d2fc68..873a1f5 100644 --- a/information_system_and_programming/term_5/db_management_and_automation/src/config.py +++ b/information_system_and_programming/term_5/db_management_and_automation/src/config.py @@ -13,9 +13,12 @@ class Settings(BaseSettings): """ Возвращает строку подключения к БД необходимую для SQLAlchemy """ - return f"postgresql+asyncpg://{self.DB_USER}:{self.DB_PASS}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}" + return ( + f"postgresql+asyncpg://{self.DB_USER}:{self.DB_PASS}" + f"@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}" + ) - model_config = SettingsConfigDict(env_file="src/.env") + model_config = SettingsConfigDict(env_file=".env") settings = Settings() diff --git a/information_system_and_programming/term_5/db_management_and_automation/src/frontend/routes.py b/information_system_and_programming/term_5/db_management_and_automation/src/frontend/routes.py index 509084e..1d8518a 100644 --- a/information_system_and_programming/term_5/db_management_and_automation/src/frontend/routes.py +++ b/information_system_and_programming/term_5/db_management_and_automation/src/frontend/routes.py @@ -1,5 +1,3 @@ -import os - from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles diff --git a/information_system_and_programming/term_5/db_management_and_automation/tests/test_frontend.py b/information_system_and_programming/term_5/db_management_and_automation/tests/test_frontend.py index 1070d01..7889793 100644 --- a/information_system_and_programming/term_5/db_management_and_automation/tests/test_frontend.py +++ b/information_system_and_programming/term_5/db_management_and_automation/tests/test_frontend.py @@ -1,6 +1,6 @@ from starlette.testclient import TestClient -from src.main import create_app +from src.app import create_app client = TestClient(create_app()) diff --git a/information_system_and_programming/term_5/db_management_and_automation/tests/test_main.py b/information_system_and_programming/term_5/db_management_and_automation/tests/test_main.py index 7b2c96c..8cf44cf 100644 --- a/information_system_and_programming/term_5/db_management_and_automation/tests/test_main.py +++ b/information_system_and_programming/term_5/db_management_and_automation/tests/test_main.py @@ -1,6 +1,6 @@ from starlette.testclient import TestClient -from src.main import create_app +from src.app import create_app client = TestClient(create_app())