diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fba3ea3..835a2f4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,7 +24,7 @@ repos: - id: pretty-format-json - repo: https://github.com/astral-sh/ruff-pre-commit - # Ruff version. + # Ruff version. rev: v0.0.284 hooks: - id: ruff @@ -59,6 +59,7 @@ repos: - pandas==2.* - pandas-stubs==2.0.* - types-requests + - sqlalchemy[mypy]==1.4.49 - repo: https://github.com/frnmst/md-toc rev: 8.2.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4bfddee..553d4c8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,3 +34,27 @@ We decided to use english on everything close to code but will write longer text - Secret detection - python normen ([pep8](https://peps.python.org/pep-0008/)) with [flake8](https://flake8.pycqa.org/en/latest/) - type checking with ([mypy](https://github.com/python/mypy)) + +## Setup + +### Connection strings +Create a `secrets.json` in the root of this repo with the following structure (values to be replaces by desired config): +```json + { + "postgres": { + "username": "postgres", + "password": "postgres", + "host": "localhost", + "database": "postgres", + "port": 5432 + }, + "mongo": { + "username": "username", + "password": "password", + "host": "localhost", + "database": "transparenzregister", + "port": 27017 + } + } +``` +Example usage see [connector.py](./src/aki_prj23_transparenzregister/utils/postgres/connector.py) diff --git a/Jupyter/mongoDB/01_How_to_connect_to_MongoDB_StagingDB.ipynb b/Jupyter/mongoDB/01_How_to_connect_to_MongoDB_StagingDB.ipynb index bf8d26d..c5d8481 100644 --- a/Jupyter/mongoDB/01_How_to_connect_to_MongoDB_StagingDB.ipynb +++ b/Jupyter/mongoDB/01_How_to_connect_to_MongoDB_StagingDB.ipynb @@ -8,7 +8,7 @@ "outputs": [], "source": [ "import configuration as conf\n", - "import aki_prj23_transparenzregister.utils.mongo as mongo" + "import aki_prj23_transparenzregister.utils.mongo.connector as mongo" ] }, { @@ -38,8 +38,10 @@ "metadata": {}, "outputs": [], "source": [ - "#Create Connection-Object\n", - "MongoObject=mongo.MongoConnection(conf.HOSTNAME,conf.DATABASE,conf.PORT,conf.USERNAME,conf.PASSWORD)" + "# Create Connection-Object\n", + "MongoObject = mongo.MongoConnection(\n", + " conf.HOSTNAME, conf.DATABASE, conf.PORT, conf.USERNAME, conf.PASSWORD\n", + ")" ] }, { @@ -59,8 +61,8 @@ "metadata": {}, "outputs": [], "source": [ - "#create Connection\n", - "MongoConnect=mongo.MongoConnector(MongoObject)" + "# create Connection\n", + "MongoConnect = mongo.MongoConnector(MongoObject)" ] }, { @@ -79,8 +81,8 @@ "metadata": {}, "outputs": [], "source": [ - "#create Object for news-collection\n", - "CollNews=MongoConnect.database[\"news\"]" + "# create Object for news-collection\n", + "CollNews = MongoConnect.database[\"news\"]" ] }, { @@ -104,8 +106,8 @@ "metadata": {}, "outputs": [], "source": [ - "cursor=CollNews.find({'date':'2023-06-16T13:29:18.901+02:00'})\n", - "NewsList=list(cursor)" + "cursor = CollNews.find({\"date\": \"2023-06-16T13:29:18.901+02:00\"})\n", + "NewsList = list(cursor)" ] }, { @@ -169,9 +171,9 @@ "metadata": {}, "outputs": [], "source": [ - "#get all documents from collection\n", - "cursor=CollNews.find({})\n", - "NewsList=list(cursor)" + "# get all documents from collection\n", + "cursor = CollNews.find({})\n", + "NewsList = list(cursor)" ] }, { @@ -4936,7 +4938,7 @@ } ], "source": [ - "#loop trough all documents\n", + "# loop trough all documents\n", "for post in CollNews.find():\n", " print(post)" ] diff --git a/Jupyter/mongoDB/02_How_to_write_to_MongoDB_StagingDB.ipynb b/Jupyter/mongoDB/02_How_to_write_to_MongoDB_StagingDB.ipynb index daac017..33f48f1 100644 --- a/Jupyter/mongoDB/02_How_to_write_to_MongoDB_StagingDB.ipynb +++ b/Jupyter/mongoDB/02_How_to_write_to_MongoDB_StagingDB.ipynb @@ -7,8 +7,8 @@ "metadata": {}, "outputs": [], "source": [ - "import configurationFH as conf #hier wird die Configuration für das K8 cluster verwendet\n", - "import aki_prj23_transparenzregister.utils.mongo as mongo" + "import configurationFH as conf # hier wird die Configuration für das K8 cluster verwendet\n", + "import aki_prj23_transparenzregister.utils.mongo.connector as mongo" ] }, { @@ -38,8 +38,10 @@ "metadata": {}, "outputs": [], "source": [ - "#Create Connection-Object\n", - "MongoObject=mongo.MongoConnection(conf.HOSTNAME,conf.DATABASE,conf.PORT,conf.USERNAME,conf.PASSWORD)" + "# Create Connection-Object\n", + "MongoObject = mongo.MongoConnection(\n", + " conf.HOSTNAME, conf.DATABASE, conf.PORT, conf.USERNAME, conf.PASSWORD\n", + ")" ] }, { @@ -59,8 +61,8 @@ "metadata": {}, "outputs": [], "source": [ - "#create Connection\n", - "MongoConnect=mongo.MongoConnector(MongoObject)" + "# create Connection\n", + "MongoConnect = mongo.MongoConnector(MongoObject)" ] }, { @@ -79,8 +81,8 @@ "metadata": {}, "outputs": [], "source": [ - "#create Object for news-collection\n", - "CollNews=MongoConnect.database[\"news\"]" + "# create Object for news-collection\n", + "CollNews = MongoConnect.database[\"news\"]" ] }, { @@ -104,9 +106,9 @@ "metadata": {}, "outputs": [], "source": [ - "#get all documents from collection\n", - "cursor=CollNews.find({})\n", - "NewsList=list(cursor)" + "# get all documents from collection\n", + "cursor = CollNews.find({})\n", + "NewsList = list(cursor)" ] }, { @@ -190,11 +192,11 @@ "import json\n", "\n", "# select the news article\n", - "data=NewsList[212]\n", - "jsonID=data['_id']\n", + "data = NewsList[212]\n", + "jsonID = data[\"_id\"]\n", "\n", - "#add the new attribute \n", - "data['company'] = '[Deutsche Bahn, GDL]'\n", + "# add the new attribute\n", + "data[\"company\"] = \"[Deutsche Bahn, GDL]\"\n", "\n", "print(data)" ] @@ -241,8 +243,8 @@ "CollNews.update_one(\n", " {\"_id\": data[\"_id\"]},\n", " {\"$set\": data},\n", - " upsert=True # Setze upsert=True, um das Dokument einzufügen, falls es noch nicht existiert\n", - ")\n" + " upsert=True, # Setze upsert=True, um das Dokument einzufügen, falls es noch nicht existiert\n", + ")" ] }, { @@ -252,9 +254,9 @@ "metadata": {}, "outputs": [], "source": [ - "#get all documents from collection\n", - "cursor=CollNews.find({})\n", - "NewsList=list(cursor)" + "# get all documents from collection\n", + "cursor = CollNews.find({})\n", + "NewsList = list(cursor)" ] }, { diff --git a/aufgaben.txt b/aufgaben.txt deleted file mode 100644 index 8001c4f..0000000 --- a/aufgaben.txt +++ /dev/null @@ -1,10 +0,0 @@ -1. Orga: - - Markdown Templates: - - Meeting Notes (Tristan) - - Requirements Liste, Richtung Pflichtenheft (Tim) - - Zeitplan und Meilensteine (Sebastian) - - Zugang GitHub Repo (Philipp) -2. Recherche: - - Rechtliche Rahmenbedingungen (Sascha) - - Datenanforderungen - Welche Informtionen/Entitäten benötigen wir? (Kim) - - APIs & Datenquellen (Philipp, Tristan) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c7efb62 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,27 @@ +version: '3.8' +services: + postgres: + image: postgres + restart: always + environment: + POSTGRES_PASSWORD: postgres + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - 5432:5432 + mongodb: + image: mongo:4.4.6 + container_name: mongodb + restart: unless-stopped + environment: + MONGO_INITDB_ROOT_USERNAME: username + MONGO_INITDB_ROOT_PASSWORD: password + MONGO_INITDB_DATABASE: transparenzregister + ports: + - 27017:27017 + volumes: + - mongo_data:/data/db + +volumes: + postgres_data: + mongo_data: diff --git a/poetry.lock b/poetry.lock index 7d6a91e..aec0c5e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -367,14 +367,14 @@ pycparser = "*" [[package]] name = "cfgv" -version = "3.3.1" +version = "3.4.0" description = "Validate configuration and produce human readable error messages." category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8" files = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, ] [[package]] @@ -570,72 +570,64 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "coverage" -version = "7.2.7" +version = "7.3.0" description = "Code coverage measurement for Python" category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, - {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, - {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, - {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, - {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, - {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, - {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, - {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, - {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, - {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, - {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, - {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, - {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, - {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, - {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, - {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, - {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, - {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, + {file = "coverage-7.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db76a1bcb51f02b2007adacbed4c88b6dee75342c37b05d1822815eed19edee5"}, + {file = "coverage-7.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c02cfa6c36144ab334d556989406837336c1d05215a9bdf44c0bc1d1ac1cb637"}, + {file = "coverage-7.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477c9430ad5d1b80b07f3c12f7120eef40bfbf849e9e7859e53b9c93b922d2af"}, + {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce2ee86ca75f9f96072295c5ebb4ef2a43cecf2870b0ca5e7a1cbdd929cf67e1"}, + {file = "coverage-7.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68d8a0426b49c053013e631c0cdc09b952d857efa8f68121746b339912d27a12"}, + {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b3eb0c93e2ea6445b2173da48cb548364f8f65bf68f3d090404080d338e3a689"}, + {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:90b6e2f0f66750c5a1178ffa9370dec6c508a8ca5265c42fbad3ccac210a7977"}, + {file = "coverage-7.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96d7d761aea65b291a98c84e1250cd57b5b51726821a6f2f8df65db89363be51"}, + {file = "coverage-7.3.0-cp310-cp310-win32.whl", hash = "sha256:63c5b8ecbc3b3d5eb3a9d873dec60afc0cd5ff9d9f1c75981d8c31cfe4df8527"}, + {file = "coverage-7.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:97c44f4ee13bce914272589b6b41165bbb650e48fdb7bd5493a38bde8de730a1"}, + {file = "coverage-7.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74c160285f2dfe0acf0f72d425f3e970b21b6de04157fc65adc9fd07ee44177f"}, + {file = "coverage-7.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b543302a3707245d454fc49b8ecd2c2d5982b50eb63f3535244fd79a4be0c99d"}, + {file = "coverage-7.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad0f87826c4ebd3ef484502e79b39614e9c03a5d1510cfb623f4a4a051edc6fd"}, + {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13c6cbbd5f31211d8fdb477f0f7b03438591bdd077054076eec362cf2207b4a7"}, + {file = "coverage-7.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac440c43e9b479d1241fe9d768645e7ccec3fb65dc3a5f6e90675e75c3f3e3a"}, + {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c9834d5e3df9d2aba0275c9f67989c590e05732439b3318fa37a725dff51e74"}, + {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4c8e31cf29b60859876474034a83f59a14381af50cbe8a9dbaadbf70adc4b214"}, + {file = "coverage-7.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7a9baf8e230f9621f8e1d00c580394a0aa328fdac0df2b3f8384387c44083c0f"}, + {file = "coverage-7.3.0-cp311-cp311-win32.whl", hash = "sha256:ccc51713b5581e12f93ccb9c5e39e8b5d4b16776d584c0f5e9e4e63381356482"}, + {file = "coverage-7.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:887665f00ea4e488501ba755a0e3c2cfd6278e846ada3185f42d391ef95e7e70"}, + {file = "coverage-7.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d000a739f9feed900381605a12a61f7aaced6beae832719ae0d15058a1e81c1b"}, + {file = "coverage-7.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:59777652e245bb1e300e620ce2bef0d341945842e4eb888c23a7f1d9e143c446"}, + {file = "coverage-7.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9737bc49a9255d78da085fa04f628a310c2332b187cd49b958b0e494c125071"}, + {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5247bab12f84a1d608213b96b8af0cbb30d090d705b6663ad794c2f2a5e5b9fe"}, + {file = "coverage-7.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2ac9a1de294773b9fa77447ab7e529cf4fe3910f6a0832816e5f3d538cfea9a"}, + {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:85b7335c22455ec12444cec0d600533a238d6439d8d709d545158c1208483873"}, + {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:36ce5d43a072a036f287029a55b5c6a0e9bd73db58961a273b6dc11a2c6eb9c2"}, + {file = "coverage-7.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:211a4576e984f96d9fce61766ffaed0115d5dab1419e4f63d6992b480c2bd60b"}, + {file = "coverage-7.3.0-cp312-cp312-win32.whl", hash = "sha256:56afbf41fa4a7b27f6635bc4289050ac3ab7951b8a821bca46f5b024500e6321"}, + {file = "coverage-7.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f297e0c1ae55300ff688568b04ff26b01c13dfbf4c9d2b7d0cb688ac60df479"}, + {file = "coverage-7.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac0dec90e7de0087d3d95fa0533e1d2d722dcc008bc7b60e1143402a04c117c1"}, + {file = "coverage-7.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:438856d3f8f1e27f8e79b5410ae56650732a0dcfa94e756df88c7e2d24851fcd"}, + {file = "coverage-7.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1084393c6bda8875c05e04fce5cfe1301a425f758eb012f010eab586f1f3905e"}, + {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49ab200acf891e3dde19e5aa4b0f35d12d8b4bd805dc0be8792270c71bd56c54"}, + {file = "coverage-7.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67e6bbe756ed458646e1ef2b0778591ed4d1fcd4b146fc3ba2feb1a7afd4254"}, + {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f39c49faf5344af36042b293ce05c0d9004270d811c7080610b3e713251c9b0"}, + {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7df91fb24c2edaabec4e0eee512ff3bc6ec20eb8dccac2e77001c1fe516c0c84"}, + {file = "coverage-7.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:34f9f0763d5fa3035a315b69b428fe9c34d4fc2f615262d6be3d3bf3882fb985"}, + {file = "coverage-7.3.0-cp38-cp38-win32.whl", hash = "sha256:bac329371d4c0d456e8d5f38a9b0816b446581b5f278474e416ea0c68c47dcd9"}, + {file = "coverage-7.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b859128a093f135b556b4765658d5d2e758e1fae3e7cc2f8c10f26fe7005e543"}, + {file = "coverage-7.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed8d310afe013db1eedd37176d0839dc66c96bcfcce8f6607a73ffea2d6ba"}, + {file = "coverage-7.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61260ec93f99f2c2d93d264b564ba912bec502f679793c56f678ba5251f0393"}, + {file = "coverage-7.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97af9554a799bd7c58c0179cc8dbf14aa7ab50e1fd5fa73f90b9b7215874ba28"}, + {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3558e5b574d62f9c46b76120a5c7c16c4612dc2644c3d48a9f4064a705eaee95"}, + {file = "coverage-7.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37d5576d35fcb765fca05654f66aa71e2808d4237d026e64ac8b397ffa66a56a"}, + {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:07ea61bcb179f8f05ffd804d2732b09d23a1238642bf7e51dad62082b5019b34"}, + {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:80501d1b2270d7e8daf1b64b895745c3e234289e00d5f0e30923e706f110334e"}, + {file = "coverage-7.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4eddd3153d02204f22aef0825409091a91bf2a20bce06fe0f638f5c19a85de54"}, + {file = "coverage-7.3.0-cp39-cp39-win32.whl", hash = "sha256:2d22172f938455c156e9af2612650f26cceea47dc86ca048fa4e0b2d21646ad3"}, + {file = "coverage-7.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:60f64e2007c9144375dd0f480a54d6070f00bb1a28f65c408370544091c9bc9e"}, + {file = "coverage-7.3.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:5492a6ce3bdb15c6ad66cb68a0244854d9917478877a25671d70378bdc8562d0"}, + {file = "coverage-7.3.0.tar.gz", hash = "sha256:49dbb19cdcafc130f597d9e04a29d0a032ceedf729e41b181f51cd170e6ee865"}, ] [package.extras] @@ -880,6 +872,80 @@ files = [ {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, ] +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + [[package]] name = "h11" version = "0.14.0" @@ -1364,14 +1430,14 @@ test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", [[package]] name = "jupyterlab" -version = "4.0.4" +version = "4.0.5" description = "JupyterLab computational environment" category = "dev" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.0.4-py3-none-any.whl", hash = "sha256:23eef35d22be8f2ad9b873ec41ceb2e8c3b0dc8ae740c0f973e2de09e587530f"}, - {file = "jupyterlab-4.0.4.tar.gz", hash = "sha256:049449a56d93202ed204e0e86f96f5a3447a08cfc09fb012fd239e178651cb34"}, + {file = "jupyterlab-4.0.5-py3-none-any.whl", hash = "sha256:13b3a326e7b95d72746fe20dbe80ee1e71165d6905e01ceaf1320eb809cb1b47"}, + {file = "jupyterlab-4.0.5.tar.gz", hash = "sha256:de49deb75f9b9aec478ed04754cbefe9c5d22fd796a5783cdc65e212983d3611"}, ] [package.dependencies] @@ -1750,7 +1816,7 @@ files = [ name = "mypy" version = "1.5.0" description = "Optional static typing for Python" -category = "dev" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1791,7 +1857,7 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -2310,14 +2376,14 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co [[package]] name = "plotly" -version = "5.15.0" +version = "5.16.0" description = "An open-source, interactive data visualization library for Python" category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "plotly-5.15.0-py2.py3-none-any.whl", hash = "sha256:3508876bbd6aefb8a692c21a7128ca87ce42498dd041efa5c933ee44b55aab24"}, - {file = "plotly-5.15.0.tar.gz", hash = "sha256:822eabe53997d5ebf23c77e1d1fcbf3bb6aa745eb05d532afd4b6f9a2e2ab02f"}, + {file = "plotly-5.16.0-py2.py3-none-any.whl", hash = "sha256:046ba0cd9f6b251780e0d93313016ec5e2cb69d9a68da818cd7110e6c77a4011"}, + {file = "plotly-5.16.0.tar.gz", hash = "sha256:13dc052665dcb4d9eefd89847c0b144984e99aca5c8008f9885d2583b77d8b7d"}, ] [package.dependencies] @@ -2443,6 +2509,27 @@ files = [ [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +[[package]] +name = "psycopg2" +version = "2.9.7" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "psycopg2-2.9.7-cp310-cp310-win32.whl", hash = "sha256:1a6a2d609bce44f78af4556bea0c62a5e7f05c23e5ea9c599e07678995609084"}, + {file = "psycopg2-2.9.7-cp310-cp310-win_amd64.whl", hash = "sha256:b22ed9c66da2589a664e0f1ca2465c29b75aaab36fa209d4fb916025fb9119e5"}, + {file = "psycopg2-2.9.7-cp311-cp311-win32.whl", hash = "sha256:44d93a0109dfdf22fe399b419bcd7fa589d86895d3931b01fb321d74dadc68f1"}, + {file = "psycopg2-2.9.7-cp311-cp311-win_amd64.whl", hash = "sha256:91e81a8333a0037babfc9fe6d11e997a9d4dac0f38c43074886b0d9dead94fe9"}, + {file = "psycopg2-2.9.7-cp37-cp37m-win32.whl", hash = "sha256:d1210fcf99aae6f728812d1d2240afc1dc44b9e6cba526a06fb8134f969957c2"}, + {file = "psycopg2-2.9.7-cp37-cp37m-win_amd64.whl", hash = "sha256:e9b04cbef584310a1ac0f0d55bb623ca3244c87c51187645432e342de9ae81a8"}, + {file = "psycopg2-2.9.7-cp38-cp38-win32.whl", hash = "sha256:d5c5297e2fbc8068d4255f1e606bfc9291f06f91ec31b2a0d4c536210ac5c0a2"}, + {file = "psycopg2-2.9.7-cp38-cp38-win_amd64.whl", hash = "sha256:8275abf628c6dc7ec834ea63f6f3846bf33518907a2b9b693d41fd063767a866"}, + {file = "psycopg2-2.9.7-cp39-cp39-win32.whl", hash = "sha256:c7949770cafbd2f12cecc97dea410c514368908a103acf519f2a346134caa4d5"}, + {file = "psycopg2-2.9.7-cp39-cp39-win_amd64.whl", hash = "sha256:b6bd7d9d3a7a63faae6edf365f0ed0e9b0a1aaf1da3ca146e6b043fb3eb5d723"}, + {file = "psycopg2-2.9.7.tar.gz", hash = "sha256:f00cc35bd7119f1fed17b85bd1007855194dde2cbd8de01ab8ebb17487440ad8"}, +] + [[package]] name = "ptyprocess" version = "0.7.0" @@ -3602,6 +3689,95 @@ Sphinx = ">=5" lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] +[[package]] +name = "sqlalchemy" +version = "1.4.49" +description = "Database Abstraction Library" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.49-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e126cf98b7fd38f1e33c64484406b78e937b1a280e078ef558b95bf5b6895f6"}, + {file = "SQLAlchemy-1.4.49-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:03db81b89fe7ef3857b4a00b63dedd632d6183d4ea5a31c5d8a92e000a41fc71"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:95b9df9afd680b7a3b13b38adf6e3a38995da5e162cc7524ef08e3be4e5ed3e1"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a63e43bf3f668c11bb0444ce6e809c1227b8f067ca1068898f3008a273f52b09"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f835c050ebaa4e48b18403bed2c0fda986525896efd76c245bdd4db995e51a4c"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c21b172dfb22e0db303ff6419451f0cac891d2e911bb9fbf8003d717f1bcf91"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win32.whl", hash = "sha256:5fb1ebdfc8373b5a291485757bd6431de8d7ed42c27439f543c81f6c8febd729"}, + {file = "SQLAlchemy-1.4.49-cp310-cp310-win_amd64.whl", hash = "sha256:f8a65990c9c490f4651b5c02abccc9f113a7f56fa482031ac8cb88b70bc8ccaa"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8923dfdf24d5aa8a3adb59723f54118dd4fe62cf59ed0d0d65d940579c1170a4"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9ab2c507a7a439f13ca4499db6d3f50423d1d65dc9b5ed897e70941d9e135b0"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5debe7d49b8acf1f3035317e63d9ec8d5e4d904c6e75a2a9246a119f5f2fdf3d"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win32.whl", hash = "sha256:82b08e82da3756765c2e75f327b9bf6b0f043c9c3925fb95fb51e1567fa4ee87"}, + {file = "SQLAlchemy-1.4.49-cp311-cp311-win_amd64.whl", hash = "sha256:171e04eeb5d1c0d96a544caf982621a1711d078dbc5c96f11d6469169bd003f1"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:36e58f8c4fe43984384e3fbe6341ac99b6b4e083de2fe838f0fdb91cebe9e9cb"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b31e67ff419013f99ad6f8fc73ee19ea31585e1e9fe773744c0f3ce58c039c30"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c14b29d9e1529f99efd550cd04dbb6db6ba5d690abb96d52de2bff4ed518bc95"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c40f3470e084d31247aea228aa1c39bbc0904c2b9ccbf5d3cfa2ea2dac06f26d"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win32.whl", hash = "sha256:706bfa02157b97c136547c406f263e4c6274a7b061b3eb9742915dd774bbc264"}, + {file = "SQLAlchemy-1.4.49-cp36-cp36m-win_amd64.whl", hash = "sha256:a7f7b5c07ae5c0cfd24c2db86071fb2a3d947da7bd487e359cc91e67ac1c6d2e"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:4afbbf5ef41ac18e02c8dc1f86c04b22b7a2125f2a030e25bbb4aff31abb224b"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24e300c0c2147484a002b175f4e1361f102e82c345bf263242f0449672a4bccf"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:201de072b818f8ad55c80d18d1a788729cccf9be6d9dc3b9d8613b053cd4836d"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653ed6817c710d0c95558232aba799307d14ae084cc9b1f4c389157ec50df5c"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win32.whl", hash = "sha256:647e0b309cb4512b1f1b78471fdaf72921b6fa6e750b9f891e09c6e2f0e5326f"}, + {file = "SQLAlchemy-1.4.49-cp37-cp37m-win_amd64.whl", hash = "sha256:ab73ed1a05ff539afc4a7f8cf371764cdf79768ecb7d2ec691e3ff89abbc541e"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:37ce517c011560d68f1ffb28af65d7e06f873f191eb3a73af5671e9c3fada08a"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1878ce508edea4a879015ab5215546c444233881301e97ca16fe251e89f1c55"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e8e608983e6f85d0852ca61f97e521b62e67969e6e640fe6c6b575d4db68557"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccf956da45290df6e809ea12c54c02ace7f8ff4d765d6d3dfb3655ee876ce58d"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win32.whl", hash = "sha256:f167c8175ab908ce48bd6550679cc6ea20ae169379e73c7720a28f89e53aa532"}, + {file = "SQLAlchemy-1.4.49-cp38-cp38-win_amd64.whl", hash = "sha256:45806315aae81a0c202752558f0df52b42d11dd7ba0097bf71e253b4215f34f4"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:b6d0c4b15d65087738a6e22e0ff461b407533ff65a73b818089efc8eb2b3e1de"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a843e34abfd4c797018fd8d00ffffa99fd5184c421f190b6ca99def4087689bd"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1c890421651b45a681181301b3497e4d57c0d01dc001e10438a40e9a9c25ee77"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d26f280b8f0a8f497bc10573849ad6dc62e671d2468826e5c748d04ed9e670d5"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win32.whl", hash = "sha256:ec2268de67f73b43320383947e74700e95c6770d0c68c4e615e9897e46296294"}, + {file = "SQLAlchemy-1.4.49-cp39-cp39-win_amd64.whl", hash = "sha256:bbdf16372859b8ed3f4d05f925a984771cd2abd18bd187042f24be4886c2a15f"}, + {file = "SQLAlchemy-1.4.49.tar.gz", hash = "sha256:06ff25cbae30c396c4b7737464f2a7fc37a67b7da409993b182b024cec80aed9"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and platform_machine == \"aarch64\" or python_version >= \"3\" and platform_machine == \"ppc64le\" or python_version >= \"3\" and platform_machine == \"x86_64\" or python_version >= \"3\" and platform_machine == \"amd64\" or python_version >= \"3\" and platform_machine == \"AMD64\" or python_version >= \"3\" and platform_machine == \"win32\" or python_version >= \"3\" and platform_machine == \"WIN32\""} +mypy = {version = ">=0.910", optional = true, markers = "python_version >= \"3\" and extra == \"mypy\""} +sqlalchemy2-stubs = {version = "*", optional = true, markers = "extra == \"mypy\""} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "sqlalchemy2-stubs" +version = "0.0.2a35" +description = "Typing Stubs for SQLAlchemy 1.4" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "sqlalchemy2-stubs-0.0.2a35.tar.gz", hash = "sha256:bd5d530697d7e8c8504c7fe792ef334538392a5fb7aa7e4f670bfacdd668a19d"}, + {file = "sqlalchemy2_stubs-0.0.2a35-py3-none-any.whl", hash = "sha256:593784ff9fc0dc2ded1895e3322591689db3be06f3ca006e3ef47640baf2d38a"}, +] + +[package.dependencies] +typing-extensions = ">=3.7.4" + [[package]] name = "stack-data" version = "0.6.2" @@ -3691,23 +3867,23 @@ files = [ [[package]] name = "tornado" -version = "6.3.2" +version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." category = "dev" optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, - {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, - {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, - {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, ] [[package]] @@ -3813,14 +3989,14 @@ types-urllib3 = "*" [[package]] name = "types-tqdm" -version = "4.66.0.0" +version = "4.66.0.1" description = "Typing stubs for tqdm" category = "main" optional = false python-versions = "*" files = [ - {file = "types-tqdm-4.66.0.0.tar.gz", hash = "sha256:7a981f281f911cb2f4780ba67e3dd7f15d36f32996a16a56e2834a6f734b7db9"}, - {file = "types_tqdm-4.66.0.0-py3-none-any.whl", hash = "sha256:be1c0ee809e915fa62af1981923a4ec9b8ccdae6d0e332399bf06bd6c5843d70"}, + {file = "types-tqdm-4.66.0.1.tar.gz", hash = "sha256:6457c90f03cc5a0fe8dd11839c8cbf5572bf542b438b1af74233801728b5dfbc"}, + {file = "types_tqdm-4.66.0.1-py3-none-any.whl", hash = "sha256:6a1516788cbb33d725803439b79c25bfed7e8176b8d782020b5c24aedac1649b"}, ] [[package]] @@ -3839,7 +4015,7 @@ files = [ name = "typing-extensions" version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3897,14 +4073,14 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.24.2" +version = "20.24.3" description = "Virtual Python Environment builder" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.2-py3-none-any.whl", hash = "sha256:43a3052be36080548bdee0b42919c88072037d50d56c28bd3f853cbe92b953ff"}, - {file = "virtualenv-20.24.2.tar.gz", hash = "sha256:fd8a78f46f6b99a67b7ec5cf73f92357891a7b3a40fd97637c27f854aae3b9e0"}, + {file = "virtualenv-20.24.3-py3-none-any.whl", hash = "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02"}, + {file = "virtualenv-20.24.3.tar.gz", hash = "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc"}, ] [package.dependencies] @@ -4018,4 +4194,4 @@ h11 = ">=0.9.0,<1" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "add32c0b7fe84b41480551fa68c5dda8508932b6804c77c4dbc66105119fe11b" +content-hash = "2bf454cf5cecdd6b9416b08155de8304cf2b5bdd87f449fc78e8990302707f25" diff --git a/pyproject.toml b/pyproject.toml index 6068874..a04c82d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,9 @@ requires = ["poetry-core"] [tookl.mypy] disallow_untyped_defs = true +exclude = ".ipynb_checkpoints, .mypy_cache, .mytest_cache, build" follow_imports = "silent" +plugins = ["sqlalchemy.ext.mypy.plugin"] python_version = "3.11" warn_redudant_casts = true warn_unused_ignores = true @@ -27,9 +29,11 @@ readme = "README.md" version = "0.1.0" [tool.poetry.dependencies] +SQLAlchemy = {version = "^1.4.46", extras = ["mypy"]} loguru = "^0.7.0" matplotlib = "^3.7.1" plotly = "^5.14.1" +psycopg2 = "^2.9.7" pymongo = "^4.4.1" python = "^3.11" seaborn = "^0.12.2" diff --git a/src/aki_prj23_transparenzregister/config/__init__.py b/src/aki_prj23_transparenzregister/config/__init__.py new file mode 100644 index 0000000..2730631 --- /dev/null +++ b/src/aki_prj23_transparenzregister/config/__init__.py @@ -0,0 +1 @@ +"""App configuration.""" diff --git a/src/aki_prj23_transparenzregister/config/config_providers.py b/src/aki_prj23_transparenzregister/config/config_providers.py new file mode 100644 index 0000000..c6c4483 --- /dev/null +++ b/src/aki_prj23_transparenzregister/config/config_providers.py @@ -0,0 +1,91 @@ +"""Wrappers for config providers.""" + +import abc +import json +import os + +from aki_prj23_transparenzregister.config.config_template import PostgreConnectionString +from aki_prj23_transparenzregister.utils.mongo.connector import MongoConnection + + +class ConfigProvider(metaclass=abc.ABCMeta): + """Generic abstract class for a wrapper providing the config options for PostgreSQL and MongoDB.""" + + @abc.abstractmethod + def get_postgre_connection_string(self) -> PostgreConnectionString: + """Get PostgreSQL connection string. + + Raises: + NotImplementedError: To be defined by child classes + + Returns: + PostgreConnectionString: Connection details + """ + raise NotImplementedError + + @abc.abstractmethod + def get_mongo_connection_string(self) -> MongoConnection: + """Get MongoDB connection string. + + Raises: + NotImplementedError: To be defined by child classes + + Returns: + MongoConnection: Connection details + """ + raise NotImplementedError + + +class JsonFileConfigProvider(ConfigProvider): + """Config provider based on .json file.""" + + __data__: dict = {} + + def __init__(self, file_path: str): + """Constructor reading it's data from given .json file. + + Args: + file_path (str): PATH to .json file containing config + + Raises: + FileNotFoundError: File does not exist + TypeError: File could not be read or is malformed + """ + if not os.path.isfile(file_path): + raise FileNotFoundError + with open(file_path) as file: + try: + data = json.loads(file.read()) + self.__data__ = data + except Exception as error: + raise TypeError("File content is not a valid JSON object") from error + + def get_postgre_connection_string(self) -> PostgreConnectionString: + """Read PostgreSQL connection string from .json file added in constructor. + + Returns: + PostgreConnectionString: Connection details + """ + details = self.__data__["postgres"] + return PostgreConnectionString( + details["username"], + details["password"], + details["host"], + details["database"], + details["port"], + ) + + def get_mongo_connection_string(self) -> MongoConnection: + """Read MongodB connection string from .json file added in constructor. + + Returns: + MongoConnection: Connection details + """ + details = self.__data__["mongo"] + return MongoConnection( + details["host"], + details["database"], + details["port"], + details["username"], + details["password"], + ) diff --git a/src/aki_prj23_transparenzregister/config/config_template.py b/src/aki_prj23_transparenzregister/config/config_template.py new file mode 100644 index 0000000..5884729 --- /dev/null +++ b/src/aki_prj23_transparenzregister/config/config_template.py @@ -0,0 +1,13 @@ +"""Config interface templates.""" +from dataclasses import dataclass + + +@dataclass +class PostgreConnectionString: + """PostgreSQL Connection String args wrapper.""" + + username: str + password: str | None + host: str + database: str + port: int | None diff --git a/src/aki_prj23_transparenzregister/models/news.py b/src/aki_prj23_transparenzregister/models/news.py index 778390f..01cd04c 100644 --- a/src/aki_prj23_transparenzregister/models/news.py +++ b/src/aki_prj23_transparenzregister/models/news.py @@ -4,11 +4,7 @@ from dataclasses import asdict, dataclass @dataclass class News: - """_summary_. - - Returns: - _type_: _description_ - """ + """News data model.""" id: str title: str @@ -17,9 +13,9 @@ class News: source_url: str def to_dict(self) -> dict: - """_summary_. + """Transform dataclass to dict. Returns: - dict: _description_ + dict: Transformed object """ return asdict(self) diff --git a/src/aki_prj23_transparenzregister/utils/enumy_types.py b/src/aki_prj23_transparenzregister/utils/enumy_types.py new file mode 100644 index 0000000..e8edbf0 --- /dev/null +++ b/src/aki_prj23_transparenzregister/utils/enumy_types.py @@ -0,0 +1,31 @@ +"""Collection of enumeration types for the whole project.""" +import enum + + +class RelationTypeEnum(enum.Enum): + """RelationTypeEnum.""" + + executive = "Executive" + auditor = "Auditor" + supervisory_board = "Supervisory_Board" + managing_director = "Managing_Directory" + authorized_representative = "Authorized_Representative" + final_auditor = "Final_Auditor" + + +class SentimentTypeEnum(enum.Enum): + """SentimentTypeEnum.""" + + employee_voting = "employee_voting" + sustainability = "sustainability" + environmental_aspects = "environmental_aspects" + perception = "perception" + + +class RelationTypeCompanyEnum(enum.Enum): + """RelationTypeCompanyEnum.""" + + participates_with = "participates_with" + has_shares_of = "has_shares_of" + is_supplied_by = "is_supplied_by" + works_with = "works_with" diff --git a/src/aki_prj23_transparenzregister/utils/mongo/__init__.py b/src/aki_prj23_transparenzregister/utils/mongo/__init__.py new file mode 100644 index 0000000..2249866 --- /dev/null +++ b/src/aki_prj23_transparenzregister/utils/mongo/__init__.py @@ -0,0 +1 @@ +"""MongoDB related modules.""" diff --git a/src/aki_prj23_transparenzregister/utils/company_mongo_service.py b/src/aki_prj23_transparenzregister/utils/mongo/company_mongo_service.py similarity index 90% rename from src/aki_prj23_transparenzregister/utils/company_mongo_service.py rename to src/aki_prj23_transparenzregister/utils/mongo/company_mongo_service.py index 8b89c54..fc6ca8c 100644 --- a/src/aki_prj23_transparenzregister/utils/company_mongo_service.py +++ b/src/aki_prj23_transparenzregister/utils/mongo/company_mongo_service.py @@ -1,6 +1,6 @@ """CompanyMongoService.""" from aki_prj23_transparenzregister.models.company import Company, CompanyID -from aki_prj23_transparenzregister.utils.mongo import MongoConnector +from aki_prj23_transparenzregister.utils.mongo.connector import MongoConnector class CompanyMongoService: diff --git a/src/aki_prj23_transparenzregister/utils/mongo.py b/src/aki_prj23_transparenzregister/utils/mongo/connector.py similarity index 96% rename from src/aki_prj23_transparenzregister/utils/mongo.py rename to src/aki_prj23_transparenzregister/utils/mongo/connector.py index ab5e1e8..0a84806 100644 --- a/src/aki_prj23_transparenzregister/utils/mongo.py +++ b/src/aki_prj23_transparenzregister/utils/mongo/connector.py @@ -1,47 +1,47 @@ -"""Mongo Wrapper.""" -from dataclasses import dataclass - -import pymongo - - -@dataclass -class MongoConnection: - """_summary_.""" - - hostname: str - database: str - port: int | None - username: str | None - password: str | None - - def get_conn_string(self) -> str: - """Transforms the information of the object to a MongoDB connection string. - - Returns: - str: Connection string - """ - if self.username is not None and self.password is not None: - connection_string = ( - f"mongodb+srv://{self.username}:{self.password}@{self.hostname}" - ) - else: - connection_string = f"mongodb+srv://{self.hostname}" - if self.port is not None: - connection_string += f":{self.port}" - connection_string = connection_string.replace("mongodb+srv", "mongodb") - return connection_string - - -class MongoConnector: - """Wrapper for establishing a connection to a MongoDB instance.""" - - def __init__(self, connection: MongoConnection): - """_summary_. - - Args: - connection (MongoConnection): Wrapper for connection string - """ - self.client: pymongo.MongoClient = pymongo.MongoClient( - connection.get_conn_string() - ) - self.database = self.client[connection.database] +"""Mongo Wrapper.""" +from dataclasses import dataclass + +import pymongo + + +@dataclass +class MongoConnection: + """_summary_.""" + + hostname: str + database: str + port: int | None + username: str | None + password: str | None + + def get_conn_string(self) -> str: + """Transforms the information of the object to a MongoDB connection string. + + Returns: + str: Connection string + """ + if self.username is not None and self.password is not None: + connection_string = ( + f"mongodb+srv://{self.username}:{self.password}@{self.hostname}" + ) + else: + connection_string = f"mongodb+srv://{self.hostname}" + if self.port is not None: + connection_string += f":{self.port}" + connection_string = connection_string.replace("mongodb+srv", "mongodb") + return connection_string + + +class MongoConnector: + """Wrapper for establishing a connection to a MongoDB instance.""" + + def __init__(self, connection: MongoConnection): + """_summary_. + + Args: + connection (MongoConnection): Wrapper for connection string + """ + self.client: pymongo.MongoClient = pymongo.MongoClient( + connection.get_conn_string() + ) + self.database = self.client[connection.database] diff --git a/src/aki_prj23_transparenzregister/utils/news_mongo_service.py b/src/aki_prj23_transparenzregister/utils/mongo/news_mongo_service.py similarity index 96% rename from src/aki_prj23_transparenzregister/utils/news_mongo_service.py rename to src/aki_prj23_transparenzregister/utils/mongo/news_mongo_service.py index a2ea4ec..5ce25f4 100644 --- a/src/aki_prj23_transparenzregister/utils/news_mongo_service.py +++ b/src/aki_prj23_transparenzregister/utils/mongo/news_mongo_service.py @@ -1,6 +1,6 @@ """MongoNewsService.""" from aki_prj23_transparenzregister.models.news import News -from aki_prj23_transparenzregister.utils.mongo import MongoConnector +from aki_prj23_transparenzregister.utils.mongo.connector import MongoConnector class MongoNewsService: diff --git a/src/aki_prj23_transparenzregister/utils/postgres/__init__.py b/src/aki_prj23_transparenzregister/utils/postgres/__init__.py new file mode 100644 index 0000000..6a09042 --- /dev/null +++ b/src/aki_prj23_transparenzregister/utils/postgres/__init__.py @@ -0,0 +1 @@ +"""PostgreSQL related modules.""" diff --git a/src/aki_prj23_transparenzregister/utils/postgres/connector.py b/src/aki_prj23_transparenzregister/utils/postgres/connector.py new file mode 100644 index 0000000..487a529 --- /dev/null +++ b/src/aki_prj23_transparenzregister/utils/postgres/connector.py @@ -0,0 +1,40 @@ +"""Module containing connection utils for PostgreSQL DB.""" +from sqlalchemy import create_engine +from sqlalchemy.engine import URL +from sqlalchemy.orm import declarative_base + +from aki_prj23_transparenzregister.config.config_providers import JsonFileConfigProvider +from aki_prj23_transparenzregister.config.config_template import PostgreConnectionString + + +def get_engine(conn_args: PostgreConnectionString): + """Creates an engine connected to a Postgre instance. + + Returns: + sqlalchemy.engine: connection engine + """ + url = URL.create( + drivername="postgresql", + username=conn_args.username, + password=conn_args.password, + host=conn_args.host, + database=conn_args.database, + port=conn_args.port, + ) + + return create_engine(url) + + +def init_db(): + """Initialize DB with all defined entities.""" + config_provider = JsonFileConfigProvider("./secrets.json") + engine = get_engine(config_provider.get_postgre_connection_string()) + with engine.connect(): + base = declarative_base() + + base.metadata.create_all(engine) + + +if __name__ == "__main__": + """Main flow creating tables""" + init_db() diff --git a/src/aki_prj23_transparenzregister/utils/postgres/entities.py b/src/aki_prj23_transparenzregister/utils/postgres/entities.py new file mode 100644 index 0000000..d3791eb --- /dev/null +++ b/src/aki_prj23_transparenzregister/utils/postgres/entities.py @@ -0,0 +1,137 @@ +"""ORM entities for Prod. DB.""" +from datetime import datetime + +import sqlalchemy as sa +from sqlalchemy.orm import ( + declarative_base, +) + +from aki_prj23_transparenzregister.utils.enumy_types import ( + RelationTypeCompanyEnum, + RelationTypeEnum, + SentimentTypeEnum, +) + +# # create an object *district_court* which inherits attributes from Base-class +Base = declarative_base() + + +class DistrictCourt(Base): # type: ignore + """DistrictCourt.""" + + __tablename__ = "district_court" + + id = sa.Column(sa.Integer, primary_key=True) + city = sa.Column(sa.String(100), nullable=False) + name = sa.Column(sa.String(100), nullable=False) + + +class Company(Base): # type: ignore + """Company.""" + + __tablename__ = "company" + + hr = sa.Column(sa.Integer, nullable=False, primary_key=True) + court_id = sa.Column( + sa.Integer, sa.ForeignKey("district_court.id"), nullable=False, primary_key=True + ) + name = sa.Column(sa.String(100), nullable=False) + street = sa.Column(sa.String(100), nullable=False) + zip_code = sa.Column(sa.String(5), nullable=False) + city = sa.Column(sa.String(100), nullable=False) + sector = sa.Column(sa.String(100), nullable=False) + + __table_args__ = ( + sa.PrimaryKeyConstraint("hr", "court_id", name="pk_company_hr_court"), + ) + + +class Finance(Base): # type: ignore + """Finance.""" + + __tablename__ = "finance" + + id = sa.Column(sa.Integer, primary_key=True) + company_hr = sa.Column(sa.Integer, sa.ForeignKey(Company.hr)) + company_court = sa.Column(sa.Integer, sa.ForeignKey(Company.court_id)) + date = sa.Column(sa.DateTime(timezone=True), default=datetime.now) + total_volume = sa.Column(sa.Float) + ebit = sa.Column(sa.Float) + ebitda = sa.Column(sa.Float) + ebit_margin = sa.Column(sa.Float) + total_balance = sa.Column(sa.Float) + equity = sa.Column(sa.Float) + debt = sa.Column(sa.Float) + return_on_equity = sa.Column(sa.Float) + capital_turnover_rate = sa.Column(sa.Float) + + # company: Mapped[Company] = relationship(Company) + + +class Sentiment(Base): # type: ignore + """Sentiment.""" + + # noinspection SpellCheckingInspection + __tablename__ = "sentiment" + + id = sa.Column(sa.Integer, primary_key=True) + company_hr = sa.Column(sa.Integer, sa.ForeignKey(Company.hr)) + company_court = sa.Column(sa.Integer, sa.ForeignKey(Company.court_id)) + date = sa.Column(sa.DateTime(timezone=True), default=datetime.now) + sentiment_type = sa.Column( + sa.Enum(SentimentTypeEnum), + nullable=False, + ) + value = sa.Column(sa.Float(), nullable=False) + source = sa.Column(sa.String(100)) + + # sentiment = relationship(Company) + + +# create person object +class Person(Base): # type: ignore + """Person.""" + + __tablename__ = "person" + + id = sa.Column(sa.Integer, primary_key=True) + name = sa.Column(sa.String(100), nullable=False) + surname = sa.Column(sa.String(100), nullable=False) + works_for = sa.Column(sa.String(100)) + + +# create own relation type and person_relation object +class PersonRelation(Base): # type: ignore + """PersonRelation.""" + + __tablename__ = "person_relation" + + id = sa.Column(sa.Integer, primary_key=True) + company_hr = sa.Column(sa.Integer, sa.ForeignKey(Company.hr)) + company_court = sa.Column(sa.Integer, sa.ForeignKey(Company.court_id)) + person_id = sa.Column(sa.Integer, sa.ForeignKey(Person.id)) + date_from = sa.Column(sa.DateTime(timezone=True), default=datetime.now) + date_to = sa.Column(sa.DateTime(timezone=True), default=datetime.now) + relation = sa.Column(sa.Enum(RelationTypeEnum), nullable=False) + + # company = relationship("Company") + # person = relationship("Person", foreign_keys=[person_id]) + # company = relationship('Company', foreign_keys=[company_hr,company_court]) + + +# create own relation type and company_relation object +class CompanyRelation(Base): # type: ignore + """CompanyRelation.""" + + __tablename__ = "company_relation" + + id = sa.Column(sa.Integer, primary_key=True) + company1_id = sa.Column(sa.Integer, nullable=False) + company2_id = sa.Column(sa.Integer, nullable=False) + date_from = sa.Column(sa.DateTime(timezone=True), default=datetime.now) + date_to = sa.Column(sa.DateTime(timezone=True), default=datetime.now) + relation = sa.Column(sa.Enum(RelationTypeCompanyEnum), nullable=False) + + # company = relationship("Company") + + __table_args__ = {"extend_existing": True} diff --git a/tests/config/__init__.py b/tests/config/__init__.py new file mode 100644 index 0000000..6275ce4 --- /dev/null +++ b/tests/config/__init__.py @@ -0,0 +1 @@ +"""Tests for config module.""" diff --git a/tests/config/config_providers_test.py b/tests/config/config_providers_test.py new file mode 100644 index 0000000..36af60c --- /dev/null +++ b/tests/config/config_providers_test.py @@ -0,0 +1,74 @@ +import json +from unittest.mock import mock_open, patch + +import pytest + +from aki_prj23_transparenzregister.config.config_providers import JsonFileConfigProvider + + +def test_json_provider_init_fail(): + with pytest.raises(FileNotFoundError): + JsonFileConfigProvider("file-that-does-not-exist") + + +def test_json_provider_init_no_json(): + with patch("os.path.isfile") as mock_isfile, patch( + "builtins.open", mock_open(read_data="fhdaofhdoas") + ): + mock_isfile.return_value = True + with pytest.raises(TypeError): + JsonFileConfigProvider("non-json-file") + + +def test_json_provider_init(): + data = {"hello": "world"} + input_data = json.dumps(data) + with patch("os.path.isfile") as mock_isfile: + mock_isfile.return_value = True + with patch("builtins.open", mock_open(read_data=input_data)): + provider = JsonFileConfigProvider("someWhere") + assert provider.__data__ == data + + +def test_json_provider_get_postgre(): + data = { + "postgres": { + "username": "user", + "password": "pass", + "host": "locahost", + "database": "postgres", + "port": 420, + } + } + input_data = json.dumps(data) + with patch("os.path.isfile") as mock_isfile: + mock_isfile.return_value = True + with patch("builtins.open", mock_open(read_data=input_data)): + config = JsonFileConfigProvider("someWhere").get_postgre_connection_string() + assert config.username == data["postgres"]["username"] + assert config.password == data["postgres"]["password"] + assert config.host == data["postgres"]["host"] + assert config.database == data["postgres"]["database"] + assert config.port == data["postgres"]["port"] + + +def test_json_provider_get_mongo(): + data = { + "mongo": { + "username": "user", + "password": "pass", + "host": "locahost", + "database": "postgres", + "port": 420, + } + } + input_data = json.dumps(data) + with patch("os.path.isfile") as mock_isfile: + mock_isfile.return_value = True + with patch("builtins.open", mock_open(read_data=input_data)): + config = JsonFileConfigProvider("someWhere").get_mongo_connection_string() + assert config.username == data["mongo"]["username"] + assert config.password == data["mongo"]["password"] + assert config.hostname == data["mongo"]["host"] + assert config.database == data["mongo"]["database"] + assert config.port == data["mongo"]["port"] diff --git a/tests/utils/mongo/__init__.py b/tests/utils/mongo/__init__.py new file mode 100644 index 0000000..cf97370 --- /dev/null +++ b/tests/utils/mongo/__init__.py @@ -0,0 +1 @@ +"""Mongo utils module.""" diff --git a/tests/utils/company_mongo_service_test.py b/tests/utils/mongo/company_mongo_service_test.py similarity index 94% rename from tests/utils/company_mongo_service_test.py rename to tests/utils/mongo/company_mongo_service_test.py index 2f13d57..2c46ca3 100644 --- a/tests/utils/company_mongo_service_test.py +++ b/tests/utils/mongo/company_mongo_service_test.py @@ -4,7 +4,7 @@ from unittest.mock import Mock import pytest from aki_prj23_transparenzregister.models.company import Company -from aki_prj23_transparenzregister.utils.company_mongo_service import ( +from aki_prj23_transparenzregister.utils.mongo.company_mongo_service import ( CompanyMongoService, ) @@ -21,7 +21,8 @@ def mock_mongo_connector(mocker) -> Mock: """ mock = Mock() mocker.patch( - "aki_prj23_transparenzregister.utils.mongo.MongoConnector", return_value=mock + "aki_prj23_transparenzregister.utils.mongo.connector.MongoConnector", + return_value=mock, ) return mock diff --git a/tests/utils/mongo_test.py b/tests/utils/mongo/mongo_test.py similarity index 88% rename from tests/utils/mongo_test.py rename to tests/utils/mongo/mongo_test.py index f52a192..3bf1f5f 100644 --- a/tests/utils/mongo_test.py +++ b/tests/utils/mongo/mongo_test.py @@ -1,6 +1,9 @@ from unittest.mock import patch -from aki_prj23_transparenzregister.utils.mongo import MongoConnection, MongoConnector +from aki_prj23_transparenzregister.utils.mongo.connector import ( + MongoConnection, + MongoConnector, +) def test_get_conn_string_no_credentials(): diff --git a/tests/utils/news_mongo_service_test.py b/tests/utils/mongo/news_mongo_service_test.py similarity index 87% rename from tests/utils/news_mongo_service_test.py rename to tests/utils/mongo/news_mongo_service_test.py index 0d337d6..e7b222f 100644 --- a/tests/utils/news_mongo_service_test.py +++ b/tests/utils/mongo/news_mongo_service_test.py @@ -3,7 +3,7 @@ from unittest.mock import Mock, patch import pytest from aki_prj23_transparenzregister.models.news import News -from aki_prj23_transparenzregister.utils.news_mongo_service import ( +from aki_prj23_transparenzregister.utils.mongo.news_mongo_service import ( MongoEntryTransformer, MongoNewsService, ) @@ -21,7 +21,8 @@ def mock_mongo_connector(mocker) -> Mock: """ mock = Mock() mocker.patch( - "aki_prj23_transparenzregister.utils.mongo.MongoConnector", return_value=mock + "aki_prj23_transparenzregister.utils.mongo.connector.MongoConnector", + return_value=mock, ) return mock @@ -61,7 +62,7 @@ def test_get_by_id_with_result(mock_mongo_connector, mock_collection): service = MongoNewsService(mock_mongo_connector) with patch( - "aki_prj23_transparenzregister.utils.news_mongo_service.MongoEntryTransformer.transform_outgoing" + "aki_prj23_transparenzregister.utils.mongo.news_mongo_service.MongoEntryTransformer.transform_outgoing" ) as mock_out: mock_collection.find.return_value = [{}] mock_out.return_value = {} @@ -81,7 +82,7 @@ def test_insert(mock_mongo_connector, mock_collection): service = MongoNewsService(mock_mongo_connector) with patch( - "aki_prj23_transparenzregister.utils.news_mongo_service.MongoEntryTransformer.transform_ingoing" + "aki_prj23_transparenzregister.utils.mongo.news_mongo_service.MongoEntryTransformer.transform_ingoing" ) as mock_in: mock_collection.insert_one.return_value = {} mock_in.return_value = {} diff --git a/tests/utils/postgres/__init__.py b/tests/utils/postgres/__init__.py new file mode 100644 index 0000000..a4ce3a4 --- /dev/null +++ b/tests/utils/postgres/__init__.py @@ -0,0 +1 @@ +"""Tests for utils.postgres module.""" diff --git a/tests/utils/postgres/connector_test.py b/tests/utils/postgres/connector_test.py new file mode 100644 index 0000000..f8d8218 --- /dev/null +++ b/tests/utils/postgres/connector_test.py @@ -0,0 +1,36 @@ +from unittest.mock import Mock, patch + +from aki_prj23_transparenzregister.config.config_template import PostgreConnectionString +from aki_prj23_transparenzregister.utils.postgres.connector import get_engine, init_db + + +def test_get_engine(): + conn_args = PostgreConnectionString("", "", "", "", 42) + with patch( + "aki_prj23_transparenzregister.utils.postgres.connector.create_engine" + ) as mock_create_engine: + result = "someThing" + mock_create_engine.return_value = result + assert get_engine(conn_args) == result + + +def test_init_db(): + with patch( + "aki_prj23_transparenzregister.utils.postgres.connector.get_engine" + ) as mock_get_engine, patch( + "aki_prj23_transparenzregister.utils.postgres.connector.declarative_base" + ) as mock_declarative_base, patch( + "aki_prj23_transparenzregister.utils.postgres.connector.JsonFileConfigProvider" + ) as mock_provider: + mock_get_engine.connect.return_value = {} + + mock_value = Mock() + mock_value.metadata.create_all.return_value = None + mock_declarative_base.return_value = mock_value + + mock_value = Mock() + mock_provider.return_value = mock_value + mock_value.get_postgre_connection_string.return_value = "" + + init_db() + assert True diff --git a/tests/utils/postgres/entities_test.py b/tests/utils/postgres/entities_test.py new file mode 100644 index 0000000..bc2817a --- /dev/null +++ b/tests/utils/postgres/entities_test.py @@ -0,0 +1,4 @@ +def test_import(): + from aki_prj23_transparenzregister.utils.postgres import entities + + assert entities is not None