Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion modules/kernels/python/kernel.nix
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ common.makeJupyterKernel (
displayName = displayName;
language = kernelName;
argv = [
"${python}/bin/python"
# PyPy environments name the binary pypy3, so take the path the environment reports.
python.interpreter
"-m"
"ipykernel"
"-f"
Expand Down
22 changes: 21 additions & 1 deletion modules/kernels/python/module.nix
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,27 @@ in
config.pkgs.callPackage ./. {
name = "PyPy";

python3 = lib.getAttr config.kernels.pypy3.python3Package config.pkgs;
python3 = (lib.getAttr config.kernels.pypy3.python3Package config.pkgs).override {
packageOverrides = pyFinal: pyPrev:
# Test suites are the main thing standing between PyPy and a working kernel: a
# package unsupported on PyPy throws when its outPath is evaluated even as a mere
# check input, and several check inputs are C extensions that don't compile here.
(lib.mapAttrs (_name: value:
let isPythonPackage = builtins.tryEval (lib.isDerivation value && value ? overridePythonAttrs);
in if isPythonPackage.success && isPythonPackage.value
then value.overridePythonAttrs (_: { doCheck = false; })
else value
) pyPrev)
// {
# On PyPy, pyzmq builds and runs against cffi rather than Cython, but nixpkgs
# only wires up the Cython path.
pyzmq = pyPrev.pyzmq.overridePythonAttrs (old: {
doCheck = false;
build-system = (old.build-system or []) ++ [ pyFinal.cffi pyFinal.pycparser ];
dependencies = (old.dependencies or []) ++ [ pyFinal.cffi pyFinal.pycparser ];
});
};
};

settings = config.kernels.pypy3;
settingsSchema = nixosOptionsToSettingsSchema { componentsToDrop = 2; } options.kernels.pypy3;
Expand Down
7 changes: 1 addition & 6 deletions sample_environments/pypy3.nix
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,5 @@
codedown.makeEnvironment {
name = "pypy3";

# kernels.pypy3.enable = true;
# kernels.pypy3.packages = [
# "matplotlib"
# "scipy"
# "rope"
# ];
kernels.pypy3.enable = true;
}
22 changes: 21 additions & 1 deletion tests/app/Spec/Tests/Python.hs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ tests = describe "Python" $ parallel $ do
tests' ("python3", "python313")
-- tests' ("python3", "python314")

-- tests' ("pypy3", "pypy3")
pypyTests

tests' :: (Text, Text) -> LanguageSpec
tests' (kernelName, pythonPackage) = introduceNixEnvironment [kernelSpec kernelName pythonPackage] [] [i|Python (#{pythonPackage})|] $ introduceJupyterRunner $ do
Expand Down Expand Up @@ -72,6 +72,26 @@ tests' (kernelName, pythonPackage) = introduceNixEnvironment [kernelSpec kernelN
assertDiagnosticRanges diagnostics []


-- | Nixpkgs carries far less for PyPy than for CPython, so this covers the kernel itself
-- rather than the package and language server stack the CPython tests exercise.
pypyTests :: LanguageSpec
pypyTests = introduceNixEnvironment [pypyKernelSpec] [] "Python (pypy3)" $ introduceJupyterRunner $ do
testHasExpectedFields "pypy3"

testKernelStdout "pypy3" [i|print("hi")|] "hi\n"
testKernelStdout "pypy3" [i|import platform; print(platform.python_implementation())|] "PyPy\n"

pypyKernelSpec :: NixKernelSpec
pypyKernelSpec = NixKernelSpec {
nixKernelName = "pypy3"
, nixKernelChannel = "codedown"
, nixKernelDisplayName = Just "PyPy"
, nixKernelPackages = []
, nixKernelMeta = Nothing
, nixKernelIcon = Nothing
, nixKernelExtraConfig = Nothing
}

kernelSpec :: Text -> Text -> NixKernelSpec
kernelSpec kernelName pythonPackage = NixKernelSpec {
nixKernelName = kernelName
Expand Down
Loading