|
1 | | -# TODO: use uv2nix |
2 | 1 | { |
3 | 2 | inputs = { |
4 | 3 | nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; |
|
7 | 6 | inputs.nixpkgs.follows = "nixpkgs"; |
8 | 7 | }; |
9 | 8 |
|
| 9 | + uv = { |
| 10 | + url = "github:pyproject-nix/uv2nix"; |
| 11 | + inputs = { |
| 12 | + nixpkgs.follows = "nixpkgs"; |
| 13 | + pyproject-nix.follows = "pyproject"; |
| 14 | + }; |
| 15 | + }; |
| 16 | + |
| 17 | + build-systems = { |
| 18 | + url = "github:pyproject-nix/build-system-pkgs"; |
| 19 | + inputs = { |
| 20 | + uv2nix.follows = "uv"; |
| 21 | + nixpkgs.follows = "nixpkgs"; |
| 22 | + pyproject-nix.follows = "pyproject"; |
| 23 | + }; |
| 24 | + }; |
| 25 | + |
10 | 26 | pyproject = { |
11 | 27 | url = "github:pyproject-nix/pyproject.nix"; |
12 | 28 | inputs.nixpkgs.follows = "nixpkgs"; |
13 | 29 | }; |
14 | 30 | }; |
15 | 31 |
|
16 | 32 | outputs = { |
| 33 | + uv, |
17 | 34 | self, |
18 | 35 | hooks, |
19 | 36 | nixpkgs, |
20 | 37 | pyproject, |
| 38 | + build-systems, |
21 | 39 | ... |
22 | 40 | }: let |
23 | | - forAllSystems = function: |
24 | | - nixpkgs.lib.genAttrs [ |
25 | | - "x86_64-linux" |
26 | | - "aarch64-linux" |
27 | | - "x86_64-darwin" |
28 | | - "aarch64-darwin" |
29 | | - ] (system: function system nixpkgs.legacyPackages.${system}); |
| 41 | + inherit (nixpkgs) lib; |
30 | 42 |
|
31 | 43 | getPythonVersion = let |
32 | 44 | val = builtins.getEnv "PYTHON_VERSION"; |
|
37 | 49 | in |
38 | 50 | builtins.replaceStrings ["."] [""] result; |
39 | 51 |
|
40 | | - project = pyproject.lib.project.loadPyproject {projectRoot = ./.;}; |
| 52 | + workspace = uv.lib.workspace.loadWorkspace {workspaceRoot = ./.;}; |
| 53 | + overlay = workspace.mkPyprojectOverlay {sourcePreference = "wheel";}; |
| 54 | + |
| 55 | + forAllSystems = f: |
| 56 | + lib.genAttrs [ |
| 57 | + "x86_64-linux" |
| 58 | + "aarch64-linux" |
| 59 | + "x86_64-darwin" |
| 60 | + "aarch64-darwin" |
| 61 | + ] (system: |
| 62 | + f rec { |
| 63 | + inherit system; |
| 64 | + |
| 65 | + pkgs = nixpkgs.legacyPackages.${system}; |
| 66 | + python = pkgs."python${getPythonVersion}"; |
| 67 | + |
| 68 | + pythonSet = |
| 69 | + (pkgs.callPackage pyproject.build.packages {inherit python;}).overrideScope ( |
| 70 | + lib.composeManyExtensions [ |
| 71 | + build-systems.overlays.default |
| 72 | + overlay |
| 73 | + ] |
| 74 | + ); |
| 75 | + }); |
41 | 76 | in { |
42 | 77 | devShells = |
43 | | - forAllSystems (system: pkgs: let |
44 | | - python = pkgs."python${getPythonVersion}"; |
45 | | - arg = |
46 | | - project.renderers.withPackages { |
47 | | - inherit python project; |
48 | | - groups = ["test"]; |
49 | | - }; |
50 | | - |
51 | | - pyenv = python.withPackages arg; |
| 78 | + forAllSystems ({ |
| 79 | + pkgs, |
| 80 | + system, |
| 81 | + python, |
| 82 | + ... |
| 83 | + }: let |
52 | 84 | check = self.checks.${system}.pre-commit-check; |
53 | 85 | in { |
| 86 | + # note: impure, editable overlays in uv2nix are unstable |
54 | 87 | default = |
55 | 88 | pkgs.mkShell { |
56 | | - inherit (check) shellHook; |
57 | | - |
58 | | - packages = |
59 | | - check.enabledPackages |
60 | | - ++ [ |
61 | | - pyenv |
62 | | - pkgs.uv |
63 | | - ]; |
| 89 | + packages = check.enabledPackages ++ [python pkgs.uv]; |
| 90 | + env = |
| 91 | + { |
| 92 | + UV_PYTHON_DOWNLOADS = "never"; |
| 93 | + UV_PYTHON = python.interpreter; |
| 94 | + } |
| 95 | + // lib.optionalAttrs pkgs.stdenv.isLinux { |
| 96 | + LD_LIBRARY_PATH = lib.makeLibraryPath pkgs.pythonManylinuxPackages.manylinux1; |
| 97 | + }; |
64 | 98 | }; |
| 99 | + |
| 100 | + shellHook = |
| 101 | + '' |
| 102 | + unset PYTHONPATH |
| 103 | + '' |
| 104 | + ++ check.shellHook; |
65 | 105 | }); |
66 | 106 |
|
67 | 107 | packages = |
68 | | - forAllSystems (system: pkgs: let |
69 | | - python = pkgs."python${getPythonVersion}"; |
70 | | - attrs = project.renderers.buildPythonPackage {inherit python project;}; |
71 | | - in rec { |
72 | | - default = python.pkgs.buildPythonPackage attrs; |
73 | | - wheel = default.dist; |
| 108 | + forAllSystems ({pythonSet, ...}: { |
| 109 | + default = pythonSet.mkVirtualEnv "proselint-env" workspace.deps.default; |
| 110 | + |
| 111 | + wheel = |
| 112 | + pythonSet.proselint.override { |
| 113 | + pyprojectHook = pythonSet.pyprojectDistHook; |
| 114 | + }; |
| 115 | + |
| 116 | + sdist = |
| 117 | + (pythonSet.proselint.override { |
| 118 | + pyprojectHook = pythonSet.pyprojectDistHook; |
| 119 | + }).overrideAttrs (old: { |
| 120 | + env.uvBuildType = "sdist"; |
| 121 | + }); |
74 | 122 | }); |
75 | 123 |
|
76 | 124 | apps = |
77 | | - forAllSystems (system: _: { |
| 125 | + forAllSystems ({system, ...}: { |
78 | 126 | default = { |
79 | 127 | type = "app"; |
80 | 128 | program = "${self.packages.${system}.default}/bin/proselint"; |
81 | 129 | }; |
82 | 130 | }); |
83 | 131 |
|
84 | 132 | checks = |
85 | | - forAllSystems (system: pkgs: { |
| 133 | + forAllSystems ({ |
| 134 | + system, |
| 135 | + pkgs, |
| 136 | + ... |
| 137 | + }: { |
86 | 138 | pre-commit-check = |
87 | 139 | hooks.lib.${system}.run { |
88 | 140 | src = ./.; |
|
0 commit comments