From 99b21b8870f43eedf697bc03a2bf235aa8003ab1 Mon Sep 17 00:00:00 2001 From: adisbladis Date: Fri, 22 Nov 2024 00:04:52 +0000 Subject: [PATCH] ruff: Build as a standalone without Python Using `buildPythonPackage` make `ruff` propagate the Python used for the build, which might not be the same Python as you want in your development shell. https://github.com/NixOS/nixpkgs/pull/350654 changed the ruff top-level attribute to be built with Python modules. This doesn't actually make much sense, we have versioned Python sets, and including just the one Python in the top-level package isn't helpful, and causes issues downstream related to PATH & PYTHONPATH. See my related [uv PR](https://github.com/NixOS/nixpkgs/pull/357113#issue-2670270577). --- pkgs/by-name/ru/ruff-lsp/package.nix | 2 +- pkgs/by-name/ru/ruff/package.nix | 57 ++++++------------- .../python-modules/ruff/default.nix | 35 ++++++++++++ pkgs/top-level/python-packages.nix | 4 +- 4 files changed, 54 insertions(+), 44 deletions(-) create mode 100644 pkgs/development/python-modules/ruff/default.nix diff --git a/pkgs/by-name/ru/ruff-lsp/package.nix b/pkgs/by-name/ru/ruff-lsp/package.nix index 97b905e340c3c..6214bb2d9332d 100644 --- a/pkgs/by-name/ru/ruff-lsp/package.nix +++ b/pkgs/by-name/ru/ruff-lsp/package.nix @@ -36,7 +36,7 @@ python3Packages.buildPythonApplication rec { pytestCheckHook pytest-asyncio python-lsp-jsonrpc - ruff.bin + ruff versionCheckHook ]; versionCheckProgramArg = [ "--version" ]; diff --git a/pkgs/by-name/ru/ruff/package.nix b/pkgs/by-name/ru/ruff/package.nix index c9e2e78427f2c..662b7409ec8ec 100644 --- a/pkgs/by-name/ru/ruff/package.nix +++ b/pkgs/by-name/ru/ruff/package.nix @@ -1,11 +1,12 @@ { lib, stdenv, - python3Packages, - fetchFromGitHub, rustPlatform, + fetchFromGitHub, installShellFiles, + rust-jemalloc-sys, + buildPackages, versionCheckHook, # passthru @@ -14,15 +15,9 @@ nix-update-script, }: -python3Packages.buildPythonPackage rec { +rustPlatform.buildRustPackage rec { pname = "ruff"; version = "0.8.4"; - pyproject = true; - - outputs = [ - "bin" - "out" - ]; src = fetchFromGitHub { owner = "astral-sh"; @@ -31,46 +26,29 @@ python3Packages.buildPythonPackage rec { hash = "sha256-c5d2XaoEjCHWMdjTLD6CnwP8rpSXTUrmKSs0QWQ6UG0="; }; - # Do not rely on path lookup at runtime to find the ruff binary - postPatch = '' - substituteInPlace python/ruff/__main__.py \ - --replace-fail \ - 'ruff_exe = "ruff" + sysconfig.get_config_var("EXE")' \ - 'return "${placeholder "bin"}/bin/ruff"' - ''; + useFetchCargoVendor = true; + cargoHash = "sha256-jbUjsIJRpkKYc+qHN8tkcZrcjPTFJfdCsatezzdX4Ss="; - cargoDeps = rustPlatform.fetchCargoVendor { - inherit pname version src; - hash = "sha256-jbUjsIJRpkKYc+qHN8tkcZrcjPTFJfdCsatezzdX4Ss="; - }; - - nativeBuildInputs = - [ installShellFiles ] - ++ (with rustPlatform; [ - cargoSetupHook - maturinBuildHook - cargoCheckHook - ]); + nativeBuildInputs = [ installShellFiles ]; buildInputs = [ rust-jemalloc-sys ]; postInstall = + let + emulator = stdenv.hostPlatform.emulator buildPackages; + in '' - mkdir -p $bin/bin - mv $out/bin/ruff $bin/bin/ - rmdir $out/bin - '' - + lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) '' installShellCompletion --cmd ruff \ - --bash <($bin/bin/ruff generate-shell-completion bash) \ - --fish <($bin/bin/ruff generate-shell-completion fish) \ - --zsh <($bin/bin/ruff generate-shell-completion zsh) + --bash <(${emulator} $out/bin/ruff generate-shell-completion bash) \ + --fish <(${emulator} $out/bin/ruff generate-shell-completion fish) \ + --zsh <(${emulator} $out/bin/ruff generate-shell-completion zsh) ''; # Run cargo tests - cargoCheckType = "debug"; + checkType = "debug"; + # tests do not appear to respect linker options on doctests # Upstream issue: https://github.com/rust-lang/cargo/issues/14189 # This causes errors like "error: linker `cc` not found" on static builds @@ -106,12 +84,11 @@ python3Packages.buildPythonPackage rec { "--skip=unix::symlink_inside_workspace" ]; - nativeCheckInputs = [ + nativeInstallCheckInputs = [ versionCheckHook ]; versionCheckProgramArg = [ "--version" ]; - - pythonImportsCheck = [ "ruff" ]; + doInstallCheck = true; passthru = { tests = diff --git a/pkgs/development/python-modules/ruff/default.nix b/pkgs/development/python-modules/ruff/default.nix new file mode 100644 index 0000000000000..adf7dccfa85f6 --- /dev/null +++ b/pkgs/development/python-modules/ruff/default.nix @@ -0,0 +1,35 @@ +{ + buildPythonPackage, + pkgs, + rustPlatform, + installShellFiles, +}: + +buildPythonPackage { + inherit (pkgs.ruff) + pname + version + src + cargoDeps + postInstall + meta + ; + + # Do not rely on path lookup at runtime to find the ruff binary + postPatch = '' + substituteInPlace python/ruff/__main__.py \ + --replace-fail \ + 'ruff_exe = "ruff" + sysconfig.get_config_var("EXE")' \ + 'return "${placeholder "bin"}/bin/ruff"' + ''; + + pyproject = true; + + nativeBuildInputs = [ + installShellFiles + rustPlatform.cargoSetupHook + rustPlatform.maturinBuildHook + ]; + + pythonImportsCheck = [ "ruff" ]; +} diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 1a026f7d4d414..87b860855f5d9 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -14282,9 +14282,7 @@ self: super: with self; { rubymarshal = callPackage ../development/python-modules/rubymarshal { }; - ruff = toPythonModule (pkgs.ruff.override { - python3Packages = self; - }); + ruff = callPackage ../development/python-modules/ruff { }; ruff-api = callPackage ../development/python-modules/ruff-api { };