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