From 6b6b1995994a4bcb910b2658052a7cb332ffb32c Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Wed, 17 Apr 2024 15:43:31 +0200 Subject: [PATCH 01/75] Refactor to `poetry2nix` --- .envrc | 1 + flake.nix | 38 ++++++++++++++++++++++++++++++++++++++ pyproject.toml | 41 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 .envrc create mode 100644 flake.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000000..3550a30f2d --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000000..d909fa052f --- /dev/null +++ b/flake.nix @@ -0,0 +1,38 @@ +{ + description = "EvaP"; + + inputs = { + flake-utils.url = "github:numtide/flake-utils"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + poetry2nix = { + url = "github:nix-community/poetry2nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = { self, nixpkgs, flake-utils, ... }@inputs: + flake-utils.lib.eachDefaultSystem (system: + let + # see https://github.com/nix-community/poetry2nix/tree/master#api for more functions and examples. + pkgs = nixpkgs.legacyPackages.${system}; + poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; + in + { + packages = { + evap = poetry2nix.mkPoetryApplication { + projectDir = self; + preferWheels = true; + overrides = poetry2nix.overrides.withDefaults (final: prev: { + # https://github.com/nix-community/poetry2nix/issues/1499 + django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; + }); + }; + default = self.packages.${system}.evap; + }; + + devShells.default = pkgs.mkShell { + inputsFrom = [ self.packages.${system}.evap ]; + packages = [ pkgs.poetry ]; + }; + }); +} diff --git a/pyproject.toml b/pyproject.toml index dae30b59b8..4ea84a1d82 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,42 @@ -[project] -requires-python = ">=3.10" +[tool.poetry] +name = "evap" +version = "0.1.0" +description = "" +authors = ["Sébastien Eustace "] +readme = "README.md" +packages = [{include = "evap"}] + +[tool.poetry.dependencies] +python = "^3.10" +django-extensions = "^3.2.3" +django-fsm = "^2.8.1" +django = "^5.0" +mozilla-django-oidc = "^4.0.1" +openpyxl = "^3.1.2" +psycopg2-binary = "^2.9.9" +redis = "^5.0.3" +xlwt = "^1.3.0" + +[tool.poetry.group.dev.dependencies] +black = "^24.4.0" +coverage = { version = "*", extras = ["toml"] } +django-debug-toolbar = "^4.0" +django-stubs = "4.2.6" +django-webtest = "^1.9.10" +isort = "^5.13.1" +model-bakery = "^1.17.0" +mypy = "^1.9.0" +openpyxl-stubs = "^0.1.25" +pylint-django = "^2.5.4" +pylint = "^3.1.0" +ruff = "^0.3.7" +tblib = "^3.0.0" +xlrd = "^2.0.1" +typeguard = "^4.2.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" ############################################## From 192ec030a66024cfc1c5092d13d1c416644dcbe3 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Wed, 17 Apr 2024 15:43:43 +0200 Subject: [PATCH 02/75] Lock files --- flake.lock | 175 ++++++++ poetry.lock | 1237 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1412 insertions(+) create mode 100644 flake.lock create mode 100644 poetry.lock diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000000..973273c8fa --- /dev/null +++ b/flake.lock @@ -0,0 +1,175 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1705309234, + "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nix-github-actions": { + "inputs": { + "nixpkgs": [ + "poetry2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1703863825, + "narHash": "sha256-rXwqjtwiGKJheXB43ybM8NwWB8rO2dSRrEqes0S7F5Y=", + "owner": "nix-community", + "repo": "nix-github-actions", + "rev": "5163432afc817cf8bd1f031418d1869e4c9d5547", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-github-actions", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1713248628, + "narHash": "sha256-NLznXB5AOnniUtZsyy/aPWOk8ussTuePp2acb9U+ISA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "5672bc9dbf9d88246ddab5ac454e82318d094bb8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "poetry2nix": { + "inputs": { + "flake-utils": "flake-utils_2", + "nix-github-actions": "nix-github-actions", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems_3", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1708589824, + "narHash": "sha256-2GOiFTkvs5MtVF65sC78KNVxQSmsxtk0WmV1wJ9V2ck=", + "owner": "nix-community", + "repo": "poetry2nix", + "rev": "3c92540611f42d3fb2d0d084a6c694cd6544b609", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "poetry2nix", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "poetry2nix": "poetry2nix" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "id": "systems", + "type": "indirect" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "poetry2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1708335038, + "narHash": "sha256-ETLZNFBVCabo7lJrpjD6cAbnE11eDOjaQnznmg/6hAE=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "e504621290a1fd896631ddbc5e9c16f4366c9f65", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000000..3f4112f1f1 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1237 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "asgiref" +version = "3.8.1" +description = "ASGI specs, helper code, and adapters" +optional = false +python-versions = ">=3.8" +files = [ + {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, + {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} + +[package.extras] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] + +[[package]] +name = "astroid" +version = "3.1.0" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "astroid-3.1.0-py3-none-any.whl", hash = "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819"}, + {file = "astroid-3.1.0.tar.gz", hash = "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "black" +version = "24.4.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-24.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6ad001a9ddd9b8dfd1b434d566be39b1cd502802c8d38bbb1ba612afda2ef436"}, + {file = "black-24.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3a3a092b8b756c643fe45f4624dbd5a389f770a4ac294cf4d0fce6af86addaf"}, + {file = "black-24.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae79397f367ac8d7adb6c779813328f6d690943f64b32983e896bcccd18cbad"}, + {file = "black-24.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:71d998b73c957444fb7c52096c3843875f4b6b47a54972598741fe9a7f737fcb"}, + {file = "black-24.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8e5537f456a22cf5cfcb2707803431d2feeb82ab3748ade280d6ccd0b40ed2e8"}, + {file = "black-24.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64e60a7edd71fd542a10a9643bf369bfd2644de95ec71e86790b063aa02ff745"}, + {file = "black-24.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd5b4f76056cecce3e69b0d4c228326d2595f506797f40b9233424e2524c070"}, + {file = "black-24.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:64578cf99b6b46a6301bc28bdb89f9d6f9b592b1c5837818a177c98525dbe397"}, + {file = "black-24.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f95cece33329dc4aa3b0e1a771c41075812e46cf3d6e3f1dfe3d91ff09826ed2"}, + {file = "black-24.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4396ca365a4310beef84d446ca5016f671b10f07abdba3e4e4304218d2c71d33"}, + {file = "black-24.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d99dfdf37a2a00a6f7a8dcbd19edf361d056ee51093b2445de7ca09adac965"}, + {file = "black-24.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:21f9407063ec71c5580b8ad975653c66508d6a9f57bd008bb8691d273705adcd"}, + {file = "black-24.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:652e55bb722ca026299eb74e53880ee2315b181dfdd44dca98e43448620ddec1"}, + {file = "black-24.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f2966b9b2b3b7104fca9d75b2ee856fe3fdd7ed9e47c753a4bb1a675f2caab8"}, + {file = "black-24.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bb9ca06e556a09f7f7177bc7cb604e5ed2d2df1e9119e4f7d2f1f7071c32e5d"}, + {file = "black-24.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4e71cdebdc8efeb6deaf5f2deb28325f8614d48426bed118ecc2dcaefb9ebf3"}, + {file = "black-24.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6644f97a7ef6f401a150cca551a1ff97e03c25d8519ee0bbc9b0058772882665"}, + {file = "black-24.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75a2d0b4f5eb81f7eebc31f788f9830a6ce10a68c91fbe0fade34fff7a2836e6"}, + {file = "black-24.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb949f56a63c5e134dfdca12091e98ffb5fd446293ebae123d10fc1abad00b9e"}, + {file = "black-24.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:7852b05d02b5b9a8c893ab95863ef8986e4dda29af80bbbda94d7aee1abf8702"}, + {file = "black-24.4.0-py3-none-any.whl", hash = "sha256:74eb9b5420e26b42c00a3ff470dc0cd144b80a766128b1771d07643165e08d0e"}, + {file = "black-24.4.0.tar.gz", hash = "sha256:f07b69fda20578367eaebbd670ff8fc653ab181e1ff95d84497f9fa20e7d0641"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "coverage" +version = "7.4.4" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, + {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, + {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, + {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, + {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, + {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, + {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, + {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, + {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, + {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, + {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, + {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, + {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "cryptography" +version = "42.0.5" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, + {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, + {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, + {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, + {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, + {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, + {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "dill" +version = "0.3.8" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + +[[package]] +name = "django" +version = "5.0.4" +description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." +optional = false +python-versions = ">=3.10" +files = [ + {file = "Django-5.0.4-py3-none-any.whl", hash = "sha256:916423499d75d62da7aa038d19aef23d23498d8df229775eb0a6309ee1013775"}, + {file = "Django-5.0.4.tar.gz", hash = "sha256:4bd01a8c830bb77a8a3b0e7d8b25b887e536ad17a81ba2dce5476135c73312bd"}, +] + +[package.dependencies] +asgiref = ">=3.7.0,<4" +sqlparse = ">=0.3.1" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +argon2 = ["argon2-cffi (>=19.1.0)"] +bcrypt = ["bcrypt"] + +[[package]] +name = "django-debug-toolbar" +version = "4.3.0" +description = "A configurable set of panels that display various debug information about the current request/response." +optional = false +python-versions = ">=3.8" +files = [ + {file = "django_debug_toolbar-4.3.0-py3-none-any.whl", hash = "sha256:e09b7dcb8417b743234dfc57c95a7c1d1d87a88844abd13b4c5387f807b31bf6"}, + {file = "django_debug_toolbar-4.3.0.tar.gz", hash = "sha256:0b0dddee5ea29b9cb678593bc0d7a6d76b21d7799cb68e091a2148341a80f3c4"}, +] + +[package.dependencies] +django = ">=3.2.4" +sqlparse = ">=0.2" + +[[package]] +name = "django-extensions" +version = "3.2.3" +description = "Extensions for Django" +optional = false +python-versions = ">=3.6" +files = [ + {file = "django-extensions-3.2.3.tar.gz", hash = "sha256:44d27919d04e23b3f40231c4ab7af4e61ce832ef46d610cc650d53e68328410a"}, + {file = "django_extensions-3.2.3-py3-none-any.whl", hash = "sha256:9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401"}, +] + +[package.dependencies] +Django = ">=3.2" + +[[package]] +name = "django-fsm" +version = "2.8.2" +description = "Django friendly finite state machine support." +optional = false +python-versions = "*" +files = [ + {file = "django-fsm-2.8.2.tar.gz", hash = "sha256:fe3be8fa916470360632b2a86aefcb342d67916fa4c5749caaa7760f88c0c49c"}, + {file = "django_fsm-2.8.2-py2.py3-none-any.whl", hash = "sha256:0b4d346a8de1c2c30c2206ced649e25695f567c072358030544a604fc937d235"}, +] + +[[package]] +name = "django-stubs" +version = "4.2.6" +description = "Mypy stubs for Django" +optional = false +python-versions = ">=3.8" +files = [ + {file = "django-stubs-4.2.6.tar.gz", hash = "sha256:e60b43de662a199db4b15c803c06669e0ac5035614af291cbd3b91591f7dcc94"}, + {file = "django_stubs-4.2.6-py3-none-any.whl", hash = "sha256:2fcd257884a68dfa02de41ee5410ec805264d9b07d9b5b119e4dea82c7b8345e"}, +] + +[package.dependencies] +django = "*" +django-stubs-ext = ">=4.2.5" +tomli = {version = "*", markers = "python_version < \"3.11\""} +types-pytz = "*" +types-PyYAML = "*" +typing-extensions = "*" + +[package.extras] +compatible-mypy = ["mypy (>=1.6.0,<1.7.0)"] + +[[package]] +name = "django-stubs-ext" +version = "4.2.7" +description = "Monkey-patching and extensions for django-stubs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "django-stubs-ext-4.2.7.tar.gz", hash = "sha256:519342ac0849cda1559746c9a563f03ff99f636b0ebe7c14b75e816a00dfddc3"}, + {file = "django_stubs_ext-4.2.7-py3-none-any.whl", hash = "sha256:45a5d102417a412e3606e3c358adb4744988a92b7b58ccf3fd64bddd5d04d14c"}, +] + +[package.dependencies] +django = "*" +typing-extensions = "*" + +[[package]] +name = "django-webtest" +version = "1.9.11" +description = "Instant integration of Ian Bicking's WebTest (http://docs.pylonsproject.org/projects/webtest/) with Django's testing framework." +optional = false +python-versions = "*" +files = [ + {file = "django-webtest-1.9.11.tar.gz", hash = "sha256:9597d26ced599bc5d4d9366bb451469fc9707b4779f79543cdf401ae6c5aeb35"}, + {file = "django_webtest-1.9.11-py3-none-any.whl", hash = "sha256:e29baf8337e7fe7db41ce63ca6661f7b5c77fe56f506f48b305e09313f5475b4"}, +] + +[package.dependencies] +webtest = ">=1.3.3" + +[[package]] +name = "et-xmlfile" +version = "1.1.0" +description = "An implementation of lxml.xmlfile for the standard library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, +] + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] + +[package.extras] +colors = ["colorama (>=0.4.6)"] + +[[package]] +name = "josepy" +version = "1.14.0" +description = "JOSE protocol implementation in Python" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "josepy-1.14.0-py3-none-any.whl", hash = "sha256:d2b36a30f316269f3242f4c2e45e15890784178af5ec54fa3e49cf9234ee22e0"}, + {file = "josepy-1.14.0.tar.gz", hash = "sha256:308b3bf9ce825ad4d4bba76372cf19b5dc1c2ce96a9d298f9642975e64bd13dd"}, +] + +[package.dependencies] +cryptography = ">=1.5" +pyopenssl = ">=0.13" + +[package.extras] +docs = ["sphinx (>=4.3.0)", "sphinx-rtd-theme (>=1.0)"] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "model-bakery" +version = "1.17.0" +description = "Smart object creation facility for Django." +optional = false +python-versions = ">=3.8" +files = [ + {file = "model_bakery-1.17.0-py3-none-any.whl", hash = "sha256:1d26f1a7043c46e6729145b964a7740bf8f6dddac16510fd18323a1492fba757"}, + {file = "model_bakery-1.17.0.tar.gz", hash = "sha256:fe808132cd966164600f0450cc05b3cfa50c6c062e00f739a861c5a4b9f236ca"}, +] + +[package.dependencies] +django = ">=3.2" + +[package.extras] +docs = ["sphinx", "sphinx-rtd-theme"] +test = ["black", "coverage", "mypy", "pillow", "pytest", "pytest-django", "ruff"] + +[[package]] +name = "mozilla-django-oidc" +version = "4.0.1" +description = "A lightweight authentication and access management library for integration with OpenID Connect enabled authentication services." +optional = false +python-versions = "*" +files = [ + {file = "mozilla-django-oidc-4.0.1.tar.gz", hash = "sha256:4ff8c64069e3e05c539cecf9345e73225a99641a25e13b7a5f933ec897b58918"}, + {file = "mozilla_django_oidc-4.0.1-py2.py3-none-any.whl", hash = "sha256:04ef58759be69f22cdc402d082480aaebf193466cad385dc9e4f8df2a0b187ca"}, +] + +[package.dependencies] +cryptography = "*" +Django = ">=3.2" +josepy = "*" +requests = "*" + +[[package]] +name = "mypy" +version = "1.9.0" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"}, + {file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"}, + {file = "mypy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c87c15aed320de9b438ae7b00c1ac91cd393c1b854c2ce538e2a72d55df150"}, + {file = "mypy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48533cdd345c3c2e5ef48ba3b0d3880b257b423e7995dada04248725c6f77374"}, + {file = "mypy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:4d3dbd346cfec7cb98e6cbb6e0f3c23618af826316188d587d1c1bc34f0ede03"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:653265f9a2784db65bfca694d1edd23093ce49740b2244cde583aeb134c008f3"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a3c007ff3ee90f69cf0a15cbcdf0995749569b86b6d2f327af01fd1b8aee9dc"}, + {file = "mypy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2418488264eb41f69cc64a69a745fad4a8f86649af4b1041a4c64ee61fc61129"}, + {file = "mypy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68edad3dc7d70f2f17ae4c6c1b9471a56138ca22722487eebacfd1eb5321d612"}, + {file = "mypy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:85ca5fcc24f0b4aeedc1d02f93707bccc04733f21d41c88334c5482219b1ccb3"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aceb1db093b04db5cd390821464504111b8ec3e351eb85afd1433490163d60cd"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0235391f1c6f6ce487b23b9dbd1327b4ec33bb93934aa986efe8a9563d9349e6"}, + {file = "mypy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d5ddc13421ba3e2e082a6c2d74c2ddb3979c39b582dacd53dd5d9431237185"}, + {file = "mypy-1.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:190da1ee69b427d7efa8aa0d5e5ccd67a4fb04038c380237a0d96829cb157913"}, + {file = "mypy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe28657de3bfec596bbeef01cb219833ad9d38dd5393fc649f4b366840baefe6"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e54396d70be04b34f31d2edf3362c1edd023246c82f1730bbf8768c28db5361b"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5e6061f44f2313b94f920e91b204ec600982961e07a17e0f6cd83371cb23f5c2"}, + {file = "mypy-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a10926e5473c5fc3da8abb04119a1f5811a236dc3a38d92015cb1e6ba4cb9e"}, + {file = "mypy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b685154e22e4e9199fc95f298661deea28aaede5ae16ccc8cbb1045e716b3e04"}, + {file = "mypy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d741d3fc7c4da608764073089e5f58ef6352bedc223ff58f2f038c2c4698a89"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:587ce887f75dd9700252a3abbc9c97bbe165a4a630597845c61279cf32dfbf02"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f88566144752999351725ac623471661c9d1cd8caa0134ff98cceeea181789f4"}, + {file = "mypy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61758fabd58ce4b0720ae1e2fea5cfd4431591d6d590b197775329264f86311d"}, + {file = "mypy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e49499be624dead83927e70c756970a0bc8240e9f769389cdf5714b0784ca6bf"}, + {file = "mypy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:571741dc4194b4f82d344b15e8837e8c5fcc462d66d076748142327626a1b6e9"}, + {file = "mypy-1.9.0-py3-none-any.whl", hash = "sha256:a260627a570559181a9ea5de61ac6297aa5af202f06fd7ab093ce74e7181e43e"}, + {file = "mypy-1.9.0.tar.gz", hash = "sha256:3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "openpyxl" +version = "3.1.2" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +optional = false +python-versions = ">=3.6" +files = [ + {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, + {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, +] + +[package.dependencies] +et-xmlfile = "*" + +[[package]] +name = "openpyxl-stubs" +version = "0.1.25" +description = "Type stubs for openpyxl" +optional = false +python-versions = "*" +files = [ + {file = "openpyxl-stubs-0.1.25.tar.gz", hash = "sha256:108b112df072f7645ca356eacdd5730b1bd986c67ae33366a4a13c6879c369e7"}, + {file = "openpyxl_stubs-0.1.25-py3-none-any.whl", hash = "sha256:db29f7804993b4a46b155fc4be45314c14538cb475b00591d8096e5af486abf1"}, +] + +[package.dependencies] +mypy = ">=0.720" +openpyxl = ">=3.0.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "packaging" +version = "24.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "platformdirs" +version = "4.2.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] + +[[package]] +name = "psycopg2-binary" +version = "2.9.9" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, +] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pylint" +version = "3.1.0" +description = "python code static checker" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "pylint-3.1.0-py3-none-any.whl", hash = "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74"}, + {file = "pylint-3.1.0.tar.gz", hash = "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23"}, +] + +[package.dependencies] +astroid = ">=3.1.0,<=3.2.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, +] +isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pylint-django" +version = "2.5.5" +description = "A Pylint plugin to help Pylint understand the Django web framework" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "pylint_django-2.5.5-py3-none-any.whl", hash = "sha256:5abd5c2228e0e5e2a4cb6d0b4fc1d1cef1e773d0be911412f4dd4fc1a1a440b7"}, + {file = "pylint_django-2.5.5.tar.gz", hash = "sha256:2f339e4bf55776958283395c5139c37700c91bd5ef1d8251ef6ac88b5abbba9b"}, +] + +[package.dependencies] +pylint = ">=2.0,<4" +pylint-plugin-utils = ">=0.8" + +[package.extras] +with-django = ["Django (>=2.2)"] + +[[package]] +name = "pylint-plugin-utils" +version = "0.8.2" +description = "Utilities and helpers for writing Pylint plugins" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "pylint_plugin_utils-0.8.2-py3-none-any.whl", hash = "sha256:ae11664737aa2effbf26f973a9e0b6779ab7106ec0adc5fe104b0907ca04e507"}, + {file = "pylint_plugin_utils-0.8.2.tar.gz", hash = "sha256:d3cebf68a38ba3fba23a873809155562571386d4c1b03e5b4c4cc26c3eee93e4"}, +] + +[package.dependencies] +pylint = ">=1.7" + +[[package]] +name = "pyopenssl" +version = "24.1.0" +description = "Python wrapper module around the OpenSSL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyOpenSSL-24.1.0-py3-none-any.whl", hash = "sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad"}, + {file = "pyOpenSSL-24.1.0.tar.gz", hash = "sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f"}, +] + +[package.dependencies] +cryptography = ">=41.0.5,<43" + +[package.extras] +docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx-rtd-theme"] +test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] + +[[package]] +name = "redis" +version = "5.0.3" +description = "Python client for Redis database and key-value store" +optional = false +python-versions = ">=3.7" +files = [ + {file = "redis-5.0.3-py3-none-any.whl", hash = "sha256:5da9b8fe9e1254293756c16c008e8620b3d15fcc6dde6babde9541850e72a32d"}, + {file = "redis-5.0.3.tar.gz", hash = "sha256:4973bae7444c0fbed64a06b87446f79361cb7e4ec1538c022d696ed7a5015580"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} + +[package.extras] +hiredis = ["hiredis (>=1.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "ruff" +version = "0.3.7" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0e8377cccb2f07abd25e84fc5b2cbe48eeb0fea9f1719cad7caedb061d70e5ce"}, + {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:15a4d1cc1e64e556fa0d67bfd388fed416b7f3b26d5d1c3e7d192c897e39ba4b"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d28bdf3d7dc71dd46929fafeec98ba89b7c3550c3f0978e36389b5631b793663"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:379b67d4f49774ba679593b232dcd90d9e10f04d96e3c8ce4a28037ae473f7bb"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c060aea8ad5ef21cdfbbe05475ab5104ce7827b639a78dd55383a6e9895b7c51"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ebf8f615dde968272d70502c083ebf963b6781aacd3079081e03b32adfe4d58a"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48098bd8f5c38897b03604f5428901b65e3c97d40b3952e38637b5404b739a2"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8a4fda219bf9024692b1bc68c9cff4b80507879ada8769dc7e985755d662ea"}, + {file = "ruff-0.3.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c44e0149f1d8b48c4d5c33d88c677a4aa22fd09b1683d6a7ff55b816b5d074f"}, + {file = "ruff-0.3.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3050ec0af72b709a62ecc2aca941b9cd479a7bf2b36cc4562f0033d688e44fa1"}, + {file = "ruff-0.3.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a29cc38e4c1ab00da18a3f6777f8b50099d73326981bb7d182e54a9a21bb4ff7"}, + {file = "ruff-0.3.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b15cc59c19edca917f51b1956637db47e200b0fc5e6e1878233d3a938384b0b"}, + {file = "ruff-0.3.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e491045781b1e38b72c91247cf4634f040f8d0cb3e6d3d64d38dcf43616650b4"}, + {file = "ruff-0.3.7-py3-none-win32.whl", hash = "sha256:bc931de87593d64fad3a22e201e55ad76271f1d5bfc44e1a1887edd0903c7d9f"}, + {file = "ruff-0.3.7-py3-none-win_amd64.whl", hash = "sha256:5ef0e501e1e39f35e03c2acb1d1238c595b8bb36cf7a170e7c1df1b73da00e74"}, + {file = "ruff-0.3.7-py3-none-win_arm64.whl", hash = "sha256:789e144f6dc7019d1f92a812891c645274ed08af6037d11fc65fcbc183b7d59f"}, + {file = "ruff-0.3.7.tar.gz", hash = "sha256:d5c1aebee5162c2226784800ae031f660c350e7a3402c4d1f8ea4e97e232e3ba"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "sqlparse" +version = "0.5.0" +description = "A non-validating SQL parser." +optional = false +python-versions = ">=3.8" +files = [ + {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, + {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, +] + +[package.extras] +dev = ["build", "hatch"] +doc = ["sphinx"] + +[[package]] +name = "tblib" +version = "3.0.0" +description = "Traceback serialization library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tblib-3.0.0-py3-none-any.whl", hash = "sha256:80a6c77e59b55e83911e1e607c649836a69c103963c5f28a46cbeef44acf8129"}, + {file = "tblib-3.0.0.tar.gz", hash = "sha256:93622790a0a29e04f0346458face1e144dc4d32f493714c6c3dff82a4adb77e6"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.4" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, + {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, +] + +[[package]] +name = "typeguard" +version = "4.2.1" +description = "Run-time type checker for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typeguard-4.2.1-py3-none-any.whl", hash = "sha256:7da3bd46e61f03e0852f8d251dcbdc2a336aa495d7daff01e092b55327796eb8"}, + {file = "typeguard-4.2.1.tar.gz", hash = "sha256:c556a1b95948230510070ca53fa0341fb0964611bd05d598d87fb52115d65fee"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["coverage[toml] (>=7)", "mypy (>=1.2.0)", "pytest (>=7)"] + +[[package]] +name = "types-pytz" +version = "2024.1.0.20240417" +description = "Typing stubs for pytz" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-pytz-2024.1.0.20240417.tar.gz", hash = "sha256:6810c8a1f68f21fdf0f4f374a432487c77645a0ac0b31de4bf4690cf21ad3981"}, + {file = "types_pytz-2024.1.0.20240417-py3-none-any.whl", hash = "sha256:8335d443310e2db7b74e007414e74c4f53b67452c0cb0d228ca359ccfba59659"}, +] + +[[package]] +name = "types-pyyaml" +version = "6.0.12.20240311" +description = "Typing stubs for PyYAML" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-PyYAML-6.0.12.20240311.tar.gz", hash = "sha256:a9e0f0f88dc835739b0c1ca51ee90d04ca2a897a71af79de9aec5f38cb0a5342"}, + {file = "types_PyYAML-6.0.12.20240311-py3-none-any.whl", hash = "sha256:b845b06a1c7e54b8e5b4c683043de0d9caf205e7434b3edc678ff2411979b8f6"}, +] + +[[package]] +name = "typing-extensions" +version = "4.11.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, +] + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "waitress" +version = "3.0.0" +description = "Waitress WSGI server" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "waitress-3.0.0-py3-none-any.whl", hash = "sha256:2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669"}, + {file = "waitress-3.0.0.tar.gz", hash = "sha256:005da479b04134cdd9dd602d1ee7c49d79de0537610d653674cc6cbde222b8a1"}, +] + +[package.extras] +docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.9)"] +testing = ["coverage (>=5.0)", "pytest", "pytest-cov"] + +[[package]] +name = "webob" +version = "1.8.7" +description = "WSGI request and response object" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +files = [ + {file = "WebOb-1.8.7-py2.py3-none-any.whl", hash = "sha256:73aae30359291c14fa3b956f8b5ca31960e420c28c1bec002547fb04928cf89b"}, + {file = "WebOb-1.8.7.tar.gz", hash = "sha256:b64ef5141be559cfade448f044fa45c2260351edcb6a8ef6b7e00c7dcef0c323"}, +] + +[package.extras] +docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes"] +testing = ["coverage", "pytest (>=3.1.0)", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "webtest" +version = "3.0.0" +description = "Helper to test WSGI applications" +optional = false +python-versions = ">=3.6, <4" +files = [ + {file = "WebTest-3.0.0-py3-none-any.whl", hash = "sha256:2a001a9efa40d2a7e5d9cd8d1527c75f41814eb6afce2c3d207402547b1e5ead"}, + {file = "WebTest-3.0.0.tar.gz", hash = "sha256:54bd969725838d9861a9fa27f8d971f79d275d94ae255f5c501f53bb6d9929eb"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +waitress = ">=0.8.5" +WebOb = ">=1.2" + +[package.extras] +docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.8)"] +tests = ["PasteDeploy", "WSGIProxy2", "coverage", "pyquery", "pytest", "pytest-cov"] + +[[package]] +name = "xlrd" +version = "2.0.1" +description = "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "xlrd-2.0.1-py2.py3-none-any.whl", hash = "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd"}, + {file = "xlrd-2.0.1.tar.gz", hash = "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88"}, +] + +[package.extras] +build = ["twine", "wheel"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "xlwt" +version = "1.3.0" +description = "Library to create spreadsheet files compatible with MS Excel 97/2000/XP/2003 XLS files, on any platform, with Python 2.6, 2.7, 3.3+" +optional = false +python-versions = "*" +files = [ + {file = "xlwt-1.3.0-py2.py3-none-any.whl", hash = "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e"}, + {file = "xlwt-1.3.0.tar.gz", hash = "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "7ba3f123763d13d619d3fcc5d5e945a17b6b456b7f1d0245457b418e0903c99c" From e1062c3dd91fa01f73ef1b98c1d3e6903139b1c9 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Wed, 17 Apr 2024 17:25:51 +0200 Subject: [PATCH 03/75] Possible setup with services Use nix run .#services to start postgres and redis and in another terminal run nix develop ./manage.py migrate ./manage.py run This doesn't compile scss yet, but the basic website shows up. --- .gitignore | 4 +-- flake.lock | 85 ++++++++++++++++++++++++++++++++++++++---------------- flake.nix | 83 +++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 122 insertions(+), 50 deletions(-) diff --git a/.gitignore b/.gitignore index 1f21105dc7..74c5931f79 100644 --- a/.gitignore +++ b/.gitignore @@ -56,5 +56,5 @@ todo # flake8 configuration setup.cfg -# User specific vagrant overrides (needs extra config) -.Vagrantfile.local +data/ +/result diff --git a/flake.lock b/flake.lock index 973273c8fa..0f012722f6 100644 --- a/flake.lock +++ b/flake.lock @@ -1,26 +1,26 @@ { "nodes": { - "flake-utils": { + "flake-parts": { "inputs": { - "systems": "systems" + "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "lastModified": 1712014858, + "narHash": "sha256-sB4SWl2lX95bExY2gMFG5HIzvva5AVMJd4Igm+GpZNw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "9126214d0a59633752a136528f5f3b9aa8565b7d", "type": "github" }, "original": { - "owner": "numtide", - "repo": "flake-utils", + "owner": "hercules-ci", + "repo": "flake-parts", "type": "github" } }, - "flake-utils_2": { + "flake-utils": { "inputs": { - "systems": "systems_2" + "systems": "systems" }, "locked": { "lastModified": 1705309234, @@ -73,14 +73,32 @@ "type": "github" } }, + "nixpkgs-lib": { + "locked": { + "dir": "lib", + "lastModified": 1711703276, + "narHash": "sha256-iMUFArF0WCatKK6RzfUJknjem0H9m4KgorO/p3Dopkk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d8fe5e6c92d0d190646fb9f1056741a229980089", + "type": "github" + }, + "original": { + "dir": "lib", + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "poetry2nix": { "inputs": { - "flake-utils": "flake-utils_2", + "flake-utils": "flake-utils", "nix-github-actions": "nix-github-actions", "nixpkgs": [ "nixpkgs" ], - "systems": "systems_3", + "systems": "systems_2", "treefmt-nix": "treefmt-nix" }, "locked": { @@ -97,29 +115,46 @@ "type": "github" } }, + "process-compose-flake": { + "locked": { + "lastModified": 1712911844, + "narHash": "sha256-act5Q5zSruTmwKMrZQeFAwWVxARAkYx96Ed423jDWFM=", + "owner": "Platonic-Systems", + "repo": "process-compose-flake", + "rev": "522b77b195d039a6fdb98d86447f9fba8a6efbce", + "type": "github" + }, + "original": { + "owner": "Platonic-Systems", + "repo": "process-compose-flake", + "type": "github" + } + }, "root": { "inputs": { - "flake-utils": "flake-utils", + "flake-parts": "flake-parts", "nixpkgs": "nixpkgs", - "poetry2nix": "poetry2nix" + "poetry2nix": "poetry2nix", + "process-compose-flake": "process-compose-flake", + "services-flake": "services-flake" } }, - "systems": { + "services-flake": { "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "lastModified": 1713065262, + "narHash": "sha256-r5gZ8sqk3BamCFEc+zaJJkcwEGLEDcOMgBU2A1mU+BA=", + "owner": "juspay", + "repo": "services-flake", + "rev": "4d363b6d22b5ee9763c2e94e72c13505849b9625", "type": "github" }, "original": { - "owner": "nix-systems", - "repo": "default", + "owner": "juspay", + "repo": "services-flake", "type": "github" } }, - "systems_2": { + "systems": { "locked": { "lastModified": 1681028828, "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", @@ -134,7 +169,7 @@ "type": "github" } }, - "systems_3": { + "systems_2": { "locked": { "lastModified": 1681028828, "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", diff --git a/flake.nix b/flake.nix index d909fa052f..2a6b704962 100644 --- a/flake.nix +++ b/flake.nix @@ -2,37 +2,74 @@ description = "EvaP"; inputs = { - flake-utils.url = "github:numtide/flake-utils"; nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; poetry2nix = { url = "github:nix-community/poetry2nix"; inputs.nixpkgs.follows = "nixpkgs"; }; + + flake-parts.url = "github:hercules-ci/flake-parts"; + process-compose-flake.url = "github:Platonic-Systems/process-compose-flake"; + services-flake.url = "github:juspay/services-flake"; }; - outputs = { self, nixpkgs, flake-utils, ... }@inputs: - flake-utils.lib.eachDefaultSystem (system: - let - # see https://github.com/nix-community/poetry2nix/tree/master#api for more functions and examples. - pkgs = nixpkgs.legacyPackages.${system}; - poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; - in - { - packages = { - evap = poetry2nix.mkPoetryApplication { - projectDir = self; - preferWheels = true; - overrides = poetry2nix.overrides.withDefaults (final: prev: { - # https://github.com/nix-community/poetry2nix/issues/1499 - django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; - }); + outputs = { self, nixpkgs, flake-parts, ... }@inputs: + flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ + inputs.process-compose-flake.flakeModule + ]; + systems = [ + "x86_64-linux" + ]; + perSystem = { config, system, ... }: + let + # see https://github.com/nix-community/poetry2nix/tree/master#api for more functions and examples. + pkgs = nixpkgs.legacyPackages.${system}; + inherit (pkgs) lib; + poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; + in + { + packages = { + evap = poetry2nix.mkPoetryApplication { + projectDir = self; + preferWheels = true; + overrides = poetry2nix.overrides.withDefaults (final: prev: { + # https://github.com/nix-community/poetry2nix/issues/1499 + django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; + }); + }; }; - default = self.packages.${system}.evap; - }; - devShells.default = pkgs.mkShell { - inputsFrom = [ self.packages.${system}.evap ]; - packages = [ pkgs.poetry ]; + # Start with `nix run .#services` + process-compose."services" = { + imports = [ + inputs.services-flake.processComposeModules.default + ]; + + services = { + redis."r1".enable = true; + postgres."pg1" = { + enable = true; + # initialDatabases = [ + # { name = "evap"; } + # ]; + initialScript.before = '' + CREATE USER evap; + ALTER USER evap WITH PASSWORD 'evap'; + CREATE DATABASE evap OWNER evap; + ''; + }; + }; + }; + + devShells = { + default = pkgs.mkShell { + inputsFrom = [ self.packages.${system}.evap ]; + packages = with pkgs; [ + poetry + ]; + }; + }; }; - }); + }; } From 87c261c78135a9116cd19873040da36f835b50f1 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 23 Apr 2024 01:07:04 +0200 Subject: [PATCH 04/75] possible instructions for readme --- nix-setup.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 nix-setup.md diff --git a/nix-setup.md b/nix-setup.md new file mode 100644 index 0000000000..874562bb2c --- /dev/null +++ b/nix-setup.md @@ -0,0 +1,58 @@ +# EvaP Nix Setup + +This document describes the experimental nix setup for EvaP. + +## Development Setup + +To develop EvaP, you will have to install [`git`](https://git-scm.com/downloads) and [`nix`](https://nixos.org/) (with support for nix flakes). + +If you are using Windows, we recommend that you [install the Windows Terminal](https://aka.ms/terminal) and set up the Windows Subsystem for Linux. +[Install WSL2](https://learn.microsoft.com/en-us/windows/wsl/install), start an Ubuntu VM, and [enable systemd support](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/). +Now, you can follow the Linux instructions to install git and nix. + +To install nix on your computer, we recommend that you use the [Determinate Nix Installer](https://install.determinate.systems/). +Alternatively, you can use a virtual machine or container, as long as it can run nix. For example, see this [example setup with `podman`](todo). + +Next, clone the EvaP repository using `git clone --recurse-submodules https://github.com/e-valuation/EvaP.git`. +When you are inside the `EvaP` directory, you can +- use `nix run .#services` to run the database system storing EvaP's data, and +- run `nix develop` to make all needed development tools available in your current shell session. + +You always need to enter the `nix develop` environment before you can use the `./manage.py` script. +For convenience, you can install [`direnv`](https://direnv.net/) and [`nix-direnv`](https://github.com/nix-community/nix-direnv) to automatically enter the `nix develop` environment. + +After your first setup, you should run `./manage.py first-time-setup`. +Finally, you can start EvaP by running `./manage.py run`. +Open your browser at http://localhost:8000/ and login with email evap@institution.example.com and password evap. + +# (wiki article with podman setup) + +You can use [`podman`](https://podman.io/) to start a container to develop EvaP. +The container will be isolated from the rest of your system, so that you do not need to install nix on your computer. + +Create a new file called `Containerfile` (TODO: should we just include this file in the repo?) with the following contents (adapted from https://github.com/DeterminateSystems/nix-installer/blob/04b07fa15e527f23cc4a3c0db0a1b3aaa0160dc0/README.md#in-a-container): +```Containerfile +FROM docker.io/ubuntu:latest +# TODO: fix a version? + +RUN apt-get update -y && apt-get install curl systemd -y + +RUN curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux \ + --extra-conf "sandbox = false" \ + --no-start-daemon \ + --no-confirm + +# TODO: add a new user? +# TODO: install direnv +# TODO: automatically start databases? + +WORKDIR /evap + +CMD [ "/bin/systemd" ] +``` + +Then, build an image with `podman build -t evap-image .` and create a container with `podman create --name evap-container -v /path/to/your/evap/directory:/evap -p 8000:8000 evap-image`. + +From now on, you can use the container whenever you want to work on EvaP. +Start the container with `podman start evap-container` and enter it with `podman exec -it evap-container /bin/bash`. +After entering the container, you should be able to run `nix develop`. From 1d775b3660b66c123523388e0826ea40132c82f8 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Sun, 16 Jun 2024 20:11:34 +0200 Subject: [PATCH 05/75] x --- flake.nix | 25 ++++++++++++++++++++++--- package.json | 2 ++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/flake.nix b/flake.nix index 2a6b704962..fa2f96cf0b 100644 --- a/flake.nix +++ b/flake.nix @@ -24,6 +24,7 @@ perSystem = { config, system, ... }: let # see https://github.com/nix-community/poetry2nix/tree/master#api for more functions and examples. + version = "2024-06"; pkgs = nixpkgs.legacyPackages.${system}; inherit (pkgs) lib; poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; @@ -38,6 +39,23 @@ django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; }); }; + + evapnode = + let + inherit (pkgs) importNpmLock; + in + pkgs.buildNpmPackage { + pname = "evap"; + inherit version; + src = ./.; + npmDeps = importNpmLock { + npmRoot = ./.; + }; + npmConfigHook = importNpmLock.npmConfigHook; + + dontNpmBuild = true; + PUPPETEER_SKIP_DOWNLOAD = "1"; + }; }; # Start with `nix run .#services` @@ -54,9 +72,9 @@ # { name = "evap"; } # ]; initialScript.before = '' - CREATE USER evap; - ALTER USER evap WITH PASSWORD 'evap'; - CREATE DATABASE evap OWNER evap; + CREATE USER evap; + ALTER USER evap WITH PASSWORD 'evap'; + CREATE DATABASE evap OWNER evap; ''; }; }; @@ -67,6 +85,7 @@ inputsFrom = [ self.packages.${system}.evap ]; packages = with pkgs; [ poetry + self.packages.${system}.evapnode ]; }; }; diff --git a/package.json b/package.json index e2606ad7ef..0b497cc90a 100644 --- a/package.json +++ b/package.json @@ -1,4 +1,6 @@ { + "name": "EvaP", + "version": "2024-06", "devDependencies": { "@types/bootstrap": "^5.2.6", "@types/jest": "^29.5.12", From 045c5696942ec1f9b0a5852d11f3be010dd57527 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 16 Jul 2024 01:10:14 +0200 Subject: [PATCH 06/75] make node inputs available in shell --- flake.nix | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index fa2f96cf0b..a81f93a524 100644 --- a/flake.nix +++ b/flake.nix @@ -82,10 +82,9 @@ devShells = { default = pkgs.mkShell { - inputsFrom = [ self.packages.${system}.evap ]; + inputsFrom = [ self.packages.${system}.evap self.packages.${system}.evapnode ]; packages = with pkgs; [ poetry - self.packages.${system}.evapnode ]; }; }; From b8369ff9f07e9f92627e94ca1f15436f4499a267 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 29 Jul 2024 18:38:34 +0200 Subject: [PATCH 07/75] Remove npm stuff for now, use more flake-parts niceties --- flake.nix | 41 +++++++++++------------------------------ 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/flake.nix b/flake.nix index a81f93a524..6615fd10e3 100644 --- a/flake.nix +++ b/flake.nix @@ -13,20 +13,14 @@ services-flake.url = "github:juspay/services-flake"; }; - outputs = { self, nixpkgs, flake-parts, ... }@inputs: + outputs = { self, flake-parts, ... }@inputs: flake-parts.lib.mkFlake { inherit inputs; } { imports = [ inputs.process-compose-flake.flakeModule ]; - systems = [ - "x86_64-linux" - ]; - perSystem = { config, system, ... }: + systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ]; + perSystem = { self', inputs', pkgs, system, ... }: let - # see https://github.com/nix-community/poetry2nix/tree/master#api for more functions and examples. - version = "2024-06"; - pkgs = nixpkgs.legacyPackages.${system}; - inherit (pkgs) lib; poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; in { @@ -39,23 +33,6 @@ django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; }); }; - - evapnode = - let - inherit (pkgs) importNpmLock; - in - pkgs.buildNpmPackage { - pname = "evap"; - inherit version; - src = ./.; - npmDeps = importNpmLock { - npmRoot = ./.; - }; - npmConfigHook = importNpmLock.npmConfigHook; - - dontNpmBuild = true; - PUPPETEER_SKIP_DOWNLOAD = "1"; - }; }; # Start with `nix run .#services` @@ -68,9 +45,6 @@ redis."r1".enable = true; postgres."pg1" = { enable = true; - # initialDatabases = [ - # { name = "evap"; } - # ]; initialScript.before = '' CREATE USER evap; ALTER USER evap WITH PASSWORD 'evap'; @@ -82,10 +56,17 @@ devShells = { default = pkgs.mkShell { - inputsFrom = [ self.packages.${system}.evap self.packages.${system}.evapnode ]; + inputsFrom = [ self'.packages.evap ]; packages = with pkgs; [ poetry + nodejs ]; + + env.PUPPETEER_SKIP_DOWNLOAD = 1; + + shellHook = '' + source "${self}/deployment/manage_autocompletion.sh" + ''; }; }; }; From 80b7fc7e9f829d21fff5c9a42605be96eb51ca73 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 30 Jul 2024 15:42:40 +0200 Subject: [PATCH 08/75] Add initialize-setup and clean-setup scripts --- deployment/localsettings.template.py | 2 +- flake.nix | 51 ++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/deployment/localsettings.template.py b/deployment/localsettings.template.py index 968771793f..56cceb4143 100644 --- a/deployment/localsettings.template.py +++ b/deployment/localsettings.template.py @@ -15,7 +15,7 @@ } # Make this unique, and don't share it with anybody. -SECRET_KEY = "${SECRET_KEY}" # nosec +SECRET_KEY = "$SECRET_KEY" # nosec # Make apache work when DEBUG == False ALLOWED_HOSTS = ["localhost", "127.0.0.1"] diff --git a/flake.nix b/flake.nix index 6615fd10e3..948d1b1348 100644 --- a/flake.nix +++ b/flake.nix @@ -33,6 +33,7 @@ django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; }); }; + }; # Start with `nix run .#services` @@ -48,6 +49,7 @@ initialScript.before = '' CREATE USER evap; ALTER USER evap WITH PASSWORD 'evap'; + ALTER USER evap CREATEDB; CREATE DATABASE evap OWNER evap; ''; }; @@ -55,19 +57,46 @@ }; devShells = { - default = pkgs.mkShell { - inputsFrom = [ self'.packages.evap ]; - packages = with pkgs; [ - poetry - nodejs - ]; + default = + let + clean-setup = pkgs.writeShellScriptBin "clean-setup" '' + read -p "Delete node_modules/ and data/? [y/N] " + [[ "$REPLY" =~ ^[Yy]$ ]] || exit 1 + set -ex + rm -rf node_modules/ data/ + ''; - env.PUPPETEER_SKIP_DOWNLOAD = 1; + initialize-setup = pkgs.writeShellScriptBin "initialize-setup" '' + set -ex - shellHook = '' - source "${self}/deployment/manage_autocompletion.sh" - ''; - }; + npm ci + cp deployment/localsettings.template.py evap/localsettings.py + sed -i -e "s/\$SECRET_KEY/$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)/" evap/localsettings.py + git submodule update --init + ./manage.py migrate --noinput + ./manage.py collectstatic --noinput + ./manage.py compilemessages --locale de + ./manage.py loaddata test_data.json + ./manage.py refresh_results_cache + ''; + in + pkgs.mkShell { + inputsFrom = [ self'.packages.evap ]; + packages = with pkgs; [ + poetry + nodejs + + clean-setup + initialize-setup + ]; + + env.PUPPETEER_SKIP_DOWNLOAD = 1; + + shellHook = '' + # TODO: doesn't work with other shells from direnv + source "${self}/deployment/manage_autocompletion.sh" + ''; + }; }; }; }; From 90eb21cf917c1ac33986672b18f6d42c1679129e Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 12 Aug 2024 20:00:31 +0200 Subject: [PATCH 09/75] add overrides --- .gitignore | 1 + flake.lock | 14 ++++++ flake.nix | 137 ++++++++++++++++++++++++++------------------------ overrides.nix | 1 + 4 files changed, 88 insertions(+), 65 deletions(-) create mode 100644 overrides.nix diff --git a/.gitignore b/.gitignore index 74c5931f79..f07a22c49a 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,4 @@ setup.cfg data/ /result +overrides.nix diff --git a/flake.lock b/flake.lock index 0f012722f6..9f249c7ba4 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,18 @@ { "nodes": { + "custom-overrides": { + "flake": false, + "locked": { + "lastModified": 1, + "narHash": "sha256-du/RhhwV3yZy42UcBN9qAG7KRJnu24GZt1Wccui1R8s=", + "path": "overrides.nix", + "type": "path" + }, + "original": { + "path": "overrides.nix", + "type": "path" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" @@ -132,6 +145,7 @@ }, "root": { "inputs": { + "custom-overrides": "custom-overrides", "flake-parts": "flake-parts", "nixpkgs": "nixpkgs", "poetry2nix": "poetry2nix", diff --git a/flake.nix b/flake.nix index 948d1b1348..8dd8667e29 100644 --- a/flake.nix +++ b/flake.nix @@ -11,6 +11,11 @@ flake-parts.url = "github:hercules-ci/flake-parts"; process-compose-flake.url = "github:Platonic-Systems/process-compose-flake"; services-flake.url = "github:juspay/services-flake"; + + custom-overrides = { + url = "path:overrides.nix"; + flake = false; + }; }; outputs = { self, flake-parts, ... }@inputs: @@ -22,82 +27,84 @@ perSystem = { self', inputs', pkgs, system, ... }: let poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; - in - { - packages = { - evap = poetry2nix.mkPoetryApplication { - projectDir = self; - preferWheels = true; - overrides = poetry2nix.overrides.withDefaults (final: prev: { - # https://github.com/nix-community/poetry2nix/issues/1499 - django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; - }); - }; + result = { + packages = { + evap = poetry2nix.mkPoetryApplication { + projectDir = self; + preferWheels = true; + overrides = poetry2nix.overrides.withDefaults (final: prev: { + # https://github.com/nix-community/poetry2nix/issues/1499 + django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; + }); + }; - }; + }; - # Start with `nix run .#services` - process-compose."services" = { - imports = [ - inputs.services-flake.processComposeModules.default - ]; + # Start with `nix run .#services` + process-compose."services" = { + imports = [ + inputs.services-flake.processComposeModules.default + ]; - services = { - redis."r1".enable = true; - postgres."pg1" = { - enable = true; - initialScript.before = '' - CREATE USER evap; - ALTER USER evap WITH PASSWORD 'evap'; - ALTER USER evap CREATEDB; - CREATE DATABASE evap OWNER evap; - ''; + services = { + redis."r1".enable = true; + postgres."pg1" = { + enable = true; + initialScript.before = '' + CREATE USER evap; + ALTER USER evap WITH PASSWORD 'evap'; + ALTER USER evap CREATEDB; + CREATE DATABASE evap OWNER evap; + ''; + }; }; }; - }; - devShells = { - default = - let - clean-setup = pkgs.writeShellScriptBin "clean-setup" '' - read -p "Delete node_modules/ and data/? [y/N] " - [[ "$REPLY" =~ ^[Yy]$ ]] || exit 1 - set -ex - rm -rf node_modules/ data/ - ''; + devShells = { + default = + let + clean-setup = pkgs.writeShellScriptBin "clean-setup" '' + read -p "Delete node_modules/ and data/? [y/N] " + [[ "$REPLY" =~ ^[Yy]$ ]] || exit 1 + set -ex + rm -rf node_modules/ data/ + ''; - initialize-setup = pkgs.writeShellScriptBin "initialize-setup" '' - set -ex + initialize-setup = pkgs.writeShellScriptBin "initialize-setup" '' + set -ex - npm ci - cp deployment/localsettings.template.py evap/localsettings.py - sed -i -e "s/\$SECRET_KEY/$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)/" evap/localsettings.py - git submodule update --init - ./manage.py migrate --noinput - ./manage.py collectstatic --noinput - ./manage.py compilemessages --locale de - ./manage.py loaddata test_data.json - ./manage.py refresh_results_cache - ''; - in - pkgs.mkShell { - inputsFrom = [ self'.packages.evap ]; - packages = with pkgs; [ - poetry - nodejs + npm ci + cp deployment/localsettings.template.py evap/localsettings.py + sed -i -e "s/\$SECRET_KEY/$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)/" evap/localsettings.py + git submodule update --init + ./manage.py migrate --noinput + ./manage.py collectstatic --noinput + ./manage.py compilemessages --locale de + ./manage.py loaddata test_data.json + ./manage.py refresh_results_cache + ''; + in + pkgs.mkShell { + inputsFrom = [ self'.packages.evap ]; + packages = with pkgs; [ + poetry + nodejs - clean-setup - initialize-setup - ]; + clean-setup + initialize-setup + ]; - env.PUPPETEER_SKIP_DOWNLOAD = 1; + env.PUPPETEER_SKIP_DOWNLOAD = 1; - shellHook = '' - # TODO: doesn't work with other shells from direnv - source "${self}/deployment/manage_autocompletion.sh" - ''; - }; + shellHook = '' + # TODO: doesn't work with other shells from direnv + source "${self}/deployment/manage_autocompletion.sh" + ''; + }; + }; }; - }; + final = result // (import inputs.custom-overrides final result); + in + final; }; } diff --git a/overrides.nix b/overrides.nix new file mode 100644 index 0000000000..0e2fe68a06 --- /dev/null +++ b/overrides.nix @@ -0,0 +1 @@ +final: prev: {} From 928b8d119226b90a7fd8d3a9b89762ce5d81c615 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 12 Aug 2024 22:05:09 +0200 Subject: [PATCH 10/75] use packages maybe --- .gitignore | 2 +- flake.lock | 14 ------- flake.nix | 108 ++++++++++++-------------------------------------- nix/evap.nix | 10 +++++ nix/shell.nix | 41 +++++++++++++++++++ 5 files changed, 78 insertions(+), 97 deletions(-) create mode 100644 nix/evap.nix create mode 100644 nix/shell.nix diff --git a/.gitignore b/.gitignore index f07a22c49a..e2ed542267 100644 --- a/.gitignore +++ b/.gitignore @@ -58,4 +58,4 @@ setup.cfg data/ /result -overrides.nix +my-shell.nix diff --git a/flake.lock b/flake.lock index 9f249c7ba4..0f012722f6 100644 --- a/flake.lock +++ b/flake.lock @@ -1,18 +1,5 @@ { "nodes": { - "custom-overrides": { - "flake": false, - "locked": { - "lastModified": 1, - "narHash": "sha256-du/RhhwV3yZy42UcBN9qAG7KRJnu24GZt1Wccui1R8s=", - "path": "overrides.nix", - "type": "path" - }, - "original": { - "path": "overrides.nix", - "type": "path" - } - }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" @@ -145,7 +132,6 @@ }, "root": { "inputs": { - "custom-overrides": "custom-overrides", "flake-parts": "flake-parts", "nixpkgs": "nixpkgs", "poetry2nix": "poetry2nix", diff --git a/flake.nix b/flake.nix index 8dd8667e29..25fe6a962d 100644 --- a/flake.nix +++ b/flake.nix @@ -11,11 +11,6 @@ flake-parts.url = "github:hercules-ci/flake-parts"; process-compose-flake.url = "github:Platonic-Systems/process-compose-flake"; services-flake.url = "github:juspay/services-flake"; - - custom-overrides = { - url = "path:overrides.nix"; - flake = false; - }; }; outputs = { self, flake-parts, ... }@inputs: @@ -25,86 +20,35 @@ ]; systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ]; perSystem = { self', inputs', pkgs, system, ... }: - let - poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; - result = { - packages = { - evap = poetry2nix.mkPoetryApplication { - projectDir = self; - preferWheels = true; - overrides = poetry2nix.overrides.withDefaults (final: prev: { - # https://github.com/nix-community/poetry2nix/issues/1499 - django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; - }); - }; - - }; - - # Start with `nix run .#services` - process-compose."services" = { - imports = [ - inputs.services-flake.processComposeModules.default - ]; + { + packages.evap = pkgs.callPackage ./nix/evap.nix { + poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; + projectDir = self; + }; + devShells.default = pkgs.callPackage ./nix/shell.nix { + projectDir = self; + inherit (self'.packages) evap; + }; - services = { - redis."r1".enable = true; - postgres."pg1" = { - enable = true; - initialScript.before = '' - CREATE USER evap; - ALTER USER evap WITH PASSWORD 'evap'; - ALTER USER evap CREATEDB; - CREATE DATABASE evap OWNER evap; - ''; - }; + # Start with `nix run .#services` + process-compose."services" = { + imports = [ + inputs.services-flake.processComposeModules.default + ]; + + services = { + redis."r1".enable = true; + postgres."pg1" = { + enable = true; + initialScript.before = '' + CREATE USER evap; + ALTER USER evap WITH PASSWORD 'evap'; + ALTER USER evap CREATEDB; + CREATE DATABASE evap OWNER evap; + ''; }; }; - - devShells = { - default = - let - clean-setup = pkgs.writeShellScriptBin "clean-setup" '' - read -p "Delete node_modules/ and data/? [y/N] " - [[ "$REPLY" =~ ^[Yy]$ ]] || exit 1 - set -ex - rm -rf node_modules/ data/ - ''; - - initialize-setup = pkgs.writeShellScriptBin "initialize-setup" '' - set -ex - - npm ci - cp deployment/localsettings.template.py evap/localsettings.py - sed -i -e "s/\$SECRET_KEY/$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)/" evap/localsettings.py - git submodule update --init - ./manage.py migrate --noinput - ./manage.py collectstatic --noinput - ./manage.py compilemessages --locale de - ./manage.py loaddata test_data.json - ./manage.py refresh_results_cache - ''; - in - pkgs.mkShell { - inputsFrom = [ self'.packages.evap ]; - packages = with pkgs; [ - poetry - nodejs - - clean-setup - initialize-setup - ]; - - env.PUPPETEER_SKIP_DOWNLOAD = 1; - - shellHook = '' - # TODO: doesn't work with other shells from direnv - source "${self}/deployment/manage_autocompletion.sh" - ''; - }; - }; }; - final = result // (import inputs.custom-overrides final result); - in - final; + }; }; } diff --git a/nix/evap.nix b/nix/evap.nix new file mode 100644 index 0000000000..7f7a9aa23c --- /dev/null +++ b/nix/evap.nix @@ -0,0 +1,10 @@ +{ poetry2nix, projectDir, ... }: + +poetry2nix.mkPoetryApplication { + inherit projectDir; + preferWheels = true; + overrides = poetry2nix.overrides.withDefaults (final: prev: { + # https://github.com/nix-community/poetry2nix/issues/1499 + django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; + }); +} diff --git a/nix/shell.nix b/nix/shell.nix new file mode 100644 index 0000000000..56b9be175f --- /dev/null +++ b/nix/shell.nix @@ -0,0 +1,41 @@ +{ pkgs, evap, projectDir, ... }: + +let + clean-setup = pkgs.writeShellScriptBin "clean-setup" '' + read -p "Delete node_modules/ and data/? [y/N] " + [[ "$REPLY" =~ ^[Yy]$ ]] || exit 1 + set -ex + rm -rf node_modules/ data/ + ''; + + initialize-setup = pkgs.writeShellScriptBin "initialize-setup" '' + set -ex + + npm ci + cp deployment/localsettings.template.py evap/localsettings.py + sed -i -e "s/\$SECRET_KEY/$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)/" evap/localsettings.py + git submodule update --init + ./manage.py migrate --noinput + ./manage.py collectstatic --noinput + ./manage.py compilemessages --locale de + ./manage.py loaddata test_data.json + ./manage.py refresh_results_cache + ''; +in +pkgs.mkShell { + inputsFrom = [ evap ]; + packages = with pkgs; [ + poetry + nodejs + + clean-setup + initialize-setup + ]; + + env.PUPPETEER_SKIP_DOWNLOAD = 1; + + shellHook = '' + # TODO: doesn't work with other shells from direnv + source "${projectDir}/deployment/manage_autocompletion.sh" + ''; +} From 3ad546b9cda6ae035087cc3f1213e98c275cae65 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 12 Aug 2024 23:56:12 +0200 Subject: [PATCH 11/75] Add instructions for custom shells --- .gitignore | 2 +- flake.nix | 15 +++++++++++++-- nix-setup.md | 29 +++++++++++++++++++++++++++++ nix/shell.nix | 4 ++-- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index e2ed542267..32fd4965bf 100644 --- a/.gitignore +++ b/.gitignore @@ -58,4 +58,4 @@ setup.cfg data/ /result -my-shell.nix +custom-nix/ diff --git a/flake.nix b/flake.nix index 25fe6a962d..39c8f306b7 100644 --- a/flake.nix +++ b/flake.nix @@ -20,13 +20,24 @@ ]; systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ]; perSystem = { self', inputs', pkgs, system, ... }: + let + fs = pkgs.lib.fileset; + projectDir = fs.toSource { + root = ./.; + fileset = fs.difference ./. (fs.unions [ + (fs.maybeMissing ./result) + (fs.maybeMissing ./custom-nix) + ./flake.lock + ]); + }; + in { packages.evap = pkgs.callPackage ./nix/evap.nix { poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; - projectDir = self; + inherit projectDir; }; devShells.default = pkgs.callPackage ./nix/shell.nix { - projectDir = self; + inherit projectDir; inherit (self'.packages) evap; }; diff --git a/nix-setup.md b/nix-setup.md index 874562bb2c..d8a8397baa 100644 --- a/nix-setup.md +++ b/nix-setup.md @@ -25,6 +25,35 @@ After your first setup, you should run `./manage.py first-time-setup`. Finally, you can start EvaP by running `./manage.py run`. Open your browser at http://localhost:8000/ and login with email evap@institution.example.com and password evap. +### Custom Development Shell + +If you want to do some additional configuration to the development environment, we recommend the following procedure: + +1. Create `custom-nix/flake.nix` with something like the following: + ```nix + { + description = "Evap Custom Config"; + + inputs.evap.url = "path:.."; + + outputs = { evap, ... }: + let + system = "x86_64-linux"; + pkgs = import evap.inputs.nixpkgs { inherit system; }; + in + { + devShells.${system}.default = evap.devShells.${system}.default.override { + extraPackages = with pkgs; [ hello ]; + }; + }; + } + ``` +2. Run `nix flake lock` inside the `custom-nix` directory. +3. Back in the root directory, run `git add --intent-to-add --force custom-nix/flake.nix custom-nix/flake.lock`. +4. Run `git update-index --assume-unchanged custom-nix/flake.nix custom-nix/flake.lock`. + +Now you can use `./custom-nix` as your shell, for example with `nix develop ./custom-nix`. Make sure to regularly update the referenced version of the main flake, for example by passing `--update-input evap` to `nix develop` (or with `use flake ./custom-nix --update-input evap` in your `.envrc`). + # (wiki article with podman setup) You can use [`podman`](https://podman.io/) to start a container to develop EvaP. diff --git a/nix/shell.nix b/nix/shell.nix index 56b9be175f..0c2b70800f 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -1,4 +1,4 @@ -{ pkgs, evap, projectDir, ... }: +{ pkgs, evap, projectDir, extraPackages ? [ ], ... }: let clean-setup = pkgs.writeShellScriptBin "clean-setup" '' @@ -30,7 +30,7 @@ pkgs.mkShell { clean-setup initialize-setup - ]; + ] ++ extraPackages; env.PUPPETEER_SKIP_DOWNLOAD = 1; From 17ba4b8050e7bad3dc2dacd12d77100a9fa18390 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 12 Aug 2024 23:56:48 +0200 Subject: [PATCH 12/75] Don't track .envrc --- .envrc | 1 - .gitignore | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 .envrc diff --git a/.envrc b/.envrc deleted file mode 100644 index 3550a30f2d..0000000000 --- a/.envrc +++ /dev/null @@ -1 +0,0 @@ -use flake diff --git a/.gitignore b/.gitignore index 32fd4965bf..ad80202911 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,4 @@ setup.cfg data/ /result custom-nix/ +.envrc From f9985ec7cf5d3b1badfd187f4e26975515c65a1a Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Fri, 23 Aug 2024 20:33:09 +0200 Subject: [PATCH 13/75] Simplify, I guess people should just edit `flake.nix` for extra packages --- flake.nix | 61 ++++++++++++++++++++------------------------------- nix/shell.nix | 7 +----- 2 files changed, 25 insertions(+), 43 deletions(-) diff --git a/flake.nix b/flake.nix index 39c8f306b7..82cd0d054d 100644 --- a/flake.nix +++ b/flake.nix @@ -19,47 +19,34 @@ inputs.process-compose-flake.flakeModule ]; systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ]; - perSystem = { self', inputs', pkgs, system, ... }: - let - fs = pkgs.lib.fileset; - projectDir = fs.toSource { - root = ./.; - fileset = fs.difference ./. (fs.unions [ - (fs.maybeMissing ./result) - (fs.maybeMissing ./custom-nix) - ./flake.lock - ]); - }; - in - { - packages.evap = pkgs.callPackage ./nix/evap.nix { - poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; - inherit projectDir; - }; - devShells.default = pkgs.callPackage ./nix/shell.nix { - inherit projectDir; - inherit (self'.packages) evap; - }; + perSystem = { self', inputs', pkgs, system, ... }: { + packages.evap = pkgs.callPackage ./nix/evap.nix { + poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; + projectDir = self; + }; + devShells.default = pkgs.callPackage ./nix/shell.nix { + inherit (self'.packages) evap; + }; - # Start with `nix run .#services` - process-compose."services" = { - imports = [ - inputs.services-flake.processComposeModules.default - ]; + # Start with `nix run .#services` + process-compose."services" = { + imports = [ + inputs.services-flake.processComposeModules.default + ]; - services = { - redis."r1".enable = true; - postgres."pg1" = { - enable = true; - initialScript.before = '' - CREATE USER evap; - ALTER USER evap WITH PASSWORD 'evap'; - ALTER USER evap CREATEDB; - CREATE DATABASE evap OWNER evap; - ''; - }; + services = { + redis."r1".enable = true; + postgres."pg1" = { + enable = true; + initialScript.before = '' + CREATE USER evap; + ALTER USER evap WITH PASSWORD 'evap'; + ALTER USER evap CREATEDB; + CREATE DATABASE evap OWNER evap; + ''; }; }; }; + }; }; } diff --git a/nix/shell.nix b/nix/shell.nix index 0c2b70800f..81cbebf479 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -1,4 +1,4 @@ -{ pkgs, evap, projectDir, extraPackages ? [ ], ... }: +{ pkgs, evap, extraPackages ? [ ], ... }: let clean-setup = pkgs.writeShellScriptBin "clean-setup" '' @@ -33,9 +33,4 @@ pkgs.mkShell { ] ++ extraPackages; env.PUPPETEER_SKIP_DOWNLOAD = 1; - - shellHook = '' - # TODO: doesn't work with other shells from direnv - source "${projectDir}/deployment/manage_autocompletion.sh" - ''; } From b4743a9ab96185702e7e18f28a84940819f4957e Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Fri, 23 Aug 2024 21:08:34 +0200 Subject: [PATCH 14/75] document more --- nix-setup.md | 69 +++++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/nix-setup.md b/nix-setup.md index d8a8397baa..8213d300be 100644 --- a/nix-setup.md +++ b/nix-setup.md @@ -4,7 +4,7 @@ This document describes the experimental nix setup for EvaP. ## Development Setup -To develop EvaP, you will have to install [`git`](https://git-scm.com/downloads) and [`nix`](https://nixos.org/) (with support for nix flakes). +To develop EvaP, you will have to install [`git`](https://git-scm.com/downloads) and [`nix`](https://nixos.org/) with support for nix flakes. If you are using Windows, we recommend that you [install the Windows Terminal](https://aka.ms/terminal) and set up the Windows Subsystem for Linux. [Install WSL2](https://learn.microsoft.com/en-us/windows/wsl/install), start an Ubuntu VM, and [enable systemd support](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/). @@ -18,43 +18,52 @@ When you are inside the `EvaP` directory, you can - use `nix run .#services` to run the database system storing EvaP's data, and - run `nix develop` to make all needed development tools available in your current shell session. -You always need to enter the `nix develop` environment before you can use the `./manage.py` script. -For convenience, you can install [`direnv`](https://direnv.net/) and [`nix-direnv`](https://github.com/nix-community/nix-direnv) to automatically enter the `nix develop` environment. +To initialize the database and perform additional setup steps, you need to run the `initialize-setup` command that is available in the `nix develop` environment. +You will only need to perform this step once. -After your first setup, you should run `./manage.py first-time-setup`. -Finally, you can start EvaP by running `./manage.py run`. -Open your browser at http://localhost:8000/ and login with email evap@institution.example.com and password evap. +You can start EvaP by running `./manage.py run`. +Open your browser at http://localhost:8000/ and login with email `evap@institution.example.com` and password `evap`. -### Custom Development Shell +For additional tips and tricks around the development setup, see the dedicated wiki page. -If you want to do some additional configuration to the development environment, we recommend the following procedure: +# Optimizing the Development Environment -1. Create `custom-nix/flake.nix` with something like the following: - ```nix - { - description = "Evap Custom Config"; +This page contains various tips and tricks around the development setup. - inputs.evap.url = "path:.."; +## Automatic Activation - outputs = { evap, ... }: - let - system = "x86_64-linux"; - pkgs = import evap.inputs.nixpkgs { inherit system; }; - in - { - devShells.${system}.default = evap.devShells.${system}.default.override { - extraPackages = with pkgs; [ hello ]; - }; - }; - } - ``` -2. Run `nix flake lock` inside the `custom-nix` directory. -3. Back in the root directory, run `git add --intent-to-add --force custom-nix/flake.nix custom-nix/flake.lock`. -4. Run `git update-index --assume-unchanged custom-nix/flake.nix custom-nix/flake.lock`. +To automatically activate the `nix develop` environment when entering the `EvaP` directory, you can install [`direnv`](https://direnv.net/) and [`nix-direnv`](https://github.com/nix-community/nix-direnv). +Afterwards, create the file `.envrc` with the following contents: +``` +use flake +``` + +## Shell Completions + +The file `deployment/manage_autocompletion.sh` contains bash completions (tab completions) for the `./manage.py` script. +To activate them, use `source deployment/manage_autocompletion.sh`. +You can also do this in your `.envrc` file (note that the completions only work for `bash` though). + +## Extra Packages + +To install additional packages in the `nix develop` environment, edit the `devShells` part in `flake.nix` like so: + +```nix +devShells.default = pkgs.callPackage ./nix/shell.nix { + inherit (self'.packages) evap; + extraPackages = with pkgs; [ hello asciiquarium ]; # <--- added line here +}; +``` + +Find the packages you are looking for at https://search.nixos.org/packages. +Make sure to not include these changes in your git commits. +You can use `git update-index --assume-unchanged`, if you know what you are doing. + +## Clean Setup -Now you can use `./custom-nix` as your shell, for example with `nix develop ./custom-nix`. Make sure to regularly update the referenced version of the main flake, for example by passing `--update-input evap` to `nix develop` (or with `use flake ./custom-nix --update-input evap` in your `.envrc`). +To remove the directories created by the `initialize-setup` command, use the `clean-setup` command. -# (wiki article with podman setup) +## Development Container with Podman You can use [`podman`](https://podman.io/) to start a container to develop EvaP. The container will be isolated from the rest of your system, so that you do not need to install nix on your computer. From b55c3b95cc7ad9e882e3deeb25fbca85abf45fa5 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Sat, 24 Aug 2024 12:28:06 +0200 Subject: [PATCH 15/75] Split `nix-setup.md` into `README.md` and `nix/tricks.md` --- .gitignore | 5 ++--- README.md | 37 +++++++++++++++-------------------- nix-setup.md => nix/tricks.md | 28 -------------------------- 3 files changed, 18 insertions(+), 52 deletions(-) rename nix-setup.md => nix/tricks.md (61%) diff --git a/.gitignore b/.gitignore index ad80202911..aed88e7f2f 100644 --- a/.gitignore +++ b/.gitignore @@ -56,7 +56,6 @@ todo # flake8 configuration setup.cfg -data/ +/data/ /result -custom-nix/ -.envrc +/.envrc diff --git a/README.md b/README.md index 108b43f0c1..2f1efb16ca 100644 --- a/README.md +++ b/README.md @@ -11,34 +11,29 @@ EvaP is the course evaluation system used internally at Hasso Plattner Institute For the documentation, please see our [wiki](https://github.com/e-valuation/EvaP/wiki). +## Development Setup -## Installation (for Development) +To develop EvaP, you will have to install [`git`](https://git-scm.com/downloads) and [`nix`](https://nixos.org/) with support for nix flakes. -The easiest setup using [Vagrant](https://www.vagrantup.com) is shown here. +If you are using Windows, we recommend that you [install the Windows Terminal](https://aka.ms/terminal) and set up the Windows Subsystem for Linux. +[Install WSL2](https://learn.microsoft.com/en-us/windows/wsl/install), start an Ubuntu VM, and [enable systemd support](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/). +Now, you can follow the Linux instructions to install git and nix. -1. Install [git](https://git-scm.com/downloads), [Vagrant](https://www.vagrantup.com/downloads.html), and one of [VirtualBox](https://www.virtualbox.org/wiki/Downloads) (recommended) or [Docker](https://docs.docker.com/engine/install/) (for ARM systems). +To install nix on your computer, we recommend that you use the [Determinate Nix Installer](https://install.determinate.systems/). +Alternatively, you can use a virtual machine or container, as long as it can run nix. For example, see this [example setup with `podman`](./nix/tricks.md#development-container-with-podman). -2. Run the following commands on the command line to clone the repository, create the Vagrant VM and run the Django development server. - * If you are familiar with the fork-based open source workflow, create a fork and clone that (using SSH if you prefer that). +Next, clone the EvaP repository using `git clone --recurse-submodules https://github.com/e-valuation/EvaP.git`. +When you are inside the `EvaP` directory, you can +- use `nix run .#services` to run the database system storing EvaP's data, and +- run `nix develop` to make all needed development tools available in your current shell session. - * Windows users: We have observed [weird](https://www.github.com/git-for-windows/git/issues/4705) [behavior](https://www.github.com/git-for-windows/git/issues/4704) with SSH in Git Bash on Windows and thus recommend using PowerShell instead. +To initialize the database and perform additional setup steps, you need to run the `initialize-setup` command that is available in the `nix develop` environment. +You will only need to perform this step once. - * To use Docker, replace `vagrant up` with `vagrant up --provider docker && vagrant provision`. +You can start EvaP by running `./manage.py run`. +Open your browser at http://localhost:8000/ and login with email `evap@institution.example.com` and password `evap`. - ```bash - git clone --recurse-submodules https://github.com/e-valuation/EvaP.git - cd EvaP - vagrant up - vagrant ssh - ``` - and, after the last command opened an SSH session in the development machine: - ```bash - ./manage.py run - ``` - -3. Open your browser at http://localhost:8000/ and login with email `evap@institution.example.com` and password `evap`. - -That's it! +For additional tips and tricks around the development setup, see [`nix/tricks.md`](./nix/tricks.md). ## Contributing diff --git a/nix-setup.md b/nix/tricks.md similarity index 61% rename from nix-setup.md rename to nix/tricks.md index 8213d300be..2fad78bc2d 100644 --- a/nix-setup.md +++ b/nix/tricks.md @@ -1,31 +1,3 @@ -# EvaP Nix Setup - -This document describes the experimental nix setup for EvaP. - -## Development Setup - -To develop EvaP, you will have to install [`git`](https://git-scm.com/downloads) and [`nix`](https://nixos.org/) with support for nix flakes. - -If you are using Windows, we recommend that you [install the Windows Terminal](https://aka.ms/terminal) and set up the Windows Subsystem for Linux. -[Install WSL2](https://learn.microsoft.com/en-us/windows/wsl/install), start an Ubuntu VM, and [enable systemd support](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/). -Now, you can follow the Linux instructions to install git and nix. - -To install nix on your computer, we recommend that you use the [Determinate Nix Installer](https://install.determinate.systems/). -Alternatively, you can use a virtual machine or container, as long as it can run nix. For example, see this [example setup with `podman`](todo). - -Next, clone the EvaP repository using `git clone --recurse-submodules https://github.com/e-valuation/EvaP.git`. -When you are inside the `EvaP` directory, you can -- use `nix run .#services` to run the database system storing EvaP's data, and -- run `nix develop` to make all needed development tools available in your current shell session. - -To initialize the database and perform additional setup steps, you need to run the `initialize-setup` command that is available in the `nix develop` environment. -You will only need to perform this step once. - -You can start EvaP by running `./manage.py run`. -Open your browser at http://localhost:8000/ and login with email `evap@institution.example.com` and password `evap`. - -For additional tips and tricks around the development setup, see the dedicated wiki page. - # Optimizing the Development Environment This page contains various tips and tricks around the development setup. From 0da43c25bddafd29c65d4bb7c9d641aaa22cc2cc Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Sat, 24 Aug 2024 15:14:07 +0200 Subject: [PATCH 16/75] Work on podman example --- .gitignore | 1 + nix/tricks.md | 26 ++++++++++++++++++++------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index aed88e7f2f..dbf94aaa8c 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,4 @@ setup.cfg /data/ /result /.envrc +Containerfile diff --git a/nix/tricks.md b/nix/tricks.md index 2fad78bc2d..7bc5dd64fe 100644 --- a/nix/tricks.md +++ b/nix/tricks.md @@ -43,26 +43,40 @@ The container will be isolated from the rest of your system, so that you do not Create a new file called `Containerfile` (TODO: should we just include this file in the repo?) with the following contents (adapted from https://github.com/DeterminateSystems/nix-installer/blob/04b07fa15e527f23cc4a3c0db0a1b3aaa0160dc0/README.md#in-a-container): ```Containerfile FROM docker.io/ubuntu:latest -# TODO: fix a version? -RUN apt-get update -y && apt-get install curl systemd -y +RUN apt-get update -y && apt-get install -y curl systemd direnv RUN curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux \ --extra-conf "sandbox = false" \ --no-start-daemon \ --no-confirm -# TODO: add a new user? -# TODO: install direnv # TODO: automatically start databases? +RUN groupadd --gid 1001 evap && useradd --uid 1001 --gid 1001 --no-user-group -ms /bin/bash evap +USER evap WORKDIR /evap +RUN echo 'eval "$(direnv hook bash)"' >> ~/.bashrc +USER root CMD [ "/bin/systemd" ] ``` -Then, build an image with `podman build -t evap-image .` and create a container with `podman create --name evap-container -v /path/to/your/evap/directory:/evap -p 8000:8000 evap-image`. +Then, build an image and create a container with +```bash +podman build -t evap-image . +podman create --name evap-container --userns=keep-id:uid=1001,gid=1001 -v $PWD:/evap -p 8000:8000 evap-image +``` From now on, you can use the container whenever you want to work on EvaP. -Start the container with `podman start evap-container` and enter it with `podman exec -it evap-container /bin/bash`. +Start the container with `podman start evap-container` and enter it with `podman exec -u evap -it evap-container /bin/bash`. After entering the container, you should be able to run `nix develop`. + +The container has `direnv` already set up, you can create the following `.envrc` and then allow it with `direnv allow`: +``` +if ! has nix_direnv_version || ! nix_direnv_version 3.0.5; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.5/direnvrc" "sha256-RuwIS+QKFj/T9M2TFXScjBsLR6V3A17YVoEW/Q6AZ1w=" +fi +use flake +source deployment/manage_autocompletion.sh +``` From 7f2552b5bd34bc927d622d46bdd412ed82a4699d Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 18:32:01 +0200 Subject: [PATCH 17/75] Update dependency versions --- pyproject.toml | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4ea84a1d82..c9758957de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,38 +1,36 @@ [tool.poetry] name = "evap" -version = "0.1.0" -description = "" -authors = ["Sébastien Eustace "] +version = "2024-07-08-dev" readme = "README.md" packages = [{include = "evap"}] [tool.poetry.dependencies] python = "^3.10" django-extensions = "^3.2.3" -django-fsm = "^2.8.1" -django = "^5.0" +django-fsm = "^2.8.2" +Django = "^5.0.0" mozilla-django-oidc = "^4.0.1" -openpyxl = "^3.1.2" +openpyxl = "^3.1.5" psycopg2-binary = "^2.9.9" -redis = "^5.0.3" +redis = "^5.0.8" xlwt = "^1.3.0" [tool.poetry.group.dev.dependencies] -black = "^24.4.0" +black = "^24.8.0" coverage = { version = "*", extras = ["toml"] } django-debug-toolbar = "^4.0" -django-stubs = "4.2.6" +django-stubs = "5.0.4" django-webtest = "^1.9.10" isort = "^5.13.1" -model-bakery = "^1.17.0" -mypy = "^1.9.0" +model-bakery = "^1.19.5" +mypy = "^1.11.0" openpyxl-stubs = "^0.1.25" pylint-django = "^2.5.4" -pylint = "^3.1.0" -ruff = "^0.3.7" +pylint = "^3.2.3" +ruff = "^0.6.2" tblib = "^3.0.0" xlrd = "^2.0.1" -typeguard = "^4.2.1" +typeguard = "^4.3.0" [build-system] requires = ["poetry-core"] From da4893cb4c27f06c68e3c849a3ef4d5c717deeec Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 19:15:47 +0200 Subject: [PATCH 18/75] Remove traces of vagrant --- Vagrantfile | 59 -------------- deployment/provision_vagrant_vm.sh | 124 ----------------------------- evap/settings.py | 2 +- evap/urls.py | 2 +- 4 files changed, 2 insertions(+), 185 deletions(-) delete mode 100644 Vagrantfile delete mode 100755 deployment/provision_vagrant_vm.sh diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index 079f9f4a7f..0000000000 --- a/Vagrantfile +++ /dev/null @@ -1,59 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -Vagrant.require_version ">= 2.2.14" - -Vagrant.configure("2") do |config| - config.vm.provider :virtualbox do |v, override| - v.memory = 2048 - override.vm.box = "ubuntu/jammy64" - override.vm.box_version = "= 20230524.0.0 " - override.vm.provision "shell", path: "deployment/provision_vagrant_vm.sh" - - # disable logfile - if Vagrant::Util::Platform.windows? - v.customize [ "modifyvm", :id, "--uartmode1", "file", "nul" ] - else - v.customize [ "modifyvm", :id, "--uartmode1", "file", "/dev/null" ] - end - end - - if Vagrant::Util::Platform.windows? then - # workaround for git bash not automatically allocating a tty on windows in some scenarios - # see https://github.com/hashicorp/vagrant/issues/9143#issuecomment-401088752 - config.ssh.extra_args = "-tt" - end - - config.vm.provider :docker do |d, override| - d.image = "ubuntu:jammy" - # Docker container really are supposed to be used differently. Hacky way to make it into a "VM". - d.cmd = ["tail", "-f", "/dev/null"] - - # Required so we can use mount inside the VM -- see e.g. https://github.com/moby/moby/issues/16429 - d.create_args = ["--cap-add=SYS_ADMIN", "--security-opt=apparmor:unconfined", "--device=/dev/fuse"] - - # Workaround for no SSH server as long as https://github.com/hashicorp/vagrant/issues/8145 is still open - override.trigger.before :provision do |trigger| - trigger.ruby do |env, machine| system("vagrant docker-exec -it -- /evap/deployment/provision_vagrant_vm.sh") end - end - override.trigger.before :ssh do |trigger| - trigger.ruby do |env, machine| system("vagrant docker-exec -it -- sudo -H -u evap bash") end - end - end - - # port forwarding - config.vm.network :forwarded_port, guest: 8000, host: 8000 # django server - config.vm.network :forwarded_port, guest: 80, host: 8001 # apache - config.vm.network :forwarded_port, guest: 6379, host: 6379 # redis. helpful when developing on windows, for which redis is not available - - # override username to be evap instead of vagrant, just as it is on production. - # This is necessary so management script can assume evap is the correct user to - # execute stuff as. - # Mounting with uid and gid is necessary as the provision script will create - # this user, so mounting before does not work with an owner specified by name. - # Also, provision needs to use vagrant as ssh user (since evap does not exist yet) - config.vm.synced_folder ".", "/evap", mount_options: ["uid=1042", "gid=1042"] - if ARGV[0] == "ssh" or ARGV[0] == "ssh-config" - config.ssh.username = 'evap' - end -end diff --git a/deployment/provision_vagrant_vm.sh b/deployment/provision_vagrant_vm.sh deleted file mode 100755 index e1928af2ab..0000000000 --- a/deployment/provision_vagrant_vm.sh +++ /dev/null @@ -1,124 +0,0 @@ -#! /usr/bin/env bash - -set -x # print executed commands - -MOUNTPOINT="/evap" -USER="evap" -REPO_FOLDER="/opt/evap" -ENV_FOLDER="/home/$USER/venv" -NODE_MODULES_FOLDER="/home/$USER/node_modules" -EVAP_PYTHON=python3.10 - -# force apt to not ask, just do defaults. -export DEBIAN_FRONTEND=noninteractive - -apt-get -q update - -# system utilities that docker containers don't have -apt-get -q install -y sudo wget git bash-completion -# docker weirdly needs this -- see https://stackoverflow.com/questions/46247032/how-to-solve-invoke-rc-d-policy-rc-d-denied-execution-of-start-when-building -printf '#!/bin/sh\nexit 0' > /usr/sbin/policy-rc.d - -# install python stuff -apt-get -q install -y $EVAP_PYTHON $EVAP_PYTHON-dev $EVAP_PYTHON-venv gettext - -# setup postgres -apt-get -q install -y postgresql -sudo -u postgres createuser --createdb evap -sudo -u postgres psql -U postgres -d postgres -c "ALTER USER evap WITH PASSWORD 'evap';" -sudo -u postgres createdb -O evap evap - -# setup redis -apt-get -q install -y redis-server -sed -i "s/^bind .*/bind 127.0.0.1/g" /etc/redis/redis.conf -service redis-server restart - -# install apache -apt-get -q install -y apache2 apache2-dev libapache2-mod-wsgi-py3 - -# make user, create home folder, set uid to the same set in the Vagrantfile (required for becoming the synced folder owner), set default shell to bash -useradd -m -u 1042 -s /bin/bash evap -cp /etc/skel/.bashrc /home/$USER/ - -# remount the mounted evap folder from the home directory. Use bindfs to map the owner in all setups. -OWNER=$(stat -c %u "$MOUNTPOINT/evap") -apt-get -q install -y bindfs -mkdir -p "$REPO_FOLDER" -# remount if REPO_FOLDER does not contain any files (meaning it is not mounted) -if [[ -z $(ls -A "$REPO_FOLDER") ]]; then - bindfs --map="$OWNER/1042:@$OWNER/@1042" "$MOUNTPOINT" "$REPO_FOLDER" || exit 1 -else - echo "Skipped trying to mount $REPO_FOLDER - a mounted folder was already detected." -fi -echo "[[ -z \$(ls -A '$REPO_FOLDER') ]] && sudo bindfs --map='$OWNER/1042:@$OWNER/@1042' '$MOUNTPOINT' '$REPO_FOLDER' # remount iff folder empty" >> /home/$USER/.bashrc - -# allow ssh login -cp -r /home/vagrant/.ssh /home/$USER/.ssh -chown -R $USER:$USER /home/$USER/.ssh -# allow sudo without password -echo "$USER ALL=(ALL) NOPASSWD:ALL" | tee /etc/sudoers.d/evap - -sudo -H -u $USER $EVAP_PYTHON -m venv $ENV_FOLDER -# venv will use ensurepip to install a new version of pip. We need to update that version. -sudo -H -u $USER $ENV_FOLDER/bin/python -m pip install -U pip -sudo -H -u $USER $ENV_FOLDER/bin/pip install wheel - -# setup apache -a2enmod headers -a2enmod wsgi -a2enmod rewrite -cp $REPO_FOLDER/deployment/apache.maintenance-template.conf /etc/apache2/sites-available/evap-maintenance.conf -cp $REPO_FOLDER/deployment/apache.template.conf /etc/apache2/sites-available/evap.conf -sed -i -e "s=\${ENV_FOLDER}=$ENV_FOLDER=" /etc/apache2/sites-available/evap.conf -sed -i -e "s=\${REPO_FOLDER}=$REPO_FOLDER=" /etc/apache2/sites-available/evap.conf -a2ensite evap.conf -a2dissite 000-default.conf -# this comments in some line in some apache config file to fix the locale. -# see https://github.com/e-valuation/EvaP/issues/626 -# and https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#if-you-get-a-unicodeencodeerror -sed -i s,\#.\ /etc/default/locale,.\ /etc/default/locale,g /etc/apache2/envvars -service apache2 reload - -# auto cd into /$USER on login and activate venv -echo "cd $REPO_FOLDER" >> /home/$USER/.bashrc -echo "source $ENV_FOLDER/bin/activate" >> /home/$USER/.bashrc - -# required for docker (no-op if already started) -echo "sudo service postgresql start && sudo service redis-server start" >> /home/$USER/.bashrc - -# install requirements -sudo -H -u $USER $ENV_FOLDER/bin/pip install -r $REPO_FOLDER/requirements-dev.txt - -# deploy localsettings and insert random key -cp $REPO_FOLDER/deployment/localsettings.template.py $REPO_FOLDER/evap/localsettings.py -sed -i -e "s/\${SECRET_KEY}/$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)/" $REPO_FOLDER/evap/localsettings.py - -# setup vm auto-completion -cp $REPO_FOLDER/deployment/manage_autocompletion.sh /etc/bash_completion.d/ - -# install chrome, see: https://github.com/puppeteer/puppeteer/issues/7740 -apt-get -q install -y chromium-browser - -# install libraries for puppeteer -apt-get -q install -y libasound2 libgconf-2-4 libgbm1 libgtk-3-0 libnss3 libx11-xcb1 libxss1 libxshmfence-dev - -# install nvm -wget https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh --no-verbose --output-document - | sudo -H -u $USER bash - -# setup evap -cd "$REPO_FOLDER" || exit 1 -sudo -H -u $USER git submodule update --init - -sudo -H -u $USER mkdir node_modules -sudo -H -u $USER mkdir ${NODE_MODULES_FOLDER} -sudo mount --bind ${NODE_MODULES_FOLDER} ${MOUNTPOINT}/node_modules -echo "sudo mount --bind ${NODE_MODULES_FOLDER} ${MOUNTPOINT}/node_modules" >> /home/$USER/.bashrc - -sudo -H -u $USER bash -c "source /home/$USER/.nvm/nvm.sh; nvm install --no-progress node; npm ci" -echo "nvm use node" >> /home/$USER/.bashrc - -sudo -H -u $USER $ENV_FOLDER/bin/python manage.py migrate --noinput -sudo -H -u $USER $ENV_FOLDER/bin/python manage.py collectstatic --noinput -sudo -H -u $USER $ENV_FOLDER/bin/python manage.py compilemessages --locale de -sudo -H -u $USER $ENV_FOLDER/bin/python manage.py loaddata test_data.json -sudo -H -u $USER $ENV_FOLDER/bin/python manage.py refresh_results_cache diff --git a/evap/settings.py b/evap/settings.py index be20a246fb..368ddc6c59 100644 --- a/evap/settings.py +++ b/evap/settings.py @@ -421,7 +421,7 @@ def CHARACTER_ALLOWED_IN_NAME(character): # pylint: disable=invalid-name # Create a localsettings.py if you want to locally override settings # and don't want the changes to appear in 'git status'. try: - # localsettings file may (vagrant) or may not (CI run) exist + # localsettings file may or may not exist (for example in CI) # the import can overwrite locals with a slightly different type (e.g. DATABASES), which is fine. from evap.localsettings import * # type: ignore # noqa: F403,PGH003 diff --git a/evap/urls.py b/evap/urls.py index 08fd0e0c8b..3d8cf31fe3 100644 --- a/evap/urls.py +++ b/evap/urls.py @@ -25,6 +25,6 @@ if settings.ENABLE_DEBUG_TOOLBAR: # pylint does not correctly evaluate this if, so it will raise an import-error on - # GitHub actions and a useless-suppression on a vagrant setup. Ignore both cases. + # GitHub actions and a useless-suppression otherwise. Ignore both cases. import debug_toolbar # pylint: disable=import-error, useless-suppression urlpatterns += [path('__debug__/', include(debug_toolbar.urls))] From b8080c8ef7de0a4154fdf1908dc27abe5c43e93b Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 19:31:46 +0200 Subject: [PATCH 19/75] `nix flake update` --- flake.lock | 60 ++++++++++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/flake.lock b/flake.lock index 0f012722f6..2bc34f1a3a 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1712014858, - "narHash": "sha256-sB4SWl2lX95bExY2gMFG5HIzvva5AVMJd4Igm+GpZNw=", + "lastModified": 1722555600, + "narHash": "sha256-XOQkdLafnb/p9ij77byFQjDf5m5QYl9b2REiVClC+x4=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "9126214d0a59633752a136528f5f3b9aa8565b7d", + "rev": "8471fe90ad337a8074e957b69ca4d0089218391d", "type": "github" }, "original": { @@ -23,11 +23,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1705309234, - "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { @@ -59,11 +59,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1713248628, - "narHash": "sha256-NLznXB5AOnniUtZsyy/aPWOk8ussTuePp2acb9U+ISA=", + "lastModified": 1724479785, + "narHash": "sha256-pP3Azj5d6M5nmG68Fu4JqZmdGt4S4vqI5f8te+E/FTw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5672bc9dbf9d88246ddab5ac454e82318d094bb8", + "rev": "d0e1602ddde669d5beb01aec49d71a51937ed7be", "type": "github" }, "original": { @@ -75,20 +75,14 @@ }, "nixpkgs-lib": { "locked": { - "dir": "lib", - "lastModified": 1711703276, - "narHash": "sha256-iMUFArF0WCatKK6RzfUJknjem0H9m4KgorO/p3Dopkk=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "d8fe5e6c92d0d190646fb9f1056741a229980089", - "type": "github" + "lastModified": 1722555339, + "narHash": "sha256-uFf2QeW7eAHlYXuDktm9c25OxOyCoUOQmh5SZ9amE5Q=", + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/a5d394176e64ab29c852d03346c1fc9b0b7d33eb.tar.gz" }, "original": { - "dir": "lib", - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/a5d394176e64ab29c852d03346c1fc9b0b7d33eb.tar.gz" } }, "poetry2nix": { @@ -102,11 +96,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1708589824, - "narHash": "sha256-2GOiFTkvs5MtVF65sC78KNVxQSmsxtk0WmV1wJ9V2ck=", + "lastModified": 1724417163, + "narHash": "sha256-gD0N0pnKxWJcKtbetlkKOIumS0Zovgxx/nMfOIJIzoI=", "owner": "nix-community", "repo": "poetry2nix", - "rev": "3c92540611f42d3fb2d0d084a6c694cd6544b609", + "rev": "7619e43c2b48c29e24b88a415256f09df96ec276", "type": "github" }, "original": { @@ -117,11 +111,11 @@ }, "process-compose-flake": { "locked": { - "lastModified": 1712911844, - "narHash": "sha256-act5Q5zSruTmwKMrZQeFAwWVxARAkYx96Ed423jDWFM=", + "lastModified": 1724606023, + "narHash": "sha256-rdGeNa/lCS8E1lXzPqgl+vZUUvnbEZT11Bqkx5jfYug=", "owner": "Platonic-Systems", "repo": "process-compose-flake", - "rev": "522b77b195d039a6fdb98d86447f9fba8a6efbce", + "rev": "f6ce9481df9aec739e4e06b67492401a5bb4f0b1", "type": "github" }, "original": { @@ -141,11 +135,11 @@ }, "services-flake": { "locked": { - "lastModified": 1713065262, - "narHash": "sha256-r5gZ8sqk3BamCFEc+zaJJkcwEGLEDcOMgBU2A1mU+BA=", + "lastModified": 1724545750, + "narHash": "sha256-NF5VjVYBtMN3Cn2rjhuLe4iwsj3tFytNG6ARJZnhIyA=", "owner": "juspay", "repo": "services-flake", - "rev": "4d363b6d22b5ee9763c2e94e72c13505849b9625", + "rev": "84fb5267fed8decd53a1deb8faccafc228623c8a", "type": "github" }, "original": { @@ -191,11 +185,11 @@ ] }, "locked": { - "lastModified": 1708335038, - "narHash": "sha256-ETLZNFBVCabo7lJrpjD6cAbnE11eDOjaQnznmg/6hAE=", + "lastModified": 1719749022, + "narHash": "sha256-ddPKHcqaKCIFSFc/cvxS14goUhCOAwsM1PbMr0ZtHMg=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "e504621290a1fd896631ddbc5e9c16f4366c9f65", + "rev": "8df5ff62195d4e67e2264df0b7f5e8c9995fd0bd", "type": "github" }, "original": { From 7185804957c12baa661fed5581e73b6fc3e13a21 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 20:11:59 +0200 Subject: [PATCH 20/75] Add multiple flake outputs for evap with or without dev dependencies --- flake.nix | 16 +++++++++++----- nix/evap.nix | 3 ++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/flake.nix b/flake.nix index 82cd0d054d..8bff8183c7 100644 --- a/flake.nix +++ b/flake.nix @@ -20,12 +20,18 @@ ]; systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ]; perSystem = { self', inputs', pkgs, system, ... }: { - packages.evap = pkgs.callPackage ./nix/evap.nix { - poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; - projectDir = self; + packages = rec { + evap = pkgs.callPackage ./nix/evap.nix { + poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; + projectDir = self; + }; + evap-dev = evap.override { poetry-groups = [ "dev" ]; }; }; - devShells.default = pkgs.callPackage ./nix/shell.nix { - inherit (self'.packages) evap; + + devShells = rec { + evap = pkgs.callPackage ./nix/shell.nix { inherit (self'.packages) evap; }; + evap-dev = evap.override { evap = self'.packages.evap-dev; }; + default = evap-dev; }; # Start with `nix run .#services` diff --git a/nix/evap.nix b/nix/evap.nix index 7f7a9aa23c..5b494a0f4e 100644 --- a/nix/evap.nix +++ b/nix/evap.nix @@ -1,4 +1,4 @@ -{ poetry2nix, projectDir, ... }: +{ projectDir, poetry2nix, poetry-groups ? [], ... }: poetry2nix.mkPoetryApplication { inherit projectDir; @@ -7,4 +7,5 @@ poetry2nix.mkPoetryApplication { # https://github.com/nix-community/poetry2nix/issues/1499 django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; }); + groups = poetry-groups; } From 6dce78aa067515dc4cc1ff858065e7ae971c3c2c Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 20:12:16 +0200 Subject: [PATCH 21/75] github actions that will just work first try for sure --- .github/workflows/tests.yml | 127 +++++++++++++----------------------- 1 file changed, 45 insertions(+), 82 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cf29f8f207..bd1265612f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,24 +12,16 @@ jobs: runs-on: ubuntu-22.04 - services: - postgres: - image: postgres - env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: evap - ports: - - 5432:5432 - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - steps: - name: Check out repository code uses: actions/checkout@v4 - - name: Setup python - uses: ./.github/setup_python + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: nicknovitski/nix-develop@v1 + - name: Start database + run: nix run .#services -- --detach && sleep 5 - name: Run tests run: coverage run manage.py test - name: Upload coverage @@ -42,24 +34,16 @@ jobs: runs-on: ubuntu-22.04 - services: - postgres: - image: postgres - env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: evap - ports: - - 5432:5432 - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - steps: - name: Check out repository code uses: actions/checkout@v4 - - name: Setup python - uses: ./.github/setup_python + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: nicknovitski/nix-develop@v1 + - name: Start database + run: nix run .#services -- --detach && sleep 5 - name: Run tests run: python manage.py test --shuffle @@ -72,8 +56,9 @@ jobs: - name: Check out repository code uses: actions/checkout@v4 - - name: Setup python - uses: ./.github/setup_python + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: nicknovitski/nix-develop@v1 - name: Run MyPy run: mypy @@ -87,8 +72,9 @@ jobs: - name: Check out repository code uses: actions/checkout@v4 - - name: Setup python - uses: ./.github/setup_python + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: nicknovitski/nix-develop@v1 - name: Run ruff run: ruff check . @@ -96,7 +82,6 @@ jobs: - name: Run pylint run: pylint evap tools - formatter: runs-on: ubuntu-22.04 @@ -106,11 +91,12 @@ jobs: - name: Check out repository code uses: actions/checkout@v4 - - name: Setup python - uses: ./.github/setup_python + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: nicknovitski/nix-develop@v1 - - name: Setup nodejs - uses: ./.github/setup_nodejs + - name: Install Node dependencies + run: npm ci - name: Check code formatting run: black --check . @@ -120,26 +106,9 @@ jobs: - name: Check TypeScript formatting run: npx prettier --list-different --loglevel debug 'evap/static/ts/**/*.ts' - backup-process: runs-on: ubuntu-22.04 - services: - postgres: - image: postgres - env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: evap - ports: - - 5432:5432 - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - redis: - image: redis - options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5 - ports: - - 6379:6379 - name: Backup process steps: @@ -148,13 +117,13 @@ jobs: with: submodules: true - - name: Setup python - uses: ./.github/setup_python - with: - requirements-file: requirements.txt + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: nicknovitski/nix-develop@v1 + # TODO: no dev dependencies - - name: Setup nodejs - uses: ./.github/setup_nodejs + - name: Install Node dependencies + run: npm ci - name: Install additional dependencies run: sudo apt-get update && sudo apt-get install gettext @@ -187,8 +156,12 @@ jobs: with: submodules: true - - name: Setup nodejs - uses: ./.github/setup_nodejs + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: nicknovitski/nix-develop@v1 + + - name: Install Node dependencies + run: npm ci - name: Compile Scss run: npx sass evap/static/scss/evap.scss evap/static/css/evap.css @@ -198,34 +171,21 @@ jobs: name: css path: evap/static/css/evap.css - render_pages: runs-on: ubuntu-22.04 name: Render Html pages - services: - postgres: - image: postgres - env: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: evap - ports: - - 5432:5432 - options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 - redis: - image: redis - options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5 - ports: - - 6379:6379 - steps: - name: Check out repository code uses: actions/checkout@v4 - - name: Setup python - uses: ./.github/setup_python + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: nicknovitski/nix-develop@v1 + + - name: Start database + run: nix run .#services -- --detach && sleep 5 - name: Render pages run: coverage run manage.py ts render_pages @@ -240,7 +200,6 @@ jobs: name: rendered-pages path: evap/static/ts/rendered - typescript: runs-on: ubuntu-22.04 @@ -254,8 +213,12 @@ jobs: with: submodules: true - - name: Setup nodejs - uses: ./.github/setup_nodejs + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: nicknovitski/nix-develop@v1 + + - name: Install Node dependencies + run: npm ci - name: Compile Typescript run: npx tsc --project evap/static/ts/tsconfig.compile.json From 89b8a06cb75201afcc6611b53aceee2901c00c1d Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 20:18:15 +0200 Subject: [PATCH 22/75] Revert unneeded changes --- overrides.nix | 1 - package.json | 2 -- 2 files changed, 3 deletions(-) delete mode 100644 overrides.nix diff --git a/overrides.nix b/overrides.nix deleted file mode 100644 index 0e2fe68a06..0000000000 --- a/overrides.nix +++ /dev/null @@ -1 +0,0 @@ -final: prev: {} diff --git a/package.json b/package.json index 0b497cc90a..e2606ad7ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,4 @@ { - "name": "EvaP", - "version": "2024-06", "devDependencies": { "@types/bootstrap": "^5.2.6", "@types/jest": "^29.5.12", From d53d6af686cbe688ae480e4e7dff8111f6560992 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 20:19:06 +0200 Subject: [PATCH 23/75] It is `--detached`, not `--detach` --- .github/workflows/tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index bd1265612f..52308b0733 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -21,7 +21,7 @@ jobs: - uses: nicknovitski/nix-develop@v1 - name: Start database - run: nix run .#services -- --detach && sleep 5 + run: nix run .#services -- --detached && sleep 5 - name: Run tests run: coverage run manage.py test - name: Upload coverage @@ -43,7 +43,7 @@ jobs: - uses: nicknovitski/nix-develop@v1 - name: Start database - run: nix run .#services -- --detach && sleep 5 + run: nix run .#services -- --detached && sleep 5 - name: Run tests run: python manage.py test --shuffle @@ -185,7 +185,7 @@ jobs: - uses: nicknovitski/nix-develop@v1 - name: Start database - run: nix run .#services -- --detach && sleep 5 + run: nix run .#services -- --detached && sleep 5 - name: Render pages run: coverage run manage.py ts render_pages From 7eb47356e893b9014987120347757f47d648a27a Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 20:25:35 +0200 Subject: [PATCH 24/75] Use TCP connection to postgres everywhere --- deployment/localsettings.template.py | 2 +- evap/settings.py | 7 +++---- evap/settings_test.py | 5 ++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/deployment/localsettings.template.py b/deployment/localsettings.template.py index 56cceb4143..15d3eb446d 100644 --- a/deployment/localsettings.template.py +++ b/deployment/localsettings.template.py @@ -8,7 +8,7 @@ 'NAME': 'evap', 'USER': 'evap', 'PASSWORD': 'evap', - 'HOST': '127.0.0.1', # Set to empty string for localhost. + 'HOST': 'localhost', # Set to empty string for localhost. 'PORT': '', # Set to empty string for default. 'CONN_MAX_AGE': 600, } diff --git a/evap/settings.py b/evap/settings.py index 368ddc6c59..cb1265576d 100644 --- a/evap/settings.py +++ b/evap/settings.py @@ -112,10 +112,9 @@ "default": { "ENGINE": "django.db.backends.postgresql", "NAME": "evap", - "USER": "postgres", - "PASSWORD": "", - "HOST": "", # Set to empty string for localhost. - "PORT": "", # Set to empty string for default. + "USER": "evap", + "PASSWORD": "evap", + "HOST": "localhost", "CONN_MAX_AGE": 600, } } diff --git a/evap/settings_test.py b/evap/settings_test.py index ed25e0efcc..6af9464751 100644 --- a/evap/settings_test.py +++ b/evap/settings_test.py @@ -3,10 +3,9 @@ "default": { "ENGINE": "django.db.backends.postgresql", "NAME": "evap", - "USER": "postgres", - "PASSWORD": "postgres", + "USER": "evap", + "PASSWORD": "evap", "HOST": "localhost", - "PORT": "5432", } } CACHES = { From b79bd0c3ec206eeea39a1ebbc2a1b853b1939df4 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 21:06:59 +0200 Subject: [PATCH 25/75] lots of github action code --- .github/setup_evap/action.yml | 42 +++++++++++++ .github/setup_python/action.yml | 46 -------------- .github/workflows/tests.yml | 104 ++++++++------------------------ 3 files changed, 66 insertions(+), 126 deletions(-) create mode 100644 .github/setup_evap/action.yml delete mode 100644 .github/setup_python/action.yml diff --git a/.github/setup_evap/action.yml b/.github/setup_evap/action.yml new file mode 100644 index 0000000000..9a36ae277c --- /dev/null +++ b/.github/setup_evap/action.yml @@ -0,0 +1,42 @@ +name: "Setup EvaP Testing Environment" +description: "Sets up the nix environment with caching and copy localsettings" + +inputs: + shell: + description: "name of development shell to use" + required: false + default: '.#evap-dev' + fetch-submodules: + required: false + default: false + start-db: + required: false + default: false + npm-ci: + required: false + default: false + +runs: + using: "composite" + steps: + - name: Check out repository code + uses: actions/checkout@v4 + with: + submodules: ${{ inputs.fetch-submodules }} + + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: nicknovitski/nix-develop@v1 + with: + arguments: "${{ inputs.shell }}" + + - name: Add localsettings + run: cp evap/settings_test.py evap/localsettings.py + + - name: Install Node dependencies + run: npm ci + if: ${{ inputs.npm-ci }} + + - name: Start database + run: nix run .#services -- --detached && sleep 5 + if: ${{ inputs.start-db }} diff --git a/.github/setup_python/action.yml b/.github/setup_python/action.yml deleted file mode 100644 index 955a244b64..0000000000 --- a/.github/setup_python/action.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: "Setup Python" -description: "Sets up Python for use in actions with caching and copy localsettings" - -inputs: - requirements-file: - description: "name of the requirements file to install" - required: false - default: requirements-dev.txt - -runs: - using: "composite" - steps: - - name: Setup python - id: python - uses: actions/setup-python@v5 - with: - python-version: "3.10" - - - name: Restore venv cache - id: cache-virtualenv - uses: actions/cache@v4 - with: - path: .venv - # hashFiles( 'requirements*.txt' ) because -dev.txt includes requirements.txt - key: venv-${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{ hashFiles( 'requirements*.txt' ) }}-${{ inputs.requirements-file }} - - - name: Install dependencies - run: | - python -m venv .venv - source .venv/bin/activate - pip install -r "${{ inputs.requirements-file }}" - shell: bash - if: steps.cache-virtualenv.outputs.cache-hit != 'true' - - - name: Add localsettings - run: cp evap/settings_test.py evap/localsettings.py - shell: bash - - - name: Activate venv - run: | - source .venv/bin/activate - echo "$PATH" >> "$GITHUB_PATH" - echo PATH="$PATH" >> "$GITHUB_ENV" - echo VIRTUAL_ENV="$VIRTUAL_ENV" >> "$GITHUB_ENV" - echo PYTHONHOME="$PYTHONHOME" >> "$GITHUB_ENV" - shell: bash diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 52308b0733..445bd7e5e8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,15 +13,10 @@ jobs: runs-on: ubuntu-22.04 steps: - - name: Check out repository code - uses: actions/checkout@v4 - - - uses: DeterminateSystems/nix-installer-action@main - - uses: DeterminateSystems/magic-nix-cache-action@main - - uses: nicknovitski/nix-develop@v1 + - uses: ./.github/setup_evap + with: + start-db: true - - name: Start database - run: nix run .#services -- --detached && sleep 5 - name: Run tests run: coverage run manage.py test - name: Upload coverage @@ -35,15 +30,10 @@ jobs: runs-on: ubuntu-22.04 steps: - - name: Check out repository code - uses: actions/checkout@v4 - - - uses: DeterminateSystems/nix-installer-action@main - - uses: DeterminateSystems/magic-nix-cache-action@main - - uses: nicknovitski/nix-develop@v1 + - uses: ./.github/setup_evap + with: + start-db: true - - name: Start database - run: nix run .#services -- --detached && sleep 5 - name: Run tests run: python manage.py test --shuffle @@ -53,13 +43,7 @@ jobs: name: MyPy steps: - - name: Check out repository code - uses: actions/checkout@v4 - - - uses: DeterminateSystems/nix-installer-action@main - - uses: DeterminateSystems/magic-nix-cache-action@main - - uses: nicknovitski/nix-develop@v1 - + - uses: ./.github/setup_evap - name: Run MyPy run: mypy @@ -69,16 +53,9 @@ jobs: name: Linter steps: - - name: Check out repository code - uses: actions/checkout@v4 - - - uses: DeterminateSystems/nix-installer-action@main - - uses: DeterminateSystems/magic-nix-cache-action@main - - uses: nicknovitski/nix-develop@v1 - + - uses: ./.github/setup_evap - name: Run ruff run: ruff check . - - name: Run pylint run: pylint evap tools @@ -88,15 +65,9 @@ jobs: name: Formatting steps: - - name: Check out repository code - uses: actions/checkout@v4 - - - uses: DeterminateSystems/nix-installer-action@main - - uses: DeterminateSystems/magic-nix-cache-action@main - - uses: nicknovitski/nix-develop@v1 - - - name: Install Node dependencies - run: npm ci + - uses: ./.github/setup_evap + with: + npm-ci: true - name: Check code formatting run: black --check . @@ -112,18 +83,11 @@ jobs: name: Backup process steps: - - name: Check out repository code - uses: actions/checkout@v4 + - uses: ./.github/setup_evap with: - submodules: true - - - uses: DeterminateSystems/nix-installer-action@main - - uses: DeterminateSystems/magic-nix-cache-action@main - - uses: nicknovitski/nix-develop@v1 - # TODO: no dev dependencies - - - name: Install Node dependencies - run: npm ci + fetch-submodules: true + shell: '.#evap' # no dev-dependencies + start-db: true - name: Install additional dependencies run: sudo apt-get update && sudo apt-get install gettext @@ -151,17 +115,10 @@ jobs: name: Compile Scss steps: - - name: Check out repository code - uses: actions/checkout@v4 + - uses: ./.github/setup_evap with: - submodules: true - - - uses: DeterminateSystems/nix-installer-action@main - - uses: DeterminateSystems/magic-nix-cache-action@main - - uses: nicknovitski/nix-develop@v1 - - - name: Install Node dependencies - run: npm ci + fetch-submodules: true + npm-ci: true - name: Compile Scss run: npx sass evap/static/scss/evap.scss evap/static/css/evap.css @@ -177,15 +134,9 @@ jobs: name: Render Html pages steps: - - name: Check out repository code - uses: actions/checkout@v4 - - - uses: DeterminateSystems/nix-installer-action@main - - uses: DeterminateSystems/magic-nix-cache-action@main - - uses: nicknovitski/nix-develop@v1 - - - name: Start database - run: nix run .#services -- --detached && sleep 5 + - uses: ./.github/setup_evap + with: + start-db: true - name: Render pages run: coverage run manage.py ts render_pages @@ -208,17 +159,10 @@ jobs: name: Test Typescript steps: - - name: Check out repository code - uses: actions/checkout@v4 + - uses: ./.github/setup_evap with: - submodules: true - - - uses: DeterminateSystems/nix-installer-action@main - - uses: DeterminateSystems/magic-nix-cache-action@main - - uses: nicknovitski/nix-develop@v1 - - - name: Install Node dependencies - run: npm ci + fetch-submodules: true + npm-ci: true - name: Compile Typescript run: npx tsc --project evap/static/ts/tsconfig.compile.json From b834e22a826429648ff5ee68850ff1606ca3f809 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 21:10:13 +0200 Subject: [PATCH 26/75] all fixed up now --- .github/setup_evap/action.yml | 8 -------- .github/workflows/tests.yml | 18 +++++++++++++++--- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/.github/setup_evap/action.yml b/.github/setup_evap/action.yml index 9a36ae277c..1d0555458e 100644 --- a/.github/setup_evap/action.yml +++ b/.github/setup_evap/action.yml @@ -6,9 +6,6 @@ inputs: description: "name of development shell to use" required: false default: '.#evap-dev' - fetch-submodules: - required: false - default: false start-db: required: false default: false @@ -19,11 +16,6 @@ inputs: runs: using: "composite" steps: - - name: Check out repository code - uses: actions/checkout@v4 - with: - submodules: ${{ inputs.fetch-submodules }} - - uses: DeterminateSystems/nix-installer-action@main - uses: DeterminateSystems/magic-nix-cache-action@main - uses: nicknovitski/nix-develop@v1 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 445bd7e5e8..e6b76d7d95 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,6 +13,7 @@ jobs: runs-on: ubuntu-22.04 steps: + - uses: actions/checkout@v4 - uses: ./.github/setup_evap with: start-db: true @@ -30,6 +31,7 @@ jobs: runs-on: ubuntu-22.04 steps: + - uses: actions/checkout@v4 - uses: ./.github/setup_evap with: start-db: true @@ -43,6 +45,7 @@ jobs: name: MyPy steps: + - uses: actions/checkout@v4 - uses: ./.github/setup_evap - name: Run MyPy run: mypy @@ -53,6 +56,7 @@ jobs: name: Linter steps: + - uses: actions/checkout@v4 - uses: ./.github/setup_evap - name: Run ruff run: ruff check . @@ -65,6 +69,7 @@ jobs: name: Formatting steps: + - uses: actions/checkout@v4 - uses: ./.github/setup_evap with: npm-ci: true @@ -83,9 +88,11 @@ jobs: name: Backup process steps: + - uses: actions/checkout@v4 + with: + submodules: true - uses: ./.github/setup_evap with: - fetch-submodules: true shell: '.#evap' # no dev-dependencies start-db: true @@ -115,9 +122,11 @@ jobs: name: Compile Scss steps: + - uses: actions/checkout@v4 + with: + submodules: true - uses: ./.github/setup_evap with: - fetch-submodules: true npm-ci: true - name: Compile Scss @@ -134,6 +143,7 @@ jobs: name: Render Html pages steps: + - uses: actions/checkout@v4 - uses: ./.github/setup_evap with: start-db: true @@ -159,9 +169,11 @@ jobs: name: Test Typescript steps: + - uses: actions/checkout@v4 + with: + submodules: true - uses: ./.github/setup_evap with: - fetch-submodules: true npm-ci: true - name: Compile Typescript From 2487d44b7eb9d5f8c54c46600909d51dfa66d29c Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 21:19:43 +0200 Subject: [PATCH 27/75] add descriptions --- .github/setup_evap/action.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/setup_evap/action.yml b/.github/setup_evap/action.yml index 1d0555458e..12643f0f1b 100644 --- a/.github/setup_evap/action.yml +++ b/.github/setup_evap/action.yml @@ -7,9 +7,11 @@ inputs: required: false default: '.#evap-dev' start-db: + description: "whether or not to run the database in the background" required: false default: false npm-ci: + description: "whether or not to run `npm ci`" required: false default: false From ab889538089d30fc819c95cccecce59604d62402 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 21:20:41 +0200 Subject: [PATCH 28/75] Add explicit `shell` --- .github/setup_evap/action.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/setup_evap/action.yml b/.github/setup_evap/action.yml index 12643f0f1b..4c4c3b7bbb 100644 --- a/.github/setup_evap/action.yml +++ b/.github/setup_evap/action.yml @@ -26,11 +26,14 @@ runs: - name: Add localsettings run: cp evap/settings_test.py evap/localsettings.py + shell: bash - name: Install Node dependencies run: npm ci + shell: bash if: ${{ inputs.npm-ci }} - name: Start database run: nix run .#services -- --detached && sleep 5 + shell: bash if: ${{ inputs.start-db }} From f43da9c78e1824b62fa949c0506a4c7486edf130 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 21:47:35 +0200 Subject: [PATCH 29/75] Install chromium for CI like we did in vagrant --- .github/workflows/tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e6b76d7d95..3e0f6b9b48 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -176,6 +176,8 @@ jobs: with: npm-ci: true + - run: apt-get -q install -y chromium-browser + - name: Compile Typescript run: npx tsc --project evap/static/ts/tsconfig.compile.json - name: Load rendered pages From 4c9d6608758005e7767829820a26c80c746e3db1 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 21:58:26 +0200 Subject: [PATCH 30/75] Use `./#evap` to make nix-develop-action work? --- .github/setup_evap/action.yml | 2 +- .github/workflows/tests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/setup_evap/action.yml b/.github/setup_evap/action.yml index 4c4c3b7bbb..f3177e2922 100644 --- a/.github/setup_evap/action.yml +++ b/.github/setup_evap/action.yml @@ -5,7 +5,7 @@ inputs: shell: description: "name of development shell to use" required: false - default: '.#evap-dev' + default: './#evap-dev' start-db: description: "whether or not to run the database in the background" required: false diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3e0f6b9b48..17ac957d69 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -93,7 +93,7 @@ jobs: submodules: true - uses: ./.github/setup_evap with: - shell: '.#evap' # no dev-dependencies + shell: './#evap' # no dev-dependencies start-db: true - name: Install additional dependencies From 2a9cee484d1f58af38546ec45966ca2717a73a88 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 22:05:54 +0200 Subject: [PATCH 31/75] Update lockfile --- poetry.lock | 647 +++++++++++++++++++++++++------------------------ pyproject.toml | 3 +- 2 files changed, 337 insertions(+), 313 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3f4112f1f1..5ef7d2b284 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "asgiref" @@ -19,13 +19,13 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "astroid" -version = "3.1.0" +version = "3.2.4" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.8.0" files = [ - {file = "astroid-3.1.0-py3-none-any.whl", hash = "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819"}, - {file = "astroid-3.1.0.tar.gz", hash = "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"}, + {file = "astroid-3.2.4-py3-none-any.whl", hash = "sha256:413658a61eeca6202a59231abb473f932038fbcbf1666587f66d482083413a25"}, + {file = "astroid-3.2.4.tar.gz", hash = "sha256:0e14202810b30da1b735827f78f5157be2bbd4a7a59b7707ca0bfc2fb4c0063a"}, ] [package.dependencies] @@ -65,33 +65,33 @@ lxml = ["lxml"] [[package]] name = "black" -version = "24.4.0" +version = "24.8.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6ad001a9ddd9b8dfd1b434d566be39b1cd502802c8d38bbb1ba612afda2ef436"}, - {file = "black-24.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3a3a092b8b756c643fe45f4624dbd5a389f770a4ac294cf4d0fce6af86addaf"}, - {file = "black-24.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae79397f367ac8d7adb6c779813328f6d690943f64b32983e896bcccd18cbad"}, - {file = "black-24.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:71d998b73c957444fb7c52096c3843875f4b6b47a54972598741fe9a7f737fcb"}, - {file = "black-24.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8e5537f456a22cf5cfcb2707803431d2feeb82ab3748ade280d6ccd0b40ed2e8"}, - {file = "black-24.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64e60a7edd71fd542a10a9643bf369bfd2644de95ec71e86790b063aa02ff745"}, - {file = "black-24.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd5b4f76056cecce3e69b0d4c228326d2595f506797f40b9233424e2524c070"}, - {file = "black-24.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:64578cf99b6b46a6301bc28bdb89f9d6f9b592b1c5837818a177c98525dbe397"}, - {file = "black-24.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f95cece33329dc4aa3b0e1a771c41075812e46cf3d6e3f1dfe3d91ff09826ed2"}, - {file = "black-24.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4396ca365a4310beef84d446ca5016f671b10f07abdba3e4e4304218d2c71d33"}, - {file = "black-24.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d99dfdf37a2a00a6f7a8dcbd19edf361d056ee51093b2445de7ca09adac965"}, - {file = "black-24.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:21f9407063ec71c5580b8ad975653c66508d6a9f57bd008bb8691d273705adcd"}, - {file = "black-24.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:652e55bb722ca026299eb74e53880ee2315b181dfdd44dca98e43448620ddec1"}, - {file = "black-24.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f2966b9b2b3b7104fca9d75b2ee856fe3fdd7ed9e47c753a4bb1a675f2caab8"}, - {file = "black-24.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bb9ca06e556a09f7f7177bc7cb604e5ed2d2df1e9119e4f7d2f1f7071c32e5d"}, - {file = "black-24.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4e71cdebdc8efeb6deaf5f2deb28325f8614d48426bed118ecc2dcaefb9ebf3"}, - {file = "black-24.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6644f97a7ef6f401a150cca551a1ff97e03c25d8519ee0bbc9b0058772882665"}, - {file = "black-24.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75a2d0b4f5eb81f7eebc31f788f9830a6ce10a68c91fbe0fade34fff7a2836e6"}, - {file = "black-24.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb949f56a63c5e134dfdca12091e98ffb5fd446293ebae123d10fc1abad00b9e"}, - {file = "black-24.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:7852b05d02b5b9a8c893ab95863ef8986e4dda29af80bbbda94d7aee1abf8702"}, - {file = "black-24.4.0-py3-none-any.whl", hash = "sha256:74eb9b5420e26b42c00a3ff470dc0cd144b80a766128b1771d07643165e08d0e"}, - {file = "black-24.4.0.tar.gz", hash = "sha256:f07b69fda20578367eaebbd670ff8fc653ab181e1ff95d84497f9fa20e7d0641"}, + {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, + {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, + {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, + {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, + {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, + {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, + {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, + {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, + {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, + {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, + {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, + {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, + {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, + {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, + {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, + {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, + {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, + {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, + {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, + {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, + {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, + {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, ] [package.dependencies] @@ -111,74 +111,89 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2024.2.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, - {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, + {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, + {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, + {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, + {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, + {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, + {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, + {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, + {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, + {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, + {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, + {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, + {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, + {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, + {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, ] [package.dependencies] @@ -310,63 +325,83 @@ files = [ [[package]] name = "coverage" -version = "7.4.4" +version = "7.6.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, - {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, - {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, - {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, - {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, - {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, - {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, - {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, - {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, - {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, - {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, - {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, - {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, - {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, - {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, - {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, - {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, - {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, - {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, - {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, - {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, - {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, - {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, - {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, - {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, - {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, - {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, - {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, - {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, - {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, - {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, - {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [package.dependencies] @@ -377,43 +412,38 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "42.0.5" +version = "43.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, - {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, - {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, - {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, - {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, - {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, - {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, - {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, - {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, - {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, - {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, - {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, - {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, - {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, + {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, + {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, + {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, + {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, + {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, + {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, + {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, + {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, + {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, + {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f"}, + {file = "cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069"}, + {file = "cryptography-43.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1"}, + {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, ] [package.dependencies] @@ -426,7 +456,7 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.0)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -446,17 +476,17 @@ profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "django" -version = "5.0.4" +version = "5.1" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.10" files = [ - {file = "Django-5.0.4-py3-none-any.whl", hash = "sha256:916423499d75d62da7aa038d19aef23d23498d8df229775eb0a6309ee1013775"}, - {file = "Django-5.0.4.tar.gz", hash = "sha256:4bd01a8c830bb77a8a3b0e7d8b25b887e536ad17a81ba2dce5476135c73312bd"}, + {file = "Django-5.1-py3-none-any.whl", hash = "sha256:d3b811bf5371a26def053d7ee42a9df1267ef7622323fe70a601936725aa4557"}, + {file = "Django-5.1.tar.gz", hash = "sha256:848a5980e8efb76eea70872fb0e4bc5e371619c70fffbe48e3e1b50b2c09455d"}, ] [package.dependencies] -asgiref = ">=3.7.0,<4" +asgiref = ">=3.8.1,<4" sqlparse = ">=0.3.1" tzdata = {version = "*", markers = "sys_platform == \"win32\""} @@ -466,17 +496,17 @@ bcrypt = ["bcrypt"] [[package]] name = "django-debug-toolbar" -version = "4.3.0" +version = "4.4.6" description = "A configurable set of panels that display various debug information about the current request/response." optional = false python-versions = ">=3.8" files = [ - {file = "django_debug_toolbar-4.3.0-py3-none-any.whl", hash = "sha256:e09b7dcb8417b743234dfc57c95a7c1d1d87a88844abd13b4c5387f807b31bf6"}, - {file = "django_debug_toolbar-4.3.0.tar.gz", hash = "sha256:0b0dddee5ea29b9cb678593bc0d7a6d76b21d7799cb68e091a2148341a80f3c4"}, + {file = "django_debug_toolbar-4.4.6-py3-none-any.whl", hash = "sha256:3beb671c9ec44ffb817fad2780667f172bd1c067dbcabad6268ce39a81335f45"}, + {file = "django_debug_toolbar-4.4.6.tar.gz", hash = "sha256:36e421cb908c2f0675e07f9f41e3d1d8618dc386392ec82d23bcfcd5d29c7044"}, ] [package.dependencies] -django = ">=3.2.4" +django = ">=4.2.9" sqlparse = ">=0.2" [[package]] @@ -506,35 +536,37 @@ files = [ [[package]] name = "django-stubs" -version = "4.2.6" +version = "5.0.4" description = "Mypy stubs for Django" optional = false python-versions = ">=3.8" files = [ - {file = "django-stubs-4.2.6.tar.gz", hash = "sha256:e60b43de662a199db4b15c803c06669e0ac5035614af291cbd3b91591f7dcc94"}, - {file = "django_stubs-4.2.6-py3-none-any.whl", hash = "sha256:2fcd257884a68dfa02de41ee5410ec805264d9b07d9b5b119e4dea82c7b8345e"}, + {file = "django_stubs-5.0.4-py3-none-any.whl", hash = "sha256:c2502f5ecbae50c68f9a86d52b5b2447d8648fd205036dad0ccb41e19a445927"}, + {file = "django_stubs-5.0.4.tar.gz", hash = "sha256:78e3764488fdfd2695f12502136548ec22f8d4b1780541a835042b8238d11514"}, ] [package.dependencies] +asgiref = "*" django = "*" -django-stubs-ext = ">=4.2.5" +django-stubs-ext = ">=5.0.4" tomli = {version = "*", markers = "python_version < \"3.11\""} -types-pytz = "*" types-PyYAML = "*" -typing-extensions = "*" +typing-extensions = ">=4.11.0" [package.extras] -compatible-mypy = ["mypy (>=1.6.0,<1.7.0)"] +compatible-mypy = ["mypy (>=1.11.0,<1.12.0)"] +oracle = ["oracledb"] +redis = ["redis"] [[package]] name = "django-stubs-ext" -version = "4.2.7" +version = "5.0.4" description = "Monkey-patching and extensions for django-stubs" optional = false python-versions = ">=3.8" files = [ - {file = "django-stubs-ext-4.2.7.tar.gz", hash = "sha256:519342ac0849cda1559746c9a563f03ff99f636b0ebe7c14b75e816a00dfddc3"}, - {file = "django_stubs_ext-4.2.7-py3-none-any.whl", hash = "sha256:45a5d102417a412e3606e3c358adb4744988a92b7b58ccf3fd64bddd5d04d14c"}, + {file = "django_stubs_ext-5.0.4-py3-none-any.whl", hash = "sha256:910cbaff3d1e8e806a5c27d5ddd4088535aae8371ea921b7fd680fdfa5f14e30"}, + {file = "django_stubs_ext-5.0.4.tar.gz", hash = "sha256:85da065224204774208be29c7d02b4482d5a69218a728465c2fbe41725fdc819"}, ] [package.dependencies] @@ -568,13 +600,13 @@ files = [ [[package]] name = "idna" -version = "3.7" +version = "3.8" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, + {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, ] [[package]] @@ -622,20 +654,20 @@ files = [ [[package]] name = "model-bakery" -version = "1.17.0" +version = "1.19.5" description = "Smart object creation facility for Django." optional = false python-versions = ">=3.8" files = [ - {file = "model_bakery-1.17.0-py3-none-any.whl", hash = "sha256:1d26f1a7043c46e6729145b964a7740bf8f6dddac16510fd18323a1492fba757"}, - {file = "model_bakery-1.17.0.tar.gz", hash = "sha256:fe808132cd966164600f0450cc05b3cfa50c6c062e00f739a861c5a4b9f236ca"}, + {file = "model_bakery-1.19.5-py3-none-any.whl", hash = "sha256:09ecbbf124d32614339581b642c82ac4a73147442f598c7bad23eece24187e5c"}, + {file = "model_bakery-1.19.5.tar.gz", hash = "sha256:37cece544a33f8899ed8f0488cd6a9d2b0b6925e7b478a4ff2786dece8c63745"}, ] [package.dependencies] -django = ">=3.2" +django = ">=4.2" [package.extras] -docs = ["sphinx", "sphinx-rtd-theme"] +docs = ["myst-parser", "sphinx", "sphinx-rtd-theme"] test = ["black", "coverage", "mypy", "pillow", "pytest", "pytest-django", "ruff"] [[package]] @@ -657,44 +689,44 @@ requests = "*" [[package]] name = "mypy" -version = "1.9.0" +version = "1.11.2" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"}, - {file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"}, - {file = "mypy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c87c15aed320de9b438ae7b00c1ac91cd393c1b854c2ce538e2a72d55df150"}, - {file = "mypy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48533cdd345c3c2e5ef48ba3b0d3880b257b423e7995dada04248725c6f77374"}, - {file = "mypy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:4d3dbd346cfec7cb98e6cbb6e0f3c23618af826316188d587d1c1bc34f0ede03"}, - {file = "mypy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:653265f9a2784db65bfca694d1edd23093ce49740b2244cde583aeb134c008f3"}, - {file = "mypy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a3c007ff3ee90f69cf0a15cbcdf0995749569b86b6d2f327af01fd1b8aee9dc"}, - {file = "mypy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2418488264eb41f69cc64a69a745fad4a8f86649af4b1041a4c64ee61fc61129"}, - {file = "mypy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68edad3dc7d70f2f17ae4c6c1b9471a56138ca22722487eebacfd1eb5321d612"}, - {file = "mypy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:85ca5fcc24f0b4aeedc1d02f93707bccc04733f21d41c88334c5482219b1ccb3"}, - {file = "mypy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aceb1db093b04db5cd390821464504111b8ec3e351eb85afd1433490163d60cd"}, - {file = "mypy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0235391f1c6f6ce487b23b9dbd1327b4ec33bb93934aa986efe8a9563d9349e6"}, - {file = "mypy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d5ddc13421ba3e2e082a6c2d74c2ddb3979c39b582dacd53dd5d9431237185"}, - {file = "mypy-1.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:190da1ee69b427d7efa8aa0d5e5ccd67a4fb04038c380237a0d96829cb157913"}, - {file = "mypy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe28657de3bfec596bbeef01cb219833ad9d38dd5393fc649f4b366840baefe6"}, - {file = "mypy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e54396d70be04b34f31d2edf3362c1edd023246c82f1730bbf8768c28db5361b"}, - {file = "mypy-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5e6061f44f2313b94f920e91b204ec600982961e07a17e0f6cd83371cb23f5c2"}, - {file = "mypy-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a10926e5473c5fc3da8abb04119a1f5811a236dc3a38d92015cb1e6ba4cb9e"}, - {file = "mypy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b685154e22e4e9199fc95f298661deea28aaede5ae16ccc8cbb1045e716b3e04"}, - {file = "mypy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d741d3fc7c4da608764073089e5f58ef6352bedc223ff58f2f038c2c4698a89"}, - {file = "mypy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:587ce887f75dd9700252a3abbc9c97bbe165a4a630597845c61279cf32dfbf02"}, - {file = "mypy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f88566144752999351725ac623471661c9d1cd8caa0134ff98cceeea181789f4"}, - {file = "mypy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61758fabd58ce4b0720ae1e2fea5cfd4431591d6d590b197775329264f86311d"}, - {file = "mypy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e49499be624dead83927e70c756970a0bc8240e9f769389cdf5714b0784ca6bf"}, - {file = "mypy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:571741dc4194b4f82d344b15e8837e8c5fcc462d66d076748142327626a1b6e9"}, - {file = "mypy-1.9.0-py3-none-any.whl", hash = "sha256:a260627a570559181a9ea5de61ac6297aa5af202f06fd7ab093ce74e7181e43e"}, - {file = "mypy-1.9.0.tar.gz", hash = "sha256:3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"}, + {file = "mypy-1.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d42a6dd818ffce7be66cce644f1dff482f1d97c53ca70908dff0b9ddc120b77a"}, + {file = "mypy-1.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:801780c56d1cdb896eacd5619a83e427ce436d86a3bdf9112527f24a66618fef"}, + {file = "mypy-1.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41ea707d036a5307ac674ea172875f40c9d55c5394f888b168033177fce47383"}, + {file = "mypy-1.11.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6e658bd2d20565ea86da7d91331b0eed6d2eee22dc031579e6297f3e12c758c8"}, + {file = "mypy-1.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:478db5f5036817fe45adb7332d927daa62417159d49783041338921dcf646fc7"}, + {file = "mypy-1.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75746e06d5fa1e91bfd5432448d00d34593b52e7e91a187d981d08d1f33d4385"}, + {file = "mypy-1.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a976775ab2256aadc6add633d44f100a2517d2388906ec4f13231fafbb0eccca"}, + {file = "mypy-1.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd953f221ac1379050a8a646585a29574488974f79d8082cedef62744f0a0104"}, + {file = "mypy-1.11.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:57555a7715c0a34421013144a33d280e73c08df70f3a18a552938587ce9274f4"}, + {file = "mypy-1.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:36383a4fcbad95f2657642a07ba22ff797de26277158f1cc7bd234821468b1b6"}, + {file = "mypy-1.11.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e8960dbbbf36906c5c0b7f4fbf2f0c7ffb20f4898e6a879fcf56a41a08b0d318"}, + {file = "mypy-1.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06d26c277962f3fb50e13044674aa10553981ae514288cb7d0a738f495550b36"}, + {file = "mypy-1.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e7184632d89d677973a14d00ae4d03214c8bc301ceefcdaf5c474866814c987"}, + {file = "mypy-1.11.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3a66169b92452f72117e2da3a576087025449018afc2d8e9bfe5ffab865709ca"}, + {file = "mypy-1.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:969ea3ef09617aff826885a22ece0ddef69d95852cdad2f60c8bb06bf1f71f70"}, + {file = "mypy-1.11.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:37c7fa6121c1cdfcaac97ce3d3b5588e847aa79b580c1e922bb5d5d2902df19b"}, + {file = "mypy-1.11.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a8a53bc3ffbd161b5b2a4fff2f0f1e23a33b0168f1c0778ec70e1a3d66deb86"}, + {file = "mypy-1.11.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ff93107f01968ed834f4256bc1fc4475e2fecf6c661260066a985b52741ddce"}, + {file = "mypy-1.11.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:edb91dded4df17eae4537668b23f0ff6baf3707683734b6a818d5b9d0c0c31a1"}, + {file = "mypy-1.11.2-cp38-cp38-win_amd64.whl", hash = "sha256:ee23de8530d99b6db0573c4ef4bd8f39a2a6f9b60655bf7a1357e585a3486f2b"}, + {file = "mypy-1.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:801ca29f43d5acce85f8e999b1e431fb479cb02d0e11deb7d2abb56bdaf24fd6"}, + {file = "mypy-1.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af8d155170fcf87a2afb55b35dc1a0ac21df4431e7d96717621962e4b9192e70"}, + {file = "mypy-1.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7821776e5c4286b6a13138cc935e2e9b6fde05e081bdebf5cdb2bb97c9df81d"}, + {file = "mypy-1.11.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539c570477a96a4e6fb718b8d5c3e0c0eba1f485df13f86d2970c91f0673148d"}, + {file = "mypy-1.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:3f14cd3d386ac4d05c5a39a51b84387403dadbd936e17cb35882134d4f8f0d24"}, + {file = "mypy-1.11.2-py3-none-any.whl", hash = "sha256:b499bc07dbdcd3de92b0a8b29fdf592c111276f6a12fe29c30f6c417dd546d12"}, + {file = "mypy-1.11.2.tar.gz", hash = "sha256:7f9993ad3e0ffdc95c2a14b66dee63729f021968bff8ad911867579c65d13a79"}, ] [package.dependencies] mypy-extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -715,13 +747,13 @@ files = [ [[package]] name = "openpyxl" -version = "3.1.2" +version = "3.1.5" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, - {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, + {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, + {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, ] [package.dependencies] @@ -745,13 +777,13 @@ typing-extensions = ">=3.7.4" [[package]] name = "packaging" -version = "24.0" +version = "24.1" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] [[package]] @@ -767,18 +799,19 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, - {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, ] [package.extras] docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "psycopg2-binary" @@ -874,17 +907,17 @@ files = [ [[package]] name = "pylint" -version = "3.1.0" +version = "3.2.6" description = "python code static checker" optional = false python-versions = ">=3.8.0" files = [ - {file = "pylint-3.1.0-py3-none-any.whl", hash = "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74"}, - {file = "pylint-3.1.0.tar.gz", hash = "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23"}, + {file = "pylint-3.2.6-py3-none-any.whl", hash = "sha256:03c8e3baa1d9fb995b12c1dbe00aa6c4bcef210c2a2634374aedeb22fb4a8f8f"}, + {file = "pylint-3.2.6.tar.gz", hash = "sha256:a5d01678349454806cff6d886fb072294f56a58c4761278c97fb557d708e1eb3"}, ] [package.dependencies] -astroid = ">=3.1.0,<=3.2.0-dev0" +astroid = ">=3.2.4,<=3.3.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -935,17 +968,17 @@ pylint = ">=1.7" [[package]] name = "pyopenssl" -version = "24.1.0" +version = "24.2.1" description = "Python wrapper module around the OpenSSL library" optional = false python-versions = ">=3.7" files = [ - {file = "pyOpenSSL-24.1.0-py3-none-any.whl", hash = "sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad"}, - {file = "pyOpenSSL-24.1.0.tar.gz", hash = "sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f"}, + {file = "pyOpenSSL-24.2.1-py3-none-any.whl", hash = "sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d"}, + {file = "pyopenssl-24.2.1.tar.gz", hash = "sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95"}, ] [package.dependencies] -cryptography = ">=41.0.5,<43" +cryptography = ">=41.0.5,<44" [package.extras] docs = ["sphinx (!=5.2.0,!=5.2.0.post0,!=7.2.5)", "sphinx-rtd-theme"] @@ -953,31 +986,31 @@ test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] [[package]] name = "redis" -version = "5.0.3" +version = "5.0.8" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.3-py3-none-any.whl", hash = "sha256:5da9b8fe9e1254293756c16c008e8620b3d15fcc6dde6babde9541850e72a32d"}, - {file = "redis-5.0.3.tar.gz", hash = "sha256:4973bae7444c0fbed64a06b87446f79361cb7e4ec1538c022d696ed7a5015580"}, + {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, + {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, ] [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] -hiredis = ["hiredis (>=1.0.0)"] +hiredis = ["hiredis (>1.0.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -992,50 +1025,51 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "ruff" -version = "0.3.7" +version = "0.6.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0e8377cccb2f07abd25e84fc5b2cbe48eeb0fea9f1719cad7caedb061d70e5ce"}, - {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:15a4d1cc1e64e556fa0d67bfd388fed416b7f3b26d5d1c3e7d192c897e39ba4b"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d28bdf3d7dc71dd46929fafeec98ba89b7c3550c3f0978e36389b5631b793663"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:379b67d4f49774ba679593b232dcd90d9e10f04d96e3c8ce4a28037ae473f7bb"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c060aea8ad5ef21cdfbbe05475ab5104ce7827b639a78dd55383a6e9895b7c51"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ebf8f615dde968272d70502c083ebf963b6781aacd3079081e03b32adfe4d58a"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48098bd8f5c38897b03604f5428901b65e3c97d40b3952e38637b5404b739a2"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8a4fda219bf9024692b1bc68c9cff4b80507879ada8769dc7e985755d662ea"}, - {file = "ruff-0.3.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c44e0149f1d8b48c4d5c33d88c677a4aa22fd09b1683d6a7ff55b816b5d074f"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3050ec0af72b709a62ecc2aca941b9cd479a7bf2b36cc4562f0033d688e44fa1"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a29cc38e4c1ab00da18a3f6777f8b50099d73326981bb7d182e54a9a21bb4ff7"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b15cc59c19edca917f51b1956637db47e200b0fc5e6e1878233d3a938384b0b"}, - {file = "ruff-0.3.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e491045781b1e38b72c91247cf4634f040f8d0cb3e6d3d64d38dcf43616650b4"}, - {file = "ruff-0.3.7-py3-none-win32.whl", hash = "sha256:bc931de87593d64fad3a22e201e55ad76271f1d5bfc44e1a1887edd0903c7d9f"}, - {file = "ruff-0.3.7-py3-none-win_amd64.whl", hash = "sha256:5ef0e501e1e39f35e03c2acb1d1238c595b8bb36cf7a170e7c1df1b73da00e74"}, - {file = "ruff-0.3.7-py3-none-win_arm64.whl", hash = "sha256:789e144f6dc7019d1f92a812891c645274ed08af6037d11fc65fcbc183b7d59f"}, - {file = "ruff-0.3.7.tar.gz", hash = "sha256:d5c1aebee5162c2226784800ae031f660c350e7a3402c4d1f8ea4e97e232e3ba"}, + {file = "ruff-0.6.2-py3-none-linux_armv6l.whl", hash = "sha256:5c8cbc6252deb3ea840ad6a20b0f8583caab0c5ef4f9cca21adc5a92b8f79f3c"}, + {file = "ruff-0.6.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:17002fe241e76544448a8e1e6118abecbe8cd10cf68fde635dad480dba594570"}, + {file = "ruff-0.6.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3dbeac76ed13456f8158b8f4fe087bf87882e645c8e8b606dd17b0b66c2c1158"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:094600ee88cda325988d3f54e3588c46de5c18dae09d683ace278b11f9d4d534"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:316d418fe258c036ba05fbf7dfc1f7d3d4096db63431546163b472285668132b"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d72b8b3abf8a2d51b7b9944a41307d2f442558ccb3859bbd87e6ae9be1694a5d"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2aed7e243be68487aa8982e91c6e260982d00da3f38955873aecd5a9204b1d66"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d371f7fc9cec83497fe7cf5eaf5b76e22a8efce463de5f775a1826197feb9df8"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8f310d63af08f583363dfb844ba8f9417b558199c58a5999215082036d795a1"}, + {file = "ruff-0.6.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7db6880c53c56addb8638fe444818183385ec85eeada1d48fc5abe045301b2f1"}, + {file = "ruff-0.6.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1175d39faadd9a50718f478d23bfc1d4da5743f1ab56af81a2b6caf0a2394f23"}, + {file = "ruff-0.6.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b939f9c86d51635fe486585389f54582f0d65b8238e08c327c1534844b3bb9a"}, + {file = "ruff-0.6.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d0d62ca91219f906caf9b187dea50d17353f15ec9bb15aae4a606cd697b49b4c"}, + {file = "ruff-0.6.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7438a7288f9d67ed3c8ce4d059e67f7ed65e9fe3aa2ab6f5b4b3610e57e3cb56"}, + {file = "ruff-0.6.2-py3-none-win32.whl", hash = "sha256:279d5f7d86696df5f9549b56b9b6a7f6c72961b619022b5b7999b15db392a4da"}, + {file = "ruff-0.6.2-py3-none-win_amd64.whl", hash = "sha256:d9f3469c7dd43cd22eb1c3fc16926fb8258d50cb1b216658a07be95dd117b0f2"}, + {file = "ruff-0.6.2-py3-none-win_arm64.whl", hash = "sha256:f28fcd2cd0e02bdf739297516d5643a945cc7caf09bd9bcb4d932540a5ea4fa9"}, + {file = "ruff-0.6.2.tar.gz", hash = "sha256:239ee6beb9e91feb8e0ec384204a763f36cb53fb895a1a364618c6abb076b3be"}, ] [[package]] name = "soupsieve" -version = "2.5" +version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] [[package]] name = "sqlparse" -version = "0.5.0" +version = "0.5.1" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" files = [ - {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, - {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, + {file = "sqlparse-0.5.1-py3-none-any.whl", hash = "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4"}, + {file = "sqlparse-0.5.1.tar.gz", hash = "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e"}, ] [package.extras] @@ -1066,64 +1100,53 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.4" +version = "0.13.2" description = "Style preserving TOML library" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, - {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, + {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, + {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, ] [[package]] name = "typeguard" -version = "4.2.1" +version = "4.3.0" description = "Run-time type checker for Python" optional = false python-versions = ">=3.8" files = [ - {file = "typeguard-4.2.1-py3-none-any.whl", hash = "sha256:7da3bd46e61f03e0852f8d251dcbdc2a336aa495d7daff01e092b55327796eb8"}, - {file = "typeguard-4.2.1.tar.gz", hash = "sha256:c556a1b95948230510070ca53fa0341fb0964611bd05d598d87fb52115d65fee"}, + {file = "typeguard-4.3.0-py3-none-any.whl", hash = "sha256:4d24c5b39a117f8a895b9da7a9b3114f04eb63bade45a4492de49b175b6f7dfa"}, + {file = "typeguard-4.3.0.tar.gz", hash = "sha256:92ee6a0aec9135181eae6067ebd617fd9de8d75d714fb548728a4933b1dea651"}, ] [package.dependencies] -typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} +typing-extensions = ">=4.10.0" [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.3.0)"] test = ["coverage[toml] (>=7)", "mypy (>=1.2.0)", "pytest (>=7)"] -[[package]] -name = "types-pytz" -version = "2024.1.0.20240417" -description = "Typing stubs for pytz" -optional = false -python-versions = ">=3.8" -files = [ - {file = "types-pytz-2024.1.0.20240417.tar.gz", hash = "sha256:6810c8a1f68f21fdf0f4f374a432487c77645a0ac0b31de4bf4690cf21ad3981"}, - {file = "types_pytz-2024.1.0.20240417-py3-none-any.whl", hash = "sha256:8335d443310e2db7b74e007414e74c4f53b67452c0cb0d228ca359ccfba59659"}, -] - [[package]] name = "types-pyyaml" -version = "6.0.12.20240311" +version = "6.0.12.20240808" description = "Typing stubs for PyYAML" optional = false python-versions = ">=3.8" files = [ - {file = "types-PyYAML-6.0.12.20240311.tar.gz", hash = "sha256:a9e0f0f88dc835739b0c1ca51ee90d04ca2a897a71af79de9aec5f38cb0a5342"}, - {file = "types_PyYAML-6.0.12.20240311-py3-none-any.whl", hash = "sha256:b845b06a1c7e54b8e5b4c683043de0d9caf205e7434b3edc678ff2411979b8f6"}, + {file = "types-PyYAML-6.0.12.20240808.tar.gz", hash = "sha256:b8f76ddbd7f65440a8bda5526a9607e4c7a322dc2f8e1a8c405644f9a6f4b9af"}, + {file = "types_PyYAML-6.0.12.20240808-py3-none-any.whl", hash = "sha256:deda34c5c655265fc517b546c902aa6eed2ef8d3e921e4765fe606fe2afe8d35"}, ] [[package]] name = "typing-extensions" -version = "4.11.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, - {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -1139,13 +1162,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] @@ -1171,13 +1194,13 @@ testing = ["coverage (>=5.0)", "pytest", "pytest-cov"] [[package]] name = "webob" -version = "1.8.7" +version = "1.8.8" description = "WSGI request and response object" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "WebOb-1.8.7-py2.py3-none-any.whl", hash = "sha256:73aae30359291c14fa3b956f8b5ca31960e420c28c1bec002547fb04928cf89b"}, - {file = "WebOb-1.8.7.tar.gz", hash = "sha256:b64ef5141be559cfade448f044fa45c2260351edcb6a8ef6b7e00c7dcef0c323"}, + {file = "WebOb-1.8.8-py2.py3-none-any.whl", hash = "sha256:b60ba63f05c0cf61e086a10c3781a41fcfe30027753a8ae6d819c77592ce83ea"}, + {file = "webob-1.8.8.tar.gz", hash = "sha256:2abc1555e118fc251e705fc6dc66c7f5353bb9fbfab6d20e22f1c02b4b71bcee"}, ] [package.extras] @@ -1234,4 +1257,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "7ba3f123763d13d619d3fcc5d5e945a17b6b456b7f1d0245457b418e0903c99c" +content-hash = "32590408c713fbcdb8f4efc1cbdd5365af65dece754107c899f81b1cfcb1be26" diff --git a/pyproject.toml b/pyproject.toml index c9758957de..bb82303ff8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,7 @@ [tool.poetry] +package-mode = false name = "evap" -version = "2024-07-08-dev" +version = "0.1.0" readme = "README.md" packages = [{include = "evap"}] From f273d3980c0da1d6514dce9e0cf8573c0fc1287e Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 22:06:11 +0200 Subject: [PATCH 32/75] install chrome with sudo --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 17ac957d69..c046bfe64b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -176,7 +176,7 @@ jobs: with: npm-ci: true - - run: apt-get -q install -y chromium-browser + - run: sudo apt-get update && sudo apt-get -q install chromium-browser - name: Compile Typescript run: npx tsc --project evap/static/ts/tsconfig.compile.json From b529b26b2b3c886a169cc806e6b2b6f12167c12e Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 22:08:07 +0200 Subject: [PATCH 33/75] shells without quotes? --- .github/setup_evap/action.yml | 2 +- .github/workflows/tests.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/setup_evap/action.yml b/.github/setup_evap/action.yml index f3177e2922..8727a1fa8f 100644 --- a/.github/setup_evap/action.yml +++ b/.github/setup_evap/action.yml @@ -5,7 +5,7 @@ inputs: shell: description: "name of development shell to use" required: false - default: './#evap-dev' + default: .#evap-dev start-db: description: "whether or not to run the database in the background" required: false diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c046bfe64b..256dca36d0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -93,7 +93,7 @@ jobs: submodules: true - uses: ./.github/setup_evap with: - shell: './#evap' # no dev-dependencies + shell: .#evap # no dev-dependencies start-db: true - name: Install additional dependencies From 6de88085276e9297e77eeb4bc5453487de529022 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 22:13:34 +0200 Subject: [PATCH 34/75] use `~` over `^` in dependencies --- poetry.lock | 18 +++++++++--------- pyproject.toml | 42 +++++++++++++++++++++--------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5ef7d2b284..f9e3bc2e42 100644 --- a/poetry.lock +++ b/poetry.lock @@ -476,17 +476,17 @@ profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "django" -version = "5.1" +version = "5.0.8" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.10" files = [ - {file = "Django-5.1-py3-none-any.whl", hash = "sha256:d3b811bf5371a26def053d7ee42a9df1267ef7622323fe70a601936725aa4557"}, - {file = "Django-5.1.tar.gz", hash = "sha256:848a5980e8efb76eea70872fb0e4bc5e371619c70fffbe48e3e1b50b2c09455d"}, + {file = "Django-5.0.8-py3-none-any.whl", hash = "sha256:333a7988f7ca4bc14d360d3d8f6b793704517761ae3813b95432043daec22a45"}, + {file = "Django-5.0.8.tar.gz", hash = "sha256:ebe859c9da6fead9c9ee6dbfa4943b04f41342f4cea2c4d8c978ef0d10694f2b"}, ] [package.dependencies] -asgiref = ">=3.8.1,<4" +asgiref = ">=3.7.0,<4" sqlparse = ">=0.3.1" tzdata = {version = "*", markers = "sys_platform == \"win32\""} @@ -496,17 +496,17 @@ bcrypt = ["bcrypt"] [[package]] name = "django-debug-toolbar" -version = "4.4.6" +version = "4.0.0" description = "A configurable set of panels that display various debug information about the current request/response." optional = false python-versions = ">=3.8" files = [ - {file = "django_debug_toolbar-4.4.6-py3-none-any.whl", hash = "sha256:3beb671c9ec44ffb817fad2780667f172bd1c067dbcabad6268ce39a81335f45"}, - {file = "django_debug_toolbar-4.4.6.tar.gz", hash = "sha256:36e421cb908c2f0675e07f9f41e3d1d8618dc386392ec82d23bcfcd5d29c7044"}, + {file = "django_debug_toolbar-4.0.0-py3-none-any.whl", hash = "sha256:bad339d68520652ddc1580c76f136fcbc3e020fd5ed96510a89a02ec81bb3fb1"}, + {file = "django_debug_toolbar-4.0.0.tar.gz", hash = "sha256:89619f6e0ea1057dca47bfc429ed99b237ef70074dabc065a7faa5f00e1459cf"}, ] [package.dependencies] -django = ">=4.2.9" +django = ">=3.2.4" sqlparse = ">=0.2" [[package]] @@ -1257,4 +1257,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "32590408c713fbcdb8f4efc1cbdd5365af65dece754107c899f81b1cfcb1be26" +content-hash = "9bd505b35c74c8e9562ad6a3432a309d2aef14a91060ded4f0a068c0073f9bbc" diff --git a/pyproject.toml b/pyproject.toml index bb82303ff8..f5524978ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,31 +7,31 @@ packages = [{include = "evap"}] [tool.poetry.dependencies] python = "^3.10" -django-extensions = "^3.2.3" -django-fsm = "^2.8.2" -Django = "^5.0.0" -mozilla-django-oidc = "^4.0.1" -openpyxl = "^3.1.5" -psycopg2-binary = "^2.9.9" -redis = "^5.0.8" -xlwt = "^1.3.0" +django-extensions = "~3.2.3" +django-fsm = "~2.8.2" +Django = "~5.0.0" +mozilla-django-oidc = "~4.0.1" +openpyxl = "~3.1.5" +psycopg2-binary = "~2.9.9" +redis = "~5.0.8" +xlwt = "~1.3.0" [tool.poetry.group.dev.dependencies] -black = "^24.8.0" +black = "~24.8.0" coverage = { version = "*", extras = ["toml"] } -django-debug-toolbar = "^4.0" +django-debug-toolbar = "~4.0" django-stubs = "5.0.4" -django-webtest = "^1.9.10" -isort = "^5.13.1" -model-bakery = "^1.19.5" -mypy = "^1.11.0" -openpyxl-stubs = "^0.1.25" -pylint-django = "^2.5.4" -pylint = "^3.2.3" -ruff = "^0.6.2" -tblib = "^3.0.0" -xlrd = "^2.0.1" -typeguard = "^4.3.0" +django-webtest = "~1.9.10" +isort = "~5.13.1" +model-bakery = "~1.19.5" +mypy = "~1.11.0" +openpyxl-stubs = "~0.1.25" +pylint-django = "~2.5.4" +pylint = "~3.2.3" +ruff = "~0.6.2" +tblib = "~3.0.0" +xlrd = "~2.0.1" +typeguard = "~4.3.0" [build-system] requires = ["poetry-core"] From 7af9c0a0dc45dbcf74ec8b45601bd0122ac92ad9 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 26 Aug 2024 22:53:02 +0200 Subject: [PATCH 35/75] remove mentions of ENVDIR --- deployment/load_production_backup.sh | 23 ++++++++++------------- deployment/update_production.sh | 20 +++++++++----------- 2 files changed, 19 insertions(+), 24 deletions(-) diff --git a/deployment/load_production_backup.sh b/deployment/load_production_backup.sh index 45a96ac573..c50e406341 100755 --- a/deployment/load_production_backup.sh +++ b/deployment/load_production_backup.sh @@ -7,9 +7,8 @@ set -e # abort on error cd "$(dirname "$0")/.." # change to root directory USERNAME="evap" -ENVDIR="/opt/evap/env" CONDITIONAL_NOINPUT="" -[[ ! -z "$GITHUB_WORKFLOW" ]] && echo "Detected GitHub" && USERNAME="root" && ENVDIR="${VIRTUAL_ENV}" && CONDITIONAL_NOINPUT="--noinput" +[[ ! -z "$GITHUB_WORKFLOW" ]] && echo "Detected GitHub" && USERNAME="root" && CONDITIONAL_NOINPUT="--noinput" COMMIT_HASH="$(git rev-parse --short HEAD)" @@ -43,20 +42,18 @@ fi [[ -z "$GITHUB_WORKFLOW" ]] && sudo service apache2 stop -sudo -H -u "$USERNAME" "$ENVDIR/bin/pip" install -r requirements.txt - # sometimes, this fails for some random i18n test translation files. -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py compilemessages || true -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py scss --production -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py collectstatic --noinput +sudo -H -u "$USERNAME" ./manage.py compilemessages || true +sudo -H -u "$USERNAME" ./manage.py scss --production +sudo -H -u "$USERNAME" ./manage.py collectstatic --noinput -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py reset_db "$CONDITIONAL_NOINPUT" -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py migrate -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py flush "$CONDITIONAL_NOINPUT" -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py loaddata "$1" +sudo -H -u "$USERNAME" ./manage.py reset_db "$CONDITIONAL_NOINPUT" +sudo -H -u "$USERNAME" ./manage.py migrate +sudo -H -u "$USERNAME" ./manage.py flush "$CONDITIONAL_NOINPUT" +sudo -H -u "$USERNAME" ./manage.py loaddata "$1" -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py clear_cache --all -v=1 -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py refresh_results_cache +sudo -H -u "$USERNAME" ./manage.py clear_cache --all -v=1 +sudo -H -u "$USERNAME" ./manage.py refresh_results_cache [[ -z "$GITHUB_WORKFLOW" ]] && sudo service apache2 start diff --git a/deployment/update_production.sh b/deployment/update_production.sh index ec9e4f6bf3..dcddfa63b3 100755 --- a/deployment/update_production.sh +++ b/deployment/update_production.sh @@ -10,8 +10,7 @@ BACKUP_TITLE="backup" TIMESTAMP="$(date +%Y-%m-%d_%H:%M:%S)" USERNAME="evap" -ENVDIR="/opt/evap/env" -[[ ! -z "$GITHUB_WORKFLOW" ]] && echo "Detected GitHub" && USERNAME="root" && ENVDIR="${VIRTUAL_ENV}" +[[ ! -z "$GITHUB_WORKFLOW" ]] && echo "Detected GitHub" && USERNAME="root" # argument 1 is the title for the backupfile. if [ $# -eq 1 ] @@ -36,20 +35,19 @@ sudo -H -u $USERNAME git fetch # match the database layout, or https://github.com/e-valuation/EvaP/issues/1237. [[ -z "$GITHUB_WORKFLOW" ]] && sudo ./deployment/enable_maintenance_mode.sh -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py dumpdata --natural-foreign --natural-primary --all -e contenttypes -e auth.Permission --indent 2 --output "$FILENAME" +sudo -H -u "$USERNAME" ./manage.py dumpdata --natural-foreign --natural-primary --all -e contenttypes -e auth.Permission --indent 2 --output "$FILENAME" [[ ! -z "$EVAP_SKIP_CHECKOUT" ]] && echo "Skipping Checkout" [[ ! -z "$EVAP_SKIP_CHECKOUT" ]] || sudo -H -u "$USERNAME" git checkout origin/release -sudo -H -u "$USERNAME" "$ENVDIR/bin/pip" install -r requirements.txt # sometimes, this fails for some random i18n test translation files. -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py compilemessages || true -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py scss --production -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py ts compile --fresh -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py collectstatic --noinput -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py migrate -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py clear_cache --all -v=1 -sudo -H -u "$USERNAME" "$ENVDIR/bin/python" manage.py refresh_results_cache +sudo -H -u "$USERNAME" ./manage.py compilemessages || true +sudo -H -u "$USERNAME" ./manage.py scss --production +sudo -H -u "$USERNAME" ./manage.py ts compile --fresh +sudo -H -u "$USERNAME" ./manage.py collectstatic --noinput +sudo -H -u "$USERNAME" ./manage.py migrate +sudo -H -u "$USERNAME" ./manage.py clear_cache --all -v=1 +sudo -H -u "$USERNAME" ./manage.py refresh_results_cache [[ -z "$GITHUB_WORKFLOW" ]] && sudo ./deployment/disable_maintenance_mode.sh From 0787642be2e07a071a6a86e7254d84df5e208a27 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Thu, 29 Aug 2024 20:46:11 +0200 Subject: [PATCH 36/75] install browser via suggested command --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 256dca36d0..83df1878ee 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -176,7 +176,7 @@ jobs: with: npm-ci: true - - run: sudo apt-get update && sudo apt-get -q install chromium-browser + - run: npx puppeteer browsers install chrome - name: Compile Typescript run: npx tsc --project evap/static/ts/tsconfig.compile.json From e359113ba648d1aadb395897fb255dbccdff881a Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Thu, 29 Aug 2024 20:47:13 +0200 Subject: [PATCH 37/75] preserve env (such as PATH to binaries from nix) with sudo --- deployment/update_production.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/deployment/update_production.sh b/deployment/update_production.sh index dcddfa63b3..22ed5979af 100755 --- a/deployment/update_production.sh +++ b/deployment/update_production.sh @@ -35,19 +35,19 @@ sudo -H -u $USERNAME git fetch # match the database layout, or https://github.com/e-valuation/EvaP/issues/1237. [[ -z "$GITHUB_WORKFLOW" ]] && sudo ./deployment/enable_maintenance_mode.sh -sudo -H -u "$USERNAME" ./manage.py dumpdata --natural-foreign --natural-primary --all -e contenttypes -e auth.Permission --indent 2 --output "$FILENAME" +sudo -H -u "$USERNAME" --preserve-env ./manage.py dumpdata --natural-foreign --natural-primary --all -e contenttypes -e auth.Permission --indent 2 --output "$FILENAME" [[ ! -z "$EVAP_SKIP_CHECKOUT" ]] && echo "Skipping Checkout" [[ ! -z "$EVAP_SKIP_CHECKOUT" ]] || sudo -H -u "$USERNAME" git checkout origin/release # sometimes, this fails for some random i18n test translation files. -sudo -H -u "$USERNAME" ./manage.py compilemessages || true -sudo -H -u "$USERNAME" ./manage.py scss --production -sudo -H -u "$USERNAME" ./manage.py ts compile --fresh -sudo -H -u "$USERNAME" ./manage.py collectstatic --noinput -sudo -H -u "$USERNAME" ./manage.py migrate -sudo -H -u "$USERNAME" ./manage.py clear_cache --all -v=1 -sudo -H -u "$USERNAME" ./manage.py refresh_results_cache +sudo -H -u "$USERNAME" --preserve-env ./manage.py compilemessages || true +sudo -H -u "$USERNAME" --preserve-env ./manage.py scss --production +sudo -H -u "$USERNAME" --preserve-env ./manage.py ts compile --fresh +sudo -H -u "$USERNAME" --preserve-env ./manage.py collectstatic --noinput +sudo -H -u "$USERNAME" --preserve-env ./manage.py migrate +sudo -H -u "$USERNAME" --preserve-env ./manage.py clear_cache --all -v=1 +sudo -H -u "$USERNAME" --preserve-env ./manage.py refresh_results_cache [[ -z "$GITHUB_WORKFLOW" ]] && sudo ./deployment/disable_maintenance_mode.sh From 0a8682a389735b593b314ef3dc1521d941acdac5 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Thu, 29 Aug 2024 21:09:02 +0200 Subject: [PATCH 38/75] also include forbidden PYTHONPATH --- deployment/update_production.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/deployment/update_production.sh b/deployment/update_production.sh index 22ed5979af..7415580452 100755 --- a/deployment/update_production.sh +++ b/deployment/update_production.sh @@ -35,19 +35,19 @@ sudo -H -u $USERNAME git fetch # match the database layout, or https://github.com/e-valuation/EvaP/issues/1237. [[ -z "$GITHUB_WORKFLOW" ]] && sudo ./deployment/enable_maintenance_mode.sh -sudo -H -u "$USERNAME" --preserve-env ./manage.py dumpdata --natural-foreign --natural-primary --all -e contenttypes -e auth.Permission --indent 2 --output "$FILENAME" +sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py dumpdata --natural-foreign --natural-primary --all -e contenttypes -e auth.Permission --indent 2 --output "$FILENAME" [[ ! -z "$EVAP_SKIP_CHECKOUT" ]] && echo "Skipping Checkout" [[ ! -z "$EVAP_SKIP_CHECKOUT" ]] || sudo -H -u "$USERNAME" git checkout origin/release # sometimes, this fails for some random i18n test translation files. -sudo -H -u "$USERNAME" --preserve-env ./manage.py compilemessages || true -sudo -H -u "$USERNAME" --preserve-env ./manage.py scss --production -sudo -H -u "$USERNAME" --preserve-env ./manage.py ts compile --fresh -sudo -H -u "$USERNAME" --preserve-env ./manage.py collectstatic --noinput -sudo -H -u "$USERNAME" --preserve-env ./manage.py migrate -sudo -H -u "$USERNAME" --preserve-env ./manage.py clear_cache --all -v=1 -sudo -H -u "$USERNAME" --preserve-env ./manage.py refresh_results_cache +sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py compilemessages || true +sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py scss --production +sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py ts compile --fresh +sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py collectstatic --noinput +sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py migrate +sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py clear_cache --all -v=1 +sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py refresh_results_cache [[ -z "$GITHUB_WORKFLOW" ]] && sudo ./deployment/disable_maintenance_mode.sh From 197c1093d59605b922ebd03caa8f5b1828c35fa7 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Thu, 29 Aug 2024 21:19:22 +0200 Subject: [PATCH 39/75] nope, I guess this is nicer anyways? --- deployment/update_production.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/deployment/update_production.sh b/deployment/update_production.sh index 7415580452..8f7fa5b44e 100755 --- a/deployment/update_production.sh +++ b/deployment/update_production.sh @@ -35,19 +35,19 @@ sudo -H -u $USERNAME git fetch # match the database layout, or https://github.com/e-valuation/EvaP/issues/1237. [[ -z "$GITHUB_WORKFLOW" ]] && sudo ./deployment/enable_maintenance_mode.sh -sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py dumpdata --natural-foreign --natural-primary --all -e contenttypes -e auth.Permission --indent 2 --output "$FILENAME" +sudo -H -u "$USERNAME" nix develop --command "./manage.py dumpdata --natural-foreign --natural-primary --all -e contenttypes -e auth.Permission --indent 2 --output \"$FILENAME\"" [[ ! -z "$EVAP_SKIP_CHECKOUT" ]] && echo "Skipping Checkout" [[ ! -z "$EVAP_SKIP_CHECKOUT" ]] || sudo -H -u "$USERNAME" git checkout origin/release # sometimes, this fails for some random i18n test translation files. -sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py compilemessages || true -sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py scss --production -sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py ts compile --fresh -sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py collectstatic --noinput -sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py migrate -sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py clear_cache --all -v=1 -sudo -H -u "$USERNAME" --preserve-env=PYTHONPATH ./manage.py refresh_results_cache +sudo -H -u "$USERNAME" nix develop --command './manage.py compilemessages' || true +sudo -H -u "$USERNAME" nix develop --command './manage.py scss --production' +sudo -H -u "$USERNAME" nix develop --command './manage.py ts compile --fresh' +sudo -H -u "$USERNAME" nix develop --command './manage.py collectstatic --noinput' +sudo -H -u "$USERNAME" nix develop --command './manage.py migrate' +sudo -H -u "$USERNAME" nix develop --command './manage.py clear_cache --all -v=1' +sudo -H -u "$USERNAME" nix develop --command './manage.py refresh_results_cache' [[ -z "$GITHUB_WORKFLOW" ]] && sudo ./deployment/disable_maintenance_mode.sh From 64173d4e8d1a7c02017d70104dbfefe5747e923d Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 2 Sep 2024 18:39:38 +0200 Subject: [PATCH 40/75] Remove `sudo` from deployment scripts --- deployment/load_production_backup.sh | 27 ++++++++++------------- deployment/update_production.sh | 33 ++++++++++------------------ 2 files changed, 23 insertions(+), 37 deletions(-) diff --git a/deployment/load_production_backup.sh b/deployment/load_production_backup.sh index c50e406341..f63859728a 100755 --- a/deployment/load_production_backup.sh +++ b/deployment/load_production_backup.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Counter part for update_production script. # This script will import the backup made by update_production. @@ -6,9 +6,8 @@ set -e # abort on error cd "$(dirname "$0")/.." # change to root directory -USERNAME="evap" CONDITIONAL_NOINPUT="" -[[ ! -z "$GITHUB_WORKFLOW" ]] && echo "Detected GitHub" && USERNAME="root" && CONDITIONAL_NOINPUT="--noinput" +[[ ! -z "$GITHUB_WORKFLOW" ]] && echo "Detected GitHub" && CONDITIONAL_NOINPUT="--noinput" COMMIT_HASH="$(git rev-parse --short HEAD)" @@ -40,22 +39,18 @@ then exit 1 fi -[[ -z "$GITHUB_WORKFLOW" ]] && sudo service apache2 stop - # sometimes, this fails for some random i18n test translation files. -sudo -H -u "$USERNAME" ./manage.py compilemessages || true -sudo -H -u "$USERNAME" ./manage.py scss --production -sudo -H -u "$USERNAME" ./manage.py collectstatic --noinput - -sudo -H -u "$USERNAME" ./manage.py reset_db "$CONDITIONAL_NOINPUT" -sudo -H -u "$USERNAME" ./manage.py migrate -sudo -H -u "$USERNAME" ./manage.py flush "$CONDITIONAL_NOINPUT" -sudo -H -u "$USERNAME" ./manage.py loaddata "$1" +./manage.py compilemessages || true +./manage.py scss --production +./manage.py collectstatic --noinput -sudo -H -u "$USERNAME" ./manage.py clear_cache --all -v=1 -sudo -H -u "$USERNAME" ./manage.py refresh_results_cache +./manage.py reset_db "$CONDITIONAL_NOINPUT" +./manage.py migrate +./manage.py flush "$CONDITIONAL_NOINPUT" +./manage.py loaddata "$1" -[[ -z "$GITHUB_WORKFLOW" ]] && sudo service apache2 start +./manage.py clear_cache --all -v=1 +./manage.py refresh_results_cache { set +x; } 2>/dev/null # don't print the echo command, and don't print the 'set +x' itself diff --git a/deployment/update_production.sh b/deployment/update_production.sh index 8f7fa5b44e..f51ccc695b 100755 --- a/deployment/update_production.sh +++ b/deployment/update_production.sh @@ -1,4 +1,5 @@ -#!/bin/bash +#!/usr/bin/env bash + set -e # abort on error cd "$(dirname "$0")/.." # change to root directory @@ -9,9 +10,6 @@ COMMIT_HASH="$(git rev-parse --short HEAD)" BACKUP_TITLE="backup" TIMESTAMP="$(date +%Y-%m-%d_%H:%M:%S)" -USERNAME="evap" -[[ ! -z "$GITHUB_WORKFLOW" ]] && echo "Detected GitHub" && USERNAME="root" - # argument 1 is the title for the backupfile. if [ $# -eq 1 ] then @@ -28,28 +26,21 @@ echo "Starting update..." set -x # print executed commands. enable this here to not print the if above. -sudo -H -u $USERNAME git fetch - -# Note that apache should not be running during most of the upgrade, -# since then e.g. the backup might be incomplete or the code does not -# match the database layout, or https://github.com/e-valuation/EvaP/issues/1237. -[[ -z "$GITHUB_WORKFLOW" ]] && sudo ./deployment/enable_maintenance_mode.sh +git fetch -sudo -H -u "$USERNAME" nix develop --command "./manage.py dumpdata --natural-foreign --natural-primary --all -e contenttypes -e auth.Permission --indent 2 --output \"$FILENAME\"" +./manage.py dumpdata --natural-foreign --natural-primary --all -e contenttypes -e auth.Permission --indent 2 --output "$FILENAME" [[ ! -z "$EVAP_SKIP_CHECKOUT" ]] && echo "Skipping Checkout" -[[ ! -z "$EVAP_SKIP_CHECKOUT" ]] || sudo -H -u "$USERNAME" git checkout origin/release +[[ ! -z "$EVAP_SKIP_CHECKOUT" ]] || git checkout origin/release # sometimes, this fails for some random i18n test translation files. -sudo -H -u "$USERNAME" nix develop --command './manage.py compilemessages' || true -sudo -H -u "$USERNAME" nix develop --command './manage.py scss --production' -sudo -H -u "$USERNAME" nix develop --command './manage.py ts compile --fresh' -sudo -H -u "$USERNAME" nix develop --command './manage.py collectstatic --noinput' -sudo -H -u "$USERNAME" nix develop --command './manage.py migrate' -sudo -H -u "$USERNAME" nix develop --command './manage.py clear_cache --all -v=1' -sudo -H -u "$USERNAME" nix develop --command './manage.py refresh_results_cache' - -[[ -z "$GITHUB_WORKFLOW" ]] && sudo ./deployment/disable_maintenance_mode.sh +./manage.py compilemessages || true +./manage.py scss --production +./manage.py ts compile --fresh +./manage.py collectstatic --noinput +./manage.py migrate +./manage.py clear_cache --all -v=1 +./manage.py refresh_results_cache { set +x; } 2>/dev/null # don't print the echo command, and don't print the 'set +x' itself From 01aa3c2ee8cabc16ae19c03474ab7b4f6cafc8b9 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 2 Sep 2024 18:48:29 +0200 Subject: [PATCH 41/75] `rm -rf .github/setup_nodejs/` --- .github/setup_nodejs/action.yml | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 .github/setup_nodejs/action.yml diff --git a/.github/setup_nodejs/action.yml b/.github/setup_nodejs/action.yml deleted file mode 100644 index e1bd4f5ae4..0000000000 --- a/.github/setup_nodejs/action.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: "Setup nodejs" -description: "Sets up nodejs for use in actions with caching" - -runs: - using: "composite" - steps: - - name: Setup Node - uses: actions/setup-node@v4 - with: - cache: npm - - - name: Install Node dependencies - run: npm ci - shell: bash From f82789573265a14c72c900aa37435ed9f5116d96 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 2 Sep 2024 18:49:04 +0200 Subject: [PATCH 42/75] update dependabot config for actions --- .github/dependabot.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6587bedd45..b7ccb28455 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -37,16 +37,7 @@ updates: labels: - "[T] Dependencies" - package-ecosystem: "github-actions" - directory: "/.github/setup_nodejs" - schedule: - interval: "weekly" - groups: - actions: - patterns: ["*"] - labels: - - "[T] Dependencies" - - package-ecosystem: "github-actions" - directory: "/.github/setup_python" + directory: "/.github/setup_evap" schedule: interval: "weekly" groups: From 24659f486b82e14c5598b3745f62da69f5fe61e9 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 2 Sep 2024 20:48:54 +0200 Subject: [PATCH 43/75] Use `mkPoetryEnv` over `mkPoetryApplication` --- flake.nix | 9 ++------- nix/evap.nix | 11 ----------- nix/shell.nix | 26 ++++++++++++++++++++++++-- pyproject.toml | 1 + 4 files changed, 27 insertions(+), 20 deletions(-) delete mode 100644 nix/evap.nix diff --git a/flake.nix b/flake.nix index 8bff8183c7..1b67d27241 100644 --- a/flake.nix +++ b/flake.nix @@ -20,17 +20,12 @@ ]; systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ]; perSystem = { self', inputs', pkgs, system, ... }: { - packages = rec { - evap = pkgs.callPackage ./nix/evap.nix { + devShells = rec { + evap = pkgs.callPackage ./nix/shell.nix { poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; projectDir = self; }; evap-dev = evap.override { poetry-groups = [ "dev" ]; }; - }; - - devShells = rec { - evap = pkgs.callPackage ./nix/shell.nix { inherit (self'.packages) evap; }; - evap-dev = evap.override { evap = self'.packages.evap-dev; }; default = evap-dev; }; diff --git a/nix/evap.nix b/nix/evap.nix deleted file mode 100644 index 5b494a0f4e..0000000000 --- a/nix/evap.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ projectDir, poetry2nix, poetry-groups ? [], ... }: - -poetry2nix.mkPoetryApplication { - inherit projectDir; - preferWheels = true; - overrides = poetry2nix.overrides.withDefaults (final: prev: { - # https://github.com/nix-community/poetry2nix/issues/1499 - django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; - }); - groups = poetry-groups; -} diff --git a/nix/shell.nix b/nix/shell.nix index 81cbebf479..b1a2a198bf 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -1,4 +1,4 @@ -{ pkgs, evap, extraPackages ? [ ], ... }: +{ pkgs, poetry2nix, projectDir, poetry-groups ? [ ], extraPackages ? [ ], ... }: let clean-setup = pkgs.writeShellScriptBin "clean-setup" '' @@ -21,13 +21,35 @@ let ./manage.py loaddata test_data.json ./manage.py refresh_results_cache ''; + + poetry-env = poetry2nix.mkPoetryEnv { + inherit projectDir; + preferWheels = true; + overrides = poetry2nix.overrides.withDefaults (final: prev: + let + remove-conflicting-file = package-name: filename: prev.${package-name}.overridePythonAttrs { + postInstall = "rm $out/${final.python.sitePackages}/${filename}"; + }; + in + { + # https://github.com/nix-community/poetry2nix/issues/1499 + django-stubs-ext = prev.django-stubs-ext.override { preferWheel = false; }; + + # https://github.com/nix-community/poetry2nix/issues/46 + josepy = remove-conflicting-file "josepy" "CHANGELOG.rst"; + pylint-django = remove-conflicting-file "pylint-django" "CHANGELOG.rst"; + }); + groups = poetry-groups; + checkGroups = [ ]; # would otherwise always install dev-dependencies + editablePackageSources.evap = ./evap; + }; in pkgs.mkShell { - inputsFrom = [ evap ]; packages = with pkgs; [ poetry nodejs + poetry-env clean-setup initialize-setup ] ++ extraPackages; diff --git a/pyproject.toml b/pyproject.toml index f5524978ce..78b87f5d66 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,7 @@ [tool.poetry] package-mode = false name = "evap" +description = "EvaP" version = "0.1.0" readme = "README.md" packages = [{include = "evap"}] From cbf7ac9d8531dcb0c4db28726e459694747ec2a2 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 2 Sep 2024 20:59:19 +0200 Subject: [PATCH 44/75] add `typing-extensions` to dependencies, because it is needed --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 78b87f5d66..a911e7ff16 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ mozilla-django-oidc = "~4.0.1" openpyxl = "~3.1.5" psycopg2-binary = "~2.9.9" redis = "~5.0.8" +typing-extensions = "~4.12.2" xlwt = "~1.3.0" [tool.poetry.group.dev.dependencies] From b26976a6a6da6e9cc59d7b262400e9ea890161a1 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 2 Sep 2024 22:18:39 +0200 Subject: [PATCH 45/75] don't infer redis locale from environment - it didn't work on Ubuntu --- flake.nix | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 1b67d27241..6aa35d71fc 100644 --- a/flake.nix +++ b/flake.nix @@ -36,7 +36,12 @@ ]; services = { - redis."r1".enable = true; + redis."r1" = { + enable = true; + extraConfig = '' + locale-collate "C" + ''; + }; postgres."pg1" = { enable = true; initialScript.before = '' From 9366a782d63c8984aa34905f513096f4d40d3553 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 16 Sep 2024 23:01:30 +0200 Subject: [PATCH 46/75] Add `nix run .#install-services-unit` --- flake.nix | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/flake.nix b/flake.nix index 6aa35d71fc..db9b96f7a1 100644 --- a/flake.nix +++ b/flake.nix @@ -35,6 +35,11 @@ inputs.services-flake.processComposeModules.default ]; + httpServer = { + enable = true; + uds = "process-compose.socket"; + }; + services = { redis."r1" = { enable = true; @@ -53,6 +58,32 @@ }; }; }; + + packages.install-services-unit = + let + # We need to make `bash` available in the path for the readiness-checks. + wrapped-services = pkgs.runCommand "wrapped-services" { nativeBuildInputs = [ pkgs.makeWrapper ]; } '' + makeWrapper ${self'.packages.services}/bin/services $out/bin/services --prefix PATH ':' ${pkgs.lib.makeBinPath [pkgs.bash]} + ''; + in + pkgs.writeShellScriptBin "install-services-unit" '' + set -ex + WORKING_DIR="''${XDG_DATA_HOME:-$HOME/.local/share}/evap-services/" + mkdir -p $WORKING_DIR + cat > ''${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user/evap-services.service < Date: Wed, 18 Sep 2024 00:13:43 +0200 Subject: [PATCH 47/75] Add `extraPythonPackages` --- nix/shell.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nix/shell.nix b/nix/shell.nix index b1a2a198bf..517e91c89f 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -1,4 +1,4 @@ -{ pkgs, poetry2nix, projectDir, poetry-groups ? [ ], extraPackages ? [ ], ... }: +{ pkgs, poetry2nix, projectDir, poetry-groups ? [ ], extraPackages ? [ ], extraPythonPackages ? (ps: [ ]), ... }: let clean-setup = pkgs.writeShellScriptBin "clean-setup" '' @@ -52,7 +52,7 @@ pkgs.mkShell { poetry-env clean-setup initialize-setup - ] ++ extraPackages; + ] ++ extraPackages ++ (extraPythonPackages poetry-env.python.pkgs); env.PUPPETEER_SKIP_DOWNLOAD = 1; } From ad87c96adfac0d4cda62cec1519f000a5c8d42d0 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 23 Sep 2024 22:40:06 +0200 Subject: [PATCH 48/75] make podman setup nicer --- .envrc | 1 + .gitignore | 3 +-- flake.nix | 34 +++++---------------------------- nix/Containerfile | 47 ++++++++++++++++++++++++++++++++++++++++++++++ nix/shell.nix | 1 + nix/tricks.md | 48 +++++++++++------------------------------------ 6 files changed, 66 insertions(+), 68 deletions(-) create mode 100644 .envrc create mode 100644 nix/Containerfile diff --git a/.envrc b/.envrc new file mode 100644 index 0000000000..3550a30f2d --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index dbf94aaa8c..34e5df1ffc 100644 --- a/.gitignore +++ b/.gitignore @@ -58,5 +58,4 @@ setup.cfg /data/ /result -/.envrc -Containerfile +!.envrc diff --git a/flake.nix b/flake.nix index db9b96f7a1..3960b7614b 100644 --- a/flake.nix +++ b/flake.nix @@ -49,41 +49,17 @@ }; postgres."pg1" = { enable = true; + superuser = "postgres"; + createDatabase = false; initialScript.before = '' - CREATE USER evap; - ALTER USER evap WITH PASSWORD 'evap'; - ALTER USER evap CREATEDB; + DROP USER IF EXISTS evap; + DROP DATABASE IF EXISTS evap; + CREATE USER evap PASSWORD 'evap' CREATEDB; CREATE DATABASE evap OWNER evap; ''; }; }; }; - - packages.install-services-unit = - let - # We need to make `bash` available in the path for the readiness-checks. - wrapped-services = pkgs.runCommand "wrapped-services" { nativeBuildInputs = [ pkgs.makeWrapper ]; } '' - makeWrapper ${self'.packages.services}/bin/services $out/bin/services --prefix PATH ':' ${pkgs.lib.makeBinPath [pkgs.bash]} - ''; - in - pkgs.writeShellScriptBin "install-services-unit" '' - set -ex - WORKING_DIR="''${XDG_DATA_HOME:-$HOME/.local/share}/evap-services/" - mkdir -p $WORKING_DIR - cat > ''${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user/evap-services.service <> ~/.bashrc + +# Setup direnv and nix-direnv +RUN echo 'eval "$(direnv hook bash)"' >> ~/.bashrc +RUN mkdir -p ~/.config/direnv/ && cat >> ~/.config/direnv/direnvrc < /etc/systemd/system/evap-services.service <> ~/.bashrc - -USER root -CMD [ "/bin/systemd" ] -``` - -Then, build an image and create a container with +We provide a `Containerfile` that sets everything up: ```bash -podman build -t evap-image . -podman create --name evap-container --userns=keep-id:uid=1001,gid=1001 -v $PWD:/evap -p 8000:8000 evap-image +podman build --tag evap-image nix/ +podman create --name evap-container --userns=keep-id:uid=1001,gid=1001 --volume $PWD:/evap --publish 8000:8000 evap-image ``` From now on, you can use the container whenever you want to work on EvaP. -Start the container with `podman start evap-container` and enter it with `podman exec -u evap -it evap-container /bin/bash`. -After entering the container, you should be able to run `nix develop`. - -The container has `direnv` already set up, you can create the following `.envrc` and then allow it with `direnv allow`: -``` -if ! has nix_direnv_version || ! nix_direnv_version 3.0.5; then - source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.5/direnvrc" "sha256-RuwIS+QKFj/T9M2TFXScjBsLR6V3A17YVoEW/Q6AZ1w=" -fi -use flake -source deployment/manage_autocompletion.sh -``` +Start the container with `podman start evap-container` and enter it with `podman exec -it evap-container machinectl shell -q evap@`. +When entering the container for the first time, it may take a while until the database and development environment have finished setting up. +You can run `./manage.py test` to check whether everything worked out correctly. +Finally, stop the container with `podman stop evap-container`. From 86974e52fb683959869bda18fea5ceac95a1a4a0 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 23 Sep 2024 22:58:26 +0200 Subject: [PATCH 49/75] Move podman description to README --- README.md | 26 +++++++++++++++++++++++++- nix/tricks.md | 17 ----------------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 2f1efb16ca..f7f5239518 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,31 @@ EvaP is the course evaluation system used internally at Hasso Plattner Institute For the documentation, please see our [wiki](https://github.com/e-valuation/EvaP/wiki). -## Development Setup +## Development Setup (Podman) + +To develop EvaP, we recommend that you set up a development container. +This can be done with the configuration file provided by us. +You will have to install [`git`](https://git-scm.com/downloads) and [`podman`](https://podman.io/). +Clone the EvaP repository and create the container using +```bash +git clone --recurse-submodules https://github.com/e-valuation/EvaP.git +cd EvaP +podman build --tag evap-image nix/ +podman create --name evap-container --userns=keep-id:uid=1001,gid=1001 --volume $PWD:/evap --publish 8000:8000 evap-image +``` + +From now on, you can use the created container whenever you want to work on EvaP. +Start the container with `podman start evap-container` and enter it with `podman exec -it evap-container machinectl shell -q evap@`. +When entering the container for the first time, it may take a while until the database and development environment have finished setting up. +Once you see a shell prompt like `evap@5b17c1be4315:/evap$`, you should be ready. +To run the final initialization steps, run the command `initialize-setup`. +Now, you can start EvaP by running `./manage.py run`. +Open your web browser at http://localhost:8000/ and login with email `evap@institution.example.com` and password `evap`. +You can exit the container by pressing `Ctrl-D` and then stop it with `podman stop evap-container` (or it will stop automatically when you shut down your computer). + +## Development Setup (Local) + +TODO To develop EvaP, you will have to install [`git`](https://git-scm.com/downloads) and [`nix`](https://nixos.org/) with support for nix flakes. diff --git a/nix/tricks.md b/nix/tricks.md index 7a12b3eb91..89cc7e9e27 100644 --- a/nix/tricks.md +++ b/nix/tricks.md @@ -37,20 +37,3 @@ You can use `git update-index --assume-unchanged`, if you know what you are doin ## Clean Setup To remove the directories created by the `initialize-setup` command, use the `clean-setup` command. - -## Development Container with Podman - -You can use [`podman`](https://podman.io/) to start a container to develop EvaP. -The container will be isolated from the rest of your system, so that you do not need to install nix on your computer. - -We provide a `Containerfile` that sets everything up: -```bash -podman build --tag evap-image nix/ -podman create --name evap-container --userns=keep-id:uid=1001,gid=1001 --volume $PWD:/evap --publish 8000:8000 evap-image -``` - -From now on, you can use the container whenever you want to work on EvaP. -Start the container with `podman start evap-container` and enter it with `podman exec -it evap-container machinectl shell -q evap@`. -When entering the container for the first time, it may take a while until the database and development environment have finished setting up. -You can run `./manage.py test` to check whether everything worked out correctly. -Finally, stop the container with `podman stop evap-container`. From 683f3b056ab37b1f8539f1fb8a50f1e0880f3f1c Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 30 Sep 2024 21:19:46 +0200 Subject: [PATCH 50/75] remove containerfile, .envrc --- .envrc | 1 - .gitignore | 2 +- nix/Containerfile | 47 ----------------------------------------------- 3 files changed, 1 insertion(+), 49 deletions(-) delete mode 100644 .envrc delete mode 100644 nix/Containerfile diff --git a/.envrc b/.envrc deleted file mode 100644 index 3550a30f2d..0000000000 --- a/.envrc +++ /dev/null @@ -1 +0,0 @@ -use flake diff --git a/.gitignore b/.gitignore index 34e5df1ffc..d115f15abb 100644 --- a/.gitignore +++ b/.gitignore @@ -58,4 +58,4 @@ setup.cfg /data/ /result -!.envrc +.envrc diff --git a/nix/Containerfile b/nix/Containerfile deleted file mode 100644 index 6b1b31c2d6..0000000000 --- a/nix/Containerfile +++ /dev/null @@ -1,47 +0,0 @@ -FROM docker.io/ubuntu:latest - -RUN apt-get update -y && apt-get install -y curl systemd systemd-container direnv sudo git - -# Install nix -RUN curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux \ - --extra-conf "sandbox = false" \ - --no-start-daemon \ - --no-confirm - -# Setup evap user and group -RUN groupadd --gid 1001 evap && useradd --uid 1001 --gid 1001 --no-user-group --groups sudo -ms /bin/bash evap && echo evap:evap | chpasswd -USER evap -WORKDIR /evap -RUN echo 'cd /evap/' >> ~/.bashrc - -# Setup direnv and nix-direnv -RUN echo 'eval "$(direnv hook bash)"' >> ~/.bashrc -RUN mkdir -p ~/.config/direnv/ && cat >> ~/.config/direnv/direnvrc < /etc/systemd/system/evap-services.service < Date: Mon, 30 Sep 2024 21:19:58 +0200 Subject: [PATCH 51/75] Add `nix/setup` script --- nix/setup | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100755 nix/setup diff --git a/nix/setup b/nix/setup new file mode 100755 index 0000000000..ca63a544bd --- /dev/null +++ b/nix/setup @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +set -e + +if apt --version &> /dev/null; then + set -x + sudo apt-get update -y + sudo apt-get install -y nix +elif pacman --version &> /dev/null; then + set -x + sudo pacman -S nix +else + echo "Failed to detect package manager" + exit 1 +fi + +XDG_CONFIG_HOME=${XDG_CONFIG_HOME:-$HOME/.config} +mkdir -p "$XDG_CONFIG_HOME/nix/" +echo "experimental-features = flakes nix-command" >> "$XDG_CONFIG_HOME/nix/nix.conf" +echo "max-jobs = auto" >> "$XDG_CONFIG_HOME/nix/nix.conf" +sudo usermod -aG nix-users $USER +newgrp nix-users +sudo systemctl enable --now nix-daemon From 546da788c57fc71c3f2bd1fa7c0c177cd6ede02a Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 30 Sep 2024 21:49:38 +0200 Subject: [PATCH 52/75] sync dependency versions with main --- poetry.lock | 479 ++++++++++++++++++++++++------------------------- pyproject.toml | 10 +- 2 files changed, 236 insertions(+), 253 deletions(-) diff --git a/poetry.lock b/poetry.lock index f9e3bc2e42..2faf67b161 100644 --- a/poetry.lock +++ b/poetry.lock @@ -19,13 +19,13 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "astroid" -version = "3.2.4" +version = "3.3.4" description = "An abstract syntax tree for Python with inference support." optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.9.0" files = [ - {file = "astroid-3.2.4-py3-none-any.whl", hash = "sha256:413658a61eeca6202a59231abb473f932038fbcbf1666587f66d482083413a25"}, - {file = "astroid-3.2.4.tar.gz", hash = "sha256:0e14202810b30da1b735827f78f5157be2bbd4a7a59b7707ca0bfc2fb4c0063a"}, + {file = "astroid-3.3.4-py3-none-any.whl", hash = "sha256:5eba185467253501b62a9f113c263524b4f5d55e1b30456370eed4cdbd6438fd"}, + {file = "astroid-3.3.4.tar.gz", hash = "sha256:e73d0b62dd680a7c07cb2cd0ce3c22570b044dd01bd994bc3a2dd16c6cbba162"}, ] [package.dependencies] @@ -111,89 +111,89 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, - {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.17.0" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, - {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, - {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, - {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, - {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, - {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, - {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, - {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, - {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, - {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, - {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, - {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, - {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, - {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, - {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, - {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, - {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, - {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, - {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, - {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, - {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, - {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, - {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, - {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, - {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, - {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, - {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, - {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, - {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, - {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, - {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, - {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, - {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, - {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, - {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, - {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, - {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -325,83 +325,63 @@ files = [ [[package]] name = "coverage" -version = "7.6.1" +version = "7.6.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, - {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, - {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, - {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, - {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, - {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, - {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, - {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, - {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, - {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, - {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, - {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, - {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, - {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, - {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, - {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, - {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, + {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, + {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, + {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, + {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, + {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, + {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, + {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, + {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, + {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, + {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, + {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, + {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, ] [package.dependencies] @@ -412,38 +392,38 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "43.0.0" +version = "43.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47"}, - {file = "cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf"}, - {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55"}, - {file = "cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431"}, - {file = "cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc"}, - {file = "cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778"}, - {file = "cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5"}, - {file = "cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f"}, - {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"}, - {file = "cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b"}, - {file = "cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf"}, - {file = "cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f"}, - {file = "cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069"}, - {file = "cryptography-43.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1"}, - {file = "cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e"}, + {file = "cryptography-43.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277"}, + {file = "cryptography-43.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a"}, + {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042"}, + {file = "cryptography-43.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494"}, + {file = "cryptography-43.0.1-cp37-abi3-win32.whl", hash = "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2"}, + {file = "cryptography-43.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d"}, + {file = "cryptography-43.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c"}, + {file = "cryptography-43.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1"}, + {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa"}, + {file = "cryptography-43.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4"}, + {file = "cryptography-43.0.1-cp39-abi3-win32.whl", hash = "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47"}, + {file = "cryptography-43.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289"}, + {file = "cryptography-43.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172"}, + {file = "cryptography-43.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2"}, + {file = "cryptography-43.0.1.tar.gz", hash = "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d"}, ] [package.dependencies] @@ -456,18 +436,18 @@ nox = ["nox"] pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "cryptography-vectors (==43.0.0)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "cryptography-vectors (==43.0.1)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "dill" -version = "0.3.8" +version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" files = [ - {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, - {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, + {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, + {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, ] [package.extras] @@ -476,17 +456,17 @@ profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "django" -version = "5.0.8" +version = "5.1.1" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.10" files = [ - {file = "Django-5.0.8-py3-none-any.whl", hash = "sha256:333a7988f7ca4bc14d360d3d8f6b793704517761ae3813b95432043daec22a45"}, - {file = "Django-5.0.8.tar.gz", hash = "sha256:ebe859c9da6fead9c9ee6dbfa4943b04f41342f4cea2c4d8c978ef0d10694f2b"}, + {file = "Django-5.1.1-py3-none-any.whl", hash = "sha256:71603f27dac22a6533fb38d83072eea9ddb4017fead6f67f2562a40402d61c3f"}, + {file = "Django-5.1.1.tar.gz", hash = "sha256:021ffb7fdab3d2d388bc8c7c2434eb9c1f6f4d09e6119010bbb1694dda286bc2"}, ] [package.dependencies] -asgiref = ">=3.7.0,<4" +asgiref = ">=3.8.1,<4" sqlparse = ">=0.3.1" tzdata = {version = "*", markers = "sys_platform == \"win32\""} @@ -536,19 +516,19 @@ files = [ [[package]] name = "django-stubs" -version = "5.0.4" +version = "5.1.0" description = "Mypy stubs for Django" optional = false python-versions = ">=3.8" files = [ - {file = "django_stubs-5.0.4-py3-none-any.whl", hash = "sha256:c2502f5ecbae50c68f9a86d52b5b2447d8648fd205036dad0ccb41e19a445927"}, - {file = "django_stubs-5.0.4.tar.gz", hash = "sha256:78e3764488fdfd2695f12502136548ec22f8d4b1780541a835042b8238d11514"}, + {file = "django_stubs-5.1.0-py3-none-any.whl", hash = "sha256:b98d49a80aa4adf1433a97407102d068de26c739c405431d93faad96dd282c40"}, + {file = "django_stubs-5.1.0.tar.gz", hash = "sha256:86128c228b65e6c9a85e5dc56eb1c6f41125917dae0e21e6cfecdf1b27e630c5"}, ] [package.dependencies] asgiref = "*" django = "*" -django-stubs-ext = ">=5.0.4" +django-stubs-ext = ">=5.1.0" tomli = {version = "*", markers = "python_version < \"3.11\""} types-PyYAML = "*" typing-extensions = ">=4.11.0" @@ -560,13 +540,13 @@ redis = ["redis"] [[package]] name = "django-stubs-ext" -version = "5.0.4" +version = "5.1.0" description = "Monkey-patching and extensions for django-stubs" optional = false python-versions = ">=3.8" files = [ - {file = "django_stubs_ext-5.0.4-py3-none-any.whl", hash = "sha256:910cbaff3d1e8e806a5c27d5ddd4088535aae8371ea921b7fd680fdfa5f14e30"}, - {file = "django_stubs_ext-5.0.4.tar.gz", hash = "sha256:85da065224204774208be29c7d02b4482d5a69218a728465c2fbe41725fdc819"}, + {file = "django_stubs_ext-5.1.0-py3-none-any.whl", hash = "sha256:a455fc222c90b30b29ad8c53319559f5b54a99b4197205ddbb385aede03b395d"}, + {file = "django_stubs_ext-5.1.0.tar.gz", hash = "sha256:ed7d51c0b731651879fc75f331fb0806d98b67bfab464e96e2724db6b46ef926"}, ] [package.dependencies] @@ -575,13 +555,13 @@ typing-extensions = "*" [[package]] name = "django-webtest" -version = "1.9.11" +version = "1.9.12" description = "Instant integration of Ian Bicking's WebTest (http://docs.pylonsproject.org/projects/webtest/) with Django's testing framework." optional = false python-versions = "*" files = [ - {file = "django-webtest-1.9.11.tar.gz", hash = "sha256:9597d26ced599bc5d4d9366bb451469fc9707b4779f79543cdf401ae6c5aeb35"}, - {file = "django_webtest-1.9.11-py3-none-any.whl", hash = "sha256:e29baf8337e7fe7db41ce63ca6661f7b5c77fe56f506f48b305e09313f5475b4"}, + {file = "django_webtest-1.9.12-py3-none-any.whl", hash = "sha256:de5c988c20eef7abbb3d0508494d9e576af08087d0fb6109b1d54f15ef4d78fa"}, + {file = "django_webtest-1.9.12.tar.gz", hash = "sha256:5012c30665e7a6e585a1544eda75045d07d5b3f5ccccd4d0fe144c4555884095"}, ] [package.dependencies] @@ -600,15 +580,18 @@ files = [ [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "isort" version = "5.13.2" @@ -799,19 +782,19 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "psycopg2-binary" @@ -907,17 +890,17 @@ files = [ [[package]] name = "pylint" -version = "3.2.6" +version = "3.3.1" description = "python code static checker" optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.9.0" files = [ - {file = "pylint-3.2.6-py3-none-any.whl", hash = "sha256:03c8e3baa1d9fb995b12c1dbe00aa6c4bcef210c2a2634374aedeb22fb4a8f8f"}, - {file = "pylint-3.2.6.tar.gz", hash = "sha256:a5d01678349454806cff6d886fb072294f56a58c4761278c97fb557d708e1eb3"}, + {file = "pylint-3.3.1-py3-none-any.whl", hash = "sha256:2f846a466dd023513240bc140ad2dd73bfc080a5d85a710afdb728c420a5a2b9"}, + {file = "pylint-3.3.1.tar.gz", hash = "sha256:9f3dcc87b1203e612b78d91a896407787e708b3f189b5fa0b307712d49ff0c6e"}, ] [package.dependencies] -astroid = ">=3.2.4,<=3.3.0-dev0" +astroid = ">=3.3.4,<=3.4.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -986,21 +969,21 @@ test = ["pretend", "pytest (>=3.0.1)", "pytest-rerunfailures"] [[package]] name = "redis" -version = "5.0.8" +version = "5.1.0" description = "Python client for Redis database and key-value store" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, - {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, + {file = "redis-5.1.0-py3-none-any.whl", hash = "sha256:fd4fccba0d7f6aa48c58a78d76ddb4afc698f5da4a2c1d03d916e4fd7ab88cdd"}, + {file = "redis-5.1.0.tar.gz", hash = "sha256:b756df1e4a3858fcc0ef861f3fc53623a96c41e2b1f5304e09e0fe758d333d40"}, ] [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] -hiredis = ["hiredis (>1.0.0)"] -ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] +hiredis = ["hiredis (>=3.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"] [[package]] name = "requests" @@ -1025,29 +1008,29 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "ruff" -version = "0.6.2" +version = "0.6.8" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.6.2-py3-none-linux_armv6l.whl", hash = "sha256:5c8cbc6252deb3ea840ad6a20b0f8583caab0c5ef4f9cca21adc5a92b8f79f3c"}, - {file = "ruff-0.6.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:17002fe241e76544448a8e1e6118abecbe8cd10cf68fde635dad480dba594570"}, - {file = "ruff-0.6.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3dbeac76ed13456f8158b8f4fe087bf87882e645c8e8b606dd17b0b66c2c1158"}, - {file = "ruff-0.6.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:094600ee88cda325988d3f54e3588c46de5c18dae09d683ace278b11f9d4d534"}, - {file = "ruff-0.6.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:316d418fe258c036ba05fbf7dfc1f7d3d4096db63431546163b472285668132b"}, - {file = "ruff-0.6.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d72b8b3abf8a2d51b7b9944a41307d2f442558ccb3859bbd87e6ae9be1694a5d"}, - {file = "ruff-0.6.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2aed7e243be68487aa8982e91c6e260982d00da3f38955873aecd5a9204b1d66"}, - {file = "ruff-0.6.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d371f7fc9cec83497fe7cf5eaf5b76e22a8efce463de5f775a1826197feb9df8"}, - {file = "ruff-0.6.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8f310d63af08f583363dfb844ba8f9417b558199c58a5999215082036d795a1"}, - {file = "ruff-0.6.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7db6880c53c56addb8638fe444818183385ec85eeada1d48fc5abe045301b2f1"}, - {file = "ruff-0.6.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1175d39faadd9a50718f478d23bfc1d4da5743f1ab56af81a2b6caf0a2394f23"}, - {file = "ruff-0.6.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:5b939f9c86d51635fe486585389f54582f0d65b8238e08c327c1534844b3bb9a"}, - {file = "ruff-0.6.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d0d62ca91219f906caf9b187dea50d17353f15ec9bb15aae4a606cd697b49b4c"}, - {file = "ruff-0.6.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7438a7288f9d67ed3c8ce4d059e67f7ed65e9fe3aa2ab6f5b4b3610e57e3cb56"}, - {file = "ruff-0.6.2-py3-none-win32.whl", hash = "sha256:279d5f7d86696df5f9549b56b9b6a7f6c72961b619022b5b7999b15db392a4da"}, - {file = "ruff-0.6.2-py3-none-win_amd64.whl", hash = "sha256:d9f3469c7dd43cd22eb1c3fc16926fb8258d50cb1b216658a07be95dd117b0f2"}, - {file = "ruff-0.6.2-py3-none-win_arm64.whl", hash = "sha256:f28fcd2cd0e02bdf739297516d5643a945cc7caf09bd9bcb4d932540a5ea4fa9"}, - {file = "ruff-0.6.2.tar.gz", hash = "sha256:239ee6beb9e91feb8e0ec384204a763f36cb53fb895a1a364618c6abb076b3be"}, + {file = "ruff-0.6.8-py3-none-linux_armv6l.whl", hash = "sha256:77944bca110ff0a43b768f05a529fecd0706aac7bcce36d7f1eeb4cbfca5f0f2"}, + {file = "ruff-0.6.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:27b87e1801e786cd6ede4ada3faa5e254ce774de835e6723fd94551464c56b8c"}, + {file = "ruff-0.6.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd48f945da2a6334f1793d7f701725a76ba93bf3d73c36f6b21fb04d5338dcf5"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:677e03c00f37c66cea033274295a983c7c546edea5043d0c798833adf4cf4c6f"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f1476236b3eacfacfc0f66aa9e6cd39f2a624cb73ea99189556015f27c0bdeb"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f5a2f17c7d32991169195d52a04c95b256378bbf0de8cb98478351eb70d526f"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5fd0d4b7b1457c49e435ee1e437900ced9b35cb8dc5178921dfb7d98d65a08d0"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8034b19b993e9601f2ddf2c517451e17a6ab5cdb1c13fdff50c1442a7171d87"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cfb227b932ba8ef6e56c9f875d987973cd5e35bc5d05f5abf045af78ad8e098"}, + {file = "ruff-0.6.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef0411eccfc3909269fed47c61ffebdcb84a04504bafa6b6df9b85c27e813b0"}, + {file = "ruff-0.6.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:007dee844738c3d2e6c24ab5bc7d43c99ba3e1943bd2d95d598582e9c1b27750"}, + {file = "ruff-0.6.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ce60058d3cdd8490e5e5471ef086b3f1e90ab872b548814e35930e21d848c9ce"}, + {file = "ruff-0.6.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1085c455d1b3fdb8021ad534379c60353b81ba079712bce7a900e834859182fa"}, + {file = "ruff-0.6.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:70edf6a93b19481affd287d696d9e311388d808671bc209fb8907b46a8c3af44"}, + {file = "ruff-0.6.8-py3-none-win32.whl", hash = "sha256:792213f7be25316f9b46b854df80a77e0da87ec66691e8f012f887b4a671ab5a"}, + {file = "ruff-0.6.8-py3-none-win_amd64.whl", hash = "sha256:ec0517dc0f37cad14a5319ba7bba6e7e339d03fbf967a6d69b0907d61be7a263"}, + {file = "ruff-0.6.8-py3-none-win_arm64.whl", hash = "sha256:8d3bb2e3fbb9875172119021a13eed38849e762499e3cfde9588e4b4d70968dc"}, + {file = "ruff-0.6.8.tar.gz", hash = "sha256:a5bf44b1aa0adaf6d9d20f86162b34f7c593bfedabc51239953e446aefc8ce18"}, ] [[package]] @@ -1129,13 +1112,13 @@ test = ["coverage[toml] (>=7)", "mypy (>=1.2.0)", "pytest (>=7)"] [[package]] name = "types-pyyaml" -version = "6.0.12.20240808" +version = "6.0.12.20240917" description = "Typing stubs for PyYAML" optional = false python-versions = ">=3.8" files = [ - {file = "types-PyYAML-6.0.12.20240808.tar.gz", hash = "sha256:b8f76ddbd7f65440a8bda5526a9607e4c7a322dc2f8e1a8c405644f9a6f4b9af"}, - {file = "types_PyYAML-6.0.12.20240808-py3-none-any.whl", hash = "sha256:deda34c5c655265fc517b546c902aa6eed2ef8d3e921e4765fe606fe2afe8d35"}, + {file = "types-PyYAML-6.0.12.20240917.tar.gz", hash = "sha256:d1405a86f9576682234ef83bcb4e6fff7c9305c8b1fbad5e0bcd4f7dbdc9c587"}, + {file = "types_PyYAML-6.0.12.20240917-py3-none-any.whl", hash = "sha256:392b267f1c0fe6022952462bf5d6523f31e37f6cea49b14cee7ad634b6301570"}, ] [[package]] @@ -1151,24 +1134,24 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -1209,13 +1192,13 @@ testing = ["coverage", "pytest (>=3.1.0)", "pytest-cov", "pytest-xdist"] [[package]] name = "webtest" -version = "3.0.0" +version = "3.0.1" description = "Helper to test WSGI applications" optional = false -python-versions = ">=3.6, <4" +python-versions = ">=3.7" files = [ - {file = "WebTest-3.0.0-py3-none-any.whl", hash = "sha256:2a001a9efa40d2a7e5d9cd8d1527c75f41814eb6afce2c3d207402547b1e5ead"}, - {file = "WebTest-3.0.0.tar.gz", hash = "sha256:54bd969725838d9861a9fa27f8d971f79d275d94ae255f5c501f53bb6d9929eb"}, + {file = "WebTest-3.0.1-py3-none-any.whl", hash = "sha256:b3bc75d020d0576ee93a5f149666045e58fe2400ea5f0c214d7430d7d213d0d0"}, + {file = "webtest-3.0.1.tar.gz", hash = "sha256:493b5c802f8948a65b5e3a1ad5b2524ee5e1ab60cd713d9a3da3b8da082c06fe"}, ] [package.dependencies] @@ -1224,7 +1207,7 @@ waitress = ">=0.8.5" WebOb = ">=1.2" [package.extras] -docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.8)"] +docs = ["Sphinx (>=3.0.0)", "docutils", "pylons-sphinx-themes (>=1.0.8)"] tests = ["PasteDeploy", "WSGIProxy2", "coverage", "pyquery", "pytest", "pytest-cov"] [[package]] @@ -1257,4 +1240,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "9bd505b35c74c8e9562ad6a3432a309d2aef14a91060ded4f0a068c0073f9bbc" +content-hash = "5c4b2ccea8f63d89137bc643d1ce12f5b6db091b4d2b0ee9608696d41be71f4d" diff --git a/pyproject.toml b/pyproject.toml index 0f5d5562c9..5c666f4468 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,26 +10,26 @@ packages = [{include = "evap"}] python = "^3.10" django-extensions = "~3.2.3" django-fsm = "~2.8.2" -Django = "~5.0.0" +Django = "~5.1.0" mozilla-django-oidc = "~4.0.1" openpyxl = "~3.1.5" psycopg2-binary = "~2.9.9" -redis = "~5.0.8" +redis = "~5.1.0" typing-extensions = "~4.12.2" xlwt = "~1.3.0" [tool.poetry.group.dev.dependencies] black = "~24.8.0" -coverage = { version = "*", extras = ["toml"] } +coverage = { version = "7.6.0", extras = ["toml"] } django-debug-toolbar = "~4.0" -django-stubs = "5.0.4" +django-stubs = "5.1.0" django-webtest = "~1.9.10" isort = "~5.13.1" model-bakery = "~1.19.5" mypy = "~1.11.0" openpyxl-stubs = "~0.1.25" pylint-django = "~2.5.4" -pylint = "~3.2.3" +pylint = "~3.3.0" ruff = "~0.6.2" tblib = "~3.0.0" xlrd = "~2.0.1" From 497f004eca766b676cde0f6db846f73356e7fbd5 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 30 Sep 2024 22:54:25 +0200 Subject: [PATCH 53/75] fix python interpreter version --- flake.nix | 1 + nix/shell.nix | 5 +++-- poetry.lock | 10 +++------- pyproject.toml | 2 +- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/flake.nix b/flake.nix index 3960b7614b..66d79c10d7 100644 --- a/flake.nix +++ b/flake.nix @@ -22,6 +22,7 @@ perSystem = { self', inputs', pkgs, system, ... }: { devShells = rec { evap = pkgs.callPackage ./nix/shell.nix { + python3 = pkgs.python310; poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; projectDir = self; }; diff --git a/nix/shell.nix b/nix/shell.nix index bd537004a3..63be7d9bbe 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -1,4 +1,4 @@ -{ pkgs, poetry2nix, projectDir, poetry-groups ? [ ], extraPackages ? [ ], extraPythonPackages ? (ps: [ ]), ... }: +{ pkgs, python3, poetry2nix, projectDir, poetry-groups ? [ ], extraPackages ? [ ], extraPythonPackages ? (ps: [ ]), ... }: let clean-setup = pkgs.writeShellScriptBin "clean-setup" '' @@ -23,6 +23,7 @@ let ''; poetry-env = poetry2nix.mkPoetryEnv { + python = python3; inherit projectDir; preferWheels = true; overrides = poetry2nix.overrides.withDefaults (final: prev: @@ -46,7 +47,7 @@ let in pkgs.mkShell { packages = with pkgs; [ - poetry + (poetry.override { inherit python3; }) nodejs gettext diff --git a/poetry.lock b/poetry.lock index 2faf67b161..de42fcd18f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -902,11 +902,7 @@ files = [ [package.dependencies] astroid = ">=3.3.4,<=3.4.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -dill = [ - {version = ">=0.2", markers = "python_version < \"3.11\""}, - {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, - {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, -] +dill = {version = ">=0.2", markers = "python_version < \"3.11\""} isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" @@ -1239,5 +1235,5 @@ files = [ [metadata] lock-version = "2.0" -python-versions = "^3.10" -content-hash = "5c4b2ccea8f63d89137bc643d1ce12f5b6db091b4d2b0ee9608696d41be71f4d" +python-versions = "~3.10.0" +content-hash = "6d5055564734ebaa717aeb10b1a229cfbab85eb492efd720ca7e97dbfe8f69d5" diff --git a/pyproject.toml b/pyproject.toml index 5c666f4468..458c9a3cbd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ readme = "README.md" packages = [{include = "evap"}] [tool.poetry.dependencies] -python = "^3.10" +python = "~3.10.0" django-extensions = "~3.2.3" django-fsm = "~2.8.2" Django = "~5.1.0" From eef59adf0462dbee6a03043ab586d0eb90ed7212 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 30 Sep 2024 22:55:27 +0200 Subject: [PATCH 54/75] rename nix/setup to nix/setup-nix yet again --- nix/{setup => setup-nix} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename nix/{setup => setup-nix} (100%) diff --git a/nix/setup b/nix/setup-nix similarity index 100% rename from nix/setup rename to nix/setup-nix From b280b772f82d82ba33e487709f9d530340eb99eb Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Mon, 7 Oct 2024 23:53:56 +0200 Subject: [PATCH 55/75] Add bash completion in development shells It turns out that nix shells have a nice way to load completions already. This even uses "bash" in the installation, so that it does not interfere with other shells that may load the nix environment with direnv. https://togithub.com/NixOS/nixpkgs/pull/103501 https://togithub.com/scop/bash-completion/blob/7f1165018a72f837d59b3cea7071efa0108841a2/README.md Since I now used the "lazy" approach for loading the completions, the completion on `python manage.py ` does not work anymore, because the builtin completions are found first. We could overwrite BASH_COMPLETION_USER_DIR to have the highest precedence, but I think that most users use `./manage.py` anyways (it is what we recommend in our README) and the current approach seems to be the most canonical way to do this within nix packages. --- deployment/manage_autocompletion.sh | 21 --------------------- nix/shell.nix | 7 +++++++ 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/deployment/manage_autocompletion.sh b/deployment/manage_autocompletion.sh index 9083a79317..87bec00a1e 100755 --- a/deployment/manage_autocompletion.sh +++ b/deployment/manage_autocompletion.sh @@ -20,25 +20,4 @@ _managepy_complete() fi } -_python_complete() -{ - local cur prev - cur=${COMP_WORDS[COMP_CWORD]} - prev=${COMP_WORDS[COMP_CWORD-1]} - - if [ "${COMP_CWORD}" -eq 1 ]; then - COMPREPLY=($(compgen -f -o filenames -X '!*.py' -- "${cur}")) - fi - - if [ "${COMP_CWORD}" -eq 2 ] && [[ "${prev}" == *manage.py ]]; then - COMPREPLY=($(compgen -W "${COMMANDS}" -- "${cur}")) - fi - - if [ "${COMP_CWORD}" -eq 3 ] && [ "${prev}" == "ts" ]; then - COMPREPLY=($(compgen -W "${TS_COMMANDS}" -- "${cur}")) - fi -} - complete -F _managepy_complete manage.py -complete -F _python_complete python3 -complete -F _python_complete python diff --git a/nix/shell.nix b/nix/shell.nix index 63be7d9bbe..bee289f755 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -1,6 +1,12 @@ { pkgs, python3, poetry2nix, projectDir, poetry-groups ? [ ], extraPackages ? [ ], extraPythonPackages ? (ps: [ ]), ... }: let + # When running a nix shell, XDG_DATA_DIRS will be populated so that bash_completion can (lazily) find this completion script + evap-managepy-completion = pkgs.runCommand "evap-managepy-completion" { } '' + mkdir -p "$out/share/bash-completion/completions" + install ${../deployment/manage_autocompletion.sh} "$out/share/bash-completion/completions/manage.py.bash" + ''; + clean-setup = pkgs.writeShellScriptBin "clean-setup" '' read -p "Delete node_modules/ and data/? [y/N] " [[ "$REPLY" =~ ^[Yy]$ ]] || exit 1 @@ -54,6 +60,7 @@ pkgs.mkShell { poetry-env clean-setup initialize-setup + evap-managepy-completion ] ++ extraPackages ++ (extraPythonPackages poetry-env.python.pkgs); env.PUPPETEER_SKIP_DOWNLOAD = 1; From f304d4d16cfe6f4631122095f689a36187469453 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 8 Oct 2024 01:27:26 +0200 Subject: [PATCH 56/75] Use unix domain sockets instead of TCP for postgres and redis --- deployment/localsettings.template.py | 23 +++++++++++++++++++++-- evap/settings_test.py | 15 ++++++++++----- flake.nix | 10 +++++++++- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/deployment/localsettings.template.py b/deployment/localsettings.template.py index 15d3eb446d..12a7f9884f 100644 --- a/deployment/localsettings.template.py +++ b/deployment/localsettings.template.py @@ -1,4 +1,5 @@ from fractions import Fraction +from pathlib import Path from django.utils.safestring import mark_safe @@ -8,12 +9,30 @@ 'NAME': 'evap', 'USER': 'evap', 'PASSWORD': 'evap', - 'HOST': 'localhost', # Set to empty string for localhost. - 'PORT': '', # Set to empty string for default. + # Absolute path to use unix domain socket + 'HOST': Path("./data/").resolve(), 'CONN_MAX_AGE': 600, } } +redis_url = f"unix://{Path('./data/redis.socket').resolve()}" + +CACHES = { + "default": { + "BACKEND": "django.core.cache.backends.redis.RedisCache", + "LOCATION": f"{redis_url}?db=0", + }, + "results": { + "BACKEND": "django.core.cache.backends.redis.RedisCache", + "LOCATION": f"{redis_url}?db=1", + "TIMEOUT": None, # is always invalidated manually + }, + "sessions": { + "BACKEND": "django.core.cache.backends.redis.RedisCache", + "LOCATION": f"{redis_url}?db=2", + }, +} + # Make this unique, and don't share it with anybody. SECRET_KEY = "$SECRET_KEY" # nosec diff --git a/evap/settings_test.py b/evap/settings_test.py index 6af9464751..7599c173fd 100644 --- a/evap/settings_test.py +++ b/evap/settings_test.py @@ -1,3 +1,5 @@ +from pathlib import Path + SECRET_KEY = "evap-github-actions-secret-key" # nosec DATABASES = { "default": { @@ -5,21 +7,24 @@ "NAME": "evap", "USER": "evap", "PASSWORD": "evap", - "HOST": "localhost", + 'HOST': Path("./data/").resolve(), } } + +redis_url = f"unix://{Path('./data/redis.socket').resolve()}" + CACHES = { "default": { "BACKEND": "django.core.cache.backends.redis.RedisCache", - "LOCATION": "redis://localhost:6379/0", + "LOCATION": f"{redis_url}?db=0", }, "results": { "BACKEND": "django.core.cache.backends.redis.RedisCache", - "LOCATION": "redis://localhost:6379/1", - "TIMEOUT": None, + "LOCATION": f"{redis_url}?db=1", + "TIMEOUT": None, # is always invalidated manually }, "sessions": { "BACKEND": "django.core.cache.backends.redis.RedisCache", - "LOCATION": "redis://localhost:6379/2", + "LOCATION": f"{redis_url}?db=2", }, } diff --git a/flake.nix b/flake.nix index 66d79c10d7..63e829a00b 100644 --- a/flake.nix +++ b/flake.nix @@ -19,7 +19,7 @@ inputs.process-compose-flake.flakeModule ]; systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ]; - perSystem = { self', inputs', pkgs, system, ... }: { + perSystem = { self', inputs', pkgs, lib, system, ... }: { devShells = rec { evap = pkgs.callPackage ./nix/shell.nix { python3 = pkgs.python310; @@ -44,13 +44,18 @@ services = { redis."r1" = { enable = true; + port = 0; # disable listening via TCP extraConfig = '' locale-collate "C" + unixsocket ../redis.socket + unixsocketperm 777 ''; }; postgres."pg1" = { enable = true; superuser = "postgres"; + listen_addresses = ""; # disable listening via TCP + socketDir = "data"; createDatabase = false; initialScript.before = '' DROP USER IF EXISTS evap; @@ -60,6 +65,9 @@ ''; }; }; + + # See https://github.com/juspay/services-flake/issues/352 + settings.processes."r1".readiness_probe.exec.command = lib.mkForce "true"; }; }; }; From e90c865b74c3882c8230591e4b501237b858789c Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 8 Oct 2024 22:20:21 +0200 Subject: [PATCH 57/75] Move `npm ci` to process compose --- flake.nix | 17 +++++++++++++++++ nix/shell.nix | 1 - 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 63e829a00b..66af34af3d 100644 --- a/flake.nix +++ b/flake.nix @@ -68,6 +68,23 @@ # See https://github.com/juspay/services-flake/issues/352 settings.processes."r1".readiness_probe.exec.command = lib.mkForce "true"; + + settings.processes."npm-ci" = { + command = pkgs.writeShellApplication { + name = "npm-ci"; + runtimeInputs = [ pkgs.nodejs ]; + text = '' + CUR_HASH=$(nix-hash --flat <(cat ./package.json ./package-lock.json)) + echo "Hash is $CUR_HASH" + if [[ -f node_modules/evap-hash && "$CUR_HASH" == "$(cat node_modules/evap-hash)" ]]; then + echo "Equal hash found, exiting" + exit 0 + fi + npm ci + echo "$CUR_HASH" > node_modules/evap-hash + ''; + }; + }; }; }; }; diff --git a/nix/shell.nix b/nix/shell.nix index bee289f755..aec094e6b4 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -17,7 +17,6 @@ let initialize-setup = pkgs.writeShellScriptBin "initialize-setup" '' set -ex - npm ci cp deployment/localsettings.template.py evap/localsettings.py sed -i -e "s/\$SECRET_KEY/$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)/" evap/localsettings.py git submodule update --init From 6a35f15e192f62031b4df2e791d0a4522074005a Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 8 Oct 2024 22:26:14 +0200 Subject: [PATCH 58/75] Move service config to own file, add second config with only databses --- flake.nix | 60 +++++++----------------------------------------- nix/services.nix | 56 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 52 deletions(-) create mode 100644 nix/services.nix diff --git a/flake.nix b/flake.nix index 66af34af3d..fe2268c638 100644 --- a/flake.nix +++ b/flake.nix @@ -31,59 +31,15 @@ }; # Start with `nix run .#services` - process-compose."services" = { - imports = [ - inputs.services-flake.processComposeModules.default - ]; - - httpServer = { - enable = true; - uds = "process-compose.socket"; - }; - - services = { - redis."r1" = { - enable = true; - port = 0; # disable listening via TCP - extraConfig = '' - locale-collate "C" - unixsocket ../redis.socket - unixsocketperm 777 - ''; - }; - postgres."pg1" = { - enable = true; - superuser = "postgres"; - listen_addresses = ""; # disable listening via TCP - socketDir = "data"; - createDatabase = false; - initialScript.before = '' - DROP USER IF EXISTS evap; - DROP DATABASE IF EXISTS evap; - CREATE USER evap PASSWORD 'evap' CREATEDB; - CREATE DATABASE evap OWNER evap; - ''; - }; + process-compose = { + services = import ./nix/services.nix { + inherit pkgs; + inherit (inputs) services-flake; + only-databases = true; }; - - # See https://github.com/juspay/services-flake/issues/352 - settings.processes."r1".readiness_probe.exec.command = lib.mkForce "true"; - - settings.processes."npm-ci" = { - command = pkgs.writeShellApplication { - name = "npm-ci"; - runtimeInputs = [ pkgs.nodejs ]; - text = '' - CUR_HASH=$(nix-hash --flat <(cat ./package.json ./package-lock.json)) - echo "Hash is $CUR_HASH" - if [[ -f node_modules/evap-hash && "$CUR_HASH" == "$(cat node_modules/evap-hash)" ]]; then - echo "Equal hash found, exiting" - exit 0 - fi - npm ci - echo "$CUR_HASH" > node_modules/evap-hash - ''; - }; + services-full = import ./nix/services.nix { + inherit pkgs; inherit (inputs) services-flake; + only-databases = false; }; }; }; diff --git a/nix/services.nix b/nix/services.nix new file mode 100644 index 0000000000..8f73c8821f --- /dev/null +++ b/nix/services.nix @@ -0,0 +1,56 @@ +{ pkgs, lib ? pkgs.lib, services-flake, only-databases, ... }: { + imports = [ + services-flake.processComposeModules.default + ]; + + httpServer = { + enable = true; + uds = "process-compose.socket"; + }; + + services = { + redis."r1" = { + enable = true; + port = 0; # disable listening via TCP + extraConfig = '' + locale-collate "C" + unixsocket ../redis.socket + unixsocketperm 777 + ''; + }; + postgres."pg1" = { + enable = true; + superuser = "postgres"; + listen_addresses = ""; # disable listening via TCP + socketDir = "data"; + createDatabase = false; + initialScript.before = '' + DROP USER IF EXISTS evap; + DROP DATABASE IF EXISTS evap; + CREATE USER evap PASSWORD 'evap' CREATEDB; + CREATE DATABASE evap OWNER evap; + ''; + }; + }; + + # See https://github.com/juspay/services-flake/issues/352 + settings.processes."r1".readiness_probe.exec.command = lib.mkForce "true"; + + settings.processes."npm-ci" = { + command = pkgs.writeShellApplication { + name = "npm-ci"; + runtimeInputs = [ pkgs.nodejs ]; + text = '' + CUR_HASH=$(nix-hash --flat <(cat ./package.json ./package-lock.json)) + echo "Hash is $CUR_HASH" + if [[ -f node_modules/evap-hash && "$CUR_HASH" == "$(cat node_modules/evap-hash)" ]]; then + echo "Equal hash found, exiting" + exit 0 + fi + npm ci + echo "$CUR_HASH" > node_modules/evap-hash + ''; + }; + disabled = only-databases; + }; +} From 0e0d77f456ffcb8d597ef4d76d99803f00c54cf4 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 8 Oct 2024 23:11:00 +0200 Subject: [PATCH 59/75] move rest of initialize-setup to process compose --- flake.nix | 21 +++++++++++---------- nix/services.nix | 32 +++++++++++++++++++++++++++++++- nix/shell.nix | 20 ++++---------------- 3 files changed, 46 insertions(+), 27 deletions(-) diff --git a/flake.nix b/flake.nix index fe2268c638..00a4dbdf86 100644 --- a/flake.nix +++ b/flake.nix @@ -31,17 +31,18 @@ }; # Start with `nix run .#services` - process-compose = { - services = import ./nix/services.nix { - inherit pkgs; - inherit (inputs) services-flake; - only-databases = true; + process-compose = + let + make = only-databases: import ./nix/services.nix { + inherit pkgs only-databases; + inherit (inputs) services-flake; + inherit (self'.devShells.evap.passthru) poetry-env; + }; + in + { + services = make true; + services-full = make false; }; - services-full = import ./nix/services.nix { - inherit pkgs; inherit (inputs) services-flake; - only-databases = false; - }; - }; }; }; } diff --git a/nix/services.nix b/nix/services.nix index 8f73c8821f..27dc1b0eab 100644 --- a/nix/services.nix +++ b/nix/services.nix @@ -1,4 +1,4 @@ -{ pkgs, lib ? pkgs.lib, services-flake, only-databases, ... }: { +{ pkgs, lib ? pkgs.lib, services-flake, only-databases, poetry-env }: { imports = [ services-flake.processComposeModules.default ]; @@ -41,16 +41,46 @@ name = "npm-ci"; runtimeInputs = [ pkgs.nodejs ]; text = '' + set -e CUR_HASH=$(nix-hash --flat <(cat ./package.json ./package-lock.json)) echo "Hash is $CUR_HASH" if [[ -f node_modules/evap-hash && "$CUR_HASH" == "$(cat node_modules/evap-hash)" ]]; then echo "Equal hash found, exiting" exit 0 fi + set -x npm ci echo "$CUR_HASH" > node_modules/evap-hash ''; }; disabled = only-databases; }; + + settings.processes."init-django" = { + command = pkgs.writeShellApplication { + name = "init-django"; + runtimeInputs = [ poetry-env pkgs.git pkgs.gnused ]; + text = '' + set -e + if [[ -f evap/localsettings.py ]]; then + echo "Found evap/localsettings.py, exiting" + exit 0 + fi + set -x + cp deployment/localsettings.template.py evap/localsettings.py + sed -i -e "s/\$SECRET_KEY/$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)/" evap/localsettings.py + git submodule update --init + ./manage.py migrate --noinput + ./manage.py collectstatic --noinput + ./manage.py compilemessages --locale de + ./manage.py loaddata test_data.json + ./manage.py refresh_results_cache + ''; + }; + depends_on = { + "pg1".condition = "process_healthy"; + "r1".condition = "process_healthy"; + }; + disabled = only-databases; + }; } diff --git a/nix/shell.nix b/nix/shell.nix index aec094e6b4..ab471895f2 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -8,23 +8,10 @@ let ''; clean-setup = pkgs.writeShellScriptBin "clean-setup" '' - read -p "Delete node_modules/ and data/? [y/N] " + read -p "Delete node_modules/, data/ and evap/localsettings.py? [y/N] " [[ "$REPLY" =~ ^[Yy]$ ]] || exit 1 set -ex - rm -rf node_modules/ data/ - ''; - - initialize-setup = pkgs.writeShellScriptBin "initialize-setup" '' - set -ex - - cp deployment/localsettings.template.py evap/localsettings.py - sed -i -e "s/\$SECRET_KEY/$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)/" evap/localsettings.py - git submodule update --init - ./manage.py migrate --noinput - ./manage.py collectstatic --noinput - ./manage.py compilemessages --locale de - ./manage.py loaddata test_data.json - ./manage.py refresh_results_cache + rm -rf node_modules/ data/ evap/localsettings.py ''; poetry-env = poetry2nix.mkPoetryEnv { @@ -58,9 +45,10 @@ pkgs.mkShell { poetry-env clean-setup - initialize-setup evap-managepy-completion ] ++ extraPackages ++ (extraPythonPackages poetry-env.python.pkgs); + passthru = { inherit poetry-env; }; + env.PUPPETEER_SKIP_DOWNLOAD = 1; } From 802693deb81281f16277b8ad828aa26c01fd2cea Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 8 Oct 2024 23:20:21 +0200 Subject: [PATCH 60/75] Don't use `projectDir` This should avoid that editing some views.py file changes the hash of the poetry environment and thus save on some rebuilds. (The rebuilds would only create some symlinks, all actually expensive steps are cached, but this change won't hurt). --- flake.nix | 3 ++- nix/shell.nix | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/flake.nix b/flake.nix index 00a4dbdf86..a39bc970a9 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,8 @@ evap = pkgs.callPackage ./nix/shell.nix { python3 = pkgs.python310; poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; - projectDir = self; + pyproject = ./pyproject.toml; + poetrylock = ./poetry.lock; }; evap-dev = evap.override { poetry-groups = [ "dev" ]; }; default = evap-dev; diff --git a/nix/shell.nix b/nix/shell.nix index ab471895f2..fea68213ec 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -1,4 +1,4 @@ -{ pkgs, python3, poetry2nix, projectDir, poetry-groups ? [ ], extraPackages ? [ ], extraPythonPackages ? (ps: [ ]), ... }: +{ pkgs, python3, poetry2nix, pyproject, poetrylock, poetry-groups ? [ ], extraPackages ? [ ], extraPythonPackages ? (ps: [ ]), ... }: let # When running a nix shell, XDG_DATA_DIRS will be populated so that bash_completion can (lazily) find this completion script @@ -16,7 +16,8 @@ let poetry-env = poetry2nix.mkPoetryEnv { python = python3; - inherit projectDir; + # We pass these instead of `projectDir` to avoid adding the dependency on other files. + inherit pyproject poetrylock; preferWheels = true; overrides = poetry2nix.overrides.withDefaults (final: prev: let @@ -34,7 +35,6 @@ let }); groups = poetry-groups; checkGroups = [ ]; # would otherwise always install dev-dependencies - editablePackageSources.evap = ./evap; }; in pkgs.mkShell { From 84836f4cc924aba8ed3d8f98df5da648b694da21 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 8 Oct 2024 23:23:44 +0200 Subject: [PATCH 61/75] Remove `version` in pyproject.toml It seems this is not needed with the current setup --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 458c9a3cbd..031440c52a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,6 @@ package-mode = false name = "evap" description = "EvaP" -version = "0.1.0" readme = "README.md" packages = [{include = "evap"}] From acae890458ac3e74a5af3d75bef48462fe67f5d4 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 8 Oct 2024 23:26:21 +0200 Subject: [PATCH 62/75] rm requirements* --- requirements-dev.txt | 16 ---------------- requirements.txt | 8 -------- 2 files changed, 24 deletions(-) delete mode 100644 requirements-dev.txt delete mode 100644 requirements.txt diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index 62153a5795..0000000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,16 +0,0 @@ --r requirements.txt -black~=24.8.0 -coverage[toml]~=7.6.0 -django-debug-toolbar~=4.0 -django-stubs==5.1.0 -django-webtest~=1.9.10 -isort~=5.13.1 -model-bakery~=1.19.5 -mypy~=1.11.0 -openpyxl-stubs~=0.1.25 -pylint-django~=2.5.4 -pylint~=3.3.0 -ruff==0.6.2 -tblib~=3.0.0 -xlrd~=2.0.1 -typeguard~=4.3.0 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 4b3cec36e2..0000000000 --- a/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -django-extensions==3.2.3 -django-fsm==2.8.2 -Django~=5.1.0 -mozilla-django-oidc==4.0.1 -openpyxl==3.1.5 -psycopg2-binary==2.9.9 -redis==5.1.0 -xlwt==1.3.0 From f7c4b62037237b08240601d1534b578651e98367 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 8 Oct 2024 23:29:06 +0200 Subject: [PATCH 63/75] lint --- deployment/localsettings.template.py | 8 ++++---- evap/settings_test.py | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/deployment/localsettings.template.py b/deployment/localsettings.template.py index 12a7f9884f..a55f0ca5d7 100644 --- a/deployment/localsettings.template.py +++ b/deployment/localsettings.template.py @@ -15,21 +15,21 @@ } } -redis_url = f"unix://{Path('./data/redis.socket').resolve()}" +REDIS_URL = f"unix://{Path('./data/redis.socket').resolve()}" CACHES = { "default": { "BACKEND": "django.core.cache.backends.redis.RedisCache", - "LOCATION": f"{redis_url}?db=0", + "LOCATION": f"{REDIS_URL}?db=0", }, "results": { "BACKEND": "django.core.cache.backends.redis.RedisCache", - "LOCATION": f"{redis_url}?db=1", + "LOCATION": f"{REDIS_URL}?db=1", "TIMEOUT": None, # is always invalidated manually }, "sessions": { "BACKEND": "django.core.cache.backends.redis.RedisCache", - "LOCATION": f"{redis_url}?db=2", + "LOCATION": f"{REDIS_URL}?db=2", }, } diff --git a/evap/settings_test.py b/evap/settings_test.py index 7599c173fd..447b6cbc05 100644 --- a/evap/settings_test.py +++ b/evap/settings_test.py @@ -7,24 +7,24 @@ "NAME": "evap", "USER": "evap", "PASSWORD": "evap", - 'HOST': Path("./data/").resolve(), + "HOST": Path("./data/").resolve(), } } -redis_url = f"unix://{Path('./data/redis.socket').resolve()}" +REDIS_URL = f"unix://{Path('./data/redis.socket').resolve()}" CACHES = { "default": { "BACKEND": "django.core.cache.backends.redis.RedisCache", - "LOCATION": f"{redis_url}?db=0", + "LOCATION": f"{REDIS_URL}?db=0", }, "results": { "BACKEND": "django.core.cache.backends.redis.RedisCache", - "LOCATION": f"{redis_url}?db=1", + "LOCATION": f"{REDIS_URL}?db=1", "TIMEOUT": None, # is always invalidated manually }, "sessions": { "BACKEND": "django.core.cache.backends.redis.RedisCache", - "LOCATION": f"{redis_url}?db=2", + "LOCATION": f"{REDIS_URL}?db=2", }, } From c1841e80e4b893ccd9d7d3b02e5d9b2c3d59a717 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 8 Oct 2024 23:52:30 +0200 Subject: [PATCH 64/75] add back apache steps to deployment scripts --- deployment/load_production_backup.sh | 6 +++++- deployment/update_production.sh | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/deployment/load_production_backup.sh b/deployment/load_production_backup.sh index f63859728a..5102fbdb86 100755 --- a/deployment/load_production_backup.sh +++ b/deployment/load_production_backup.sh @@ -7,7 +7,7 @@ set -e # abort on error cd "$(dirname "$0")/.." # change to root directory CONDITIONAL_NOINPUT="" -[[ ! -z "$GITHUB_WORKFLOW" ]] && echo "Detected GitHub" && CONDITIONAL_NOINPUT="--noinput" +[[ ! -z "$GITHUB_WORKFLOW" ]] && echo "Detected GitHub" && CONDITIONAL_NOINPUT="--noinput" && EVAP_SKIP_APACHE_STEPS=1 COMMIT_HASH="$(git rev-parse --short HEAD)" @@ -39,6 +39,8 @@ then exit 1 fi +[[ -z "$EVAP_SKIP_APACHE_STEPS" ]] && sudo service apache2 stop + # sometimes, this fails for some random i18n test translation files. ./manage.py compilemessages || true ./manage.py scss --production @@ -52,6 +54,8 @@ fi ./manage.py clear_cache --all -v=1 ./manage.py refresh_results_cache +[[ -z "$EVAP_SKIP_APACHE_STEPS" ]] && sudo service apache2 start + { set +x; } 2>/dev/null # don't print the echo command, and don't print the 'set +x' itself echo "Backup restored." diff --git a/deployment/update_production.sh b/deployment/update_production.sh index f51ccc695b..9b61ed73b1 100755 --- a/deployment/update_production.sh +++ b/deployment/update_production.sh @@ -10,6 +10,8 @@ COMMIT_HASH="$(git rev-parse --short HEAD)" BACKUP_TITLE="backup" TIMESTAMP="$(date +%Y-%m-%d_%H:%M:%S)" +[[ ! -z "$GITHUB_WORKFLOW" ]] && echo "Detected GitHub" && EVAP_SKIP_APACHE_STEPS=1 + # argument 1 is the title for the backupfile. if [ $# -eq 1 ] then @@ -28,6 +30,11 @@ set -x # print executed commands. enable this here to not print the if above. git fetch +# Note that apache should not be running during most of the upgrade, +# since then e.g. the backup might be incomplete or the code does not +# match the database layout, or https://github.com/e-valuation/EvaP/issues/1237. +[[ -z "$EVAP_SKIP_APACHE_STEPS" ]] && sudo ./deployment/enable_maintenance_mode.sh + ./manage.py dumpdata --natural-foreign --natural-primary --all -e contenttypes -e auth.Permission --indent 2 --output "$FILENAME" [[ ! -z "$EVAP_SKIP_CHECKOUT" ]] && echo "Skipping Checkout" @@ -42,6 +49,8 @@ git fetch ./manage.py clear_cache --all -v=1 ./manage.py refresh_results_cache +[[ -z "$EVAP_SKIP_APACHE_STEPS" ]] && sudo ./deployment/disable_maintenance_mode.sh + { set +x; } 2>/dev/null # don't print the echo command, and don't print the 'set +x' itself echo "Update completed." From ba91cda2e5ba39b806dd028912b2924fc44ac335 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Tue, 8 Oct 2024 23:55:15 +0200 Subject: [PATCH 65/75] Check for existing nix installation in setup-nix --- nix/setup-nix | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/nix/setup-nix b/nix/setup-nix index ca63a544bd..71e0439557 100755 --- a/nix/setup-nix +++ b/nix/setup-nix @@ -2,6 +2,11 @@ set -e +if nix --version &> /dev/null; then + echo "Nix already installed. Please follow the appropriate steps from the script manually." + exit 1 +fi + if apt --version &> /dev/null; then set -x sudo apt-get update -y @@ -10,7 +15,7 @@ elif pacman --version &> /dev/null; then set -x sudo pacman -S nix else - echo "Failed to detect package manager" + echo "Failed to detect package manager." exit 1 fi From 6fb6ec0a2844c153fb9988080659d9c850dfa29a Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Wed, 9 Oct 2024 00:57:42 +0200 Subject: [PATCH 66/75] add wait-for-pc to wait for process-compose --- .github/setup_evap/action.yml | 2 +- flake.nix | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/setup_evap/action.yml b/.github/setup_evap/action.yml index 8727a1fa8f..1a2f088a07 100644 --- a/.github/setup_evap/action.yml +++ b/.github/setup_evap/action.yml @@ -34,6 +34,6 @@ runs: if: ${{ inputs.npm-ci }} - name: Start database - run: nix run .#services -- --detached && sleep 5 + run: nix run .#services -- --detached && nix run .#wait-for-pc shell: bash if: ${{ inputs.start-db }} diff --git a/flake.nix b/flake.nix index a39bc970a9..35e9199b99 100644 --- a/flake.nix +++ b/flake.nix @@ -44,6 +44,20 @@ services = make true; services-full = make false; }; + + packages.wait-for-pc = + let + pc = lib.getExe self'.packages.services; + in + pkgs.writeShellApplication { + name = "wait-for-pc"; + runtimeInputs = [ pkgs.jq ]; + text = '' + while [ "$(${pc} process list -o json 2>/dev/null | jq '.[] |= .is_ready == "Ready" or .status == "Completed" or .status == "Disabled" | all')" != "true" ]; do + sleep 1 + done + ''; + }; }; }; } From 359f4d24da3b7528406c0b7681646b0bcadfcf9e Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Wed, 9 Oct 2024 01:32:41 +0200 Subject: [PATCH 67/75] Update README.md --- README.md | 67 +++++++++++++++++++------------------------------------ 1 file changed, 23 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index f7f5239518..9c1f10cffe 100644 --- a/README.md +++ b/README.md @@ -11,53 +11,32 @@ EvaP is the course evaluation system used internally at Hasso Plattner Institute For the documentation, please see our [wiki](https://github.com/e-valuation/EvaP/wiki). -## Development Setup (Podman) +## Development Setup -To develop EvaP, we recommend that you set up a development container. -This can be done with the configuration file provided by us. -You will have to install [`git`](https://git-scm.com/downloads) and [`podman`](https://podman.io/). -Clone the EvaP repository and create the container using -```bash -git clone --recurse-submodules https://github.com/e-valuation/EvaP.git -cd EvaP -podman build --tag evap-image nix/ -podman create --name evap-container --userns=keep-id:uid=1001,gid=1001 --volume $PWD:/evap --publish 8000:8000 evap-image -``` +We use [nix](https://nixos.org/) to manage the development environment. -From now on, you can use the created container whenever you want to work on EvaP. -Start the container with `podman start evap-container` and enter it with `podman exec -it evap-container machinectl shell -q evap@`. -When entering the container for the first time, it may take a while until the database and development environment have finished setting up. -Once you see a shell prompt like `evap@5b17c1be4315:/evap$`, you should be ready. -To run the final initialization steps, run the command `initialize-setup`. -Now, you can start EvaP by running `./manage.py run`. -Open your web browser at http://localhost:8000/ and login with email `evap@institution.example.com` and password `evap`. -You can exit the container by pressing `Ctrl-D` and then stop it with `podman stop evap-container` (or it will stop automatically when you shut down your computer). - -## Development Setup (Local) - -TODO - -To develop EvaP, you will have to install [`git`](https://git-scm.com/downloads) and [`nix`](https://nixos.org/) with support for nix flakes. - -If you are using Windows, we recommend that you [install the Windows Terminal](https://aka.ms/terminal) and set up the Windows Subsystem for Linux. -[Install WSL2](https://learn.microsoft.com/en-us/windows/wsl/install), start an Ubuntu VM, and [enable systemd support](https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/). -Now, you can follow the Linux instructions to install git and nix. - -To install nix on your computer, we recommend that you use the [Determinate Nix Installer](https://install.determinate.systems/). -Alternatively, you can use a virtual machine or container, as long as it can run nix. For example, see this [example setup with `podman`](./nix/tricks.md#development-container-with-podman). - -Next, clone the EvaP repository using `git clone --recurse-submodules https://github.com/e-valuation/EvaP.git`. -When you are inside the `EvaP` directory, you can -- use `nix run .#services` to run the database system storing EvaP's data, and -- run `nix develop` to make all needed development tools available in your current shell session. - -To initialize the database and perform additional setup steps, you need to run the `initialize-setup` command that is available in the `nix develop` environment. -You will only need to perform this step once. - -You can start EvaP by running `./manage.py run`. -Open your browser at http://localhost:8000/ and login with email `evap@institution.example.com` and password `evap`. +1. Windows only: Install the Windows Subsystem for Linux (WSL) using `wsl --install -d Ubuntu-24.04` (you may have to restart your computer). Enter the WSL environment using the `wsl` command or by selecting the entry in the [Windows Terminal](https://aka.ms/terminal). On your first entry, you need to choose a username and password - anything works (for example: username "evap", password "evap"). +2. Install [git](https://git-scm.com/downloads) and run the following commands to clone and enter the EvaP repository: + ``` + git clone --recurse-submodules https://github.com/e-valuation/EvaP.git + cd EvaP + ``` +3. Install [nix](https://nixos.org/). For Linux and WSL, we recommend using our installation script by running `./nix/setup-nix`. For MacOS, we recommend using the [Determinate Nix Installer](https://install.determinate.systems/). +4. Start the needed background services for EvaP: + ``` + nix run .#services-full -- --detached + nix run .#wait-for-pc + ``` +5. Enter the development shell and start EvaP: + ``` + nix develop + ./manage.py run + ``` +6. Open your web browser at http://localhost:8000/ and login with email `evap@institution.example.com` and password `evap`. -For additional tips and tricks around the development setup, see [`nix/tricks.md`](./nix/tricks.md). +To stop EvaP, press `Ctrl-C`. +To exit the development shell, press `Ctrl-D` or type `exit`. +To stop the background services, run `nix run .#services-full -- down`. ## Contributing From 0fc21c6c8ebd3cd5ef25e68d44d55d542b0bb791 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Sun, 13 Oct 2024 00:00:18 +0200 Subject: [PATCH 68/75] Remove `poetry` from packages While `poetry2nix` adds an overlay on the Python package set that disables running the tests, this was not true for the additional poetry from nixpkgs directly. With the override, this poetry had to be rebuilt and thus the tests ran again. --- nix/shell.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/nix/shell.nix b/nix/shell.nix index fea68213ec..0c529c719b 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -39,7 +39,6 @@ let in pkgs.mkShell { packages = with pkgs; [ - (poetry.override { inherit python3; }) nodejs gettext From b41ee316ed52e041b3eead9c4a69bd9cb834e5b6 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Sun, 13 Oct 2024 00:02:19 +0200 Subject: [PATCH 69/75] also add gettext to npm-ci pc process This should fix msgfmt errors for `./manage.py compilemessages`. --- nix/services.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix/services.nix b/nix/services.nix index 27dc1b0eab..1467fb88ff 100644 --- a/nix/services.nix +++ b/nix/services.nix @@ -59,7 +59,7 @@ settings.processes."init-django" = { command = pkgs.writeShellApplication { name = "init-django"; - runtimeInputs = [ poetry-env pkgs.git pkgs.gnused ]; + runtimeInputs = with pkgs; [ poetry-env git gnused gettext ]; text = '' set -e if [[ -f evap/localsettings.py ]]; then From 50facce6f987d91e6b5fdd123122eff7991978f4 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Sun, 13 Oct 2024 00:16:56 +0200 Subject: [PATCH 70/75] don't use process substitution for npm-ci hash check --- nix/services.nix | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nix/services.nix b/nix/services.nix index 1467fb88ff..5f0f8c73b6 100644 --- a/nix/services.nix +++ b/nix/services.nix @@ -42,13 +42,12 @@ runtimeInputs = [ pkgs.nodejs ]; text = '' set -e - CUR_HASH=$(nix-hash --flat <(cat ./package.json ./package-lock.json)) + CUR_HASH=$(nix-hash --flat ./package.json ./package-lock.json | paste -sd " ") echo "Hash is $CUR_HASH" if [[ -f node_modules/evap-hash && "$CUR_HASH" == "$(cat node_modules/evap-hash)" ]]; then echo "Equal hash found, exiting" exit 0 fi - set -x npm ci echo "$CUR_HASH" > node_modules/evap-hash ''; From 7c66ecd5866041a6c80a7ff8ca7236e8d4c807dc Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Sun, 13 Oct 2024 00:45:25 +0200 Subject: [PATCH 71/75] remove flake-parts --- flake.lock | 37 ++----------------------- flake.nix | 80 ++++++++++++++++++++++++++++++------------------------ 2 files changed, 48 insertions(+), 69 deletions(-) diff --git a/flake.lock b/flake.lock index 2bc34f1a3a..803a309e80 100644 --- a/flake.lock +++ b/flake.lock @@ -1,23 +1,5 @@ { "nodes": { - "flake-parts": { - "inputs": { - "nixpkgs-lib": "nixpkgs-lib" - }, - "locked": { - "lastModified": 1722555600, - "narHash": "sha256-XOQkdLafnb/p9ij77byFQjDf5m5QYl9b2REiVClC+x4=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "8471fe90ad337a8074e957b69ca4d0089218391d", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, "flake-utils": { "inputs": { "systems": "systems" @@ -73,18 +55,6 @@ "type": "github" } }, - "nixpkgs-lib": { - "locked": { - "lastModified": 1722555339, - "narHash": "sha256-uFf2QeW7eAHlYXuDktm9c25OxOyCoUOQmh5SZ9amE5Q=", - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/a5d394176e64ab29c852d03346c1fc9b0b7d33eb.tar.gz" - }, - "original": { - "type": "tarball", - "url": "https://github.com/NixOS/nixpkgs/archive/a5d394176e64ab29c852d03346c1fc9b0b7d33eb.tar.gz" - } - }, "poetry2nix": { "inputs": { "flake-utils": "flake-utils", @@ -111,11 +81,11 @@ }, "process-compose-flake": { "locked": { - "lastModified": 1724606023, - "narHash": "sha256-rdGeNa/lCS8E1lXzPqgl+vZUUvnbEZT11Bqkx5jfYug=", + "lastModified": 1727723765, + "narHash": "sha256-/3az0h2Zp02bjJQKliR0PEQiT+FMLOR1GumhH42jA4w=", "owner": "Platonic-Systems", "repo": "process-compose-flake", - "rev": "f6ce9481df9aec739e4e06b67492401a5bb4f0b1", + "rev": "22f2aeb7e0b88006d1d27065f8422f2790d99e47", "type": "github" }, "original": { @@ -126,7 +96,6 @@ }, "root": { "inputs": { - "flake-parts": "flake-parts", "nixpkgs": "nixpkgs", "poetry2nix": "poetry2nix", "process-compose-flake": "process-compose-flake", diff --git a/flake.nix b/flake.nix index 35e9199b99..c923f81bac 100644 --- a/flake.nix +++ b/flake.nix @@ -8,19 +8,23 @@ inputs.nixpkgs.follows = "nixpkgs"; }; - flake-parts.url = "github:hercules-ci/flake-parts"; process-compose-flake.url = "github:Platonic-Systems/process-compose-flake"; services-flake.url = "github:juspay/services-flake"; }; - outputs = { self, flake-parts, ... }@inputs: - flake-parts.lib.mkFlake { inherit inputs; } { - imports = [ - inputs.process-compose-flake.flakeModule - ]; + outputs = { self, nixpkgs, ... }@inputs: + let + lib = nixpkgs.lib; systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ]; - perSystem = { self', inputs', pkgs, lib, system, ... }: { - devShells = rec { + forAllSystems = lib.genAttrs systems; + pkgsFor = lib.genAttrs systems (system: import nixpkgs { inherit system; }); + in + { + devShells = forAllSystems (system: + let + pkgs = pkgsFor.${system}; + in + rec { evap = pkgs.callPackage ./nix/shell.nix { python3 = pkgs.python310; poetry2nix = inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }; @@ -29,35 +33,41 @@ }; evap-dev = evap.override { poetry-groups = [ "dev" ]; }; default = evap-dev; - }; + }); - # Start with `nix run .#services` - process-compose = - let - make = only-databases: import ./nix/services.nix { - inherit pkgs only-databases; - inherit (inputs) services-flake; - inherit (self'.devShells.evap.passthru) poetry-env; - }; - in - { - services = make true; - services-full = make false; + packages = forAllSystems (system: + let + pkgs = pkgsFor.${system}; + make-process-compose = only-databases: (import inputs.process-compose-flake.lib { inherit pkgs; }).makeProcessCompose { + modules = [ + inputs.services-flake.processComposeModules.default + (import + ./nix/services.nix + { + inherit pkgs only-databases; + inherit (inputs) services-flake; + inherit (self.devShells.${system}.evap.passthru) poetry-env; + }) + ]; }; + in + { + services = make-process-compose true; + services-full = make-process-compose false; - packages.wait-for-pc = - let - pc = lib.getExe self'.packages.services; - in - pkgs.writeShellApplication { - name = "wait-for-pc"; - runtimeInputs = [ pkgs.jq ]; - text = '' - while [ "$(${pc} process list -o json 2>/dev/null | jq '.[] |= .is_ready == "Ready" or .status == "Completed" or .status == "Disabled" | all')" != "true" ]; do - sleep 1 - done - ''; - }; - }; + wait-for-pc = + let + pc = lib.getExe self.packages.${system}.services; + in + pkgs.writeShellApplication { + name = "wait-for-pc"; + runtimeInputs = [ pkgs.jq ]; + text = '' + while [ "$(${pc} process list -o json 2>/dev/null | jq '.[] |= .is_ready == "Ready" or .status == "Completed" or .status == "Disabled" | all')" != "true" ]; do + sleep 1 + done + ''; + }; + }); }; } From 5deb2b223fe51fe6219f5728e1248da60928913f Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Sun, 13 Oct 2024 01:43:33 +0200 Subject: [PATCH 72/75] Update README.md --- README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 9c1f10cffe..1f36ab1564 100644 --- a/README.md +++ b/README.md @@ -15,28 +15,27 @@ For the documentation, please see our [wiki](https://github.com/e-valuation/EvaP We use [nix](https://nixos.org/) to manage the development environment. -1. Windows only: Install the Windows Subsystem for Linux (WSL) using `wsl --install -d Ubuntu-24.04` (you may have to restart your computer). Enter the WSL environment using the `wsl` command or by selecting the entry in the [Windows Terminal](https://aka.ms/terminal). On your first entry, you need to choose a username and password - anything works (for example: username "evap", password "evap"). -2. Install [git](https://git-scm.com/downloads) and run the following commands to clone and enter the EvaP repository: +1. Windows only: Install the Windows Subsystem for Linux (WSL) using `wsl --install -d Ubuntu-24.04` (you may have to restart your computer and run this command again). Enter the WSL environment using the `wsl` command. On your first entry, you need to choose a username and password - anything works (for example: username "evap", password "evap"). Perform the next step outside of `/mnt`, for example by going to your home directory (`cd ~`). +2. Install [git](https://git-scm.com/downloads). Run the following commands to clone and enter the EvaP repository: ``` git clone --recurse-submodules https://github.com/e-valuation/EvaP.git cd EvaP ``` -3. Install [nix](https://nixos.org/). For Linux and WSL, we recommend using our installation script by running `./nix/setup-nix`. For MacOS, we recommend using the [Determinate Nix Installer](https://install.determinate.systems/). +3. On Linux and WSL, install nix by running `./nix/setup-nix`. On MacOS, install nix using the [Determinate Nix Installer](https://install.determinate.systems/). Afterwards, if you get a permission error when running nix, restart your computer. 4. Start the needed background services for EvaP: ``` - nix run .#services-full -- --detached - nix run .#wait-for-pc + nix run .#services-full ``` -5. Enter the development shell and start EvaP: +5. Open a new terminal. Enter the development shell and start EvaP: ``` + cd EvaP nix develop ./manage.py run ``` 6. Open your web browser at http://localhost:8000/ and login with email `evap@institution.example.com` and password `evap`. -To stop EvaP, press `Ctrl-C`. +To stop EvaP or the background services, press `Ctrl-C`. To exit the development shell, press `Ctrl-D` or type `exit`. -To stop the background services, run `nix run .#services-full -- down`. ## Contributing From 335b8cce1eac7c3e5ac7b9471d24788df20e7415 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Sun, 13 Oct 2024 01:49:43 +0200 Subject: [PATCH 73/75] be more assertive to people without package managers --- nix/setup-nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix/setup-nix b/nix/setup-nix index 71e0439557..9bc08c5025 100755 --- a/nix/setup-nix +++ b/nix/setup-nix @@ -15,7 +15,7 @@ elif pacman --version &> /dev/null; then set -x sudo pacman -S nix else - echo "Failed to detect package manager." + echo "Failed to detect package manager. Please install nix manually." exit 1 fi From 90c0a46e63fa29801b7ea6979c0c2cc6d8c2fa50 Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Sun, 13 Oct 2024 02:01:44 +0200 Subject: [PATCH 74/75] remove tricks.md in favor of wiki for now --- nix/tricks.md | 39 --------------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 nix/tricks.md diff --git a/nix/tricks.md b/nix/tricks.md deleted file mode 100644 index 89cc7e9e27..0000000000 --- a/nix/tricks.md +++ /dev/null @@ -1,39 +0,0 @@ -# Optimizing the Development Environment - -This page contains various tips and tricks around the development setup. - -## Automatic Activation - -To automatically activate the `nix develop` environment when entering the `EvaP` directory, you can install [`direnv`](https://direnv.net/) and [`nix-direnv`](https://github.com/nix-community/nix-direnv). -Afterwards, create the file `.envrc` with the following contents: -``` -use flake -``` - -## Shell Completions - -The file `deployment/manage_autocompletion.sh` contains bash completions (tab completions) for the `./manage.py` script. -To activate them, use `source deployment/manage_autocompletion.sh`. -You can also do this in your `.envrc` file (note that the completions only work for `bash` though). - -## Extra Packages - -To install additional packages in the `nix develop` environment, edit the `devShells` part in `flake.nix` like so: - -```nix -devShells.default = pkgs.callPackage ./nix/shell.nix { - inherit (self'.packages) evap; - - # added lines below: - extraPackages = with pkgs; [ hello asciiquarium ]; - extraPythonPackages = ps: with ps; [ python-lsp-server ]; -}; -``` - -Find the packages you are looking for at https://search.nixos.org/packages. -Make sure to not include these changes in your git commits. -You can use `git update-index --assume-unchanged`, if you know what you are doing. - -## Clean Setup - -To remove the directories created by the `initialize-setup` command, use the `clean-setup` command. From be17e29f13298729162fa43c8d0184a41a2eed6c Mon Sep 17 00:00:00 2001 From: Niklas Mohrin Date: Sun, 13 Oct 2024 02:03:11 +0200 Subject: [PATCH 75/75] add note about broken `update_production.sh` --- deployment/update_production.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/deployment/update_production.sh b/deployment/update_production.sh index 9b61ed73b1..eee24df57a 100755 --- a/deployment/update_production.sh +++ b/deployment/update_production.sh @@ -39,6 +39,8 @@ git fetch [[ ! -z "$EVAP_SKIP_CHECKOUT" ]] && echo "Skipping Checkout" [[ ! -z "$EVAP_SKIP_CHECKOUT" ]] || git checkout origin/release +# NOTE: The Python environment should be updated here with something like +# sudo -H -u "$USERNAME" "$ENVDIR/bin/pip" install -r requirements.txt # sometimes, this fails for some random i18n test translation files. ./manage.py compilemessages || true