diff --git a/.devenv.flake.nix b/.devenv.flake.nix new file mode 100644 index 0000000..e7da818 --- /dev/null +++ b/.devenv.flake.nix @@ -0,0 +1,173 @@ +{ + inputs = + let + version = "1.8.2"; +system = "x86_64-linux"; +devenv_root = "/home/th3r00t/Projects/dosfrontend"; +devenv_dotfile = "/home/th3r00t/Projects/dosfrontend/.devenv"; +devenv_dotfile_path = ./.devenv; +devenv_tmpdir = "/run/user/1000"; +devenv_runtime = "/run/user/1000/devenv-9a894c0"; +devenv_istesting = false; +devenv_direnvrc_latest_version = 1; +container_name = null; + + in { + git-hooks.url = "github:cachix/git-hooks.nix"; + git-hooks.inputs.nixpkgs.follows = "nixpkgs"; + pre-commit-hooks.follows = "git-hooks"; + nixpkgs.url = "github:cachix/devenv-nixpkgs/rolling"; + devenv.url = "github:cachix/devenv?dir=src/modules"; + } // (if builtins.pathExists (devenv_dotfile_path + "/flake.json") + then builtins.fromJSON (builtins.readFile (devenv_dotfile_path + "/flake.json")) + else { }); + + outputs = { nixpkgs, ... }@inputs: + let + version = "1.8.2"; +system = "x86_64-linux"; +devenv_root = "/home/th3r00t/Projects/dosfrontend"; +devenv_dotfile = "/home/th3r00t/Projects/dosfrontend/.devenv"; +devenv_dotfile_path = ./.devenv; +devenv_tmpdir = "/run/user/1000"; +devenv_runtime = "/run/user/1000/devenv-9a894c0"; +devenv_istesting = false; +devenv_direnvrc_latest_version = 1; +container_name = null; + + devenv = + if builtins.pathExists (devenv_dotfile_path + "/devenv.json") + then builtins.fromJSON (builtins.readFile (devenv_dotfile_path + "/devenv.json")) + else { }; + getOverlays = inputName: inputAttrs: + map + (overlay: + let + input = inputs.${inputName} or (throw "No such input `${inputName}` while trying to configure overlays."); + in + input.overlays.${overlay} or (throw "Input `${inputName}` has no overlay called `${overlay}`. Supported overlays: ${nixpkgs.lib.concatStringsSep ", " (builtins.attrNames input.overlays)}")) + inputAttrs.overlays or [ ]; + overlays = nixpkgs.lib.flatten (nixpkgs.lib.mapAttrsToList getOverlays (devenv.inputs or { })); + pkgs = import nixpkgs { + inherit system; + config = { + allowUnfree = devenv.nixpkgs.per-platform."${system}".allowUnfree or devenv.nixpkgs.allowUnfree or devenv.allowUnfree or false; + allowBroken = devenv.nixpkgs.per-platform."${system}".allowBroken or devenv.nixpkgs.allowBroken or devenv.allowBroken or false; + cudaSupport = devenv.nixpkgs.per-platform."${system}".cudaSupport or devenv.nixpkgs.cudaSupport or false; + cudaCapabilities = devenv.nixpkgs.per-platform."${system}".cudaCapabilities or devenv.nixpkgs.cudaCapabilities or [ ]; + permittedInsecurePackages = devenv.nixpkgs.per-platform."${system}".permittedInsecurePackages or devenv.nixpkgs.permittedInsecurePackages or devenv.permittedInsecurePackages or [ ]; + }; + inherit overlays; + }; + lib = pkgs.lib; + importModule = path: + if lib.hasPrefix "./" path + then if lib.hasSuffix ".nix" path + then ./. + (builtins.substring 1 255 path) + else ./. + (builtins.substring 1 255 path) + "/devenv.nix" + else if lib.hasPrefix "../" path + then throw "devenv: ../ is not supported for imports" + else + let + paths = lib.splitString "/" path; + name = builtins.head paths; + input = inputs.${name} or (throw "Unknown input ${name}"); + subpath = "/${lib.concatStringsSep "/" (builtins.tail paths)}"; + devenvpath = "${input}" + subpath; + devenvdefaultpath = devenvpath + "/devenv.nix"; + in + if lib.hasSuffix ".nix" devenvpath + then devenvpath + else if builtins.pathExists devenvdefaultpath + then devenvdefaultpath + else throw (devenvdefaultpath + " file does not exist for input ${name}."); + project = pkgs.lib.evalModules { + specialArgs = inputs // { inherit inputs; }; + modules = [ + ({ config, ... }: { + _module.args.pkgs = pkgs.appendOverlays (config.overlays or [ ]); + }) + (inputs.devenv.modules + /top-level.nix) + { + devenv.cliVersion = version; + devenv.root = devenv_root; + devenv.dotfile = devenv_dotfile; + } + ({ options, ... }: { + config.devenv = lib.mkMerge [ + (pkgs.lib.optionalAttrs (builtins.hasAttr "tmpdir" options.devenv) { + tmpdir = devenv_tmpdir; + }) + (pkgs.lib.optionalAttrs (builtins.hasAttr "isTesting" options.devenv) { + isTesting = devenv_istesting; + }) + (pkgs.lib.optionalAttrs (builtins.hasAttr "runtime" options.devenv) { + runtime = devenv_runtime; + }) + (pkgs.lib.optionalAttrs (builtins.hasAttr "direnvrcLatestVersion" options.devenv) { + direnvrcLatestVersion = devenv_direnvrc_latest_version; + }) + ]; + }) + (pkgs.lib.optionalAttrs (container_name != null) { + container.isBuilding = pkgs.lib.mkForce true; + containers.${container_name}.isBuilding = true; + }) + ] ++ (map importModule (devenv.imports or [ ])) ++ [ + (if builtins.pathExists ./devenv.nix then ./devenv.nix else { }) + (devenv.devenv or { }) + (if builtins.pathExists ./devenv.local.nix then ./devenv.local.nix else { }) + (if builtins.pathExists (devenv_dotfile_path + "/cli-options.nix") then import (devenv_dotfile_path + "/cli-options.nix") else { }) + ]; + }; + config = project.config; + + options = pkgs.nixosOptionsDoc { + options = builtins.removeAttrs project.options [ "_module" ]; + warningsAreErrors = false; + # Unpack Nix types, e.g. literalExpression, mDoc. + transformOptions = + let isDocType = v: builtins.elem v [ "literalDocBook" "literalExpression" "literalMD" "mdDoc" ]; + in lib.attrsets.mapAttrs (_: v: + if v ? _type && isDocType v._type then + v.text + else if v ? _type && v._type == "derivation" then + v.name + else + v + ); + }; + + # Recursively search for outputs in the config. + # This is used when not building a specific output by attrpath. + build = options: config: + lib.concatMapAttrs + (name: option: + if lib.isOption option then + let typeName = option.type.name or ""; + in + if builtins.elem typeName [ "output" "outputOf" ] then + { ${name} = config.${name}; } + else { } + else + let v = build option config.${name}; + in if v != { } then { + ${name} = v; + } else { } + ) + options; + + systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; + in + { + devShell = lib.genAttrs systems (system: config.shell); + packages = lib.genAttrs systems (system: { + optionsJSON = options.optionsJSON; + # deprecated + inherit (config) info procfileScript procfileEnv procfile; + ci = config.ciDerivation; + }); + devenv = config; + build = build project.options project.config; + }; + } diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..6fbf301 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,65 @@ +# Git +.git +.gitignore + +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Virtual environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Development +devenv.lock +devenv.nix +.direnv/ + +# Testing +.pytest_cache/ +.coverage +htmlcov/ + +# Local data +src/roms.db* +roms/ +data/ +logs/ +images/ + +# Release builds +release/ \ No newline at end of file diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..e3c2943 --- /dev/null +++ b/.envrc @@ -0,0 +1,7 @@ +export DIRENV_WARN_TIMEOUT=20s + +eval "$(devenv direnvrc)" + +# The use_devenv function supports passing flags to the devenv command +# For example: use devenv --impure --option services.postgres.enable:bool true +use devenv diff --git a/devenv.nix b/devenv.nix index cb46fe6..d947692 100644 --- a/devenv.nix +++ b/devenv.nix @@ -73,6 +73,12 @@ "db-create".exec = "cd $REPO_ROOT && python src/migrate.py create"; "build".exec = "cd $REPO_ROOT && ./build.sh"; "backfill-images".exec = "cd $REPO_ROOT && python src/backfill_images.py"; + "export-requirements".exec = "pip freeze > requirements.txt"; + "export-reqs".exec = '' + cd "$REPO_ROOT" + printf "%s\n" '${config.languages.python.venv.requirements}' > requirements.txt + echo "Wrote requirements.txt" + ''; }; enterShell = '' export REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)" diff --git a/requirements.txt b/requirements.txt index c306ca9..4b53187 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,21 +1,24 @@ -# DosVault Python Dependencies - -# Web Framework -fastapi>=0.104.0 -uvicorn[standard]>=0.24.0 -jinja2>=3.1.2 -python-multipart>=0.0.6 - -# Database -sqlalchemy>=2.0.0 -alembic>=1.12.0 - -# Authentication & Security -python-jose[cryptography]>=3.3.0 -bcrypt>=4.0.1 - -# HTTP Client -aiohttp>=3.9.0 - -# Utilities -pathlib2>=2.3.7; python_version<"3.4" \ No newline at end of file + pudb + ptpython + ipython + pytest + pytest-cov + flake8 + ptpython + ipython + isort + pynvim + ruff + black + sqlalchemy + requests + fastapi + uvicorn + jinja2 + python-multipart + bcrypt + python-jose + passlib + alembic + aiohttp +