From f4a36b249c7b1b3a40015992bae32311800d2c18 Mon Sep 17 00:00:00 2001 From: marc Date: Sat, 20 Dec 2025 12:04:03 +0200 Subject: [PATCH] uv2nix --- flake.lock | 116 ++++++++++++++++++++++++++++++++++++++++++++++++- flake.nix | 88 +++++++++++++++++++------------------ pyproject.toml | 6 +++ 3 files changed, 166 insertions(+), 44 deletions(-) diff --git a/flake.lock b/flake.lock index 88e712f..43ca2c0 100644 --- a/flake.lock +++ b/flake.lock @@ -34,10 +34,78 @@ "type": "github" } }, + "pyproject-build-systems": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "pyproject-nix": [ + "pyproject-nix" + ], + "uv2nix": "uv2nix" + }, + "locked": { + "lastModified": 1776659114, + "narHash": "sha256-qapCOQmR++yZSY43dzrp3wCrkOTLpod+ONtJWBk6iKU=", + "owner": "pyproject-nix", + "repo": "build-system-pkgs", + "rev": "ffaa2161dd5d63e0e94591f86b54fc239660fb2e", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "build-system-pkgs", + "type": "github" + } + }, + "pyproject-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1776715674, + "narHash": "sha256-Gs1VnEkCkkRZxJQAC/Dhz0Jbfi22mFXChbtNg9w/Ybg=", + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "rev": "69f57f27e52a87c54e28138a75ec741cd46663c9", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "type": "github" + } + }, + "pyproject-nix_2": { + "inputs": { + "nixpkgs": [ + "uv2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1776715674, + "narHash": "sha256-Gs1VnEkCkkRZxJQAC/Dhz0Jbfi22mFXChbtNg9w/Ybg=", + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "rev": "69f57f27e52a87c54e28138a75ec741cd46663c9", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "type": "github" + } + }, "root": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "pyproject-build-systems": "pyproject-build-systems", + "pyproject-nix": "pyproject-nix", + "uv2nix": "uv2nix_2" } }, "systems": { @@ -54,6 +122,52 @@ "repo": "default", "type": "github" } + }, + "uv2nix": { + "inputs": { + "nixpkgs": [ + "pyproject-build-systems", + "nixpkgs" + ], + "pyproject-nix": [ + "pyproject-build-systems", + "pyproject-nix" + ] + }, + "locked": { + "lastModified": 1776317509, + "narHash": "sha256-nSriomT9IJvyVY/mzyFz4Un6DHSjCfrVitcIfV+VHnY=", + "owner": "pyproject-nix", + "repo": "uv2nix", + "rev": "56cfeb9813150e1f900f13e4d6fe46e2845f82d5", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "uv2nix", + "type": "github" + } + }, + "uv2nix_2": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "pyproject-nix": "pyproject-nix_2" + }, + "locked": { + "lastModified": 1777895960, + "narHash": "sha256-KebDsQd+A7pm++Tp0744EjULttHvz1wbKqNKkMA/088=", + "owner": "pyproject-nix", + "repo": "uv2nix", + "rev": "5ad90d48b80ecc920ca2247d53f46beba302e186", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "uv2nix", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index e145106..82fabdb 100644 --- a/flake.nix +++ b/flake.nix @@ -1,65 +1,67 @@ { description = "Event-driven backtesting engine"; - inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; + uv2nix.url = "github:pyproject-nix/uv2nix"; + uv2nix.inputs.nixpkgs.follows = "nixpkgs"; + pyproject-nix.url = "github:pyproject-nix/pyproject.nix"; + pyproject-nix.inputs.nixpkgs.follows = "nixpkgs"; + pyproject-build-systems.url = "github:pyproject-nix/build-system-pkgs"; + pyproject-build-systems.inputs.pyproject-nix.follows = "pyproject-nix"; + pyproject-build-systems.inputs.nixpkgs.follows = "nixpkgs"; }; outputs = { self, nixpkgs, flake-utils, + uv2nix, + pyproject-nix, + pyproject-build-systems, }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; - + lib = nixpkgs.lib; python = pkgs.python312; - pythonEnv = python.withPackages (ps: - with ps; [ - numpy - pandas - matplotlib - yfinance - # dev - ruff - streamlit - plotly - ]); - in { - devShells.default = pkgs.mkShell { - packages = [ - pythonEnv - pkgs.uv - pkgs.just - pkgs.ruff - ]; + workspace = uv2nix.lib.workspace.loadWorkspace {workspaceRoot = ./.;}; + overlay = workspace.mkPyprojectOverlay {sourcePreference = "wheel";}; + pythonSet = (pkgs.callPackage pyproject-nix.build.packages {inherit python;}).overrideScope ( + lib.composeManyExtensions [ + pyproject-build-systems.overlays.default + overlay + ] + ); + + venv = pythonSet.mkVirtualEnv "backtest-env" workspace.deps.default; + in { + packages.default = pkgs.stdenv.mkDerivation { + pname = "backtest"; + version = "0.1.0"; + src = ./.; + installPhase = '' + mkdir -p $out/bin $out/lib + cp -r . $out/lib/ + cat > $out/bin/backtest << EOF + #!/bin/sh + export PATH="${venv}/bin:\$PATH" + cd $out/lib + exec ${venv}/bin/streamlit run $out/lib/app.py \ + --browser.gatherUsageStats=false \ + --server.fileWatcherType=none \ + "\$@" + EOF + chmod +x $out/bin/backtest + ''; + }; + + devShells.default = pkgs.mkShell { + packages = [pkgs.uv pkgs.just pkgs.ruff venv]; shellHook = '' - echo "backtest dev shell — python $(python --version)" + echo "backtest dev shell" ''; }; - packages.default = pkgs.stdenv.mkDerivation { - pname = "backtest"; - version = "0.1.0"; - src = ./.; - nativeBuildInputs = [ pkgs.makeWrapper ]; - buildInputs = [ pythonEnv ]; - installPhase = '' - mkdir -p $out/bin $out/lib - cp -r . $out/lib/ - cat > $out/bin/backtest << EOF - #!/bin/sh - export PATH="${pythonEnv}/bin:\$PATH" - cd $out/lib - exec ${pythonEnv}/bin/streamlit run $out/lib/app.py \ - --browser.gatherUsageStats=false \ - --server.fileWatcherType=none \ - "\$@" - EOF - chmod +x $out/bin/backtest - ''; - }; }); } diff --git a/pyproject.toml b/pyproject.toml index 16c96b5..9b5a8fc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,3 +12,9 @@ dependencies = [ "streamlit>=1.56.0", "yfinance>=1.2.1", ] + +[tool.uv.extra-build-dependencies] +multitasking = ["setuptools"] + +[tool.setuptools] +packages = []