diff --git a/.gitignore b/.gitignore index 1662ae7..8d44686 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /result* /repl-result* temp/ +.tmp dist/ /.venv diff --git a/docs/reference/app.md b/docs/reference/app.md deleted file mode 100644 index b3d34d6..0000000 --- a/docs/reference/app.md +++ /dev/null @@ -1 +0,0 @@ -::: materia.app diff --git a/docs/reference/core.md b/docs/reference/core.md deleted file mode 100644 index 60a2cbb..0000000 --- a/docs/reference/core.md +++ /dev/null @@ -1 +0,0 @@ -::: materia.core diff --git a/docs/reference/models.md b/docs/reference/models.md deleted file mode 100644 index ff7eef3..0000000 --- a/docs/reference/models.md +++ /dev/null @@ -1 +0,0 @@ -::: materia.models diff --git a/docs/reference/routers.md b/docs/reference/routers.md deleted file mode 100644 index f59bbf8..0000000 --- a/docs/reference/routers.md +++ /dev/null @@ -1 +0,0 @@ -::: materia.routers diff --git a/docs/reference/security.md b/docs/reference/security.md deleted file mode 100644 index a5dad5d..0000000 --- a/docs/reference/security.md +++ /dev/null @@ -1 +0,0 @@ -::: materia.security diff --git a/docs/reference/tasks.md b/docs/reference/tasks.md deleted file mode 100644 index db79d29..0000000 --- a/docs/reference/tasks.md +++ /dev/null @@ -1 +0,0 @@ -::: materia.tasks diff --git a/flake.lock b/flake.lock index 91d6c07..0a23e72 100644 --- a/flake.lock +++ b/flake.lock @@ -207,6 +207,21 @@ "type": "github" } }, + "nix-std": { + "locked": { + "lastModified": 1710870712, + "narHash": "sha256-e+7MJF2gsgTBuOWv4mCimSP0D9+naeFSw9a7N3yEmv4=", + "owner": "chessai", + "repo": "nix-std", + "rev": "31bbc925750cc9d8f828fe55cee1a2bd985e0c00", + "type": "github" + }, + "original": { + "owner": "chessai", + "repo": "nix-std", + "type": "github" + } + }, "nixos-mailserver": { "inputs": { "blobs": "blobs", @@ -437,6 +452,7 @@ "inputs": { "bonfire": "bonfire", "dream2nix": "dream2nix", + "nix-std": "nix-std", "nixpkgs": "nixpkgs_3" } }, diff --git a/flake.nix b/flake.nix index 023d911..84ca25e 100644 --- a/flake.nix +++ b/flake.nix @@ -8,6 +8,7 @@ inputs.nixpkgs.follows = "nixpkgs"; }; bonfire.url = "github:L-Nafaryus/bonfire"; + nix-std.url = "github:chessai/nix-std"; }; outputs = { @@ -15,6 +16,7 @@ nixpkgs, dream2nix, bonfire, + nix-std, ... }: let system = "x86_64-linux"; @@ -43,54 +45,6 @@ // {inherit meta;}; in { packages.x86_64-linux = { - materia-server = dreamBuildPackage { - module = { - config, - lib, - dream2nix, - ... - }: { - imports = [dream2nix.modules.dream2nix.WIP-python-pdm]; - - pdm.lockfile = ./pdm.lock; - pdm.pyproject = ./pyproject.toml; - - deps = _: { - python = pkgs.python312; - }; - - mkDerivation = { - src = ./.; - buildInputs = - [ - config.deps.python.pkgs.pdm-backend - ] - ++ map (x: (pkgs.lib.head (pkgs.lib.attrValues x)).public) ( - pkgs.lib.attrValues (config.groups.docs.packages) - ); - nativeBuildInputs = [ - pkgs.python312.pkgs.wrapPython - ]; - configurePhase = '' - python -m mkdocs build -d src/materia/docs/ - ''; - # TODO: include docs - }; - }; - }; - - materia-frontend-vue-source = pkgs.stdenv.mkDerivation { - pname = "materia-frontend-vue-source"; - version = "0.1.1"; - src = ./workspaces/frontend; - phases = ["installPhase"]; - installPhase = '' - mkdir -p $out - cp -r $src/* $out - ${self.packages.x86_64-linux.materia-server}/bin/materia export openapi --path $out/openapi.json - ''; - }; - materia-frontend-vue = dreamBuildPackage { module = { lib, @@ -106,10 +60,7 @@ ]; mkDerivation = { - src = builtins.path { - name = "source"; - path = self.packages.x86_64-linux.materia-frontend-vue-source; - }; + src = ./packages/frontend; }; deps = {nixpkgs, ...}: { @@ -125,7 +76,8 @@ }; }; meta = with nixpkgs.lib; { - description = "Materia frontend (nodejs)"; + description = "Materia is a simple and fast cloud storage (vue)"; + homepage = "https://materia.elnafo.ru"; license = licenses.mit; maintainers = with bonLib.maintainers; [L-Nafaryus]; broken = false; @@ -145,72 +97,128 @@ }: { imports = [dream2nix.modules.dream2nix.WIP-python-pdm]; - pdm.lockfile = ./workspaces/frontend/pdm.lock; - pdm.pyproject = ./workspaces/frontend/pyproject.toml; + pdm.lockfile = ./pdm.lock; + pdm.pyproject = ./packages/frontend/pyproject.toml; deps = _: { python = pkgs.python312; }; mkDerivation = { - src = ./workspaces/frontend; + src = ./packages/frontend; buildInputs = [ pkgs.python312.pkgs.pdm-backend ]; configurePhase = '' - cp -rv ${materia-frontend-vue}/dist ./src/materia_frontend/ - chmod 755 ./src/materia_frontend/dist - cp -rv templates/* ./src/materia_frontend/dist/ + mkdir -p target/materia_frontend + cp -rv ${materia-frontend-vue}/dist/* ./target/materia_frontend/ + cp -rv templates ./target/materia_frontend/ + touch target/materia_frontend/__init__.py ''; }; }; meta = with nixpkgs.lib; { - description = "Materia frontend"; + description = "Materia is a simple and fast cloud storage (frontend)"; + homepage = "https://materia.elnafo.ru"; license = licenses.mit; maintainers = with bonLib.maintainers; [L-Nafaryus]; broken = false; }; }; - materia = dreamBuildPackage { + materia-server = pkgs.callPackage ({ + withFrontend ? true, + withDocs ? true, + ... + }: + dreamBuildPackage { + extraArgs = { + inherit (self.packages.x86_64-linux) materia-frontend materia-docs; + }; + module = { + config, + lib, + dream2nix, + materia-frontend, + materia-docs, + ... + }: { + imports = [dream2nix.modules.dream2nix.WIP-python-pdm]; + + pdm.lockfile = ./pdm.lock; + pdm.pyproject = ./packages/server/pyproject.toml; + + deps = _: { + python = pkgs.python312; + }; + + mkDerivation = { + src = ./packages/server; + buildInputs = [ + pkgs.python312.pkgs.pdm-backend + ]; + nativeBuildInputs = [ + pkgs.python312.pkgs.wrapPython + ]; + propagatedBuildInputs = + lib.optionals withFrontend [ + materia-frontend + ] + ++ lib.optionals withDocs [materia-docs]; + }; + }; + meta = with nixpkgs.lib; { + description = "Materia is a simple and fast cloud storage"; + homepage = "https://materia.elnafo.ru"; + license = licenses.mit; + maintainers = with bonLib.maintainers; [L-Nafaryus]; + broken = false; + mainProgram = "materia"; + }; + }) {}; + + materia-docs = dreamBuildPackage { extraArgs = { - inherit (self.packages.x86_64-linux) materia-frontend; + materia-server = self.packages.x86_64-linux.materia-server.override { + withFrontend = false; + withDocs = false; + }; }; module = { config, lib, dream2nix, - materia-frontend, + materia-server, ... }: { imports = [dream2nix.modules.dream2nix.WIP-python-pdm]; pdm.lockfile = ./pdm.lock; - pdm.pyproject = ./pyproject.toml; + pdm.pyproject = ./packages/docs/pyproject.toml; deps = _: { python = pkgs.python312; }; mkDerivation = { - src = ./.; + src = ./packages/docs; buildInputs = [ pkgs.python312.pkgs.pdm-backend ]; - nativeBuildInputs = [ - pkgs.python312.pkgs.wrapPython - ]; - propagatedBuildInputs = [ - materia-frontend - ]; + nativeBuildInputs = [pkgs.mkdocs materia-server]; + configurePhase = '' + mkdir -p target/materia_docs + mkdocs build + touch target/materia_docs/__init__.py + ''; }; }; meta = with nixpkgs.lib; { - description = "Materia"; + description = "Materia is a simple and fast cloud storage (docs)"; + homepage = "https://materia.elnafo.ru"; license = licenses.mit; maintainers = with bonLib.maintainers; [L-Nafaryus]; broken = false; - mainProgram = "materia"; }; }; @@ -234,7 +242,7 @@ pathsToLink = ["/bin" "/etc" "/"]; paths = with pkgs; [ bash - self.packages.x86_64-linux.materia + self.packages.x86_64-linux.materia-server entryPoint ]; }; @@ -267,5 +275,406 @@ # greenlet requires libstdc++ LD_LIBRARY_PATH = nixpkgs.lib.makeLibraryPath [pkgs.stdenv.cc.cc]; }; + + nixosModules = rec { + materia = { + config, + lib, + pkgs, + ... + }: + with lib; let + cfg = config.services.materia; + in { + options.services.materia = { + enable = mkEnableOption "Enables the Materia service"; + + package = mkOption { + type = types.package; + default = self.packages.x86_64-linux.materia-server; + description = "The package to use."; + }; + + application = mkOption { + type = types.submodule { + options = { + user = mkOption { + type = types.str; + }; + group = mkOption { + type = types.str; + }; + mode = mkOption { + type = types.str; + }; + working_directory = mkOption { + type = types.path; + default = "/var/lib/materia"; + }; + }; + }; + default = { + user = "materia"; + group = "materia"; + mode = "production"; + working_directory = "/var/lib/materia"; + }; + }; + + server = mkOption { + type = types.submodule { + options = { + scheme = mkOption { + type = types.str; + }; + address = mkOption { + type = types.str; + }; + port = mkOption { + type = types.port; + }; + domain = mkOption { + type = types.str; + }; + }; + }; + default = { + scheme = "http"; + address = "127.0.0.1"; + port = 54601; + domain = "localhost"; + }; + }; + + database = mkOption { + type = types.submodule { + options = { + backend = mkOption { + type = types.str; + default = "postgresql"; + }; + scheme = mkOption { + type = types.str; + default = "postgresql+asyncpg"; + }; + address = mkOption { + type = types.str; + default = "127.0.0.1"; + }; + port = mkOption { + type = types.port; + default = 5432; + }; + name = mkOption { + type = types.nullOr types.str; + default = "materia"; + }; + user = mkOption { + type = types.str; + default = "materia"; + }; + password = mkOption { + type = types.nullOr (types.oneOf [types.str types.path]); + default = null; + }; + }; + }; + default = { + backend = "postgresql"; + scheme = "postgresql+asyncpg"; + address = "127.0.0.1"; + port = 5432; + name = "materia"; + user = "materia"; + password = null; + }; + }; + + cache = mkOption { + type = types.submodule { + options = { + backend = mkOption { + type = types.str; + default = "redis"; + }; + scheme = mkOption { + type = types.str; + default = "redis"; + }; + address = mkOption { + type = types.str; + default = "127.0.0.1"; + }; + port = mkOption { + type = types.port; + default = 6379; + }; + database = mkOption { + type = types.nullOr types.int; + default = 0; + }; + user = mkOption { + type = types.str; + default = "materia"; + }; + password = mkOption { + type = types.nullOr (types.oneOf [types.str types.path]); + default = null; + }; + }; + }; + default = { + backed = "redis"; + scheme = "redis"; + address = "127.0.0.1"; + port = 6379; + database = 0; + user = "materia"; + password = null; + }; + }; + + security = mkOption { + type = types.submodule { + options = { + secret_key = mkOption { + type = types.nullOr (types.oneOf [types.str types.path]); + }; + password_min_length = mkOption { + type = types.int; + }; + password_hash_algo = mkOption { + type = types.nullOr types.str; + }; + cookie_http_only = mkOption { + type = types.bool; + }; + cookie_access_token_name = mkOption { + type = types.str; + }; + cookie_refresh_token_name = mkOption { + type = types.str; + }; + }; + }; + default = { + secret_key = null; + password_min_length = 8; + password_hash_algo = "bcrypt"; + cookie_http_only = true; + cookie_access_token_name = "materia_at"; + cookie_refresh_token_name = "materia_rt"; + }; + }; + + oauth2 = mkOption { + type = types.submodule { + options = { + enabled = mkOption { + type = types.bool; + }; + jwt_signing_algo = mkOption { + type = types.str; + }; + jwt_singing_key = mkOption { + type = types.nullOr (types.oneOf [types.str types.path]); + }; + jwt_secret = mkOption { + type = types.nullOr (types.oneOf [types.str types.path]); + }; + access_token_lifetime = mkOption { + type = types.int; + }; + refresh_token_lifetime = mkOption { + type = types.int; + }; + }; + }; + default = { + enabled = true; + jwt_signing_algo = "HS256"; + jwt_singing_key = null; + jwt_secret = "changeme"; + access_token_lifetime = 3600; + refresh_token_lifetime = 730 * 60; + }; + }; + + mailer = mkOption { + type = types.submodule { + options = { + enabled = mkOption { + type = types.bool; + default = false; + }; + scheme = mkOption { + type = types.nullOr types.str; + default = null; + }; + address = mkOption { + type = types.nullOr types.str; + default = null; + }; + port = mkOption { + type = types.nullOr types.int; + default = null; + }; + helo = mkOption { + type = types.bool; + default = true; + }; + cert_file = mkOption { + type = types.nullOr types.path; + default = null; + }; + key_file = mkOption { + type = types.nullOr types.path; + default = null; + }; + sender = mkOption { + type = types.nullOr types.str; + default = null; + }; + user = mkOption { + type = types.nullOr types.str; + default = null; + }; + password = mkOption { + type = types.nullOr (types.oneOf [types.str types.path]); + default = null; + }; + plain_text = mkOption { + type = types.bool; + default = false; + }; + }; + }; + default = {}; + }; + + cron = mkOption { + type = types.submodule { + options = { + workers_count = mkOption { + type = types.int; + }; + }; + }; + default = { + workers_count = 1; + }; + }; + + repository = mkOption { + type = types.submodule { + options = { + capacity = mkOption { + type = types.int; + }; + }; + }; + default = {capacity = 5368709120;}; + }; + + misc = mkOption { + type = types.submodule { + options = { + enable_client = mkOption { + type = types.bool; + }; + enable_docs = mkOption { + type = types.bool; + }; + enable_api_docs = mkOption { + type = types.bool; + }; + }; + }; + default = { + enable_client = true; + enable_docs = true; + enable_api_docs = false; + }; + }; + }; + + config = mkIf cfg.enable { + users.users.materia = { + description = "Materia service user"; + home = cfg.application.working_directory; + createHome = true; + isSystemUser = true; + group = "materia"; + }; + users.groups.materia = {}; + + systemd.services.materia = { + description = "Materia service"; + wantedBy = ["multi-user.target"]; + after = ["network.target"]; + + serviceConfig = { + Restart = "always"; + ExecStart = "${lib.getExe cfg.package} start"; + User = "materia"; + WorkingDirectory = cfg.application.working_directory; + }; + + preStart = let + toTOML = nix-std.lib.serde.toTOML; + configFile = pkgs.writeText "config.toml" '' + ${toTOML {inherit (cfg) application server database cache security oauth2 mailer cron repository misc;}} + ''; + in '' + ln -sf ${configFile} ${cfg.application.working_directory}/config.toml + ''; + }; + }; + }; + }; + + nixosConfigurations.materia = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = [ + self.nixosModules.materia + ({ + pkgs, + config, + ... + }: { + boot.isContainer = true; + + networking.hostName = "materia"; + networking.useDHCP = false; + + services.redis.servers.materia = { + enable = true; + port = 6379; + databases = 1; + }; + + services.postgresql = { + enable = true; + enableTCPIP = true; + authentication = '' + host materia all 127.0.0.1/32 trust + ''; + initialScript = pkgs.writeText "init" '' + CREATE ROLE materia WITH LOGIN PASSWORD 'test'; + CREATE DATABASE materia OWNER materia; + ''; + ensureDatabases = ["materia"]; + }; + + services.materia = { + enable = true; + cache.port = config.services.redis.servers.materia.port; + database.password = "test"; + }; + + system.stateVersion = "24.05"; + }) + ]; + }; }; } diff --git a/packages/docs/.gitignore b/packages/docs/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/packages/docs/.gitignore @@ -0,0 +1 @@ +/target diff --git a/mkdocs.yml b/packages/docs/mkdocs.yml similarity index 92% rename from mkdocs.yml rename to packages/docs/mkdocs.yml index 6361380..f5a2867 100644 --- a/mkdocs.yml +++ b/packages/docs/mkdocs.yml @@ -1,3 +1,6 @@ +docs_dir: src +site_dir: target/materia_docs + site_name: Materia Documentation site_description: Materia cloud storage #site_url: @@ -53,7 +56,7 @@ plugins: - mkdocstrings: handlers: python: - paths: [src] # search packages in the src folder + paths: [../server/src] # search packages in the src folder options: extensions: - griffe_typingdoc @@ -76,18 +79,6 @@ plugins: filters: - '!^_' -nav: - - Materia: index.md - - Reference: - - reference/index.md - - reference/app.md - - reference/core.md - - reference/models.md - - reference/routers.md - - reference/security.md - - reference/tasks.md - - API: api.md - markdown_extensions: # Python Markdown abbr: @@ -131,3 +122,20 @@ markdown_extensions: pymdownx.blocks.details: pymdownx.blocks.tab: alternate_style: True + +nav: + - Usage: + - Introduction: index.md + - usage/getting-started.md + - Reference: + - reference/index.md + - reference/app.md + - reference/core.md + - reference/models.md + - reference/routers.md + - reference/security.md + - reference/tasks.md + - Development: + - devel/contrib.md + - devel/local.md + - API: api.md diff --git a/packages/docs/pyproject.toml b/packages/docs/pyproject.toml new file mode 100644 index 0000000..cf2685c --- /dev/null +++ b/packages/docs/pyproject.toml @@ -0,0 +1,40 @@ +[project] +name = "materia-docs" +version = "0.1.1" +description = "Materia documentation" +authors = [ + {name = "L-Nafaryus", email = "l.nafaryus@gmail.com"}, +] +dependencies = [ + "mkdocs-material>=9.5.38", + "mkdocstrings-python>=1.11.1", + "griffe-typingdoc>=0.2.7", + "pymdown-extensions>=10.11", + "black<24.0.0,>=23.3.0", +] +requires-python = ">=3.12,<3.13" +license = {text = "MIT"} + +[project.urls] +Homepage = "https://materia.elnafo.ru" +Repository = "https://github.com/L-Nafaryus/materia" +Documentation = "https://materia.elnafo.ru/docs" + +[build-system] +requires = ["pdm-backend"] +build-backend = "pdm.backend" + +[tool.pdm] +distribution = true + +[tool.pdm.build] +package-dir = "target" +includes = ["target/materia_docs"] + +[tool.pdm.scripts] +# mkdocs creates "target/materia_docs" +mkdocs-build.cmd = "mkdocs build" +top-level.shell = "touch target/materia_docs/__init__.py" +pre_build.composite = [ "mkdocs-build", "top-level" ] + +doc.cmd = "mkdocs serve" diff --git a/docs/api.md b/packages/docs/src/api.md similarity index 100% rename from docs/api.md rename to packages/docs/src/api.md diff --git a/packages/docs/src/devel/contrib.md b/packages/docs/src/devel/contrib.md new file mode 100644 index 0000000..825f3a9 --- /dev/null +++ b/packages/docs/src/devel/contrib.md @@ -0,0 +1,58 @@ +# Contributing + +First off, thanks for taking the time to contribute! Contributions include but are not restricted to: + +- Reporting bugs +- Contributing to code +- Writing tests +- Writing documentation + +The following is a set of guidelines for contributing. + +## A recommended flow of contributing to an Open Source project + +This section is for beginners to OSS. If you are an experienced OSS developer, you can skip +this section. + +1. First, fork this project to your own namespace using the fork button at the top right of the repository page. +2. Clone the **upstream** repository to local: + ```sh + git clone https://github.com/L-Nafaryus/materia.git + # Or if you prefer SSH clone: + git clone git@github.com:L-Nafaryus/materia.git + ``` +3. Add the fork as a new remote: + ```sh + git remote add fork https://github.com/yourname/materia.git + git fetch fork + ``` + where `fork` is the remote name of the fork repository. + +/// tip + +1. Don't modify code on the master branch, the master branch should always keep track of origin/master. + + To update master branch to date: + + ```sh + git pull origin master + # In rare cases that your local master branch diverges from the remote master: + git fetch origin && git reset --hard master + ``` + +2. Create a new branch based on the up-to-date master branch for new patches. +3. Create a Pull Request from that patch branch. + +/// + +## Local development + +See [Local development](./local.md) + +## Code style + +*Soon* + +## Realease + +*Soon* diff --git a/packages/docs/src/devel/local.md b/packages/docs/src/devel/local.md new file mode 100644 index 0000000..994dd67 --- /dev/null +++ b/packages/docs/src/devel/local.md @@ -0,0 +1,3 @@ +# Local development + +*Soon* diff --git a/docs/img/favicon.png b/packages/docs/src/img/favicon.png similarity index 100% rename from docs/img/favicon.png rename to packages/docs/src/img/favicon.png diff --git a/docs/img/logo-black.svg b/packages/docs/src/img/logo-black.svg similarity index 100% rename from docs/img/logo-black.svg rename to packages/docs/src/img/logo-black.svg diff --git a/docs/img/logo-full.png b/packages/docs/src/img/logo-full.png similarity index 100% rename from docs/img/logo-full.png rename to packages/docs/src/img/logo-full.png diff --git a/docs/img/logo-white.svg b/packages/docs/src/img/logo-white.svg similarity index 100% rename from docs/img/logo-white.svg rename to packages/docs/src/img/logo-white.svg diff --git a/docs/img/logo.png b/packages/docs/src/img/logo.png similarity index 100% rename from docs/img/logo.png rename to packages/docs/src/img/logo.png diff --git a/docs/img/logo.svg b/packages/docs/src/img/logo.svg similarity index 100% rename from docs/img/logo.svg rename to packages/docs/src/img/logo.svg diff --git a/docs/index.md b/packages/docs/src/index.md similarity index 94% rename from docs/index.md rename to packages/docs/src/index.md index 9c51223..7d887ec 100644 --- a/docs/index.md +++ b/packages/docs/src/index.md @@ -15,7 +15,7 @@ Materia is a simple and fast cloud storage

-**Documentation**: [https://storage.elnafo.ru/docs](https://storage.elnafo.ru/docs) +**Documentation**: [https://materia.elnafo.ru/docs](https://materia.elnafo.ru/docs) **Source**: [https://vcs.elnafo.ru/L-Nafaryus/materia](https://vcs.elnafo.ru/L-Nafaryus/materia) @@ -148,4 +148,4 @@ pdm build ## License -**materia** is licensed under the terms of the [MIT License](LICENSE). +**materia** is licensed under the terms of the [MIT License](https://vcs.elnafo.ru/L-Nafaryus/materia/src/branch/master/LICENSE). diff --git a/packages/docs/src/reference/app.md b/packages/docs/src/reference/app.md new file mode 100644 index 0000000..f70e73b --- /dev/null +++ b/packages/docs/src/reference/app.md @@ -0,0 +1 @@ +::: materia_server.app diff --git a/packages/docs/src/reference/core.md b/packages/docs/src/reference/core.md new file mode 100644 index 0000000..fdec28f --- /dev/null +++ b/packages/docs/src/reference/core.md @@ -0,0 +1 @@ +::: materia_server.core diff --git a/docs/reference/index.md b/packages/docs/src/reference/index.md similarity index 100% rename from docs/reference/index.md rename to packages/docs/src/reference/index.md diff --git a/packages/docs/src/reference/models.md b/packages/docs/src/reference/models.md new file mode 100644 index 0000000..662e095 --- /dev/null +++ b/packages/docs/src/reference/models.md @@ -0,0 +1 @@ +::: materia_server.models diff --git a/packages/docs/src/reference/routers.md b/packages/docs/src/reference/routers.md new file mode 100644 index 0000000..e886893 --- /dev/null +++ b/packages/docs/src/reference/routers.md @@ -0,0 +1 @@ +::: materia_server.routers diff --git a/packages/docs/src/reference/security.md b/packages/docs/src/reference/security.md new file mode 100644 index 0000000..6cdb430 --- /dev/null +++ b/packages/docs/src/reference/security.md @@ -0,0 +1 @@ +::: materia_server.security diff --git a/packages/docs/src/reference/tasks.md b/packages/docs/src/reference/tasks.md new file mode 100644 index 0000000..4ef2b54 --- /dev/null +++ b/packages/docs/src/reference/tasks.md @@ -0,0 +1 @@ +::: materia_server.tasks diff --git a/packages/docs/src/usage/getting-started.md b/packages/docs/src/usage/getting-started.md new file mode 100644 index 0000000..69a5d54 --- /dev/null +++ b/packages/docs/src/usage/getting-started.md @@ -0,0 +1 @@ +# Getting started diff --git a/workspaces/frontend/.gitignore b/packages/frontend/.gitignore similarity index 83% rename from workspaces/frontend/.gitignore rename to packages/frontend/.gitignore index e742cf9..101c283 100644 --- a/workspaces/frontend/.gitignore +++ b/packages/frontend/.gitignore @@ -11,5 +11,6 @@ node_modules/ *.mjs *.log -openapi.json +#openapi.json +/target src/client diff --git a/workspaces/frontend/README.md b/packages/frontend/README.md similarity index 100% rename from workspaces/frontend/README.md rename to packages/frontend/README.md diff --git a/workspaces/frontend/index.html b/packages/frontend/index.html similarity index 87% rename from workspaces/frontend/index.html rename to packages/frontend/index.html index 03b04da..1f8ca8c 100644 --- a/workspaces/frontend/index.html +++ b/packages/frontend/index.html @@ -2,7 +2,7 @@ - + Materia Dev diff --git a/packages/frontend/openapi.json b/packages/frontend/openapi.json new file mode 100644 index 0000000..f8d4358 --- /dev/null +++ b/packages/frontend/openapi.json @@ -0,0 +1 @@ +{"openapi": "3.1.0", "info": {"title": "materia", "version": "0.1.0"}, "paths": {"/api/auth/signup": {"post": {"tags": ["auth"], "summary": "Signup", "operationId": "auth_signup", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserCredentials"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/auth/signin": {"post": {"tags": ["auth"], "summary": "Signin", "operationId": "auth_signin", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserCredentials"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/auth/signout": {"get": {"tags": ["auth"], "summary": "Signout", "operationId": "auth_signout", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/oauth2/authorize": {"post": {"tags": ["oauth2"], "summary": "Authorize", "operationId": "oauth2_authorize", "requestBody": {"content": {"application/x-www-form-urlencoded": {"schema": {"$ref": "#/components/schemas/Body_authorize_api_oauth2_authorize_post"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/oauth2/access_token": {"post": {"tags": ["oauth2"], "summary": "Token", "operationId": "oauth2_token", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/user": {"get": {"tags": ["user"], "summary": "Info", "operationId": "user_info", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserInfo"}}}}}}, "delete": {"tags": ["user"], "summary": "Remove", "operationId": "user_remove", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/user/avatar": {"put": {"tags": ["user"], "summary": "Avatar", "operationId": "user_avatar", "requestBody": {"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/Body_avatar_api_user_avatar_put"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "delete": {"tags": ["user"], "summary": "Remove Avatar", "operationId": "user_remove_avatar", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/repository": {"get": {"tags": ["repository"], "summary": "Info", "operationId": "repository_info", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RepositoryInfo"}}}}}}, "post": {"tags": ["repository"], "summary": "Create", "operationId": "repository_create", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}, "delete": {"tags": ["repository"], "summary": "Remove", "operationId": "repository_remove", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}, "/api/repository/content": {"get": {"tags": ["repository"], "summary": "Content", "operationId": "repository_content", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RepositoryContent"}}}}}}}, "/api/directory": {"post": {"tags": ["directory"], "summary": "Create", "operationId": "directory_create", "requestBody": {"required": true, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DirectoryPath"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "get": {"tags": ["directory"], "summary": "Info", "operationId": "directory_info", "parameters": [{"name": "path", "in": "query", "required": true, "schema": {"type": "string", "format": "path", "title": "Path"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "delete": {"tags": ["directory"], "summary": "Remove", "operationId": "directory_remove", "parameters": [{"name": "path", "in": "query", "required": true, "schema": {"type": "string", "format": "path", "title": "Path"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/directory/rename": {"patch": {"tags": ["directory"], "summary": "Rename", "operationId": "directory_rename", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DirectoryRename"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/directory/move": {"patch": {"tags": ["directory"], "summary": "Move", "operationId": "directory_move", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DirectoryCopyMove"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/directory/copy": {"post": {"tags": ["directory"], "summary": "Copy", "operationId": "directory_copy", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DirectoryCopyMove"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/directory/content": {"get": {"tags": ["directory"], "summary": "Content", "operationId": "directory_content", "parameters": [{"name": "path", "in": "query", "required": true, "schema": {"type": "string", "format": "path", "title": "Path"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DirectoryContent"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/file": {"post": {"tags": ["file"], "summary": "Create", "operationId": "file_create", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}, "requestBody": {"content": {"multipart/form-data": {"schema": {"required": ["file", "path"], "type": "object", "properties": {"file": {"type": "string", "format": "binary"}, "path": {"type": "string", "format": "path", "example": "/"}}}}}, "required": true}}, "get": {"tags": ["file"], "summary": "Info", "operationId": "file_info", "parameters": [{"name": "path", "in": "query", "required": true, "schema": {"type": "string", "format": "path", "title": "Path"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FileInfo"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "delete": {"tags": ["file"], "summary": "Remove", "operationId": "file_remove", "parameters": [{"name": "path", "in": "query", "required": true, "schema": {"type": "string", "format": "path", "title": "Path"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/file/rename": {"patch": {"tags": ["file"], "summary": "Rename", "operationId": "file_rename", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/FileRename"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/file/move": {"patch": {"tags": ["file"], "summary": "Move", "operationId": "file_move", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/FileCopyMove"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/file/copy": {"post": {"tags": ["file"], "summary": "Copy", "operationId": "file_copy", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/FileCopyMove"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/avatar/{avatar_id}": {"get": {"tags": ["avatar"], "summary": "Avatar", "operationId": "avatar_avatar", "parameters": [{"name": "avatar_id", "in": "path", "required": true, "schema": {"type": "string", "title": "Avatar Id"}}, {"name": "format", "in": "query", "required": false, "schema": {"type": "string", "default": "png", "title": "Format"}}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}}, "components": {"schemas": {"Body_authorize_api_oauth2_authorize_post": {"properties": {"redirect_uri": {"type": "string", "maxLength": 2083, "minLength": 1, "format": "uri", "title": "Redirect Uri"}, "client_id": {"type": "string", "title": "Client Id"}, "scope": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Scope"}, "state": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "State"}, "response_type": {"type": "string", "title": "Response Type", "default": "code"}, "grant_type": {"type": "string", "pattern": "password", "title": "Grant Type", "default": "authorization_code"}}, "type": "object", "required": ["redirect_uri", "client_id"], "title": "Body_authorize_api_oauth2_authorize_post"}, "Body_avatar_api_user_avatar_put": {"properties": {"file": {"type": "string", "format": "binary", "title": "File"}}, "type": "object", "required": ["file"], "title": "Body_avatar_api_user_avatar_put"}, "DirectoryContent": {"properties": {"files": {"items": {"$ref": "#/components/schemas/FileInfo"}, "type": "array", "title": "Files"}, "directories": {"items": {"$ref": "#/components/schemas/DirectoryInfo"}, "type": "array", "title": "Directories"}}, "type": "object", "required": ["files", "directories"], "title": "DirectoryContent"}, "DirectoryCopyMove": {"properties": {"path": {"type": "string", "format": "path", "title": "Path"}, "target": {"type": "string", "format": "path", "title": "Target"}, "force": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Force", "default": false}}, "type": "object", "required": ["path", "target"], "title": "DirectoryCopyMove"}, "DirectoryInfo": {"properties": {"id": {"type": "integer", "title": "Id"}, "repository_id": {"type": "integer", "title": "Repository Id"}, "parent_id": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Parent Id"}, "created": {"type": "integer", "title": "Created"}, "updated": {"type": "integer", "title": "Updated"}, "name": {"type": "string", "title": "Name"}, "is_public": {"type": "boolean", "title": "Is Public"}, "path": {"anyOf": [{"type": "string", "format": "path"}, {"type": "null"}], "title": "Path"}, "used": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Used"}}, "type": "object", "required": ["id", "repository_id", "parent_id", "created", "updated", "name", "is_public"], "title": "DirectoryInfo"}, "DirectoryPath": {"properties": {"path": {"type": "string", "format": "path", "title": "Path"}}, "type": "object", "required": ["path"], "title": "DirectoryPath"}, "DirectoryRename": {"properties": {"path": {"type": "string", "format": "path", "title": "Path"}, "name": {"type": "string", "title": "Name"}, "force": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Force", "default": false}}, "type": "object", "required": ["path", "name"], "title": "DirectoryRename"}, "FileCopyMove": {"properties": {"path": {"type": "string", "format": "path", "title": "Path"}, "target": {"type": "string", "format": "path", "title": "Target"}, "force": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Force", "default": false}}, "type": "object", "required": ["path", "target"], "title": "FileCopyMove"}, "FileInfo": {"properties": {"id": {"type": "integer", "title": "Id"}, "repository_id": {"type": "integer", "title": "Repository Id"}, "parent_id": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Parent Id"}, "created": {"type": "integer", "title": "Created"}, "updated": {"type": "integer", "title": "Updated"}, "name": {"type": "string", "title": "Name"}, "is_public": {"type": "boolean", "title": "Is Public"}, "size": {"type": "integer", "title": "Size"}, "path": {"anyOf": [{"type": "string", "format": "path"}, {"type": "null"}], "title": "Path"}}, "type": "object", "required": ["id", "repository_id", "parent_id", "created", "updated", "name", "is_public", "size"], "title": "FileInfo"}, "FileRename": {"properties": {"path": {"type": "string", "format": "path", "title": "Path"}, "name": {"type": "string", "title": "Name"}, "force": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "title": "Force", "default": false}}, "type": "object", "required": ["path", "name"], "title": "FileRename"}, "HTTPValidationError": {"properties": {"detail": {"items": {"$ref": "#/components/schemas/ValidationError"}, "type": "array", "title": "Detail"}}, "type": "object", "title": "HTTPValidationError"}, "LoginType": {"type": "integer", "enum": [1, 2, 3], "title": "LoginType"}, "RepositoryContent": {"properties": {"files": {"items": {"$ref": "#/components/schemas/FileInfo"}, "type": "array", "title": "Files"}, "directories": {"items": {"$ref": "#/components/schemas/DirectoryInfo"}, "type": "array", "title": "Directories"}}, "type": "object", "required": ["files", "directories"], "title": "RepositoryContent"}, "RepositoryInfo": {"properties": {"id": {"type": "integer", "title": "Id"}, "capacity": {"type": "integer", "title": "Capacity"}, "used": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Used"}}, "type": "object", "required": ["id", "capacity"], "title": "RepositoryInfo"}, "UserCredentials": {"properties": {"name": {"type": "string", "title": "Name"}, "password": {"type": "string", "title": "Password"}, "email": {"anyOf": [{"type": "string", "format": "email"}, {"type": "null"}], "title": "Email"}}, "type": "object", "required": ["name", "password", "email"], "title": "UserCredentials"}, "UserInfo": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "name": {"type": "string", "title": "Name"}, "lower_name": {"type": "string", "title": "Lower Name"}, "full_name": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Full Name"}, "email": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Email"}, "is_email_private": {"type": "boolean", "title": "Is Email Private"}, "must_change_password": {"type": "boolean", "title": "Must Change Password"}, "login_type": {"$ref": "#/components/schemas/LoginType"}, "created": {"type": "integer", "title": "Created"}, "updated": {"type": "integer", "title": "Updated"}, "last_login": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Last Login"}, "is_active": {"type": "boolean", "title": "Is Active"}, "is_admin": {"type": "boolean", "title": "Is Admin"}, "avatar": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Avatar"}}, "type": "object", "required": ["id", "name", "lower_name", "full_name", "email", "is_email_private", "must_change_password", "login_type", "created", "updated", "last_login", "is_active", "is_admin", "avatar"], "title": "UserInfo"}, "ValidationError": {"properties": {"loc": {"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, "type": "array", "title": "Location"}, "msg": {"type": "string", "title": "Message"}, "type": {"type": "string", "title": "Error Type"}}, "type": "object", "required": ["loc", "msg", "type"], "title": "ValidationError"}}}} \ No newline at end of file diff --git a/workspaces/frontend/package-lock.json b/packages/frontend/package-lock.json similarity index 100% rename from workspaces/frontend/package-lock.json rename to packages/frontend/package-lock.json diff --git a/workspaces/frontend/package.json b/packages/frontend/package.json similarity index 76% rename from workspaces/frontend/package.json rename to packages/frontend/package.json index 70e0644..b737240 100644 --- a/workspaces/frontend/package.json +++ b/packages/frontend/package.json @@ -1,12 +1,22 @@ { "name": "materia-frontend-vue", "version": "0.1.1", + "description": "Materia is a simple and fast cloud storage (vue)", + "author": "L-Nafaryus ", + "license": "MIT", + "homepage": "https://materia.elnafo.ru", + "repository": { + "type": "git", + "url": "https://github.com/L-Nafaryus/materia", + "directory": "packages/frontend" + }, "private": true, "type": "module", "scripts": { "dev": "vite", "build-check": "run-p type-check \"build-only {@}\" --", "preview": "vite preview", + "simple-build": "vite build", "build": "npm run openapi && vite build", "type-check": "vue-tsc --build --force", "openapi": "./node_modules/@hey-api/openapi-ts/bin/index.cjs --input ./openapi.json --output ./src/client/ --client @hey-api/client-axios" diff --git a/workspaces/frontend/postcss.config.js b/packages/frontend/postcss.config.js similarity index 100% rename from workspaces/frontend/postcss.config.js rename to packages/frontend/postcss.config.js diff --git a/packages/frontend/pyproject.toml b/packages/frontend/pyproject.toml new file mode 100644 index 0000000..8ca5ff7 --- /dev/null +++ b/packages/frontend/pyproject.toml @@ -0,0 +1,35 @@ +[project] +name = "materia-frontend" +version = "0.1.2" +description = "Materia is a simple and fast cloud storage (frontend)" +authors = [ + {name = "L-Nafaryus", email = "l.nafaryus@gmail.com"}, +] +requires-python = ">=3.12,<3.13" +license = {text = "MIT"} + +[project.urls] +Homepage = "https://materia.elnafo.ru" +Repository = "https://github.com/L-Nafaryus/materia" +Documentation = "https://materia.elnafo.ru/docs" + +[build-system] +requires = ["pdm-backend"] +build-backend = "pdm.backend" + +[tool.pdm] +distribution = true + +[tool.pdm.build] +package-dir = "target" +includes = ["target/materia_frontend"] + +[tool.pdm.scripts] +npm-install.cmd = "npm install" +openapi-client.cmd = "npm run openapi" +npm-build.cmd = "npm run simple-build -- --outDir target/materia_frontend" +top-level.shell = "touch target/materia_frontend/__init__.py" +copy-templates.shell = "cp -r ./templates target/materia_frontend/" +pre_build.composite = [ "npm-install", "openapi-client", "npm-build", "top-level", "copy-templates" ] + +openapi-json.cmd = "pdm run -p ../server python -m materia_server export openapi --path ./openapi.json" diff --git a/workspaces/frontend/src/App.vue b/packages/frontend/src/App.vue similarity index 100% rename from workspaces/frontend/src/App.vue rename to packages/frontend/src/App.vue diff --git a/workspaces/frontend/src/assets/style.css b/packages/frontend/src/assets/style.css similarity index 100% rename from workspaces/frontend/src/assets/style.css rename to packages/frontend/src/assets/style.css diff --git a/workspaces/frontend/src/components/ContextMenu.vue b/packages/frontend/src/components/ContextMenu.vue similarity index 100% rename from workspaces/frontend/src/components/ContextMenu.vue rename to packages/frontend/src/components/ContextMenu.vue diff --git a/workspaces/frontend/src/components/CtxMenu.vue b/packages/frontend/src/components/CtxMenu.vue similarity index 100% rename from workspaces/frontend/src/components/CtxMenu.vue rename to packages/frontend/src/components/CtxMenu.vue diff --git a/workspaces/frontend/src/components/DataTable.vue b/packages/frontend/src/components/DataTable.vue similarity index 100% rename from workspaces/frontend/src/components/DataTable.vue rename to packages/frontend/src/components/DataTable.vue diff --git a/workspaces/frontend/src/components/DragItem.vue b/packages/frontend/src/components/DragItem.vue similarity index 100% rename from workspaces/frontend/src/components/DragItem.vue rename to packages/frontend/src/components/DragItem.vue diff --git a/workspaces/frontend/src/components/DropItem.vue b/packages/frontend/src/components/DropItem.vue similarity index 100% rename from workspaces/frontend/src/components/DropItem.vue rename to packages/frontend/src/components/DropItem.vue diff --git a/workspaces/frontend/src/components/DropdownItem.vue b/packages/frontend/src/components/DropdownItem.vue similarity index 100% rename from workspaces/frontend/src/components/DropdownItem.vue rename to packages/frontend/src/components/DropdownItem.vue diff --git a/workspaces/frontend/src/components/DropdownMenu.vue b/packages/frontend/src/components/DropdownMenu.vue similarity index 100% rename from workspaces/frontend/src/components/DropdownMenu.vue rename to packages/frontend/src/components/DropdownMenu.vue diff --git a/workspaces/frontend/src/components/Error.vue b/packages/frontend/src/components/Error.vue similarity index 100% rename from workspaces/frontend/src/components/Error.vue rename to packages/frontend/src/components/Error.vue diff --git a/workspaces/frontend/src/components/Modal.vue b/packages/frontend/src/components/Modal.vue similarity index 100% rename from workspaces/frontend/src/components/Modal.vue rename to packages/frontend/src/components/Modal.vue diff --git a/workspaces/frontend/src/components/NavBar.vue b/packages/frontend/src/components/NavBar.vue similarity index 100% rename from workspaces/frontend/src/components/NavBar.vue rename to packages/frontend/src/components/NavBar.vue diff --git a/workspaces/frontend/src/components/RepositoryBrowser.vue b/packages/frontend/src/components/RepositoryBrowser.vue similarity index 100% rename from workspaces/frontend/src/components/RepositoryBrowser.vue rename to packages/frontend/src/components/RepositoryBrowser.vue diff --git a/workspaces/frontend/src/components/Tooltip.vue b/packages/frontend/src/components/Tooltip.vue similarity index 100% rename from workspaces/frontend/src/components/Tooltip.vue rename to packages/frontend/src/components/Tooltip.vue diff --git a/workspaces/frontend/src/components/Uploader.vue b/packages/frontend/src/components/Uploader.vue similarity index 100% rename from workspaces/frontend/src/components/Uploader.vue rename to packages/frontend/src/components/Uploader.vue diff --git a/workspaces/frontend/src/components/Warning.vue b/packages/frontend/src/components/Warning.vue similarity index 100% rename from workspaces/frontend/src/components/Warning.vue rename to packages/frontend/src/components/Warning.vue diff --git a/workspaces/frontend/src/components/icons/IconAccept.vue b/packages/frontend/src/components/icons/IconAccept.vue similarity index 100% rename from workspaces/frontend/src/components/icons/IconAccept.vue rename to packages/frontend/src/components/icons/IconAccept.vue diff --git a/workspaces/frontend/src/components/icons/IconCommunity.vue b/packages/frontend/src/components/icons/IconCommunity.vue similarity index 100% rename from workspaces/frontend/src/components/icons/IconCommunity.vue rename to packages/frontend/src/components/icons/IconCommunity.vue diff --git a/workspaces/frontend/src/components/icons/IconDelete.vue b/packages/frontend/src/components/icons/IconDelete.vue similarity index 100% rename from workspaces/frontend/src/components/icons/IconDelete.vue rename to packages/frontend/src/components/icons/IconDelete.vue diff --git a/workspaces/frontend/src/components/icons/IconDirectory.vue b/packages/frontend/src/components/icons/IconDirectory.vue similarity index 100% rename from workspaces/frontend/src/components/icons/IconDirectory.vue rename to packages/frontend/src/components/icons/IconDirectory.vue diff --git a/workspaces/frontend/src/components/icons/IconDocumentation.vue b/packages/frontend/src/components/icons/IconDocumentation.vue similarity index 100% rename from workspaces/frontend/src/components/icons/IconDocumentation.vue rename to packages/frontend/src/components/icons/IconDocumentation.vue diff --git a/workspaces/frontend/src/components/icons/IconEcosystem.vue b/packages/frontend/src/components/icons/IconEcosystem.vue similarity index 100% rename from workspaces/frontend/src/components/icons/IconEcosystem.vue rename to packages/frontend/src/components/icons/IconEcosystem.vue diff --git a/workspaces/frontend/src/components/icons/IconFile.vue b/packages/frontend/src/components/icons/IconFile.vue similarity index 100% rename from workspaces/frontend/src/components/icons/IconFile.vue rename to packages/frontend/src/components/icons/IconFile.vue diff --git a/workspaces/frontend/src/components/icons/IconRemove.vue b/packages/frontend/src/components/icons/IconRemove.vue similarity index 100% rename from workspaces/frontend/src/components/icons/IconRemove.vue rename to packages/frontend/src/components/icons/IconRemove.vue diff --git a/workspaces/frontend/src/components/icons/IconSupport.vue b/packages/frontend/src/components/icons/IconSupport.vue similarity index 100% rename from workspaces/frontend/src/components/icons/IconSupport.vue rename to packages/frontend/src/components/icons/IconSupport.vue diff --git a/workspaces/frontend/src/components/icons/IconTooling.vue b/packages/frontend/src/components/icons/IconTooling.vue similarity index 100% rename from workspaces/frontend/src/components/icons/IconTooling.vue rename to packages/frontend/src/components/icons/IconTooling.vue diff --git a/workspaces/frontend/src/components/icons/IconUpload.vue b/packages/frontend/src/components/icons/IconUpload.vue similarity index 100% rename from workspaces/frontend/src/components/icons/IconUpload.vue rename to packages/frontend/src/components/icons/IconUpload.vue diff --git a/workspaces/frontend/src/components/icons/accept-approved-check-done-ok-tick-svgrepo-com.svg b/packages/frontend/src/components/icons/accept-approved-check-done-ok-tick-svgrepo-com.svg similarity index 100% rename from workspaces/frontend/src/components/icons/accept-approved-check-done-ok-tick-svgrepo-com.svg rename to packages/frontend/src/components/icons/accept-approved-check-done-ok-tick-svgrepo-com.svg diff --git a/workspaces/frontend/src/components/icons/delete-2-svgrepo-com.svg b/packages/frontend/src/components/icons/delete-2-svgrepo-com.svg similarity index 100% rename from workspaces/frontend/src/components/icons/delete-2-svgrepo-com.svg rename to packages/frontend/src/components/icons/delete-2-svgrepo-com.svg diff --git a/workspaces/frontend/src/components/icons/delete-svgrepo-com.svg b/packages/frontend/src/components/icons/delete-svgrepo-com.svg similarity index 100% rename from workspaces/frontend/src/components/icons/delete-svgrepo-com.svg rename to packages/frontend/src/components/icons/delete-svgrepo-com.svg diff --git a/workspaces/frontend/src/components/icons/upload-cloud-svgrepo-com.svg b/packages/frontend/src/components/icons/upload-cloud-svgrepo-com.svg similarity index 100% rename from workspaces/frontend/src/components/icons/upload-cloud-svgrepo-com.svg rename to packages/frontend/src/components/icons/upload-cloud-svgrepo-com.svg diff --git a/workspaces/frontend/src/index.ts b/packages/frontend/src/index.ts similarity index 100% rename from workspaces/frontend/src/index.ts rename to packages/frontend/src/index.ts diff --git a/workspaces/frontend/src/main.ts b/packages/frontend/src/main.ts similarity index 100% rename from workspaces/frontend/src/main.ts rename to packages/frontend/src/main.ts diff --git a/workspaces/frontend/src/plugins/directives.ts b/packages/frontend/src/plugins/directives.ts similarity index 100% rename from workspaces/frontend/src/plugins/directives.ts rename to packages/frontend/src/plugins/directives.ts diff --git a/workspaces/frontend/src/plugins/index.ts b/packages/frontend/src/plugins/index.ts similarity index 100% rename from workspaces/frontend/src/plugins/index.ts rename to packages/frontend/src/plugins/index.ts diff --git a/workspaces/frontend/src/router.ts b/packages/frontend/src/router.ts similarity index 97% rename from workspaces/frontend/src/router.ts rename to packages/frontend/src/router.ts index 1eff438..3590eda 100644 --- a/workspaces/frontend/src/router.ts +++ b/packages/frontend/src/router.ts @@ -9,7 +9,7 @@ export const is_authorized = async (): Promise => { .then(async res => { userStore.info = res.data; }) .then(async () => { if (!userStore.avatar && userStore.info.avatar) { - await api.resourcesAvatar(userStore.info.avatar) + await api.avatarAvatar(userStore.info.avatar) .then(async res => { userStore.avatar = res.data; }) } }) diff --git a/workspaces/frontend/src/store/index.ts b/packages/frontend/src/store/index.ts similarity index 99% rename from workspaces/frontend/src/store/index.ts rename to packages/frontend/src/store/index.ts index 062e892..c9a7a56 100644 --- a/workspaces/frontend/src/store/index.ts +++ b/packages/frontend/src/store/index.ts @@ -31,7 +31,7 @@ export const useUser = defineStore("user", () => { }) .then(async () => { if (!avatar.value && info.value.avatar) { - await api.resourcesAvatar(info.value.avatar) + await api.avatarAvatar(info.value.avatar) .then(async res => { avatar.value = res.data; }) } }) diff --git a/workspaces/frontend/src/types.ts b/packages/frontend/src/types.ts similarity index 100% rename from workspaces/frontend/src/types.ts rename to packages/frontend/src/types.ts diff --git a/workspaces/frontend/src/views/AdminSettings.vue b/packages/frontend/src/views/AdminSettings.vue similarity index 100% rename from workspaces/frontend/src/views/AdminSettings.vue rename to packages/frontend/src/views/AdminSettings.vue diff --git a/workspaces/frontend/src/views/AuthSignIn.vue b/packages/frontend/src/views/AuthSignIn.vue similarity index 100% rename from workspaces/frontend/src/views/AuthSignIn.vue rename to packages/frontend/src/views/AuthSignIn.vue diff --git a/workspaces/frontend/src/views/AuthSignUp.vue b/packages/frontend/src/views/AuthSignUp.vue similarity index 100% rename from workspaces/frontend/src/views/AuthSignUp.vue rename to packages/frontend/src/views/AuthSignUp.vue diff --git a/workspaces/frontend/src/views/Base.vue b/packages/frontend/src/views/Base.vue similarity index 100% rename from workspaces/frontend/src/views/Base.vue rename to packages/frontend/src/views/Base.vue diff --git a/workspaces/frontend/src/views/Home.vue b/packages/frontend/src/views/Home.vue similarity index 100% rename from workspaces/frontend/src/views/Home.vue rename to packages/frontend/src/views/Home.vue diff --git a/workspaces/frontend/src/views/NotFound.vue b/packages/frontend/src/views/NotFound.vue similarity index 100% rename from workspaces/frontend/src/views/NotFound.vue rename to packages/frontend/src/views/NotFound.vue diff --git a/workspaces/frontend/src/views/Repository.vue b/packages/frontend/src/views/Repository.vue similarity index 100% rename from workspaces/frontend/src/views/Repository.vue rename to packages/frontend/src/views/Repository.vue diff --git a/workspaces/frontend/src/views/UserPrefs.vue b/packages/frontend/src/views/UserPrefs.vue similarity index 100% rename from workspaces/frontend/src/views/UserPrefs.vue rename to packages/frontend/src/views/UserPrefs.vue diff --git a/workspaces/frontend/src/views/UserPrefsAccount.vue b/packages/frontend/src/views/UserPrefsAccount.vue similarity index 100% rename from workspaces/frontend/src/views/UserPrefsAccount.vue rename to packages/frontend/src/views/UserPrefsAccount.vue diff --git a/workspaces/frontend/src/views/UserPrefsProfile.vue b/packages/frontend/src/views/UserPrefsProfile.vue similarity index 100% rename from workspaces/frontend/src/views/UserPrefsProfile.vue rename to packages/frontend/src/views/UserPrefsProfile.vue diff --git a/workspaces/frontend/src/views/UserProfile.vue b/packages/frontend/src/views/UserProfile.vue similarity index 100% rename from workspaces/frontend/src/views/UserProfile.vue rename to packages/frontend/src/views/UserProfile.vue diff --git a/workspaces/frontend/tailwind.config.js b/packages/frontend/tailwind.config.js similarity index 100% rename from workspaces/frontend/tailwind.config.js rename to packages/frontend/tailwind.config.js diff --git a/workspaces/frontend/templates/base.html b/packages/frontend/templates/base.html similarity index 61% rename from workspaces/frontend/templates/base.html rename to packages/frontend/templates/base.html index 0598881..a56e381 100644 --- a/workspaces/frontend/templates/base.html +++ b/packages/frontend/templates/base.html @@ -2,11 +2,11 @@ - + Materia - - + +
diff --git a/workspaces/frontend/tsconfig.app.json b/packages/frontend/tsconfig.app.json similarity index 100% rename from workspaces/frontend/tsconfig.app.json rename to packages/frontend/tsconfig.app.json diff --git a/workspaces/frontend/tsconfig.json b/packages/frontend/tsconfig.json similarity index 100% rename from workspaces/frontend/tsconfig.json rename to packages/frontend/tsconfig.json diff --git a/workspaces/frontend/tsconfig.vite.json b/packages/frontend/tsconfig.vite.json similarity index 100% rename from workspaces/frontend/tsconfig.vite.json rename to packages/frontend/tsconfig.vite.json diff --git a/workspaces/frontend/vite.config.ts b/packages/frontend/vite.config.ts similarity index 66% rename from workspaces/frontend/vite.config.ts rename to packages/frontend/vite.config.ts index d998d5b..c5d41f4 100644 --- a/workspaces/frontend/vite.config.ts +++ b/packages/frontend/vite.config.ts @@ -10,12 +10,11 @@ export default defineConfig({ vueJsx(), ], build: { - //outDir: path.resolve(__dirname, "./frontend"), rollupOptions: { output: { - entryFileNames: "resources/assets/[name].js", - assetFileNames: "resources/assets/[name][extname]", - chunkFileNames: "resources/assets/[name].js" + entryFileNames: "assets/[name].js", + assetFileNames: "assets/[name][extname]", + chunkFileNames: "assets/[name].js" } } }, diff --git a/packages/server/.gitignore b/packages/server/.gitignore new file mode 100644 index 0000000..1662ae7 --- /dev/null +++ b/packages/server/.gitignore @@ -0,0 +1,18 @@ +/result* +/repl-result* +temp/ + +dist/ +/.venv +__pycache__/ +*.egg-info + +.pdm.toml +.pdm-python +.pdm-build + +.pytest_cache +.coverage + +/site +src/materia/docs diff --git a/alembic.ini b/packages/server/alembic.ini similarity index 100% rename from alembic.ini rename to packages/server/alembic.ini diff --git a/packages/server/pyproject.toml b/packages/server/pyproject.toml new file mode 100644 index 0000000..ff3fe47 --- /dev/null +++ b/packages/server/pyproject.toml @@ -0,0 +1,114 @@ +[project] +name = "materia-server" +version = "0.1.1" +description = "Materia is a simple and fast cloud storage" +authors = [ + {name = "L-Nafaryus", email = "l.nafaryus@gmail.com"}, +] +dependencies = [ + "fastapi<1.0.0,>=0.111.0", + "uvicorn[standard]<1.0.0,>=0.29.0", + "psycopg2-binary<3.0.0,>=2.9.9", + "toml<1.0.0,>=0.10.2", + "sqlalchemy[asyncio]<3.0.0,>=2.0.30", + "asyncpg<1.0.0,>=0.29.0", + "eventlet<1.0.0,>=0.36.1", + "bcrypt==4.1.2", + "pyjwt<3.0.0,>=2.8.0", + "requests<3.0.0,>=2.31.0", + "pillow<11.0.0,>=10.3.0", + "sqids<1.0.0,>=0.4.1", + "alembic<2.0.0,>=1.13.1", + "authlib<2.0.0,>=1.3.0", + "redis[hiredis]<6.0.0,>=5.0.4", + "aiosmtplib<4.0.0,>=3.0.1", + "emails<1.0,>=0.6", + "pydantic-settings<3.0.0,>=2.2.1", + "email-validator<3.0.0,>=2.1.1", + "pydanclick<1.0.0,>=0.2.0", + "loguru<1.0.0,>=0.7.2", + "alembic-postgresql-enum<2.0.0,>=1.2.0", + "gunicorn>=22.0.0", + "uvicorn-worker>=0.2.0", + "httpx>=0.27.0", + "cryptography>=43.0.0", + "python-multipart>=0.0.9", + "jinja2>=3.1.4", + "aiofiles>=24.1.0", + "aioshutil>=1.5", + "Celery>=5.4.0", + "streaming-form-data>=1.16.0", +] +requires-python = ">=3.12,<3.13" +license = {text = "MIT"} + +[project.urls] +Homepage = "https://materia.elnafo.ru" +Repository = "https://github.com/L-Nafaryus/materia" +Documentation = "https://materia.elnafo.ru/docs" + +[project.optional-dependencies] +docs = [ +] +frontend = [ + #"materia-frontend>=0.1.1", +] +all = [ + #"materia[frontend]", +] + +[build-system] +requires = ["pdm-backend"] +build-backend = "pdm.backend" + +[project.scripts] +materia = "materia_server.app.cli:cli" + +[tool.pyright] +reportGeneralTypeIssues = false + +[tool.pytest.ini_options] +pythonpath = ["."] +testpaths = ["tests"] + +[tool.pdm] +distribution = true + +[tool.pdm.dev-dependencies] +dev = [ + "black<24.0.0,>=23.3.0", + "pytest<8.0.0,>=7.3.2", + "pyflakes<4.0.0,>=3.0.1", + "pyright<2.0.0,>=1.1.314", + "pytest-asyncio>=0.23.7", + "asgi-lifespan>=2.1.0", + "pytest-cov>=5.0.0", +] + +[tool.pdm.build] +package-dir = "src" +includes = ["src/materia_server"] + +[tool.pdm.scripts] +start.cmd = "python ./src/materia/main.py {args:start --app-mode development --log-level debug}" +setup.cmd = "psql -U postgres -h 127.0.0.1 -p 54320 -d postgres -c 'create role materia login;' -c 'create database materia owner materia;'" +teardown.cmd = "psql -U postgres -h 127.0.0.1 -p 54320 -d postgres -c 'drop database materia;' -c 'drop role materia;'" +rev.cmd = "alembic revision {args:--autogenerate}" +upgrade.cmd = "alembic upgrade {args:head}" +downgrade.cmd = "alembic downgrade {args:base}" +remove-revs.shell = "rm -v ./src/materia/models/migrations/versions/*.py" + +test.cmd = "pytest" +coverage.cmd = "pytest --cov=src/materia_server" + +[tool.pdm.resolution] +respect-source-order = true + +[[tool.pdm.source]] +name = "pypi" +url = "https://pypi.org/simple" + +[[tool.pdm.source]] +name = "elnafo-vcs" +url = "https://vcs.elnafo.ru/api/packages/L-Nafaryus/pypi" +verify_ssl = true diff --git a/packages/server/src/materia_server/__main__.py b/packages/server/src/materia_server/__main__.py new file mode 100644 index 0000000..36bd263 --- /dev/null +++ b/packages/server/src/materia_server/__main__.py @@ -0,0 +1,3 @@ +from materia_server.app import cli + +cli() diff --git a/packages/server/src/materia_server/app/__init__.py b/packages/server/src/materia_server/app/__init__.py new file mode 100644 index 0000000..301e51e --- /dev/null +++ b/packages/server/src/materia_server/app/__init__.py @@ -0,0 +1,2 @@ +from materia_server.app.app import Context, Application +from materia_server.app.cli import cli diff --git a/src/materia/app/app.py b/packages/server/src/materia_server/app/app.py similarity index 82% rename from src/materia/app/app.py rename to packages/server/src/materia_server/app/app.py index f4e17de..d120f8c 100644 --- a/src/materia/app/app.py +++ b/packages/server/src/materia_server/app/app.py @@ -9,7 +9,7 @@ from fastapi import FastAPI from fastapi.routing import APIRoute from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles -from materia.core import ( +from materia_server.core import ( Config, Logger, LoggerInstance, @@ -17,8 +17,8 @@ from materia.core import ( Cache, Cron, ) -from materia import routers -from materia.core.misc import optional, optional_string +from materia_server import routers +from materia_server.core.misc import optional, optional_string class Context(TypedDict): @@ -66,13 +66,6 @@ class Application: app.logger.error(" ".join(e.args)) sys.exit() - try: - import materia_frontend - except ModuleNotFoundError: - app.logger.warning( - "`materia_frontend` is not installed. No user interface will be served." - ) - return app def prepare_logger(self): @@ -134,10 +127,25 @@ class Application: allow_methods=["*"], allow_headers=["*"], ) - self.backend.include_router(routers.docs.router) self.backend.include_router(routers.api.router) - self.backend.include_router(routers.resources.router) - self.backend.include_router(routers.root.router) + if self.config.misc.enable_api_docs: + self.backend.include_router(routers.api_docs.router) + if self.config.misc.enable_docs: + try: + import materia_docs + except ModuleNotFoundError: + self.logger.error( + "The `misc.enable_docs` option was enabled but the `materia_docs` package was not found." + ) + self.backend.include_router(routers.docs.router) + if self.config.misc.enable_client: + try: + import materia_frontend + except ModuleNotFoundError: + self.logger.error( + "The `misc.enable_client` option was enabled but the `materia_frontend` package was not found." + ) + self.backend.include_router(routers.client.router) for route in self.backend.routes: if isinstance(route, APIRoute): @@ -167,5 +175,5 @@ class Application: self.logger.info("Exiting...") sys.exit() except Exception as e: - self.logger.error(" ".join(e.args)) + self.logger.exception(" ".join(e.args), backtrace=False) sys.exit() diff --git a/src/materia/app/asgi.py b/packages/server/src/materia_server/app/asgi.py similarity index 74% rename from src/materia/app/asgi.py rename to packages/server/src/materia_server/app/asgi.py index 716ae5f..7819376 100644 --- a/src/materia/app/asgi.py +++ b/packages/server/src/materia_server/app/asgi.py @@ -1,8 +1,8 @@ from os import environ from pathlib import Path from uvicorn.workers import UvicornWorker -from materia.config import Config -from materia._logging import uvicorn_log_config +from materia_server.config import Config +from materia_server._logging import uvicorn_log_config class MateriaWorker(UvicornWorker): diff --git a/src/materia/app/cli.py b/packages/server/src/materia_server/app/cli.py similarity index 93% rename from src/materia/app/cli.py rename to packages/server/src/materia_server/app/cli.py index dc9ce56..c688438 100644 --- a/src/materia/app/cli.py +++ b/packages/server/src/materia_server/app/cli.py @@ -1,9 +1,9 @@ from pathlib import Path import sys import click -from materia.core.config import Config -from materia.core.logging import Logger -from materia.app import Application +from materia_server.core.config import Config +from materia_server.core.logging import Logger +from materia_server.app import Application import asyncio import json @@ -42,7 +42,6 @@ def start(config: Path, debug: bool): config = Config.open(config_path) except Exception as e: logger.error("Failed to read configuration file: {}", e) - else: logger.info("Using the default configuration.") config = Config() else: @@ -134,6 +133,9 @@ def export_openapi(path: Path): path = path.resolve() logger = Logger.new() config = Config() + config.misc.enable_client = False + config.misc.enable_docs = False + config.misc.enable_api_docs = False app = Application(config) app.prepare_server() diff --git a/src/materia/app/wsgi.py b/packages/server/src/materia_server/app/wsgi.py similarity index 100% rename from src/materia/app/wsgi.py rename to packages/server/src/materia_server/app/wsgi.py diff --git a/packages/server/src/materia_server/core/__init__.py b/packages/server/src/materia_server/core/__init__.py new file mode 100644 index 0000000..ecd0de0 --- /dev/null +++ b/packages/server/src/materia_server/core/__init__.py @@ -0,0 +1,13 @@ +from materia_server.core.logging import Logger, LoggerInstance, LogLevel, LogMode +from materia_server.core.database import ( + DatabaseError, + DatabaseMigrationError, + Database, + SessionMaker, + SessionContext, + ConnectionContext, +) +from materia_server.core.filesystem import FileSystem, FileSystemError, TemporaryFileTarget +from materia_server.core.config import Config +from materia_server.core.cache import Cache, CacheError +from materia_server.core.cron import Cron, CronError diff --git a/src/materia/core/cache.py b/packages/server/src/materia_server/core/cache.py similarity index 97% rename from src/materia/core/cache.py rename to packages/server/src/materia_server/core/cache.py index f22ac5c..8796b30 100644 --- a/src/materia/core/cache.py +++ b/packages/server/src/materia_server/core/cache.py @@ -3,7 +3,7 @@ from typing import Any, AsyncGenerator, Self from pydantic import RedisDsn from redis import asyncio as aioredis from redis.asyncio.client import Pipeline -from materia.core.logging import Logger +from materia_server.core.logging import Logger class CacheError(Exception): diff --git a/src/materia/core/config.py b/packages/server/src/materia_server/core/config.py similarity index 95% rename from src/materia/core/config.py rename to packages/server/src/materia_server/core/config.py index 7f47e28..52e2d54 100644 --- a/src/materia/core/config.py +++ b/packages/server/src/materia_server/core/config.py @@ -110,7 +110,7 @@ class OAuth2(BaseModel): # check if signing algo need a key or generate it | HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, EdDSA jwt_signing_key: Optional[Union[str, Path]] = None jwt_secret: Optional[Union[str, Path]] = ( - "changeme" # None # only for HS256, HS384, HS512 | generate + "changeme" # None # only for HS256, HS384, HS512 | generate ) access_token_lifetime: int = 3600 refresh_token_lifetime: int = 730 * 60 @@ -136,9 +136,9 @@ class Mailer(BaseModel): cert_file: Optional[Path] = None key_file: Optional[Path] = None - from_: Optional[NameEmail] = None + sender: Optional[NameEmail] = None user: Optional[str] = None - password: Optional[str] = None + password: Optional[Union[str, Path]] = None plain_text: bool = False @@ -150,6 +150,12 @@ class Repository(BaseModel): capacity: int = 5 << 30 +class Misc(BaseModel): + enable_client: bool = True + enable_docs: bool = True + enable_api_docs: bool = False + + class Config(BaseSettings, env_prefix="materia_", env_nested_delimiter="__"): application: Application = Application() log: Log = Log() @@ -161,6 +167,7 @@ class Config(BaseSettings, env_prefix="materia_", env_nested_delimiter="__"): mailer: Mailer = Mailer() cron: Cron = Cron() repository: Repository = Repository() + misc: Misc = Misc() @staticmethod def open(path: Path) -> Self | None: diff --git a/src/materia/core/cron.py b/packages/server/src/materia_server/core/cron.py similarity index 97% rename from src/materia/core/cron.py rename to packages/server/src/materia_server/core/cron.py index e189e64..7947d71 100644 --- a/src/materia/core/cron.py +++ b/packages/server/src/materia_server/core/cron.py @@ -2,7 +2,7 @@ from typing import Optional, Self from celery import Celery from pydantic import RedisDsn from threading import Thread -from materia.core.logging import Logger +from materia_server.core.logging import Logger class CronError(Exception): diff --git a/src/materia/core/database.py b/packages/server/src/materia_server/core/database.py similarity index 97% rename from src/materia/core/database.py rename to packages/server/src/materia_server/core/database.py index f020486..ef7bdc2 100644 --- a/src/materia/core/database.py +++ b/packages/server/src/materia_server/core/database.py @@ -18,7 +18,7 @@ from alembic.runtime.migration import MigrationContext from alembic.script.base import ScriptDirectory import alembic_postgresql_enum from fastapi import HTTPException -from materia.core.logging import Logger +from materia_server.core.logging import Logger class DatabaseError(Exception): @@ -111,7 +111,7 @@ class Database: await session.close() def run_sync_migrations(self, connection: Connection): - from materia.models.base import Base + from materia_server.models.base import Base aconfig = AlembicConfig() aconfig.set_main_option("sqlalchemy.url", str(self.url)) @@ -142,7 +142,7 @@ class Database: await connection.run_sync(self.run_sync_migrations) # type: ignore def rollback_sync_migrations(self, connection: Connection): - from materia.models.base import Base + from materia_server.models.base import Base aconfig = AlembicConfig() aconfig.set_main_option("sqlalchemy.url", str(self.url)) diff --git a/src/materia/core/filesystem.py b/packages/server/src/materia_server/core/filesystem.py similarity index 99% rename from src/materia/core/filesystem.py rename to packages/server/src/materia_server/core/filesystem.py index ccd3714..ace61b5 100644 --- a/src/materia/core/filesystem.py +++ b/packages/server/src/materia_server/core/filesystem.py @@ -8,7 +8,7 @@ import re from tempfile import NamedTemporaryFile from streaming_form_data.targets import BaseTarget from uuid import uuid4 -from materia.core.misc import optional +from materia_server.core.misc import optional valid_path = re.compile(r"^/(.*/)*([^/]*)$") diff --git a/src/materia/core/logging.py b/packages/server/src/materia_server/core/logging.py similarity index 95% rename from src/materia/core/logging.py rename to packages/server/src/materia_server/core/logging.py index affb380..7a0e2e1 100644 --- a/src/materia/core/logging.py +++ b/packages/server/src/materia_server/core/logging.py @@ -109,8 +109,8 @@ class Logger: "version": 1, "disable_existing_loggers": False, "handlers": { - "default": {"class": "materia.core.logging.InterceptHandler"}, - "access": {"class": "materia.core.logging.InterceptHandler"}, + "default": {"class": "materia_server.core.logging.InterceptHandler"}, + "access": {"class": "materia_server.core.logging.InterceptHandler"}, }, "loggers": { "uvicorn": { diff --git a/src/materia/core/misc.py b/packages/server/src/materia_server/core/misc.py similarity index 100% rename from src/materia/core/misc.py rename to packages/server/src/materia_server/core/misc.py diff --git a/src/materia/models/__init__.py b/packages/server/src/materia_server/models/__init__.py similarity index 63% rename from src/materia/models/__init__.py rename to packages/server/src/materia_server/models/__init__.py index 66b0ad9..c56bf10 100644 --- a/src/materia/models/__init__.py +++ b/packages/server/src/materia_server/models/__init__.py @@ -1,18 +1,18 @@ -from materia.models.auth import ( +from materia_server.models.auth import ( LoginType, LoginSource, # OAuth2Application, # OAuth2Grant, # OAuth2AuthorizationCode, ) -from materia.models.user import User, UserCredentials, UserInfo -from materia.models.repository import ( +from materia_server.models.user import User, UserCredentials, UserInfo +from materia_server.models.repository import ( Repository, RepositoryInfo, RepositoryContent, RepositoryError, ) -from materia.models.directory import ( +from materia_server.models.directory import ( Directory, DirectoryLink, DirectoryInfo, @@ -21,7 +21,7 @@ from materia.models.directory import ( DirectoryRename, DirectoryCopyMove, ) -from materia.models.file import ( +from materia_server.models.file import ( File, FileLink, FileInfo, diff --git a/packages/server/src/materia_server/models/auth/__init__.py b/packages/server/src/materia_server/models/auth/__init__.py new file mode 100644 index 0000000..277b629 --- /dev/null +++ b/packages/server/src/materia_server/models/auth/__init__.py @@ -0,0 +1,3 @@ +from materia_server.models.auth.source import LoginType, LoginSource + +# from materia_server.models.auth.oauth2 import OAuth2Application, OAuth2Grant, OAuth2AuthorizationCode diff --git a/src/materia/models/auth/oauth2.py b/packages/server/src/materia_server/models/auth/oauth2.py similarity index 97% rename from src/materia/models/auth/oauth2.py rename to packages/server/src/materia_server/models/auth/oauth2.py index db86db2..e708b58 100644 --- a/src/materia/models/auth/oauth2.py +++ b/packages/server/src/materia_server/models/auth/oauth2.py @@ -8,9 +8,9 @@ from sqlalchemy import BigInteger, ForeignKey, JSON, and_, select from sqlalchemy.orm import mapped_column, Mapped, relationship from pydantic import BaseModel, HttpUrl -from materia.models.base import Base -from materia.core import Database, Cache -from materia import security +from materia_server.models.base import Base +from materia_server.core import Database, Cache +from materia_server import security class OAuth2Application(Base): diff --git a/src/materia/models/auth/source.py b/packages/server/src/materia_server/models/auth/source.py similarity index 94% rename from src/materia/models/auth/source.py rename to packages/server/src/materia_server/models/auth/source.py index 15e32fa..4e98437 100644 --- a/src/materia/models/auth/source.py +++ b/packages/server/src/materia_server/models/auth/source.py @@ -4,7 +4,7 @@ from time import time from sqlalchemy import BigInteger from sqlalchemy.orm import Mapped, mapped_column -from materia.models.base import Base +from materia_server.models.base import Base class LoginType(enum.Enum): diff --git a/src/materia/models/base.py b/packages/server/src/materia_server/models/base.py similarity index 100% rename from src/materia/models/base.py rename to packages/server/src/materia_server/models/base.py diff --git a/src/materia/models/directory.py b/packages/server/src/materia_server/models/directory.py similarity index 97% rename from src/materia/models/directory.py rename to packages/server/src/materia_server/models/directory.py index 73ae4ac..05a58e5 100644 --- a/src/materia/models/directory.py +++ b/packages/server/src/materia_server/models/directory.py @@ -7,8 +7,8 @@ from sqlalchemy.orm import mapped_column, Mapped, relationship import sqlalchemy as sa from pydantic import BaseModel, ConfigDict -from materia.models.base import Base -from materia.core import SessionContext, Config, FileSystem +from materia_server.models.base import Base +from materia_server.core import SessionContext, Config, FileSystem class DirectoryError(Exception): @@ -306,5 +306,5 @@ class DirectoryCopyMove(BaseModel): force: Optional[bool] = False -from materia.models.repository import Repository -from materia.models.file import File, FileInfo +from materia_server.models.repository import Repository +from materia_server.models.file import File, FileInfo diff --git a/src/materia/models/file.py b/packages/server/src/materia_server/models/file.py similarity index 97% rename from src/materia/models/file.py rename to packages/server/src/materia_server/models/file.py index fb8c331..d9811c7 100644 --- a/src/materia/models/file.py +++ b/packages/server/src/materia_server/models/file.py @@ -7,8 +7,8 @@ from sqlalchemy.orm import mapped_column, Mapped, relationship import sqlalchemy as sa from pydantic import BaseModel, ConfigDict -from materia.models.base import Base -from materia.core import SessionContext, Config, FileSystem +from materia_server.models.base import Base +from materia_server.core import SessionContext, Config, FileSystem class FileError(Exception): @@ -273,5 +273,5 @@ class FileCopyMove(BaseModel): force: Optional[bool] = False -from materia.models.repository import Repository -from materia.models.directory import Directory +from materia_server.models.repository import Repository +from materia_server.models.directory import Directory diff --git a/src/materia/models/migrations/env.py b/packages/server/src/materia_server/models/migrations/env.py similarity index 90% rename from src/materia/models/migrations/env.py rename to packages/server/src/materia_server/models/migrations/env.py index 12888fd..d4fab2a 100644 --- a/src/materia/models/migrations/env.py +++ b/packages/server/src/materia_server/models/migrations/env.py @@ -8,13 +8,13 @@ from sqlalchemy.ext.asyncio import async_engine_from_config from alembic import context import alembic_postgresql_enum -from materia.core import Config -from materia.models.base import Base -import materia.models.user -import materia.models.auth -import materia.models.repository -import materia.models.directory -import materia.models.file +from materia_server.core import Config +from materia_server.models.base import Base +import materia_server.models.user +import materia_server.models.auth +import materia_server.models.repository +import materia_server.models.directory +import materia_server.models.file # this is the Alembic Config object, which provides diff --git a/src/materia/models/migrations/script.py.mako b/packages/server/src/materia_server/models/migrations/script.py.mako similarity index 100% rename from src/materia/models/migrations/script.py.mako rename to packages/server/src/materia_server/models/migrations/script.py.mako diff --git a/src/materia/models/migrations/versions/.gitkeep b/packages/server/src/materia_server/models/migrations/versions/.gitkeep similarity index 100% rename from src/materia/models/migrations/versions/.gitkeep rename to packages/server/src/materia_server/models/migrations/versions/.gitkeep diff --git a/src/materia/models/migrations/versions/bf2ef6c7ab70_.py b/packages/server/src/materia_server/models/migrations/versions/bf2ef6c7ab70_.py similarity index 100% rename from src/materia/models/migrations/versions/bf2ef6c7ab70_.py rename to packages/server/src/materia_server/models/migrations/versions/bf2ef6c7ab70_.py diff --git a/src/materia/models/repository.py b/packages/server/src/materia_server/models/repository.py similarity index 93% rename from src/materia/models/repository.py rename to packages/server/src/materia_server/models/repository.py index d21bbc9..d18a8eb 100644 --- a/src/materia/models/repository.py +++ b/packages/server/src/materia_server/models/repository.py @@ -8,8 +8,8 @@ from sqlalchemy.orm import mapped_column, Mapped, relationship import sqlalchemy as sa from pydantic import BaseModel, ConfigDict -from materia.models.base import Base -from materia.core import SessionContext, Config +from materia_server.models.base import Base +from materia_server.core import SessionContext, Config class RepositoryError(Exception): @@ -126,6 +126,6 @@ class RepositoryContent(BaseModel): directories: list["DirectoryInfo"] -from materia.models.user import User -from materia.models.directory import Directory, DirectoryInfo -from materia.models.file import File, FileInfo +from materia_server.models.user import User +from materia_server.models.directory import Directory, DirectoryInfo +from materia_server.models.file import File, FileInfo diff --git a/src/materia/models/user.py b/packages/server/src/materia_server/models/user.py similarity index 96% rename from src/materia/models/user.py rename to packages/server/src/materia_server/models/user.py index 934ea11..43137c8 100644 --- a/src/materia/models/user.py +++ b/packages/server/src/materia_server/models/user.py @@ -11,10 +11,10 @@ from PIL import Image from sqids.sqids import Sqids from aiofiles import os as async_os -from materia import security -from materia.models.base import Base -from materia.models.auth.source import LoginType -from materia.core import SessionContext, Config, FileSystem +from materia_server import security +from materia_server.models.base import Base +from materia_server.models.auth.source import LoginType +from materia_server.core import SessionContext, Config, FileSystem valid_username = re.compile(r"^[\da-zA-Z][-.\w]*$") invalid_username = re.compile(r"[-._]{2,}|[-._]$") @@ -222,4 +222,4 @@ class UserInfo(BaseModel): avatar: Optional[str] -from materia.models.repository import Repository +from materia_server.models.repository import Repository diff --git a/packages/server/src/materia_server/routers/__init__.py b/packages/server/src/materia_server/routers/__init__.py new file mode 100644 index 0000000..1d11510 --- /dev/null +++ b/packages/server/src/materia_server/routers/__init__.py @@ -0,0 +1 @@ +from materia_server.routers import middleware, api, client, docs, api_docs diff --git a/src/materia/routers/api/__init__.py b/packages/server/src/materia_server/routers/api/__init__.py similarity index 72% rename from src/materia/routers/api/__init__.py rename to packages/server/src/materia_server/routers/api/__init__.py index 6581b92..4820e9f 100644 --- a/src/materia/routers/api/__init__.py +++ b/packages/server/src/materia_server/routers/api/__init__.py @@ -1,6 +1,6 @@ from fastapi import APIRouter, HTTPException -from materia.routers.api.auth import auth, oauth -from materia.routers.api import docs, user, repository, directory, file +from materia_server.routers.api.auth import auth, oauth +from materia_server.routers.api import docs, user, repository, directory, file, avatar router = APIRouter(prefix="/api") router.include_router(docs.router) @@ -10,6 +10,7 @@ router.include_router(user.router) router.include_router(repository.router) router.include_router(directory.router) router.include_router(file.router) +router.include_router(avatar.router) @router.get("/api/{catchall:path}", status_code=404, include_in_schema=False) diff --git a/src/materia/routers/api/auth/__init__.py b/packages/server/src/materia_server/routers/api/auth/__init__.py similarity index 100% rename from src/materia/routers/api/auth/__init__.py rename to packages/server/src/materia_server/routers/api/auth/__init__.py diff --git a/src/materia/routers/api/auth/auth.py b/packages/server/src/materia_server/routers/api/auth/auth.py similarity index 95% rename from src/materia/routers/api/auth/auth.py rename to packages/server/src/materia_server/routers/api/auth/auth.py index 50bdeae..c8d9638 100644 --- a/src/materia/routers/api/auth/auth.py +++ b/packages/server/src/materia_server/routers/api/auth/auth.py @@ -1,9 +1,9 @@ from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Response, status -from materia import security -from materia.routers.middleware import Context -from materia.models import LoginType, User, UserCredentials +from materia_server import security +from materia_server.routers.middleware import Context +from materia_server.models import LoginType, User, UserCredentials router = APIRouter(tags=["auth"]) diff --git a/src/materia/routers/api/auth/oauth.py b/packages/server/src/materia_server/routers/api/auth/oauth.py similarity index 96% rename from src/materia/routers/api/auth/oauth.py rename to packages/server/src/materia_server/routers/api/auth/oauth.py index 2352281..c8419b2 100644 --- a/src/materia/routers/api/auth/oauth.py +++ b/packages/server/src/materia_server/routers/api/auth/oauth.py @@ -7,8 +7,8 @@ from fastapi.security.oauth2 import OAuth2PasswordRequestForm from pydantic import BaseModel, HttpUrl from starlette.status import HTTP_500_INTERNAL_SERVER_ERROR -from materia.models import User -from materia.routers.middleware import Context +from materia_server.models import User +from materia_server.routers.middleware import Context router = APIRouter(tags = ["oauth2"]) diff --git a/src/materia/routers/resources.py b/packages/server/src/materia_server/routers/api/avatar.py similarity index 53% rename from src/materia/routers/resources.py rename to packages/server/src/materia_server/routers/api/avatar.py index c1ab8fc..cbe73ab 100644 --- a/src/materia/routers/resources.py +++ b/packages/server/src/materia_server/routers/api/avatar.py @@ -1,16 +1,14 @@ from fastapi import APIRouter, Depends, HTTPException, status, Response from PIL import Image import io -from pathlib import Path -import mimetypes -from materia.routers import middleware -from materia.core import Config +from materia_server.routers import middleware +from materia_server.core import Config -router = APIRouter(tags=["resources"], prefix="/resources") +router = APIRouter(tags=["avatar"], prefix="/avatar") -@router.get("/avatars/{avatar_id}") +@router.get("/{avatar_id}") async def avatar( avatar_id: str, format: str = "png", ctx: middleware.Context = Depends() ): @@ -37,24 +35,3 @@ async def avatar( ) return Response(content=buffer.getvalue(), media_type=Image.MIME[format]) - - -try: - import materia_frontend -except ModuleNotFoundError: - pass -else: - - @router.get("/assets/{filename}") - async def assets(filename: str): - path = Path(materia_frontend.__path__[0]).joinpath( - "dist", "resources", "assets", filename - ) - - if not path.exists(): - return Response(status_code=status.HTTP_404_NOT_FOUND) - - content = path.read_bytes() - mime = mimetypes.guess_type(path)[0] - - return Response(content, media_type=mime) diff --git a/src/materia/routers/api/directory.py b/packages/server/src/materia_server/routers/api/directory.py similarity index 97% rename from src/materia/routers/api/directory.py rename to packages/server/src/materia_server/routers/api/directory.py index 4049f5c..1d64f78 100644 --- a/src/materia/routers/api/directory.py +++ b/packages/server/src/materia_server/routers/api/directory.py @@ -1,6 +1,6 @@ from pathlib import Path from fastapi import APIRouter, Depends, HTTPException, status -from materia.models import ( +from materia_server.models import ( User, Directory, DirectoryInfo, @@ -10,8 +10,8 @@ from materia.models import ( DirectoryCopyMove, Repository, ) -from materia.core import SessionContext, Config, FileSystem -from materia.routers import middleware +from materia_server.core import SessionContext, Config, FileSystem +from materia_server.routers import middleware router = APIRouter(tags=["directory"]) diff --git a/src/materia/routers/api/docs.py b/packages/server/src/materia_server/routers/api/docs.py similarity index 100% rename from src/materia/routers/api/docs.py rename to packages/server/src/materia_server/routers/api/docs.py diff --git a/src/materia/routers/api/file.py b/packages/server/src/materia_server/routers/api/file.py similarity index 96% rename from src/materia/routers/api/file.py rename to packages/server/src/materia_server/routers/api/file.py index dd1df10..f97e348 100644 --- a/src/materia/routers/api/file.py +++ b/packages/server/src/materia_server/routers/api/file.py @@ -11,7 +11,7 @@ from fastapi import ( Form, ) from fastapi.responses import JSONResponse -from materia.models import ( +from materia_server.models import ( User, File, FileInfo, @@ -20,20 +20,20 @@ from materia.models import ( FileRename, FileCopyMove, ) -from materia.core import ( +from materia_server.core import ( SessionContext, Config, FileSystem, TemporaryFileTarget, Database, ) -from materia.routers import middleware -from materia.routers.api.directory import validate_target_directory +from materia_server.routers import middleware +from materia_server.routers.api.directory import validate_target_directory from streaming_form_data import StreamingFormDataParser from streaming_form_data.targets import ValueTarget from starlette.requests import ClientDisconnect from aiofiles import ospath as async_path -from materia.tasks import remove_cache_file +from materia_server.tasks import remove_cache_file router = APIRouter(tags=["file"]) diff --git a/src/materia/routers/api/repository.py b/packages/server/src/materia_server/routers/api/repository.py similarity index 96% rename from src/materia/routers/api/repository.py rename to packages/server/src/materia_server/routers/api/repository.py index 120c647..a3fe814 100644 --- a/src/materia/routers/api/repository.py +++ b/packages/server/src/materia_server/routers/api/repository.py @@ -1,5 +1,5 @@ from fastapi import APIRouter, Depends, HTTPException, status -from materia.models import ( +from materia_server.models import ( User, Repository, RepositoryInfo, @@ -7,7 +7,7 @@ from materia.models import ( FileInfo, DirectoryInfo, ) -from materia.routers import middleware +from materia_server.routers import middleware router = APIRouter(tags=["repository"]) diff --git a/src/materia/routers/api/tasks.py b/packages/server/src/materia_server/routers/api/tasks.py similarity index 100% rename from src/materia/routers/api/tasks.py rename to packages/server/src/materia_server/routers/api/tasks.py diff --git a/src/materia/routers/api/user.py b/packages/server/src/materia_server/routers/api/user.py similarity index 95% rename from src/materia/routers/api/user.py rename to packages/server/src/materia_server/routers/api/user.py index 2e913ac..94bddba 100644 --- a/src/materia/routers/api/user.py +++ b/packages/server/src/materia_server/routers/api/user.py @@ -1,8 +1,8 @@ import uuid import io from fastapi import APIRouter, Depends, HTTPException, status, UploadFile -from materia.models import User, UserInfo -from materia.routers import middleware +from materia_server.models import User, UserInfo +from materia_server.routers import middleware router = APIRouter(tags=["user"]) diff --git a/packages/server/src/materia_server/routers/api_docs.py b/packages/server/src/materia_server/routers/api_docs.py new file mode 100644 index 0000000..2c1a745 --- /dev/null +++ b/packages/server/src/materia_server/routers/api_docs.py @@ -0,0 +1,40 @@ +from fastapi import APIRouter, Request +from fastapi.responses import HTMLResponse + +router = APIRouter() + + +@router.get("/api/docs", response_class=HTMLResponse, include_in_schema=False) +async def rapidoc(request: Request): + return f""" + + + + + + + + + + + + + + """ diff --git a/packages/server/src/materia_server/routers/client.py b/packages/server/src/materia_server/routers/client.py new file mode 100644 index 0000000..791e400 --- /dev/null +++ b/packages/server/src/materia_server/routers/client.py @@ -0,0 +1,33 @@ +from pathlib import Path +from fastapi import APIRouter, Request, Response, status +from fastapi.responses import HTMLResponse +from fastapi.templating import Jinja2Templates +import mimetypes + +router = APIRouter() + +try: + import materia_frontend +except ModuleNotFoundError: + pass +else: + + templates = Jinja2Templates( + directory=Path(materia_frontend.__path__[0], "templates") + ) + + @router.get("/assets/{filename}") + async def assets(filename: str, include_in_schema=False): + path = Path(materia_frontend.__path__[0]).joinpath("assets", filename) + + if not path.exists(): + return Response(status_code=status.HTTP_404_NOT_FOUND) + + content = path.read_bytes() + mime = mimetypes.guess_type(path)[0] + + return Response(content, media_type=mime) + + @router.get("/{spa:path}", response_class=HTMLResponse, include_in_schema=False) + async def root(request: Request): + return templates.TemplateResponse(request, "base.html", {"view": "app"}) diff --git a/src/materia/routers/docs.py b/packages/server/src/materia_server/routers/docs.py similarity index 87% rename from src/materia/routers/docs.py rename to packages/server/src/materia_server/routers/docs.py index 0ff2d07..241baf0 100644 --- a/src/materia/routers/docs.py +++ b/packages/server/src/materia_server/routers/docs.py @@ -1,16 +1,16 @@ from fastapi import APIRouter, Request, status, HTTPException, Depends from fastapi.responses import FileResponse, RedirectResponse from pathlib import Path -from materia.core.misc import optional -from materia.routers import middleware +from materia_server.core.misc import optional +from materia_server.routers import middleware router = APIRouter() try: - from materia import docs as materia_docs -except ImportError: + import materia_docs +except ModuleNotFoundError: pass else: diff --git a/src/materia/routers/middleware.py b/packages/server/src/materia_server/routers/middleware.py similarity index 97% rename from src/materia/routers/middleware.py rename to packages/server/src/materia_server/routers/middleware.py index 0bafce7..423e178 100644 --- a/src/materia/routers/middleware.py +++ b/packages/server/src/materia_server/routers/middleware.py @@ -18,8 +18,8 @@ from fastapi.security import ( APIKeyHeader, ) -from materia import security -from materia.models import User, Repository +from materia_server import security +from materia_server.models import User, Repository class Context: diff --git a/packages/server/src/materia_server/security/__init__.py b/packages/server/src/materia_server/security/__init__.py new file mode 100644 index 0000000..9561e07 --- /dev/null +++ b/packages/server/src/materia_server/security/__init__.py @@ -0,0 +1,3 @@ +from materia_server.security.secret_key import generate_key, encrypt_payload +from materia_server.security.token import TokenClaims, generate_token, validate_token +from materia_server.security.password import hash_password, validate_password diff --git a/src/materia/security/password.py b/packages/server/src/materia_server/security/password.py similarity index 100% rename from src/materia/security/password.py rename to packages/server/src/materia_server/security/password.py diff --git a/src/materia/security/secret_key.py b/packages/server/src/materia_server/security/secret_key.py similarity index 100% rename from src/materia/security/secret_key.py rename to packages/server/src/materia_server/security/secret_key.py diff --git a/src/materia/security/token.py b/packages/server/src/materia_server/security/token.py similarity index 100% rename from src/materia/security/token.py rename to packages/server/src/materia_server/security/token.py diff --git a/packages/server/src/materia_server/tasks/__init__.py b/packages/server/src/materia_server/tasks/__init__.py new file mode 100644 index 0000000..81bb3ac --- /dev/null +++ b/packages/server/src/materia_server/tasks/__init__.py @@ -0,0 +1 @@ +from materia_server.tasks.file import remove_cache_file diff --git a/src/materia/tasks/file.py b/packages/server/src/materia_server/tasks/file.py similarity index 67% rename from src/materia/tasks/file.py rename to packages/server/src/materia_server/tasks/file.py index 855c1ac..e5f6152 100644 --- a/src/materia/tasks/file.py +++ b/packages/server/src/materia_server/tasks/file.py @@ -1,10 +1,10 @@ -from materia.core import Cron, CronError, SessionContext, Config, Database +from materia_server.core import Cron, CronError, SessionContext, Config, Database from celery import shared_task from fastapi import UploadFile -from materia.models import File +from materia_server.models import File import asyncio from pathlib import Path -from materia.core import FileSystem, Config +from materia_server.core import FileSystem, Config @shared_task(name="remove_cache_file") diff --git a/tests/__init__.py b/packages/server/tests/__init__.py similarity index 100% rename from tests/__init__.py rename to packages/server/tests/__init__.py diff --git a/tests/conftest.py b/packages/server/tests/conftest.py similarity index 95% rename from tests/conftest.py rename to packages/server/tests/conftest.py index 958269f..6b4fd1e 100644 --- a/tests/conftest.py +++ b/packages/server/tests/conftest.py @@ -1,12 +1,12 @@ import pytest_asyncio -from materia.models import ( +from materia_server.models import ( User, LoginType, ) -from materia.models.base import Base -from materia import security -from materia.app import Application -from materia.core import Config, Database, Cache, Cron +from materia_server.models.base import Base +from materia_server import security +from materia_server.app import Application +from materia_server.core import Config, Database, Cache, Cron import sqlalchemy as sa from sqlalchemy.pool import NullPool from httpx import AsyncClient, ASGITransport, Cookies diff --git a/tests/test_api.py b/packages/server/tests/test_api.py similarity index 99% rename from tests/test_api.py rename to packages/server/tests/test_api.py index 5d9b123..7e98121 100644 --- a/tests/test_api.py +++ b/packages/server/tests/test_api.py @@ -1,5 +1,5 @@ import pytest -from materia.core import Config +from materia_server.core import Config from httpx import AsyncClient, Cookies from io import BytesIO diff --git a/tests/test_models.py b/packages/server/tests/test_models.py similarity index 98% rename from tests/test_models.py rename to packages/server/tests/test_models.py index 49506ff..66ce759 100644 --- a/tests/test_models.py +++ b/packages/server/tests/test_models.py @@ -1,15 +1,15 @@ import pytest_asyncio import pytest from pathlib import Path -from materia.models import ( +from materia_server.models import ( User, Repository, Directory, RepositoryError, File, ) -from materia.core import Config, SessionContext -from materia import security +from materia_server.core import Config, SessionContext +from materia_server import security import sqlalchemy as sa from sqlalchemy.orm.session import make_transient from sqlalchemy import inspect diff --git a/pdm.lock b/pdm.lock index 5961fb2..f193b31 100644 --- a/pdm.lock +++ b/pdm.lock @@ -2,17 +2,17 @@ # It is not intended for manual editing. [metadata] -groups = ["default", "dev", "docs", "frontend", "all"] +groups = ["default", "dev"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.1" -content_hash = "sha256:cbe47c7d41447213b355757ddb6784989a2213768127cf60c101063c01311bbd" +content_hash = "sha256:35390d89cb9634c9c23ef2ce4275c2ece6e0ef94450ae6c4f6c65a5fabf630d5" [[package]] name = "aiofiles" version = "24.1.0" requires_python = ">=3.8" summary = "File support for asyncio." -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"}, {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"}, @@ -23,7 +23,7 @@ name = "aioshutil" version = "1.5" requires_python = ">=3.8" summary = "Asynchronous shutil module." -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "aioshutil-1.5-py3-none-any.whl", hash = "sha256:bc2a6cdcf1a8615b62f856154fd81131031d03f2834912ebb06d8a2391253652"}, {file = "aioshutil-1.5.tar.gz", hash = "sha256:2756d6cd3bb03405dc7348ac11a0b60eb949ebd63cdd15f56e922410231c1201"}, @@ -34,7 +34,7 @@ name = "aiosmtplib" version = "3.0.2" requires_python = ">=3.8" summary = "asyncio SMTP client" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "aiosmtplib-3.0.2-py3-none-any.whl", hash = "sha256:8783059603a34834c7c90ca51103c3aa129d5922003b5ce98dbaa6d4440f10fc"}, {file = "aiosmtplib-3.0.2.tar.gz", hash = "sha256:08fd840f9dbc23258025dca229e8a8f04d2ccf3ecb1319585615bfc7933f7f47"}, @@ -45,7 +45,7 @@ name = "alembic" version = "1.13.3" requires_python = ">=3.8" summary = "A database migration tool for SQLAlchemy." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "Mako", "SQLAlchemy>=1.3.0", @@ -61,7 +61,7 @@ name = "alembic-postgresql-enum" version = "1.3.0" requires_python = "<4.0,>=3.7" summary = "Alembic autogenerate support for creation, alteration and deletion of enums" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "SQLAlchemy>=1.4", "alembic>=1.7", @@ -76,7 +76,7 @@ name = "amqp" version = "5.2.0" requires_python = ">=3.6" summary = "Low-level AMQP client for Python (fork of amqplib)." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "vine<6.0.0,>=5.0.0", ] @@ -90,7 +90,7 @@ name = "annotated-types" version = "0.6.0" requires_python = ">=3.8" summary = "Reusable constraint types to use with typing.Annotated" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, @@ -98,31 +98,17 @@ files = [ [[package]] name = "anyio" -version = "4.4.0" -requires_python = ">=3.8" +version = "4.6.0" +requires_python = ">=3.9" summary = "High level compatibility layer for multiple asynchronous event loop implementations" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "idna>=2.8", "sniffio>=1.1", ] files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, -] - -[[package]] -name = "asgi-lifespan" -version = "2.1.0" -requires_python = ">=3.7" -summary = "Programmatic startup/shutdown of ASGI apps." -groups = ["dev"] -dependencies = [ - "sniffio", -] -files = [ - {file = "asgi-lifespan-2.1.0.tar.gz", hash = "sha256:5e2effaf0bfe39829cf2d64e7ecc47c7d86d676a6599f7afba378c31f5e3a308"}, - {file = "asgi_lifespan-2.1.0-py3-none-any.whl", hash = "sha256:ed840706680e28428c01e14afb3875d7d76d3206f3d5b2f2294e059b5c23804f"}, + {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, + {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, ] [[package]] @@ -130,7 +116,7 @@ name = "asyncpg" version = "0.29.0" requires_python = ">=3.8.0" summary = "An asyncio PostgreSQL driver" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "asyncpg-0.29.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6011b0dc29886ab424dc042bf9eeb507670a3b40aece3439944006aafe023178"}, {file = "asyncpg-0.29.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b544ffc66b039d5ec5a7454667f855f7fec08e0dfaf5a5490dfafbb7abbd2cfb"}, @@ -148,7 +134,7 @@ name = "authlib" version = "1.3.2" requires_python = ">=3.8" summary = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "cryptography", ] @@ -162,7 +148,7 @@ name = "babel" version = "2.16.0" requires_python = ">=3.8" summary = "Internationalization utilities" -groups = ["docs"] +groups = ["dev"] files = [ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, @@ -173,7 +159,7 @@ name = "bcrypt" version = "4.1.2" requires_python = ">=3.7" summary = "Modern password hashing for your software and your servers" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "bcrypt-4.1.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:ac621c093edb28200728a9cca214d7e838529e557027ef0581685909acd28b5e"}, {file = "bcrypt-4.1.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea505c97a5c465ab8c3ba75c0805a102ce526695cd6818c6de3b1a38f6f60da1"}, @@ -206,13 +192,13 @@ files = [ [[package]] name = "billiard" -version = "4.2.0" +version = "4.2.1" requires_python = ">=3.7" summary = "Python multiprocessing fork with improvements and bugfixes" -groups = ["all", "default"] +groups = ["dev"] files = [ - {file = "billiard-4.2.0-py3-none-any.whl", hash = "sha256:07aa978b308f334ff8282bd4a746e681b3513db5c9a514cbdd810cbbdc19714d"}, - {file = "billiard-4.2.0.tar.gz", hash = "sha256:9a3c3184cb275aa17a732f93f65b20c525d3d9f253722d26a82194803ade5a2c"}, + {file = "billiard-4.2.1-py3-none-any.whl", hash = "sha256:40b59a4ac8806ba2c2369ea98d876bc6108b051c227baffd928c644d15d8f3cb"}, + {file = "billiard-4.2.1.tar.gz", hash = "sha256:12b641b0c539073fc8d3f5b8b7be998956665c4233c7c1fcd66a7e677c4fb36f"}, ] [[package]] @@ -239,13 +225,13 @@ files = [ [[package]] name = "cachetools" -version = "5.4.0" +version = "5.5.0" requires_python = ">=3.7" summary = "Extensible memoizing collections and decorators" -groups = ["all", "default"] +groups = ["dev"] files = [ - {file = "cachetools-5.4.0-py3-none-any.whl", hash = "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474"}, - {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"}, + {file = "cachetools-5.5.0-py3-none-any.whl", hash = "sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292"}, + {file = "cachetools-5.5.0.tar.gz", hash = "sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a"}, ] [[package]] @@ -253,7 +239,7 @@ name = "celery" version = "5.4.0" requires_python = ">=3.8" summary = "Distributed Task Queue." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "billiard<5.0,>=4.2.0", "click-didyoumean>=0.3.0", @@ -272,37 +258,38 @@ files = [ [[package]] name = "certifi" -version = "2024.7.4" +version = "2024.8.30" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." -groups = ["all", "default", "docs"] +groups = ["dev"] 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.16.0" +version = "1.17.1" requires_python = ">=3.8" summary = "Foreign Function Interface for Python calling C code." -groups = ["all", "default"] +groups = ["dev"] marker = "platform_python_implementation != \"PyPy\"" dependencies = [ "pycparser", ] files = [ - {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.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {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.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [[package]] @@ -310,7 +297,7 @@ name = "chardet" version = "5.2.0" requires_python = ">=3.7" summary = "Universal encoding detector for Python 3" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, @@ -321,7 +308,7 @@ name = "charset-normalizer" version = "3.3.2" requires_python = ">=3.7.0" summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -groups = ["all", "default", "docs"] +groups = ["dev"] files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, @@ -347,7 +334,7 @@ name = "click" version = "8.1.7" requires_python = ">=3.7" summary = "Composable command line interface toolkit" -groups = ["all", "default", "dev", "docs"] +groups = ["dev"] dependencies = [ "colorama; platform_system == \"Windows\"", ] @@ -361,7 +348,7 @@ name = "click-didyoumean" version = "0.3.1" requires_python = ">=3.6.2" summary = "Enables git-like *did-you-mean* feature in click" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "click>=7", ] @@ -374,7 +361,7 @@ files = [ name = "click-plugins" version = "1.1.1" summary = "An extension module for click to enable registering CLI commands via setuptools entry-points." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "click>=4.0", ] @@ -388,7 +375,7 @@ name = "click-repl" version = "0.3.0" requires_python = ">=3.6" summary = "REPL plugin for Click" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "click>=7.0", "prompt-toolkit>=3.0.36", @@ -403,64 +390,18 @@ name = "colorama" version = "0.4.6" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" summary = "Cross-platform colored terminal text." -groups = ["all", "default", "dev", "docs", "frontend"] +groups = ["dev"] 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.6.1" -requires_python = ">=3.8" -summary = "Code coverage measurement for Python" -groups = ["dev"] -files = [ - {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-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, -] - -[[package]] -name = "coverage" -version = "7.6.1" -extras = ["toml"] -requires_python = ">=3.8" -summary = "Code coverage measurement for Python" -groups = ["dev"] -dependencies = [ - "coverage==7.6.1", -] -files = [ - {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-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, -] - [[package]] name = "cryptography" version = "43.0.1" requires_python = ">=3.7" summary = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "cffi>=1.12; platform_python_implementation != \"PyPy\"", ] @@ -499,7 +440,7 @@ name = "cssselect" version = "1.2.0" requires_python = ">=3.7" summary = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, @@ -510,7 +451,7 @@ name = "cssutils" version = "2.11.1" requires_python = ">=3.8" summary = "A CSS Cascading Style Sheets library for Python" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "more-itertools", ] @@ -521,13 +462,13 @@ files = [ [[package]] name = "dnspython" -version = "2.6.1" -requires_python = ">=3.8" +version = "2.7.0" +requires_python = ">=3.9" summary = "DNS toolkit" -groups = ["all", "default"] +groups = ["dev"] files = [ - {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, - {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, + {file = "dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86"}, + {file = "dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1"}, ] [[package]] @@ -535,7 +476,7 @@ name = "email-validator" version = "2.2.0" requires_python = ">=3.8" summary = "A robust email address syntax and deliverability validation library." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "dnspython>=2.0.0", "idna>=2.0.0", @@ -549,7 +490,7 @@ files = [ name = "emails" version = "0.6" summary = "Modern python library for emails." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "chardet", "cssutils", @@ -568,7 +509,7 @@ name = "eventlet" version = "0.37.0" requires_python = ">=3.7" summary = "Highly concurrent networking library" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "dnspython>=1.15.0", "greenlet>=1.0", @@ -583,7 +524,7 @@ name = "fastapi" version = "0.115.0" requires_python = ">=3.8" summary = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4", "starlette<0.39.0,>=0.37.2", @@ -598,7 +539,7 @@ files = [ name = "ghp-import" version = "2.1.0" summary = "Copy your docs directly to the gh-pages branch." -groups = ["docs"] +groups = ["dev"] dependencies = [ "python-dateutil>=2.8.1", ] @@ -609,35 +550,35 @@ files = [ [[package]] name = "greenlet" -version = "3.0.3" +version = "3.1.1" requires_python = ">=3.7" summary = "Lightweight in-process concurrent programming" -groups = ["all", "default"] +groups = ["dev"] files = [ - {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, - {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, - {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, - {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, - {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, ] [[package]] name = "griffe" -version = "1.2.0" +version = "1.3.2" requires_python = ">=3.8" summary = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." -groups = ["docs"] +groups = ["dev"] dependencies = [ "colorama>=0.4", ] files = [ - {file = "griffe-1.2.0-py3-none-any.whl", hash = "sha256:a8b2fcb1ecdc5a412e646b0b4375eb20a5d2eac3a11dd8c10c56967a4097663c"}, - {file = "griffe-1.2.0.tar.gz", hash = "sha256:1c9f6ef7455930f3f9b0c4145a961c90385d1e2cbc496f7796fbff560ec60d31"}, + {file = "griffe-1.3.2-py3-none-any.whl", hash = "sha256:2e34b5e46507d615915c8e6288bb1a2234bd35dee44d01e40a2bc2f25bd4d10c"}, + {file = "griffe-1.3.2.tar.gz", hash = "sha256:1ec50335aa507ed2445f2dd45a15c9fa3a45f52c9527e880571dfc61912fd60c"}, ] [[package]] @@ -645,7 +586,7 @@ name = "griffe-typingdoc" version = "0.2.7" requires_python = ">=3.8" summary = "Griffe extension for PEP 727 – Documentation Metadata in Typing." -groups = ["docs"] +groups = ["dev"] dependencies = [ "griffe>=0.49", "typing-extensions>=4.7", @@ -660,7 +601,7 @@ name = "gunicorn" version = "23.0.0" requires_python = ">=3.7" summary = "WSGI HTTP Server for UNIX" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "packaging", ] @@ -674,7 +615,7 @@ name = "h11" version = "0.14.0" requires_python = ">=3.7" summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -685,7 +626,7 @@ name = "hiredis" version = "3.0.0" requires_python = ">=3.8" summary = "Python wrapper for hiredis" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "hiredis-3.0.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:484025d2eb8f6348f7876fc5a2ee742f568915039fcb31b478fd5c242bb0fe3a"}, {file = "hiredis-3.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:fcdb552ffd97151dab8e7bc3ab556dfa1512556b48a367db94b5c20253a35ee1"}, @@ -725,17 +666,17 @@ files = [ [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.6" requires_python = ">=3.8" summary = "A minimal low-level HTTP client." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "certifi", "h11<0.15,>=0.13", ] files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, ] [[package]] @@ -743,7 +684,7 @@ name = "httptools" version = "0.6.1" requires_python = ">=3.8.0" summary = "A collection of framework independent HTTP protocol utils." -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, @@ -760,7 +701,7 @@ name = "httpx" version = "0.27.2" requires_python = ">=3.8" summary = "The next generation HTTP client." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "anyio", "certifi", @@ -775,24 +716,13 @@ files = [ [[package]] name = "idna" -version = "3.7" -requires_python = ">=3.5" +version = "3.10" +requires_python = ">=3.6" summary = "Internationalized Domain Names in Applications (IDNA)" -groups = ["all", "default", "docs"] -files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -requires_python = ">=3.7" -summary = "brain-dead simple config-ini parsing" groups = ["dev"] files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] [[package]] @@ -800,7 +730,7 @@ name = "jinja2" version = "3.1.4" requires_python = ">=3.7" summary = "A very fast and expressive template engine." -groups = ["all", "default", "docs"] +groups = ["dev"] dependencies = [ "MarkupSafe>=2.0", ] @@ -811,17 +741,18 @@ files = [ [[package]] name = "kombu" -version = "5.4.0" +version = "5.4.2" requires_python = ">=3.8" summary = "Messaging library for Python." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "amqp<6.0.0,>=5.1.1", + "tzdata; python_version >= \"3.9\"", "vine==5.1.0", ] files = [ - {file = "kombu-5.4.0-py3-none-any.whl", hash = "sha256:c8dd99820467610b4febbc7a9e8a0d3d7da2d35116b67184418b51cc520ea6b6"}, - {file = "kombu-5.4.0.tar.gz", hash = "sha256:ad200a8dbdaaa2bbc5f26d2ee7d707d9a1fded353a0f4bd751ce8c7d9f449c60"}, + {file = "kombu-5.4.2-py3-none-any.whl", hash = "sha256:14212f5ccf022fc0a70453bb025a1dcc32782a588c49ea866884047d66e14763"}, + {file = "kombu-5.4.2.tar.gz", hash = "sha256:eef572dd2fd9fc614b37580e3caeafdd5af46c1eff31e7fba89138cdb406f2cf"}, ] [[package]] @@ -829,7 +760,7 @@ name = "loguru" version = "0.7.2" requires_python = ">=3.5" summary = "Python logging made (stupidly) simple" -groups = ["all", "default", "dev", "frontend"] +groups = ["dev"] dependencies = [ "colorama>=0.3.4; sys_platform == \"win32\"", "win32-setctime>=1.0.0; sys_platform == \"win32\"", @@ -841,57 +772,53 @@ files = [ [[package]] name = "lxml" -version = "5.2.2" +version = "5.3.0" requires_python = ">=3.6" summary = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -groups = ["all", "default"] +groups = ["dev"] files = [ - {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, - {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, - {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, - {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, - {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859"}, + {file = "lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c"}, + {file = "lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8"}, + {file = "lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d"}, + {file = "lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30"}, + {file = "lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83"}, + {file = "lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:94d6c3782907b5e40e21cadf94b13b0842ac421192f26b84c45f13f3c9d5dc27"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c300306673aa0f3ed5ed9372b21867690a17dba38c68c44b287437c362ce486b"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d9b952e07aed35fe2e1a7ad26e929595412db48535921c5013edc8aa4a35ce"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:01220dca0d066d1349bd6a1726856a78f7929f3878f7e2ee83c296c69495309e"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2d9b8d9177afaef80c53c0a9e30fa252ff3036fb1c6494d427c066a4ce6a282f"}, + {file = "lxml-5.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:20094fc3f21ea0a8669dc4c61ed7fa8263bd37d97d93b90f28fc613371e7a875"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ace2c2326a319a0bb8a8b0e5b570c764962e95818de9f259ce814ee666603f19"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92e67a0be1639c251d21e35fe74df6bcc40cba445c2cda7c4a967656733249e2"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd5350b55f9fecddc51385463a4f67a5da829bc741e38cf689f38ec9023f54ab"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c1fefd7e3d00921c44dc9ca80a775af49698bbfd92ea84498e56acffd4c5469"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:71a8dd38fbd2f2319136d4ae855a7078c69c9a38ae06e0c17c73fd70fc6caad8"}, + {file = "lxml-5.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:97acf1e1fd66ab53dacd2c35b319d7e548380c2e9e8c54525c6e76d21b1ae3b1"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:68934b242c51eb02907c5b81d138cb977b2129a0a75a8f8b60b01cb8586c7b21"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b710bc2b8292966b23a6a0121f7a6c51d45d2347edcc75f016ac123b8054d3f2"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18feb4b93302091b1541221196a2155aa296c363fd233814fa11e181adebc52f"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3eb44520c4724c2e1a57c0af33a379eee41792595023f367ba3952a2d96c2aab"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:609251a0ca4770e5a8768ff902aa02bf636339c5a93f9349b48eb1f606f7f3e9"}, + {file = "lxml-5.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:516f491c834eb320d6c843156440fe7fc0d50b33e44387fcec5b02f0bc118a4c"}, + {file = "lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f"}, ] [[package]] @@ -899,7 +826,7 @@ name = "mako" version = "1.3.5" requires_python = ">=3.8" summary = "A super-fast templating language that borrows the best ideas from the existing templating languages." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "MarkupSafe>=0.9.2", ] @@ -913,7 +840,7 @@ name = "markdown" version = "3.7" requires_python = ">=3.8" summary = "Python implementation of John Gruber's Markdown." -groups = ["docs"] +groups = ["dev"] files = [ {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, @@ -924,7 +851,7 @@ name = "markupsafe" version = "2.1.5" requires_python = ">=3.7" summary = "Safely add untrusted strings to HTML/XML markup." -groups = ["all", "default", "docs"] +groups = ["dev"] files = [ {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, @@ -939,16 +866,72 @@ files = [ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] +[[package]] +name = "materia-docs" +version = "0.1.1" +requires_python = ">=3.12,<3.13" +editable = true +path = "./packages/docs" +summary = "Materia documentation" +groups = ["dev"] +dependencies = [ + "black<24.0.0,>=23.3.0", + "griffe-typingdoc>=0.2.7", + "mkdocs-material>=9.5.38", + "mkdocstrings-python>=1.11.1", + "pymdown-extensions>=10.11", +] + [[package]] name = "materia-frontend" version = "0.1.1" requires_python = ">=3.12,<3.13" editable = true -path = "./workspaces/frontend" +path = "./packages/frontend" summary = "Materia frontend" -groups = ["all", "dev", "frontend"] +groups = ["dev"] + +[[package]] +name = "materia-server" +version = "0.1.1" +requires_python = ">=3.12,<3.13" +editable = true +path = "./packages/server" +summary = "Materia is a simple and fast cloud storage" +groups = ["dev"] dependencies = [ + "Celery>=5.4.0", + "aiofiles>=24.1.0", + "aioshutil>=1.5", + "aiosmtplib<4.0.0,>=3.0.1", + "alembic-postgresql-enum<2.0.0,>=1.2.0", + "alembic<2.0.0,>=1.13.1", + "asyncpg<1.0.0,>=0.29.0", + "authlib<2.0.0,>=1.3.0", + "bcrypt==4.1.2", + "cryptography>=43.0.0", + "email-validator<3.0.0,>=2.1.1", + "emails<1.0,>=0.6", + "eventlet<1.0.0,>=0.36.1", + "fastapi<1.0.0,>=0.111.0", + "gunicorn>=22.0.0", + "httpx>=0.27.0", + "jinja2>=3.1.4", "loguru<1.0.0,>=0.7.2", + "pillow<11.0.0,>=10.3.0", + "psycopg2-binary<3.0.0,>=2.9.9", + "pydanclick<1.0.0,>=0.2.0", + "pydantic-settings<3.0.0,>=2.2.1", + "pyjwt<3.0.0,>=2.8.0", + "python-multipart>=0.0.9", + "redis[hiredis]<6.0.0,>=5.0.4", + "requests<3.0.0,>=2.31.0", + "sqids<1.0.0,>=0.4.1", + "sqlalchemy[asyncio]<3.0.0,>=2.0.30", + "streaming-form-data>=1.16.0", + "toml<1.0.0,>=0.10.2", + "uvicorn-worker>=0.2.0", + "uvicorn[standard]<1.0.0,>=0.29.0", ] [[package]] @@ -956,7 +939,7 @@ name = "mergedeep" version = "1.3.4" requires_python = ">=3.6" summary = "A deep merge function for 🐍." -groups = ["docs"] +groups = ["dev"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -967,7 +950,7 @@ name = "mkdocs" version = "1.6.1" requires_python = ">=3.8" summary = "Project documentation with Markdown." -groups = ["docs"] +groups = ["dev"] dependencies = [ "click>=7.0", "colorama>=0.4; platform_system == \"Windows\"", @@ -993,7 +976,7 @@ name = "mkdocs-autorefs" version = "1.2.0" requires_python = ">=3.8" summary = "Automatically link across pages in MkDocs." -groups = ["docs"] +groups = ["dev"] dependencies = [ "Markdown>=3.3", "markupsafe>=2.0.1", @@ -1009,7 +992,7 @@ name = "mkdocs-get-deps" version = "0.2.0" requires_python = ">=3.8" summary = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" -groups = ["docs"] +groups = ["dev"] dependencies = [ "mergedeep>=1.3.4", "platformdirs>=2.2.0", @@ -1025,7 +1008,7 @@ name = "mkdocs-material" version = "9.5.39" requires_python = ">=3.8" summary = "Documentation that simply works" -groups = ["docs"] +groups = ["dev"] dependencies = [ "babel~=2.10", "colorama~=0.4", @@ -1049,7 +1032,7 @@ name = "mkdocs-material-extensions" version = "1.3.1" requires_python = ">=3.8" summary = "Extension pack for Python Markdown and MkDocs Material." -groups = ["docs"] +groups = ["dev"] files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -1057,10 +1040,10 @@ files = [ [[package]] name = "mkdocstrings" -version = "0.26.0" +version = "0.26.1" requires_python = ">=3.8" summary = "Automatic documentation from sources, for MkDocs." -groups = ["docs"] +groups = ["dev"] dependencies = [ "Jinja2>=2.11.1", "Markdown>=3.6", @@ -1072,8 +1055,8 @@ dependencies = [ "pymdown-extensions>=6.3", ] files = [ - {file = "mkdocstrings-0.26.0-py3-none-any.whl", hash = "sha256:1aa227fe94f88e80737d37514523aacd473fc4b50a7f6852ce41447ab23f2654"}, - {file = "mkdocstrings-0.26.0.tar.gz", hash = "sha256:ff9d0de28c8fa877ed9b29a42fe407cfe6736d70a1c48177aa84fcc3dc8518cd"}, + {file = "mkdocstrings-0.26.1-py3-none-any.whl", hash = "sha256:29738bfb72b4608e8e55cc50fb8a54f325dc7ebd2014e4e3881a49892d5983cf"}, + {file = "mkdocstrings-0.26.1.tar.gz", hash = "sha256:bb8b8854d6713d5348ad05b069a09f3b79edbc6a0f33a34c6821141adb03fe33"}, ] [[package]] @@ -1081,7 +1064,7 @@ name = "mkdocstrings-python" version = "1.11.1" requires_python = ">=3.8" summary = "A Python handler for mkdocstrings." -groups = ["docs"] +groups = ["dev"] dependencies = [ "griffe>=0.49", "mkdocs-autorefs>=1.2", @@ -1094,13 +1077,13 @@ files = [ [[package]] name = "more-itertools" -version = "10.3.0" +version = "10.5.0" requires_python = ">=3.8" summary = "More routines for operating on iterables, beyond itertools" -groups = ["all", "default"] +groups = ["dev"] files = [ - {file = "more-itertools-10.3.0.tar.gz", hash = "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463"}, - {file = "more_itertools-10.3.0-py3-none-any.whl", hash = "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320"}, + {file = "more-itertools-10.5.0.tar.gz", hash = "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6"}, + {file = "more_itertools-10.5.0-py3-none-any.whl", hash = "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef"}, ] [[package]] @@ -1114,23 +1097,12 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] -[[package]] -name = "nodeenv" -version = "1.9.1" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -summary = "Node.js virtual environment builder" -groups = ["dev"] -files = [ - {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, - {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, -] - [[package]] name = "packaging" version = "24.1" requires_python = ">=3.8" summary = "Core utilities for Python packages" -groups = ["all", "default", "dev", "docs"] +groups = ["dev"] files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -1140,7 +1112,7 @@ files = [ name = "paginate" version = "0.5.7" summary = "Divides large result sets into pages for easier browsing" -groups = ["docs"] +groups = ["dev"] files = [ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, @@ -1151,7 +1123,7 @@ name = "pathspec" version = "0.12.1" requires_python = ">=3.8" summary = "Utility library for gitignore style pattern matching of file paths." -groups = ["dev", "docs"] +groups = ["dev"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -1162,7 +1134,7 @@ name = "pillow" version = "10.4.0" requires_python = ">=3.8" summary = "Python Imaging Library (Fork)" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, @@ -1194,31 +1166,20 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" requires_python = ">=3.8" summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -groups = ["dev", "docs"] -files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -requires_python = ">=3.8" -summary = "plugin and hook calling mechanisms for python" groups = ["dev"] files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [[package]] name = "premailer" version = "3.10.0" summary = "Turns CSS blocks into style attributes" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "cachetools", "cssselect", @@ -1233,16 +1194,16 @@ files = [ [[package]] name = "prompt-toolkit" -version = "3.0.47" +version = "3.0.48" requires_python = ">=3.7.0" summary = "Library for building powerful interactive command lines in Python" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "wcwidth", ] files = [ - {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, - {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [[package]] @@ -1250,7 +1211,7 @@ name = "psycopg2-binary" version = "2.9.9" requires_python = ">=3.7" summary = "psycopg2 - Python-PostgreSQL Database Adapter" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, @@ -1272,7 +1233,7 @@ name = "pycparser" version = "2.22" requires_python = ">=3.8" summary = "C parser in Python" -groups = ["all", "default"] +groups = ["dev"] marker = "platform_python_implementation != \"PyPy\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, @@ -1284,7 +1245,7 @@ name = "pydanclick" version = "0.3.0" requires_python = "<4.0,>=3.8" summary = "Use Pydantic models as Click options" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "annotated-types<0.7.0,>=0.6.0", "click<9.0.0,>=8.1.7", @@ -1299,59 +1260,59 @@ files = [ [[package]] name = "pydantic" -version = "2.8.2" +version = "2.9.2" requires_python = ">=3.8" summary = "Data validation using Python type hints" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ - "annotated-types>=0.4.0", - "pydantic-core==2.20.1", + "annotated-types>=0.6.0", + "pydantic-core==2.23.4", "typing-extensions>=4.6.1; python_version < \"3.13\"", ] files = [ - {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, - {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [[package]] name = "pydantic-core" -version = "2.20.1" +version = "2.23.4" requires_python = ">=3.8" summary = "Core functionality for Pydantic validation and serialization" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "typing-extensions!=4.7.0,>=4.6.0", ] files = [ - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, - {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, - {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, - {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [[package]] @@ -1359,7 +1320,7 @@ name = "pydantic-settings" version = "2.5.2" requires_python = ">=3.8" summary = "Settings management using Pydantic" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "pydantic>=2.7.0", "python-dotenv>=0.21.0", @@ -1369,23 +1330,12 @@ files = [ {file = "pydantic_settings-2.5.2.tar.gz", hash = "sha256:f90b139682bee4d2065273d5185d71d37ea46cfe57e1b5ae184fc6a0b2484ca0"}, ] -[[package]] -name = "pyflakes" -version = "3.2.0" -requires_python = ">=3.8" -summary = "passive checker of Python programs" -groups = ["dev"] -files = [ - {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, - {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, -] - [[package]] name = "pygments" version = "2.18.0" requires_python = ">=3.8" summary = "Pygments is a syntax highlighting package written in Python." -groups = ["docs"] +groups = ["dev"] files = [ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, @@ -1396,7 +1346,7 @@ name = "pyjwt" version = "2.9.0" requires_python = ">=3.8" summary = "JSON Web Token implementation in Python" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, @@ -1404,78 +1354,17 @@ files = [ [[package]] name = "pymdown-extensions" -version = "10.11.1" +version = "10.11.2" requires_python = ">=3.8" summary = "Extension pack for Python Markdown." -groups = ["docs"] +groups = ["dev"] dependencies = [ "markdown>=3.6", "pyyaml", ] files = [ - {file = "pymdown_extensions-10.11.1-py3-none-any.whl", hash = "sha256:a2b28f5786e041f19cb5bb30a1c2c853668a7099da8e3dd822a5ad05f2e855e3"}, - {file = "pymdown_extensions-10.11.1.tar.gz", hash = "sha256:a8836e955851542fa2625d04d59fdf97125ca001377478ed5618e04f9183a59a"}, -] - -[[package]] -name = "pyright" -version = "1.1.382.post1" -requires_python = ">=3.7" -summary = "Command line wrapper for pyright" -groups = ["dev"] -dependencies = [ - "nodeenv>=1.6.0", - "typing-extensions>=4.1", -] -files = [ - {file = "pyright-1.1.382.post1-py3-none-any.whl", hash = "sha256:21a4749dd1740e209f88d3a601e9f40748670d39481ea32b9d77edf7f3f1fb2e"}, - {file = "pyright-1.1.382.post1.tar.gz", hash = "sha256:66a5d4e83be9452853d73e9dd9e95ba0ac3061845270e4e331d0070a597d3445"}, -] - -[[package]] -name = "pytest" -version = "7.4.4" -requires_python = ">=3.7" -summary = "pytest: simple powerful testing with Python" -groups = ["dev"] -dependencies = [ - "colorama; sys_platform == \"win32\"", - "iniconfig", - "packaging", - "pluggy<2.0,>=0.12", -] -files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, -] - -[[package]] -name = "pytest-asyncio" -version = "0.23.8" -requires_python = ">=3.8" -summary = "Pytest support for asyncio" -groups = ["dev"] -dependencies = [ - "pytest<9,>=7.0.0", -] -files = [ - {file = "pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2"}, - {file = "pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3"}, -] - -[[package]] -name = "pytest-cov" -version = "5.0.0" -requires_python = ">=3.8" -summary = "Pytest plugin for measuring coverage." -groups = ["dev"] -dependencies = [ - "coverage[toml]>=5.2.1", - "pytest>=4.6", -] -files = [ - {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, - {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, + {file = "pymdown_extensions-10.11.2-py3-none-any.whl", hash = "sha256:41cdde0a77290e480cf53892f5c5e50921a7ee3e5cd60ba91bf19837b33badcf"}, + {file = "pymdown_extensions-10.11.2.tar.gz", hash = "sha256:bc8847ecc9e784a098efd35e20cba772bc5a1b529dfcef9dc1972db9021a1049"}, ] [[package]] @@ -1483,7 +1372,7 @@ name = "python-dateutil" version = "2.9.0.post0" requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" summary = "Extensions to the standard Python datetime module" -groups = ["all", "default", "docs"] +groups = ["dev"] dependencies = [ "six>=1.5", ] @@ -1497,7 +1386,7 @@ name = "python-dotenv" version = "1.0.1" requires_python = ">=3.8" summary = "Read key-value pairs from a .env file and set them as environment variables" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -1508,7 +1397,7 @@ name = "python-multipart" version = "0.0.12" requires_python = ">=3.8" summary = "A streaming multipart parser for Python" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "python_multipart-0.0.12-py3-none-any.whl", hash = "sha256:43dcf96cf65888a9cd3423544dd0d75ac10f7aa0c3c28a175bbcd00c9ce1aebf"}, {file = "python_multipart-0.0.12.tar.gz", hash = "sha256:045e1f98d719c1ce085ed7f7e1ef9d8ccc8c02ba02b5566d5f7521410ced58cb"}, @@ -1516,19 +1405,21 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.1" -requires_python = ">=3.6" +version = "6.0.2" +requires_python = ">=3.8" summary = "YAML parser and emitter for Python" -groups = ["all", "default", "docs"] +groups = ["dev"] files = [ - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -1536,7 +1427,7 @@ name = "pyyaml-env-tag" version = "0.1" requires_python = ">=3.6" summary = "A custom YAML tag for referencing environment variables in YAML files. " -groups = ["docs"] +groups = ["dev"] dependencies = [ "pyyaml", ] @@ -1547,54 +1438,54 @@ files = [ [[package]] name = "redis" -version = "5.1.0" +version = "5.1.1" requires_python = ">=3.8" summary = "Python client for Redis database and key-value store" -groups = ["all", "default"] +groups = ["dev"] files = [ - {file = "redis-5.1.0-py3-none-any.whl", hash = "sha256:fd4fccba0d7f6aa48c58a78d76ddb4afc698f5da4a2c1d03d916e4fd7ab88cdd"}, - {file = "redis-5.1.0.tar.gz", hash = "sha256:b756df1e4a3858fcc0ef861f3fc53623a96c41e2b1f5304e09e0fe758d333d40"}, + {file = "redis-5.1.1-py3-none-any.whl", hash = "sha256:f8ea06b7482a668c6475ae202ed8d9bcaa409f6e87fb77ed1043d912afd62e24"}, + {file = "redis-5.1.1.tar.gz", hash = "sha256:f6c997521fedbae53387307c5d0bf784d9acc28d9f1d058abeac566ec4dbed72"}, ] [[package]] name = "redis" -version = "5.1.0" +version = "5.1.1" extras = ["hiredis"] requires_python = ">=3.8" summary = "Python client for Redis database and key-value store" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "hiredis>=3.0.0", - "redis==5.1.0", + "redis==5.1.1", ] files = [ - {file = "redis-5.1.0-py3-none-any.whl", hash = "sha256:fd4fccba0d7f6aa48c58a78d76ddb4afc698f5da4a2c1d03d916e4fd7ab88cdd"}, - {file = "redis-5.1.0.tar.gz", hash = "sha256:b756df1e4a3858fcc0ef861f3fc53623a96c41e2b1f5304e09e0fe758d333d40"}, + {file = "redis-5.1.1-py3-none-any.whl", hash = "sha256:f8ea06b7482a668c6475ae202ed8d9bcaa409f6e87fb77ed1043d912afd62e24"}, + {file = "redis-5.1.1.tar.gz", hash = "sha256:f6c997521fedbae53387307c5d0bf784d9acc28d9f1d058abeac566ec4dbed72"}, ] [[package]] name = "regex" -version = "2024.7.24" +version = "2024.9.11" requires_python = ">=3.8" summary = "Alternative regular expression module, to replace re." -groups = ["docs"] +groups = ["dev"] files = [ - {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, - {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, - {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, - {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, + {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, + {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, + {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, ] [[package]] @@ -1602,7 +1493,7 @@ name = "requests" version = "2.32.3" requires_python = ">=3.8" summary = "Python HTTP for Humans." -groups = ["all", "default", "docs"] +groups = ["dev"] dependencies = [ "certifi>=2017.4.17", "charset-normalizer<4,>=2", @@ -1619,7 +1510,7 @@ name = "six" version = "1.16.0" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" summary = "Python 2 and 3 compatibility utilities" -groups = ["all", "default", "docs"] +groups = ["dev"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1627,16 +1518,16 @@ files = [ [[package]] name = "smart-open" -version = "7.0.4" +version = "7.0.5" requires_python = "<4.0,>=3.7" summary = "Utils for streaming large files (S3, HDFS, GCS, Azure Blob Storage, gzip, bz2...)" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "wrapt", ] files = [ - {file = "smart_open-7.0.4-py3-none-any.whl", hash = "sha256:4e98489932b3372595cddc075e6033194775165702887216b65eba760dfd8d47"}, - {file = "smart_open-7.0.4.tar.gz", hash = "sha256:62b65852bdd1d1d516839fcb1f6bc50cd0f16e05b4ec44b52f43d38bcb838524"}, + {file = "smart_open-7.0.5-py3-none-any.whl", hash = "sha256:8523ed805c12dff3eaa50e9c903a6cb0ae78800626631c5fe7ea073439847b89"}, + {file = "smart_open-7.0.5.tar.gz", hash = "sha256:d3672003b1dbc85e2013e4983b88eb9a5ccfd389b0d4e5015f39a9ee5620ec18"}, ] [[package]] @@ -1644,7 +1535,7 @@ name = "sniffio" version = "1.3.1" requires_python = ">=3.7" summary = "Sniff out which async library your code is running under" -groups = ["all", "default", "dev"] +groups = ["dev"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -1655,7 +1546,7 @@ name = "sqids" version = "0.5.0" requires_python = ">=3.6" summary = "Generate YouTube-like ids from numbers." -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "sqids-0.5.0-py3-none-any.whl", hash = "sha256:4c2d1eabf4721e6e18001b1ff2bc0b30d059447ef96f1e1d1fb7f56841814154"}, {file = "sqids-0.5.0.tar.gz", hash = "sha256:647798e7d5bfeb236e7ac4709cfd4cd808630a6c50f80205df17b4c93e560140"}, @@ -1666,7 +1557,7 @@ name = "sqlalchemy" version = "2.0.35" requires_python = ">=3.7" summary = "Database Abstraction Library" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "greenlet!=0.4.17; (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\") and python_version < \"3.13\"", "typing-extensions>=4.6.0", @@ -1690,7 +1581,7 @@ version = "2.0.35" extras = ["asyncio"] requires_python = ">=3.7" summary = "Database Abstraction Library" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "greenlet!=0.4.17", "sqlalchemy==2.0.35", @@ -1710,29 +1601,36 @@ files = [ [[package]] name = "starlette" -version = "0.37.2" +version = "0.38.6" requires_python = ">=3.8" summary = "The little ASGI library that shines." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "anyio<5,>=3.4.0", ] files = [ - {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, - {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, + {file = "starlette-0.38.6-py3-none-any.whl", hash = "sha256:4517a1409e2e73ee4951214ba012052b9e16f60e90d73cfb06192c19203bbb05"}, + {file = "starlette-0.38.6.tar.gz", hash = "sha256:863a1588f5574e70a821dadefb41e4881ea451a47a3cd1b4df359d4ffefe5ead"}, ] [[package]] name = "streaming-form-data" -version = "1.16.0" -requires_python = ">=3.8" +version = "1.17.0" +requires_python = ">=3.9" summary = "Streaming parser for multipart/form-data" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "smart-open>=6.0", ] files = [ - {file = "streaming-form-data-1.16.0.tar.gz", hash = "sha256:cd95cde7a1e362c0f2b6e8bf2bcaf7339df1d4727b06de29968d010fcbbb9f5c"}, + {file = "streaming-form-data-1.17.0.tar.gz", hash = "sha256:1f40b10ebdccb37752374f486f750a808df807ad52a79f465420bbad2b896c50"}, + {file = "streaming_form_data-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a1484b1f74bee6f19cde51fb697b6bedb0993f21e1f73d0ae76f8cd6947868c9"}, + {file = "streaming_form_data-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56e18f672a390cd8749c48c1c63465378fe7ff2323d039b5014368f8d5d81306"}, + {file = "streaming_form_data-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b418a955f604078811fa0919fda51ef451cebc0e315a46c1c3c6e15e6306d05"}, + {file = "streaming_form_data-1.17.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bc4cfab37b9484207491033c8c261f7cf32e1dc0714c50b7a3b7169e128282b"}, + {file = "streaming_form_data-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b6a266aa936489814a6e457ed6791cf6668b704eda9c46e4bc5c3a4a52ce8bdc"}, + {file = "streaming_form_data-1.17.0-cp312-cp312-win32.whl", hash = "sha256:4687be319e495dbb68610b38f6b1a0a4ce34e6edbc58e9d9d9adeaa1ae1306c0"}, + {file = "streaming_form_data-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:77066fbc52d71eb69eb54e7c6bdf12feeee14aea6ab3e27d72e1d1e74f6f1a55"}, ] [[package]] @@ -1740,7 +1638,7 @@ name = "toml" version = "0.10.2" requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" summary = "Python Library for Tom's Obvious, Minimal Language" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, @@ -1751,7 +1649,7 @@ name = "typing-extensions" version = "4.12.2" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" -groups = ["all", "default", "dev", "docs"] +groups = ["dev"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -1759,24 +1657,24 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" requires_python = ">=2" summary = "Provider of IANA time zone data" -groups = ["all", "default"] +groups = ["dev"] 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" requires_python = ">=3.8" summary = "HTTP library with thread-safe connection pooling, file post, and more." -groups = ["all", "default", "docs"] +groups = ["dev"] 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]] @@ -1784,7 +1682,7 @@ name = "uvicorn" version = "0.31.0" requires_python = ">=3.8" summary = "The lightning-fast ASGI server." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "click>=7.0", "h11>=0.8", @@ -1799,7 +1697,7 @@ name = "uvicorn-worker" version = "0.2.0" requires_python = ">=3.8" summary = "Uvicorn worker for Gunicorn! ✨" -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "gunicorn>=20.1.0", "uvicorn>=0.14.0", @@ -1815,7 +1713,7 @@ version = "0.31.0" extras = ["standard"] requires_python = ">=3.8" summary = "The lightning-fast ASGI server." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "colorama>=0.4; sys_platform == \"win32\"", "httptools>=0.5.0", @@ -1833,19 +1731,19 @@ files = [ [[package]] name = "uvloop" -version = "0.19.0" +version = "0.20.0" requires_python = ">=3.8.0" summary = "Fast implementation of asyncio event loop on top of libuv" -groups = ["all", "default"] +groups = ["dev"] marker = "(sys_platform != \"cygwin\" and sys_platform != \"win32\") and platform_python_implementation != \"PyPy\"" files = [ - {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, - {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, - {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, - {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, - {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, - {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, - {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, + {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4b75f2950ddb6feed85336412b9a0c310a2edbcf4cf931aa5cfe29034829676d"}, + {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:77fbc69c287596880ecec2d4c7a62346bef08b6209749bf6ce8c22bbaca0239e"}, + {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6462c95f48e2d8d4c993a2950cd3d31ab061864d1c226bbf0ee2f1a8f36674b9"}, + {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649c33034979273fa71aa25d0fe120ad1777c551d8c4cd2c0c9851d88fcb13ab"}, + {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a609780e942d43a275a617c0839d85f95c334bad29c4c0918252085113285b5"}, + {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aea15c78e0d9ad6555ed201344ae36db5c63d428818b4b2a42842b3870127c00"}, + {file = "uvloop-0.20.0.tar.gz", hash = "sha256:4603ca714a754fc8d9b197e325db25b2ea045385e8a3ad05d3463de725fdf469"}, ] [[package]] @@ -1853,7 +1751,7 @@ name = "vine" version = "5.1.0" requires_python = ">=3.6" summary = "Python promises." -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "vine-5.1.0-py3-none-any.whl", hash = "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc"}, {file = "vine-5.1.0.tar.gz", hash = "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0"}, @@ -1861,74 +1759,70 @@ files = [ [[package]] name = "watchdog" -version = "5.0.0" +version = "5.0.3" requires_python = ">=3.9" summary = "Filesystem events monitoring" -groups = ["docs"] +groups = ["dev"] files = [ - {file = "watchdog-5.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1e26f570dd7f5178656affb24d6f0e22ce66c8daf88d4061a27bfb9ac866b40d"}, - {file = "watchdog-5.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d146331e6b206baa9f6dd40f72b5783ad2302c240df68e7fce196d30588ccf7b"}, - {file = "watchdog-5.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6c96b1706430839872a3e33b9370ee3f7a0079f6b828129d88498ad1f96a0f45"}, - {file = "watchdog-5.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:bc16d448a74a929b896ed9578c25756b2125400b19b3258be8d9a681c7ae8e71"}, - {file = "watchdog-5.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7e6b0e9b8a9dc3865d65888b5f5222da4ba9c4e09eab13cff5e305e7b7e7248f"}, - {file = "watchdog-5.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4fe6780915000743074236b21b6c37419aea71112af62237881bc265589fe463"}, - {file = "watchdog-5.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0710e9502727f688a7e06d48078545c54485b3d6eb53b171810879d8223c362a"}, - {file = "watchdog-5.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d76efab5248aafbf8a2c2a63cd7b9545e6b346ad1397af8b862a3bb3140787d8"}, - {file = "watchdog-5.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:ff4e957c45c446de34c513eadce01d0b65da7eee47c01dce472dd136124552c9"}, - {file = "watchdog-5.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:16c1aa3377bb1f82c5e24277fcbf4e2cac3c4ce46aaaf7212d53caa9076eb7b7"}, - {file = "watchdog-5.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:22fcad6168fc43cf0e709bd854be5b8edbb0b260f0a6f28f1ea9baa53c6907f7"}, - {file = "watchdog-5.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:0120b2fa65732797ffa65fa8ee5540c288aa861d91447df298626d6385a24658"}, - {file = "watchdog-5.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2aa59fab7ff75281778c649557275ca3085eccbdf825a0e2a5ca3810e977afe5"}, - {file = "watchdog-5.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:78db0fe0336958fc0e1269545c980b6f33d04d184ba191b2800a8b71d3e971a9"}, - {file = "watchdog-5.0.0-py3-none-win32.whl", hash = "sha256:d1acef802916083f2ad7988efc7decf07e46e266916c0a09d8fb9d387288ea12"}, - {file = "watchdog-5.0.0-py3-none-win_amd64.whl", hash = "sha256:3c2d50fdb86aa6df3973313272f5a17eb26eab29ff5a0bf54b6d34597b4dc4e4"}, - {file = "watchdog-5.0.0-py3-none-win_ia64.whl", hash = "sha256:1d17ec7e022c34fa7ddc72aa41bf28c9d1207ffb193df18ba4f6fde453725b3c"}, - {file = "watchdog-5.0.0.tar.gz", hash = "sha256:990aedb9e2f336b45a70aed9c014450e7c4a70fd99c5f5b1834d57e1453a177e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, ] [[package]] name = "watchfiles" -version = "0.22.0" +version = "0.24.0" requires_python = ">=3.8" summary = "Simple, modern and high performance file watching and code reload in python." -groups = ["all", "default"] +groups = ["dev"] dependencies = [ "anyio>=3.0.0", ] files = [ - {file = "watchfiles-0.22.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a"}, - {file = "watchfiles-0.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6"}, - {file = "watchfiles-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27"}, - {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b"}, - {file = "watchfiles-0.22.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35"}, - {file = "watchfiles-0.22.0-cp312-none-win32.whl", hash = "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e"}, - {file = "watchfiles-0.22.0-cp312-none-win_amd64.whl", hash = "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e"}, - {file = "watchfiles-0.22.0-cp312-none-win_arm64.whl", hash = "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab"}, - {file = "watchfiles-0.22.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795"}, - {file = "watchfiles-0.22.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31"}, - {file = "watchfiles-0.22.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2"}, - {file = "watchfiles-0.22.0.tar.gz", hash = "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb"}, + {file = "watchfiles-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7211b463695d1e995ca3feb38b69227e46dbd03947172585ecb0588f19b0d87a"}, + {file = "watchfiles-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b8693502d1967b00f2fb82fc1e744df128ba22f530e15b763c8d82baee15370"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdab9555053399318b953a1fe1f586e945bc8d635ce9d05e617fd9fe3a4687d6"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34e19e56d68b0dad5cff62273107cf5d9fbaf9d75c46277aa5d803b3ef8a9e9b"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41face41f036fee09eba33a5b53a73e9a43d5cb2c53dad8e61fa6c9f91b5a51e"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5148c2f1ea043db13ce9b0c28456e18ecc8f14f41325aa624314095b6aa2e9ea"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e4bd963a935aaf40b625c2499f3f4f6bbd0c3776f6d3bc7c853d04824ff1c9f"}, + {file = "watchfiles-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c79d7719d027b7a42817c5d96461a99b6a49979c143839fc37aa5748c322f234"}, + {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:32aa53a9a63b7f01ed32e316e354e81e9da0e6267435c7243bf8ae0f10b428ef"}, + {file = "watchfiles-0.24.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce72dba6a20e39a0c628258b5c308779b8697f7676c254a845715e2a1039b968"}, + {file = "watchfiles-0.24.0-cp312-none-win32.whl", hash = "sha256:d9018153cf57fc302a2a34cb7564870b859ed9a732d16b41a9b5cb2ebed2d444"}, + {file = "watchfiles-0.24.0-cp312-none-win_amd64.whl", hash = "sha256:551ec3ee2a3ac9cbcf48a4ec76e42c2ef938a7e905a35b42a1267fa4b1645896"}, + {file = "watchfiles-0.24.0-cp312-none-win_arm64.whl", hash = "sha256:b52a65e4ea43c6d149c5f8ddb0bef8d4a1e779b77591a458a893eb416624a418"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:632676574429bee8c26be8af52af20e0c718cc7f5f67f3fb658c71928ccd4f7f"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a2a9891723a735d3e2540651184be6fd5b96880c08ffe1a98bae5017e65b544b"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7fa2bc0efef3e209a8199fd111b8969fe9db9c711acc46636686331eda7dd4"}, + {file = "watchfiles-0.24.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01550ccf1d0aed6ea375ef259706af76ad009ef5b0203a3a4cce0f6024f9b68a"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:96619302d4374de5e2345b2b622dc481257a99431277662c30f606f3e22f42be"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:85d5f0c7771dcc7a26c7a27145059b6bb0ce06e4e751ed76cdf123d7039b60b5"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951088d12d339690a92cef2ec5d3cfd957692834c72ffd570ea76a6790222777"}, + {file = "watchfiles-0.24.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fb58bcaa343fedc6a9e91f90195b20ccb3135447dc9e4e2570c3a39565853e"}, + {file = "watchfiles-0.24.0.tar.gz", hash = "sha256:afb72325b74fa7a428c009c1b8be4b4d7c2afedafb2982827ef2156646df2fe1"}, ] [[package]] name = "wcwidth" version = "0.2.13" summary = "Measures the displayed width of unicode strings in a terminal" -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -1936,39 +1830,42 @@ files = [ [[package]] name = "websockets" -version = "12.0" +version = "13.1" requires_python = ">=3.8" summary = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -groups = ["all", "default"] +groups = ["dev"] files = [ - {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, - {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, - {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, - {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, - {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, - {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, - {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, - {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, - {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, - {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, - {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, - {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, - {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, - {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, + {file = "websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc"}, + {file = "websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49"}, + {file = "websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6"}, + {file = "websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14"}, + {file = "websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf"}, + {file = "websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c"}, + {file = "websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3"}, + {file = "websockets-13.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5dd6da9bec02735931fccec99d97c29f47cc61f644264eb995ad6c0c27667238"}, + {file = "websockets-13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2510c09d8e8df777177ee3d40cd35450dc169a81e747455cc4197e63f7e7bfe5"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1c3cf67185543730888b20682fb186fc8d0fa6f07ccc3ef4390831ab4b388d9"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcc03c8b72267e97b49149e4863d57c2d77f13fae12066622dc78fe322490fe6"}, + {file = "websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004280a140f220c812e65f36944a9ca92d766b6cc4560be652a0a3883a79ed8a"}, + {file = "websockets-13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e2620453c075abeb0daa949a292e19f56de518988e079c36478bacf9546ced23"}, + {file = "websockets-13.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9156c45750b37337f7b0b00e6248991a047be4aa44554c9886fe6bdd605aab3b"}, + {file = "websockets-13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:80c421e07973a89fbdd93e6f2003c17d20b69010458d3a8e37fb47874bd67d51"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d0ba76371769d6a4e56f7e83bb8e81846d17a6190971e38b5de108bde9b0d7"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9875a0143f07d74dc5e1ded1c4581f0d9f7ab86c78994e2ed9e95050073c94d"}, + {file = "websockets-13.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11e38ad8922c7961447f35c7b17bffa15de4d17c70abd07bfbe12d6faa3e027"}, + {file = "websockets-13.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4059f790b6ae8768471cddb65d3c4fe4792b0ab48e154c9f0a04cefaabcd5978"}, + {file = "websockets-13.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25c35bf84bf7c7369d247f0b8cfa157f989862c49104c5cf85cb5436a641d93e"}, + {file = "websockets-13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:83f91d8a9bb404b8c2c41a707ac7f7f75b9442a0a876df295de27251a856ad09"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a43cfdcddd07f4ca2b1afb459824dd3c6d53a51410636a2c7fc97b9a8cf4842"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48a2ef1381632a2f0cb4efeff34efa97901c9fbc118e01951ad7cfc10601a9bb"}, + {file = "websockets-13.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459bf774c754c35dbb487360b12c5727adab887f1622b8aed5755880a21c4a20"}, + {file = "websockets-13.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:95858ca14a9f6fa8413d29e0a585b31b278388aa775b8a81fa24830123874678"}, + {file = "websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f"}, + {file = "websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878"}, ] [[package]] @@ -1976,7 +1873,7 @@ name = "win32-setctime" version = "1.1.0" requires_python = ">=3.5" summary = "A small Python utility to set file creation time on Windows" -groups = ["all", "default", "dev", "frontend"] +groups = ["dev"] marker = "sys_platform == \"win32\"" files = [ {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, @@ -1988,7 +1885,7 @@ name = "wrapt" version = "1.16.0" requires_python = ">=3.6" summary = "Module for decorators, wrappers and monkey patching." -groups = ["all", "default"] +groups = ["dev"] files = [ {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, diff --git a/pyproject.toml b/pyproject.toml index 72e2be7..0eafdbf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,66 +5,14 @@ description = "Materia is a simple and fast cloud storage" authors = [ {name = "L-Nafaryus", email = "l.nafaryus@gmail.com"}, ] -dependencies = [ - "fastapi<1.0.0,>=0.111.0", - "uvicorn[standard]<1.0.0,>=0.29.0", - "psycopg2-binary<3.0.0,>=2.9.9", - "toml<1.0.0,>=0.10.2", - "sqlalchemy[asyncio]<3.0.0,>=2.0.30", - "asyncpg<1.0.0,>=0.29.0", - "eventlet<1.0.0,>=0.36.1", - "bcrypt==4.1.2", - "pyjwt<3.0.0,>=2.8.0", - "requests<3.0.0,>=2.31.0", - "pillow<11.0.0,>=10.3.0", - "sqids<1.0.0,>=0.4.1", - "alembic<2.0.0,>=1.13.1", - "authlib<2.0.0,>=1.3.0", - "redis[hiredis]<6.0.0,>=5.0.4", - "aiosmtplib<4.0.0,>=3.0.1", - "emails<1.0,>=0.6", - "pydantic-settings<3.0.0,>=2.2.1", - "email-validator<3.0.0,>=2.1.1", - "pydanclick<1.0.0,>=0.2.0", - "loguru<1.0.0,>=0.7.2", - "alembic-postgresql-enum<2.0.0,>=1.2.0", - "gunicorn>=22.0.0", - "uvicorn-worker>=0.2.0", - "httpx>=0.27.0", - "cryptography>=43.0.0", - "python-multipart>=0.0.9", - "jinja2>=3.1.4", - "aiofiles>=24.1.0", - "aioshutil>=1.5", - "Celery>=5.4.0", - "streaming-form-data>=1.16.0", -] requires-python = ">=3.12,<3.13" readme = "README.md" license = {text = "MIT"} -[project.optional-dependencies] -docs = [ - "mkdocs-material>=9.5.38", - "mkdocstrings-python>=1.11.1", - "griffe-typingdoc>=0.2.7", - "pymdown-extensions>=10.11", -] -frontend = [ - "materia-frontend>=0.1.1", -] -all = [ - "materia[frontend]", -] - [build-system] requires = ["pdm-backend"] build-backend = "pdm.backend" -[project.scripts] - -materia = "materia.app.cli:cli" - [tool.pyright] reportGeneralTypeIssues = false @@ -73,34 +21,15 @@ pythonpath = ["."] testpaths = ["tests"] [tool.pdm] -distribution = true +distribution = false [tool.pdm.dev-dependencies] dev = [ - "-e file:///${PROJECT_ROOT}/workspaces/frontend", - "black<24.0.0,>=23.3.0", - "pytest<8.0.0,>=7.3.2", - "pyflakes<4.0.0,>=3.0.1", - "pyright<2.0.0,>=1.1.314", - "pytest-asyncio>=0.23.7", - "asgi-lifespan>=2.1.0", - "pytest-cov>=5.0.0", + "-e file:///${PROJECT_ROOT}/packages/server", + "-e file:///${PROJECT_ROOT}/packages/frontend", + "-e file:///${PROJECT_ROOT}/packages/docs", ] -[tool.pdm.build] -includes = ["src/materia"] - -[tool.pdm.scripts] -start.cmd = "python ./src/materia/main.py {args:start --app-mode development --log-level debug}" -setup.cmd = "psql -U postgres -h 127.0.0.1 -p 54320 -d postgres -c 'create role materia login;' -c 'create database materia owner materia;'" -teardown.cmd = "psql -U postgres -h 127.0.0.1 -p 54320 -d postgres -c 'drop database materia;' -c 'drop role materia;'" -rev.cmd = "alembic revision {args:--autogenerate}" -upgrade.cmd = "alembic upgrade {args:head}" -downgrade.cmd = "alembic downgrade {args:base}" -remove-revs.shell = "rm -v ./src/materia/models/migrations/versions/*.py" -docs.shell = "pdm run mkdocs build -d src/materia/docs/" -pre_build.composite = [ "docs" ] - [tool.pdm.resolution] respect-source-order = true diff --git a/src/materia/__main__.py b/src/materia/__main__.py deleted file mode 100644 index 6ff9931..0000000 --- a/src/materia/__main__.py +++ /dev/null @@ -1,3 +0,0 @@ -from materia.app import cli - -cli() diff --git a/src/materia/app/__init__.py b/src/materia/app/__init__.py deleted file mode 100644 index 056584c..0000000 --- a/src/materia/app/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from materia.app.app import Context, Application -from materia.app.cli import cli diff --git a/src/materia/core/__init__.py b/src/materia/core/__init__.py deleted file mode 100644 index e3eefbe..0000000 --- a/src/materia/core/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from materia.core.logging import Logger, LoggerInstance, LogLevel, LogMode -from materia.core.database import ( - DatabaseError, - DatabaseMigrationError, - Database, - SessionMaker, - SessionContext, - ConnectionContext, -) -from materia.core.filesystem import FileSystem, FileSystemError, TemporaryFileTarget -from materia.core.config import Config -from materia.core.cache import Cache, CacheError -from materia.core.cron import Cron, CronError diff --git a/src/materia/models/auth/__init__.py b/src/materia/models/auth/__init__.py deleted file mode 100644 index 862da1d..0000000 --- a/src/materia/models/auth/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from materia.models.auth.source import LoginType, LoginSource - -# from materia.models.auth.oauth2 import OAuth2Application, OAuth2Grant, OAuth2AuthorizationCode diff --git a/src/materia/models/auth/access_token.py b/src/materia/models/auth/access_token.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/materia/routers/__init__.py b/src/materia/routers/__init__.py deleted file mode 100644 index e42f683..0000000 --- a/src/materia/routers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from materia.routers import middleware, api, resources, root, docs diff --git a/src/materia/routers/root.py b/src/materia/routers/root.py deleted file mode 100644 index d9f827f..0000000 --- a/src/materia/routers/root.py +++ /dev/null @@ -1,18 +0,0 @@ -from pathlib import Path -from fastapi import APIRouter, Request -from fastapi.responses import HTMLResponse -from fastapi.templating import Jinja2Templates - -router = APIRouter(tags=["root"]) - -try: - import materia_frontend -except ModuleNotFoundError: - pass -else: - - templates = Jinja2Templates(directory=Path(materia_frontend.__path__[0]) / "dist") - - @router.get("/{spa:path}", response_class=HTMLResponse, include_in_schema=False) - async def root(request: Request): - return templates.TemplateResponse(request, "base.html", {"view": "app"}) diff --git a/src/materia/security/__init__.py b/src/materia/security/__init__.py deleted file mode 100644 index f4547df..0000000 --- a/src/materia/security/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from materia.security.secret_key import generate_key, encrypt_payload -from materia.security.token import TokenClaims, generate_token, validate_token -from materia.security.password import hash_password, validate_password diff --git a/src/materia/tasks/__init__.py b/src/materia/tasks/__init__.py deleted file mode 100644 index a18c7f6..0000000 --- a/src/materia/tasks/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from materia.tasks.file import remove_cache_file diff --git a/workspaces/frontend/pdm.lock b/workspaces/frontend/pdm.lock deleted file mode 100644 index 3f28259..0000000 --- a/workspaces/frontend/pdm.lock +++ /dev/null @@ -1,177 +0,0 @@ -# This file is @generated by PDM. -# It is not intended for manual editing. - -[metadata] -groups = ["default", "dev"] -strategy = ["cross_platform", "inherit_metadata"] -lock_version = "4.4.1" -content_hash = "sha256:16bedb3de70622af531e01dee2c2773d108a005caf9fa9d2fbe9042267602ef6" - -[[package]] -name = "black" -version = "23.12.1" -requires_python = ">=3.8" -summary = "The uncompromising code formatter." -groups = ["dev"] -dependencies = [ - "click>=8.0.0", - "mypy-extensions>=0.4.3", - "packaging>=22.0", - "pathspec>=0.9.0", - "platformdirs>=2", -] -files = [ - {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, - {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, - {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, - {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, - {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, - {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, -] - -[[package]] -name = "click" -version = "8.1.7" -requires_python = ">=3.7" -summary = "Composable command line interface toolkit" -groups = ["dev"] -dependencies = [ - "colorama; platform_system == \"Windows\"", -] -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -summary = "Cross-platform colored terminal text." -groups = ["default", "dev"] -marker = "sys_platform == \"win32\" or platform_system == \"Windows\"" -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 = "iniconfig" -version = "2.0.0" -requires_python = ">=3.7" -summary = "brain-dead simple config-ini parsing" -groups = ["dev"] -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "loguru" -version = "0.7.2" -requires_python = ">=3.5" -summary = "Python logging made (stupidly) simple" -groups = ["default"] -dependencies = [ - "colorama>=0.3.4; sys_platform == \"win32\"", - "win32-setctime>=1.0.0; sys_platform == \"win32\"", -] -files = [ - {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, - {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -requires_python = ">=3.5" -summary = "Type system extensions for programs checked with the mypy type checker." -groups = ["dev"] -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 = "packaging" -version = "24.1" -requires_python = ">=3.8" -summary = "Core utilities for Python packages" -groups = ["dev"] -files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, -] - -[[package]] -name = "pathspec" -version = "0.12.1" -requires_python = ">=3.8" -summary = "Utility library for gitignore style pattern matching of file paths." -groups = ["dev"] -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.2" -requires_python = ">=3.8" -summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -groups = ["dev"] -files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -requires_python = ">=3.8" -summary = "plugin and hook calling mechanisms for python" -groups = ["dev"] -files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, -] - -[[package]] -name = "pyflakes" -version = "3.2.0" -requires_python = ">=3.8" -summary = "passive checker of Python programs" -groups = ["dev"] -files = [ - {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, - {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, -] - -[[package]] -name = "pytest" -version = "7.4.4" -requires_python = ">=3.7" -summary = "pytest: simple powerful testing with Python" -groups = ["dev"] -dependencies = [ - "colorama; sys_platform == \"win32\"", - "iniconfig", - "packaging", - "pluggy<2.0,>=0.12", -] -files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, -] - -[[package]] -name = "win32-setctime" -version = "1.1.0" -requires_python = ">=3.5" -summary = "A small Python utility to set file creation time on Windows" -groups = ["default"] -marker = "sys_platform == \"win32\"" -files = [ - {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, - {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, -] diff --git a/workspaces/frontend/pyproject.toml b/workspaces/frontend/pyproject.toml deleted file mode 100644 index de22ec2..0000000 --- a/workspaces/frontend/pyproject.toml +++ /dev/null @@ -1,47 +0,0 @@ -[project] -name = "materia-frontend" -version = "0.1.1" -description = "Materia frontend" -authors = [ - {name = "L-Nafaryus", email = "l.nafaryus@gmail.com"}, -] -dependencies = [ - "loguru<1.0.0,>=0.7.2", -] -requires-python = ">=3.12,<3.13" -readme = "README.md" -license = {text = "MIT"} - -[tool.pdm] -distribution = true - -[tool.pdm.dev-dependencies] -dev = [ - "black<24.0.0,>=23.3.0", - "pytest<8.0.0,>=7.3.2", - "pyflakes<4.0.0,>=3.0.1", -] - -[tool.pdm.build] -includes = [ "src/materia_frontend" ] - -[tool.pdm.scripts] -openapi-json.cmd = "pdm run -p ../../ python -m materia export openapi --path ./openapi.json" -npm-install.cmd = "npm install --prefix ./" -openapi-client.cmd = "npm run openapi" -npm-run-build.cmd = "npm run build --prefix ./" -move-dist.shell = "rm -vrf src/materia_frontend/dist && mv -v dist src/materia_frontend/ && cp -v templates/* src/materia_frontend/dist" -pre_build.composite = [ "openapi-json", "npm-install", "openapi-client", "npm-run-build", "move-dist" ] -materia-frontend.call = "materia_frontend.main:client" - -[build-system] -requires = ["pdm-backend"] -build-backend = "pdm.backend" - -[tool.pyright] -reportGeneralTypeIssues = false - -[tool.pytest.ini_options] -pythonpath = ["."] -testpaths = ["tests"] - diff --git a/workspaces/frontend/src/materia_frontend/__init__.py b/workspaces/frontend/src/materia_frontend/__init__.py deleted file mode 100644 index e69de29..0000000