summaryrefslogtreecommitdiff
path: root/common/templates/python/flake.nix
diff options
context:
space:
mode:
Diffstat (limited to 'common/templates/python/flake.nix')
-rw-r--r--common/templates/python/flake.nix98
1 files changed, 98 insertions, 0 deletions
diff --git a/common/templates/python/flake.nix b/common/templates/python/flake.nix
new file mode 100644
index 0000000..e773850
--- /dev/null
+++ b/common/templates/python/flake.nix
@@ -0,0 +1,98 @@
+{
+ inputs = {
+ nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+
+ pyproject-nix = {
+ url = "github:pyproject-nix/pyproject.nix";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ uv2nix = {
+ url = "github:pyproject-nix/uv2nix";
+ inputs.pyproject-nix.follows = "pyproject-nix";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ pyproject-build-systems = {
+ url = "github:pyproject-nix/build-system-pkgs";
+ inputs.pyproject-nix.follows = "pyproject-nix";
+ inputs.uv2nix.follows = "uv2nix";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+ };
+
+ outputs =
+ {
+ nixpkgs,
+ pyproject-nix,
+ uv2nix,
+ pyproject-build-systems,
+ ...
+ }:
+ let
+ inherit (nixpkgs) lib;
+ forAllSystems = lib.genAttrs lib.systems.flakeExposed;
+
+ workspace = uv2nix.lib.workspace.loadWorkspace { workspaceRoot = ./.; };
+
+ overlay = workspace.mkPyprojectOverlay {
+ sourcePreference = "wheel";
+ };
+
+ editableOverlay = workspace.mkEditablePyprojectOverlay {
+ root = "$REPO_ROOT";
+ };
+ packageName = "hello_world";
+
+ pythonSets = forAllSystems (
+ system:
+ let
+ pkgs = nixpkgs.legacyPackages.${system};
+ python = pkgs.python3;
+ in
+ (pkgs.callPackage pyproject-nix.build.packages {
+ inherit python;
+ }).overrideScope
+ (
+ lib.composeManyExtensions [
+ pyproject-build-systems.overlays.wheel
+ overlay
+ ]
+ )
+ );
+
+ in
+ {
+ devShells = forAllSystems (
+ system:
+ let
+ pkgs = nixpkgs.legacyPackages.${system};
+ pythonSet = pythonSets.${system}.overrideScope editableOverlay;
+ virtualenv = pythonSet.mkVirtualEnv "${packageName}-dev-env" workspace.deps.all;
+ in
+ {
+ default = pkgs.mkShellNoCC {
+ packages = [
+ virtualenv
+ pkgs.uv
+ pkgs.pyrefly
+ pkgs.ruff
+ ];
+ env = {
+ UV_NO_SYNC = "1";
+ UV_PYTHON = pythonSet.python.interpreter;
+ UV_PYTHON_DOWNLOADS = "never";
+ };
+ shellHook = ''
+ unset PYTHONPATH
+ export REPO_ROOT=$(git rev-parse --show-toplevel)
+ '';
+ };
+ }
+ );
+
+ packages = forAllSystems (system: {
+ default = pythonSets.${system}.mkVirtualEnv packageName workspace.deps.default;
+ });
+ };
+}