From 46672a13db413d465f0fda2793d05001962c0cb2 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Tue, 16 Apr 2024 02:21:24 -0400 Subject: [PATCH 01/18] Linting --- scripts/create_table.py | 24 +++--------------------- scripts/flush_db.py | 4 ++-- scripts/settings/config.py | 1 + setup.cfg | 28 ++++++++++++++++++++++++++++ src/auth.py | 5 ++--- src/main.py | 1 + src/models.py | 2 +- src/redis.py | 5 ++--- tests/test_load.py | 4 +++- tests/test_token.py | 1 + 10 files changed, 44 insertions(+), 31 deletions(-) create mode 100644 setup.cfg diff --git a/scripts/create_table.py b/scripts/create_table.py index 6a82a55..0501804 100644 --- a/scripts/create_table.py +++ b/scripts/create_table.py @@ -1,27 +1,9 @@ import asyncio -from typing import Any from settings.config import DATABASE_URL -from sqlalchemy import ( - Boolean, - Column, - CursorResult, - DateTime, - ForeignKey, - Identity, - Insert, - Integer, - LargeBinary, - MetaData, - Select, - String, - Table, - Update, - func, -) -from sqlalchemy.dialects.postgresql import UUID -from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine -from sqlalchemy.orm import sessionmaker +from sqlalchemy import Column, DateTime, Identity, Integer, MetaData, String, Table +from sqlalchemy.ext.asyncio import create_async_engine + engine = create_async_engine(str(DATABASE_URL)) diff --git a/scripts/flush_db.py b/scripts/flush_db.py index 392684c..ccc3c92 100644 --- a/scripts/flush_db.py +++ b/scripts/flush_db.py @@ -3,10 +3,10 @@ from datetime import datetime import asyncpg -from redis.asyncio import Redis - from settings.config import DB_SETTINGS, REDIS_BATCH_SIZE, REDIS_URL +from redis.asyncio import Redis + async def batch_insert(events): # TODO: Ensure number of events does not exceed SQL max statement tokens diff --git a/scripts/settings/config.py b/scripts/settings/config.py index 5189a33..92be8bc 100644 --- a/scripts/settings/config.py +++ b/scripts/settings/config.py @@ -1,5 +1,6 @@ import os + REDIS_URL = os.getenv("REDIS_URL") REDIS_BATCH_SIZE = 1000 diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..278639e --- /dev/null +++ b/setup.cfg @@ -0,0 +1,28 @@ +[flake8] +max-line-length = 100 +exclude = .venv, migrations +inline-quotes = double +ignore = E203, W503 + +[isort] +default_section = THIRDPARTY +known_first_party = pennmobile, dining, gsr_booking, user, laundry +line_length = 100 +lines_after_imports = 2 +multi_line_output = 3 +include_trailing_comma = True +use_parentheses = True + +[coverage:run] +omit = */tests/*, */migrations/*, */settings/*, */wsgi.py, */apps.py, */.venv/*, manage.py +source = . + +[uwsgi] +http-socket = :80 +chdir = /app/ +module = pennmobile.wsgi:application +master = true +static-map = /assets=/app/static +processes = 5 +threads = 2 +enable-threads = true diff --git a/src/auth.py b/src/auth.py index 8cf647c..3e0f990 100644 --- a/src/auth.py +++ b/src/auth.py @@ -4,6 +4,7 @@ from src.config import settings + # The URL to the JWKS endpoint JWKS_URL = settings.JWKS_URL @@ -34,9 +35,7 @@ def get_token_from_header(request: Request): raise HTTPException(status_code=401, detail="Wrong authentication scheme") return token except ValueError: - raise HTTPException( - status_code=401, detail="Invalid authorization header format" - ) + raise HTTPException(status_code=401, detail="Invalid authorization header format") def verify_jwt(token: str = Depends(get_token_from_header)): diff --git a/src/main.py b/src/main.py index ae2baf6..5bfd612 100644 --- a/src/main.py +++ b/src/main.py @@ -4,6 +4,7 @@ from src.redis import set_redis_from_tx from src.schemas import AnalyticsTxn + app = FastAPI() diff --git a/src/models.py b/src/models.py index 6e5a673..45e65ac 100644 --- a/src/models.py +++ b/src/models.py @@ -2,7 +2,7 @@ from enum import Enum from fastapi.encoders import jsonable_encoder -from pydantic import BaseModel, ConfigDict, json +from pydantic import BaseModel, ConfigDict class CustomModel(BaseModel): diff --git a/src/redis.py b/src/redis.py index 7c28ed0..a64c413 100644 --- a/src/redis.py +++ b/src/redis.py @@ -5,12 +5,11 @@ from src.models import RedisEvent from src.schemas import AnalyticsTxn + redis_client: Redis = Redis.from_url(str(settings.REDIS_URL)) -async def set_redis_keys( - data: list[RedisEvent], *, is_transaction: bool = False -) -> None: +async def set_redis_keys(data: list[RedisEvent], *, is_transaction: bool = False) -> None: async with redis_client.pipeline(transaction=is_transaction) as pipe: for redis_data in data: await pipe.set(redis_data.key, redis_data.value) diff --git a/tests/test_load.py b/tests/test_load.py index d12adfb..6657ea9 100644 --- a/tests/test_load.py +++ b/tests/test_load.py @@ -7,6 +7,7 @@ import requests from test_token import get_tokens + # Runtime should be less that 3 seconds for most laptops BENCHMARK_TIME = 3 # seconds @@ -14,6 +15,7 @@ NUMBER_OF_REQUESTS = 1000 THREADS = 16 + def make_request(): access_token, _ = get_tokens() @@ -53,7 +55,7 @@ def make_request(): def run_threads(): with ThreadPoolExecutor(max_workers=THREADS) as executor: - futures = [executor.submit(make_request) for _ in range(NUMBER_OF_REQUESTS)] + _ = [executor.submit(make_request) for _ in range(NUMBER_OF_REQUESTS)] def test_load(): diff --git a/tests/test_token.py b/tests/test_token.py index 0df8592..02bc919 100644 --- a/tests/test_token.py +++ b/tests/test_token.py @@ -5,6 +5,7 @@ from src.auth import verify_jwt + ATTEST_URL = "https://platform.pennlabs.org/identity/attest/" # Using Penn Basics DLA Account for testing, will not work if you don't have that in .env From 395888dac252c302d4219de78683532ff905d538 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Tue, 16 Apr 2024 02:24:39 -0400 Subject: [PATCH 02/18] Add pre-commit --- .pre-commit-config.yaml | 11 ++++++ Pipfile | 1 + Pipfile.lock | 74 ++++++++++++++++++++++++++++++++++++++++- README.md | 5 +++ 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..8411217 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,11 @@ +repos: + - repo: https://github.com/pennlabs/pre-commit-hooks + rev: v1.0-labs-analytics + hooks: + - id: black + args: [-l100] + - id: isort + args: [] + - id: flake8 + args: [--config, backend/setup.cfg] + - id: detect-private-key \ No newline at end of file diff --git a/Pipfile b/Pipfile index ff8cfe2..a1664ee 100644 --- a/Pipfile +++ b/Pipfile @@ -19,6 +19,7 @@ passlib = "*" jwcrypto = "*" pytest-asyncio = "*" pytest = "*" +pre-commit = "*" [dev-packages] isort = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 11f5684..0610c88 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "e828331d67b07440de1e9556c016cda52b66eb62c0271dabddf48fbdfed4a560" + "sha256": "b580d43662b8847b5a1621676767a38cdd0659725c97107133c560b059eead87" }, "pipfile-spec": 6, "requires": { @@ -154,6 +154,14 @@ "markers": "platform_python_implementation != 'PyPy'", "version": "==1.16.0" }, + "cfgv": { + "hashes": [ + "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", + "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" + ], + "markers": "python_version >= '3.8'", + "version": "==3.4.0" + }, "charset-normalizer": { "hashes": [ "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", @@ -296,6 +304,13 @@ "markers": "python_version >= '3.7'", "version": "==42.0.5" }, + "distlib": { + "hashes": [ + "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", + "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" + ], + "version": "==0.3.8" + }, "exceptiongroup": { "hashes": [ "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", @@ -314,6 +329,14 @@ "markers": "python_version >= '3.8'", "version": "==0.110.1" }, + "filelock": { + "hashes": [ + "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f", + "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4" + ], + "markers": "python_version >= '3.8'", + "version": "==3.13.4" + }, "greenlet": { "hashes": [ "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", @@ -426,6 +449,14 @@ ], "version": "==0.6.1" }, + "identify": { + "hashes": [ + "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791", + "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e" + ], + "markers": "python_version >= '3.8'", + "version": "==2.5.35" + }, "idna": { "hashes": [ "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", @@ -460,6 +491,14 @@ "markers": "python_version >= '3.8'", "version": "==1.5.6" }, + "nodeenv": { + "hashes": [ + "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2", + "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "version": "==1.8.0" + }, "packaging": { "hashes": [ "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", @@ -485,6 +524,14 @@ "markers": "python_version >= '3.7'", "version": "==24.0" }, + "platformdirs": { + "hashes": [ + "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", + "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" + ], + "markers": "python_version >= '3.8'", + "version": "==4.2.0" + }, "pluggy": { "hashes": [ "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", @@ -493,6 +540,15 @@ "markers": "python_version >= '3.8'", "version": "==1.4.0" }, + "pre-commit": { + "hashes": [ + "sha256:5eae9e10c2b5ac51577c3452ec0a490455c45a0533f7960f993a0d01e59decab", + "sha256:e209d61b8acdcf742404408531f0c37d49d2c734fd7cff2d6076083d191cb060" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==3.7.0" + }, "pycparser": { "hashes": [ "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", @@ -704,6 +760,14 @@ "markers": "python_version >= '3.7'", "version": "==2.31.0" }, + "setuptools": { + "hashes": [ + "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987", + "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32" + ], + "markers": "python_version >= '3.8'", + "version": "==69.5.1" + }, "sniffio": { "hashes": [ "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", @@ -841,6 +905,14 @@ ], "version": "==0.19.0" }, + "virtualenv": { + "hashes": [ + "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a", + "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197" + ], + "markers": "python_version >= '3.7'", + "version": "==20.25.1" + }, "watchfiles": { "hashes": [ "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc", diff --git a/README.md b/README.md index 7afeac5..0c639a3 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,11 @@ git clone git@github.com:pennlabs/labs-analytics.git pipenv install ``` +4. Setting up precommit: +```bash +pipenv run pre-commit install +``` + ### Setting up for local development This guide details the steps to set up `Redis`, `Redis Insight`, `postgres` and `pgweb` instances using Docker, making it easy for development. From 5065fbdeca042aad03373645118a1015ce7bbab9 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Tue, 16 Apr 2024 02:26:26 -0400 Subject: [PATCH 03/18] Test pre-commit --- .pre-commit-config.yaml | 4 ++-- src/models.py | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8411217..6f856d2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,11 +1,11 @@ repos: - repo: https://github.com/pennlabs/pre-commit-hooks - rev: v1.0-labs-analytics + rev: v1.0-mobile-backend hooks: - id: black args: [-l100] - id: isort args: [] - id: flake8 - args: [--config, backend/setup.cfg] + args: [--config, setup.cfg] - id: detect-private-key \ No newline at end of file diff --git a/src/models.py b/src/models.py index 45e65ac..148ff5a 100644 --- a/src/models.py +++ b/src/models.py @@ -6,9 +6,7 @@ class CustomModel(BaseModel): - model_config = ConfigDict( - populate_by_name=True, - ) + model_config = ConfigDict(populate_by_name=True,) def serializable_dict(self, **kwargs): default_dict = self.model_dump() From a5c55cca52d3ab7152ddd84c85642a4540454322 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Tue, 16 Apr 2024 02:27:37 -0400 Subject: [PATCH 04/18] Remove unnecessary items in setup.cfg --- setup.cfg | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/setup.cfg b/setup.cfg index 278639e..b6b2c1a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -12,17 +12,3 @@ lines_after_imports = 2 multi_line_output = 3 include_trailing_comma = True use_parentheses = True - -[coverage:run] -omit = */tests/*, */migrations/*, */settings/*, */wsgi.py, */apps.py, */.venv/*, manage.py -source = . - -[uwsgi] -http-socket = :80 -chdir = /app/ -module = pennmobile.wsgi:application -master = true -static-map = /assets=/app/static -processes = 5 -threads = 2 -enable-threads = true From 4824d46cf547fdaf3b9e9006097c4318e957eed8 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Tue, 16 Apr 2024 03:02:03 -0400 Subject: [PATCH 05/18] Fixed black --- Pipfile | 10 +- Pipfile.lock | 338 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 281 insertions(+), 67 deletions(-) diff --git a/Pipfile b/Pipfile index a1664ee..cbed0f8 100644 --- a/Pipfile +++ b/Pipfile @@ -20,11 +20,15 @@ jwcrypto = "*" pytest-asyncio = "*" pytest = "*" pre-commit = "*" +click = "==8.0.4" [dev-packages] -isort = "*" -flake8 = "*" -black = "*" +flake8 = "==6.1.0" +flake8-isort = "==6.1.0" +flake8-quotes = "==3.3.2" +flake8-absolute-import = "*" +black = "==19.10b0" +coverage = "*" [requires] python_version = "3.11" diff --git a/Pipfile.lock b/Pipfile.lock index 0610c88..817ff42 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "b580d43662b8847b5a1621676767a38cdd0659725c97107133c560b059eead87" + "sha256": "9fc92cfdec52f4ba944d1198bccbd8e4b5975c7e38226c7a963a99905be4ee28" }, "pipfile-spec": 6, "requires": { @@ -260,11 +260,12 @@ }, "click": { "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", + "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb" ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==8.0.4" }, "cryptography": { "hashes": [ @@ -740,6 +741,7 @@ "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" ], + "markers": "python_version >= '3.6'", "version": "==6.0.1" }, "redis": { @@ -1072,58 +1074,136 @@ } }, "develop": { + "appdirs": { + "hashes": [ + "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", + "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" + ], + "version": "==1.4.4" + }, + "attrs": { + "hashes": [ + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" + ], + "markers": "python_version >= '3.7'", + "version": "==23.2.0" + }, "black": { "hashes": [ - "sha256:1bb9ca06e556a09f7f7177bc7cb604e5ed2d2df1e9119e4f7d2f1f7071c32e5d", - "sha256:21f9407063ec71c5580b8ad975653c66508d6a9f57bd008bb8691d273705adcd", - "sha256:4396ca365a4310beef84d446ca5016f671b10f07abdba3e4e4304218d2c71d33", - "sha256:44d99dfdf37a2a00a6f7a8dcbd19edf361d056ee51093b2445de7ca09adac965", - "sha256:5cd5b4f76056cecce3e69b0d4c228326d2595f506797f40b9233424e2524c070", - "sha256:64578cf99b6b46a6301bc28bdb89f9d6f9b592b1c5837818a177c98525dbe397", - "sha256:64e60a7edd71fd542a10a9643bf369bfd2644de95ec71e86790b063aa02ff745", - "sha256:652e55bb722ca026299eb74e53880ee2315b181dfdd44dca98e43448620ddec1", - "sha256:6644f97a7ef6f401a150cca551a1ff97e03c25d8519ee0bbc9b0058772882665", - "sha256:6ad001a9ddd9b8dfd1b434d566be39b1cd502802c8d38bbb1ba612afda2ef436", - "sha256:71d998b73c957444fb7c52096c3843875f4b6b47a54972598741fe9a7f737fcb", - "sha256:74eb9b5420e26b42c00a3ff470dc0cd144b80a766128b1771d07643165e08d0e", - "sha256:75a2d0b4f5eb81f7eebc31f788f9830a6ce10a68c91fbe0fade34fff7a2836e6", - "sha256:7852b05d02b5b9a8c893ab95863ef8986e4dda29af80bbbda94d7aee1abf8702", - "sha256:7f2966b9b2b3b7104fca9d75b2ee856fe3fdd7ed9e47c753a4bb1a675f2caab8", - "sha256:8e5537f456a22cf5cfcb2707803431d2feeb82ab3748ade280d6ccd0b40ed2e8", - "sha256:d4e71cdebdc8efeb6deaf5f2deb28325f8614d48426bed118ecc2dcaefb9ebf3", - "sha256:dae79397f367ac8d7adb6c779813328f6d690943f64b32983e896bcccd18cbad", - "sha256:e3a3a092b8b756c643fe45f4624dbd5a389f770a4ac294cf4d0fce6af86addaf", - "sha256:eb949f56a63c5e134dfdca12091e98ffb5fd446293ebae123d10fc1abad00b9e", - "sha256:f07b69fda20578367eaebbd670ff8fc653ab181e1ff95d84497f9fa20e7d0641", - "sha256:f95cece33329dc4aa3b0e1a771c41075812e46cf3d6e3f1dfe3d91ff09826ed2" + "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b", + "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==24.4.0" + "markers": "python_version >= '3.6'", + "version": "==19.10b0" }, "click": { "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1", + "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb" ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==8.0.4" + }, + "coverage": { + "hashes": [ + "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c", + "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63", + "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7", + "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f", + "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8", + "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf", + "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0", + "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384", + "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76", + "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7", + "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d", + "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70", + "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f", + "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818", + "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b", + "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d", + "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec", + "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083", + "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2", + "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9", + "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd", + "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade", + "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e", + "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a", + "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227", + "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87", + "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c", + "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e", + "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c", + "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e", + "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd", + "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec", + "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562", + "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8", + "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677", + "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357", + "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c", + "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd", + "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49", + "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286", + "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1", + "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf", + "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51", + "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409", + "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384", + "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e", + "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978", + "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57", + "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e", + "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2", + "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48", + "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==7.4.4" }, "flake8": { "hashes": [ - "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", - "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23", + "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" ], "index": "pypi", "markers": "python_full_version >= '3.8.1'", - "version": "==7.0.0" + "version": "==6.1.0" + }, + "flake8-absolute-import": { + "hashes": [ + "sha256:b72142db999ec5e0ac4f4ac57fb8776a2959d07346c4d3742c446f206d45fcef", + "sha256:fcb734ac5a9639fa4ffbc6242ae9d6e9d8063f9cd078d6d218597ee883a99d48" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==1.0.0.2" + }, + "flake8-isort": { + "hashes": [ + "sha256:d4639343bac540194c59fb1618ac2c285b3e27609f353bef6f50904d40c1643e" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==6.1.0" + }, + "flake8-quotes": { + "hashes": [ + "sha256:6e26892b632dacba517bf27219c459a8396dcfac0f5e8204904c5a4ba9b480e1" + ], + "index": "pypi", + "version": "==3.3.2" }, "isort": { "hashes": [ "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109", "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6" ], - "index": "pypi", "markers": "python_full_version >= '3.8.0'", "version": "==5.13.2" }, @@ -1135,22 +1215,6 @@ "markers": "python_version >= '3.6'", "version": "==0.7.0" }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, - "packaging": { - "hashes": [ - "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", - "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" - ], - "markers": "python_version >= '3.7'", - "version": "==24.0" - }, "pathspec": { "hashes": [ "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", @@ -1159,14 +1223,6 @@ "markers": "python_version >= '3.8'", "version": "==0.12.1" }, - "platformdirs": { - "hashes": [ - "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", - "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" - ], - "markers": "python_version >= '3.8'", - "version": "==4.2.0" - }, "pycodestyle": { "hashes": [ "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", @@ -1177,11 +1233,165 @@ }, "pyflakes": { "hashes": [ - "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", - "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", + "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc" ], "markers": "python_version >= '3.8'", - "version": "==3.2.0" + "version": "==3.1.0" + }, + "regex": { + "hashes": [ + "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5", + "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770", + "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc", + "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105", + "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d", + "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b", + "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9", + "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630", + "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6", + "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c", + "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482", + "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6", + "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a", + "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80", + "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5", + "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1", + "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f", + "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf", + "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb", + "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2", + "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347", + "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20", + "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060", + "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5", + "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73", + "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f", + "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d", + "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3", + "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae", + "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4", + "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2", + "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457", + "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c", + "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4", + "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87", + "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0", + "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704", + "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f", + "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f", + "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b", + "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5", + "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923", + "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715", + "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c", + "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca", + "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1", + "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756", + "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360", + "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc", + "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445", + "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e", + "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4", + "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a", + "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8", + "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53", + "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697", + "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf", + "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a", + "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415", + "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f", + "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9", + "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400", + "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d", + "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392", + "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb", + "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd", + "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861", + "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232", + "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95", + "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7", + "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39", + "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887", + "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5", + "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39", + "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb", + "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586", + "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97", + "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423", + "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69", + "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7", + "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1", + "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7", + "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5", + "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8", + "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91", + "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590", + "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe", + "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c", + "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64", + "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd", + "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa", + "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31", + "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988" + ], + "markers": "python_version >= '3.7'", + "version": "==2023.12.25" + }, + "toml": { + "hashes": [ + "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", + "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.10.2" + }, + "typed-ast": { + "hashes": [ + "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10", + "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede", + "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e", + "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c", + "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d", + "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8", + "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e", + "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5", + "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155", + "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4", + "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba", + "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5", + "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a", + "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b", + "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311", + "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769", + "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686", + "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d", + "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2", + "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814", + "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9", + "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b", + "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b", + "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4", + "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd", + "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18", + "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa", + "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6", + "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee", + "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88", + "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4", + "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431", + "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04", + "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d", + "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02", + "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8", + "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437", + "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274", + "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f", + "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a", + "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2" + ], + "markers": "python_version >= '3.6'", + "version": "==1.5.5" } } } From 7f2fab6abb18df46ff634d81600b2c7f35bea854 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Tue, 16 Apr 2024 03:06:28 -0400 Subject: [PATCH 06/18] Change backend check to match penn mobile --- .github/workflows/build-deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-deploy.yaml b/.github/workflows/build-deploy.yaml index 7f76a15..94e9e97 100644 --- a/.github/workflows/build-deploy.yaml +++ b/.github/workflows/build-deploy.yaml @@ -9,7 +9,7 @@ on: push jobs: backend-check: name: "Backend Check" - uses: pennlabs/shared-actions/.github/workflows/django.yaml@8785a7d7b9158d8d5705a0202f5695db2c0beb97 + uses: pennlabs/shared-actions/.github/workflows/django.yaml@507f4cf1cc88259fc8625fb3a35bd3f18fc91cd5 with: projectName: LabsAnalytics path: . From e18ca7401c6017a17a3e42a9dd94b6d0fed52b41 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Tue, 16 Apr 2024 03:08:33 -0400 Subject: [PATCH 07/18] Revert --- .github/workflows/build-deploy.yaml | 2 +- .pre-commit-config.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-deploy.yaml b/.github/workflows/build-deploy.yaml index 94e9e97..7f76a15 100644 --- a/.github/workflows/build-deploy.yaml +++ b/.github/workflows/build-deploy.yaml @@ -9,7 +9,7 @@ on: push jobs: backend-check: name: "Backend Check" - uses: pennlabs/shared-actions/.github/workflows/django.yaml@507f4cf1cc88259fc8625fb3a35bd3f18fc91cd5 + uses: pennlabs/shared-actions/.github/workflows/django.yaml@8785a7d7b9158d8d5705a0202f5695db2c0beb97 with: projectName: LabsAnalytics path: . diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6f856d2..41e2d42 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ repos: rev: v1.0-mobile-backend hooks: - id: black - args: [-l100] + args: [] - id: isort args: [] - id: flake8 From ed710afd56c35a38fbca9179bc024623ad427767 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Tue, 16 Apr 2024 03:08:57 -0400 Subject: [PATCH 08/18] Lint --- src/auth.py | 4 +++- src/redis.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/auth.py b/src/auth.py index 3e0f990..5a7d9cf 100644 --- a/src/auth.py +++ b/src/auth.py @@ -35,7 +35,9 @@ def get_token_from_header(request: Request): raise HTTPException(status_code=401, detail="Wrong authentication scheme") return token except ValueError: - raise HTTPException(status_code=401, detail="Invalid authorization header format") + raise HTTPException( + status_code=401, detail="Invalid authorization header format" + ) def verify_jwt(token: str = Depends(get_token_from_header)): diff --git a/src/redis.py b/src/redis.py index a64c413..3ebcc67 100644 --- a/src/redis.py +++ b/src/redis.py @@ -9,7 +9,9 @@ redis_client: Redis = Redis.from_url(str(settings.REDIS_URL)) -async def set_redis_keys(data: list[RedisEvent], *, is_transaction: bool = False) -> None: +async def set_redis_keys( + data: list[RedisEvent], *, is_transaction: bool = False +) -> None: async with redis_client.pipeline(transaction=is_transaction) as pipe: for redis_data in data: await pipe.set(redis_data.key, redis_data.value) From d1321ee82560b6ab34ddebc170c9c8fa382d7fa5 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Tue, 16 Apr 2024 03:13:14 -0400 Subject: [PATCH 09/18] Add back coverage --- setup.cfg | 3 +++ 1 file changed, 3 insertions(+) diff --git a/setup.cfg b/setup.cfg index b6b2c1a..0160dcd 100644 --- a/setup.cfg +++ b/setup.cfg @@ -12,3 +12,6 @@ lines_after_imports = 2 multi_line_output = 3 include_trailing_comma = True use_parentheses = True + +[coverage:run] +source = . \ No newline at end of file From 575fdedeccfbef38fd570b1283bcf4c2e78dbfed Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Tue, 16 Apr 2024 15:08:01 -0400 Subject: [PATCH 10/18] Skip django --- .github/workflows/build-deploy.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-deploy.yaml b/.github/workflows/build-deploy.yaml index 7f76a15..d07b58a 100644 --- a/.github/workflows/build-deploy.yaml +++ b/.github/workflows/build-deploy.yaml @@ -16,6 +16,7 @@ jobs: flake: true black: true pythonVersion: 3.11-buster + skipDjangoCheck: true publish-backend: uses: pennlabs/shared-actions/.github/workflows/docker-publish.yaml@v0.1 From c97d3876a229feb4b3beb7b964f624234d4d8a9d Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Tue, 16 Apr 2024 15:10:13 -0400 Subject: [PATCH 11/18] Add linting test --- .github/workflows/build-deploy.yaml | 47 +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/.github/workflows/build-deploy.yaml b/.github/workflows/build-deploy.yaml index d07b58a..7a02381 100644 --- a/.github/workflows/build-deploy.yaml +++ b/.github/workflows/build-deploy.yaml @@ -17,6 +17,53 @@ jobs: black: true pythonVersion: 3.11-buster skipDjangoCheck: true + + linting: + name: Linting Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Cache + uses: actions/cache@v2 + with: + path: ~/.local/share/virtualenvs + key: v0-${{ hashFiles('${{ inputs.path }}/Pipfile.lock') }} + - name: Install Dependencies (pipenv) + run: |- + cd ${{ inputs.path }} + pip install pipenv + pipenv install --deploy --dev + if: ${{ inputs.dependencyManager == 'pipenv' }} + - name: Install Poetry + uses: snok/install-poetry@v1 + if: ${{ inputs.dependencyManager == 'poetry' }} + - name: Install Dependencies (poetry) + run: |- + cd ${{ inputs.path }} + poetry install --no-root + if: ${{ inputs.dependencyManager == 'poetry' }} + - name: Lint (flake8) + run: |- + cd ${{ inputs.path }} + ${{ inputs.dependencyManager }} run flake8 . + if: ${{ inputs.flake }} + - name: Lint (black) + run: |- + cd ${{ inputs.path }} + ${{ inputs.dependencyManager }} run black --check . + if: ${{ inputs.black }} + container: + image: python:${{ inputs.pythonVersion }} + env: + DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres + services: + postgres: + image: postgres:12 + env: + POSTGRES_USER: postgres + POSTGRES_DB: postgres + POSTGRES_PASSWORD: postgres + options: "--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5" publish-backend: uses: pennlabs/shared-actions/.github/workflows/docker-publish.yaml@v0.1 From beaf2195fd5a0b6910023b77a196f9c01b54f476 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Tue, 16 Apr 2024 15:16:10 -0400 Subject: [PATCH 12/18] Fix job --- .github/workflows/build-deploy.yaml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.github/workflows/build-deploy.yaml b/.github/workflows/build-deploy.yaml index 7a02381..d4f1291 100644 --- a/.github/workflows/build-deploy.yaml +++ b/.github/workflows/build-deploy.yaml @@ -33,25 +33,14 @@ jobs: cd ${{ inputs.path }} pip install pipenv pipenv install --deploy --dev - if: ${{ inputs.dependencyManager == 'pipenv' }} - - name: Install Poetry - uses: snok/install-poetry@v1 - if: ${{ inputs.dependencyManager == 'poetry' }} - - name: Install Dependencies (poetry) - run: |- - cd ${{ inputs.path }} - poetry install --no-root - if: ${{ inputs.dependencyManager == 'poetry' }} - name: Lint (flake8) run: |- cd ${{ inputs.path }} ${{ inputs.dependencyManager }} run flake8 . - if: ${{ inputs.flake }} - name: Lint (black) run: |- cd ${{ inputs.path }} ${{ inputs.dependencyManager }} run black --check . - if: ${{ inputs.black }} container: image: python:${{ inputs.pythonVersion }} env: From 66669714fdf06c3570b6c66a9dfa7da345925707 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Sun, 21 Apr 2024 16:54:32 -0400 Subject: [PATCH 13/18] Merge --- .github/workflows/build-deploy.yaml | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-deploy.yaml b/.github/workflows/build-deploy.yaml index d4f1291..0e6e7df 100644 --- a/.github/workflows/build-deploy.yaml +++ b/.github/workflows/build-deploy.yaml @@ -27,22 +27,17 @@ jobs: uses: actions/cache@v2 with: path: ~/.local/share/virtualenvs - key: v0-${{ hashFiles('${{ inputs.path }}/Pipfile.lock') }} - - name: Install Dependencies (pipenv) - run: |- - cd ${{ inputs.path }} - pip install pipenv - pipenv install --deploy --dev + key: v0-${{ hashFiles('./Pipfile.lock') }} - name: Lint (flake8) run: |- - cd ${{ inputs.path }} - ${{ inputs.dependencyManager }} run flake8 . + cd . + pipenv run flake8 . - name: Lint (black) run: |- cd ${{ inputs.path }} - ${{ inputs.dependencyManager }} run black --check . + pipenv run black --check . container: - image: python:${{ inputs.pythonVersion }} + image: python:3.11-buster env: DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres services: From d404020123f45bbac3d5337a56e3c8dbed8db6b0 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Sun, 21 Apr 2024 16:57:19 -0400 Subject: [PATCH 14/18] Add pipenv --- .github/workflows/build-deploy.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/build-deploy.yaml b/.github/workflows/build-deploy.yaml index 0e6e7df..4aa9778 100644 --- a/.github/workflows/build-deploy.yaml +++ b/.github/workflows/build-deploy.yaml @@ -28,6 +28,12 @@ jobs: with: path: ~/.local/share/virtualenvs key: v0-${{ hashFiles('./Pipfile.lock') }} + - name: Install Dependencies (pipenv) + shell: bash + continue-on-error: true + run: |- + cd . + pip install pipenv - name: Lint (flake8) run: |- cd . From 433beff13c2cc214d9686399ec199e0aafa66d88 Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Sun, 21 Apr 2024 16:58:32 -0400 Subject: [PATCH 15/18] Pipenv install --- .github/workflows/build-deploy.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-deploy.yaml b/.github/workflows/build-deploy.yaml index 4aa9778..e72db71 100644 --- a/.github/workflows/build-deploy.yaml +++ b/.github/workflows/build-deploy.yaml @@ -34,6 +34,7 @@ jobs: run: |- cd . pip install pipenv + pipenv install - name: Lint (flake8) run: |- cd . From 385f621fb31d7f20fe11dff8c4021dbe8e5cfd3c Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Sun, 21 Apr 2024 17:00:12 -0400 Subject: [PATCH 16/18] Please --- .github/workflows/build-deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-deploy.yaml b/.github/workflows/build-deploy.yaml index e72db71..87c4cf0 100644 --- a/.github/workflows/build-deploy.yaml +++ b/.github/workflows/build-deploy.yaml @@ -34,7 +34,7 @@ jobs: run: |- cd . pip install pipenv - pipenv install + pipenv install --dev - name: Lint (flake8) run: |- cd . From 45747323509ec8c0d7ddc63183638851c721eaaf Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Sun, 21 Apr 2024 17:02:56 -0400 Subject: [PATCH 17/18] Please --- .github/workflows/build-deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-deploy.yaml b/.github/workflows/build-deploy.yaml index 87c4cf0..2391b1d 100644 --- a/.github/workflows/build-deploy.yaml +++ b/.github/workflows/build-deploy.yaml @@ -41,7 +41,7 @@ jobs: pipenv run flake8 . - name: Lint (black) run: |- - cd ${{ inputs.path }} + cd . pipenv run black --check . container: image: python:3.11-buster From 5bcc345dffb95181da1e384fdfa1743bb6292e4d Mon Sep 17 00:00:00 2001 From: Justin Zhang Date: Sun, 21 Apr 2024 23:57:28 -0400 Subject: [PATCH 18/18] Lint --- setup.cfg | 2 +- tests/test_load.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index 0160dcd..1bb3bbf 100644 --- a/setup.cfg +++ b/setup.cfg @@ -6,7 +6,7 @@ ignore = E203, W503 [isort] default_section = THIRDPARTY -known_first_party = pennmobile, dining, gsr_booking, user, laundry +known_first_party = src, scripts line_length = 100 lines_after_imports = 2 multi_line_output = 3 diff --git a/tests/test_load.py b/tests/test_load.py index 6657ea9..13eb980 100644 --- a/tests/test_load.py +++ b/tests/test_load.py @@ -55,7 +55,8 @@ def make_request(): def run_threads(): with ThreadPoolExecutor(max_workers=THREADS) as executor: - _ = [executor.submit(make_request) for _ in range(NUMBER_OF_REQUESTS)] + for _ in range(NUMBER_OF_REQUESTS): + executor.submit(make_request) def test_load():