1{
2 lib,
3 stdenv,
4 python3,
5}:
6
7let
8
9 default = {
10 python3 =
11 let
12 env = (python3.withPackages (ps: with ps; [ ipykernel ]));
13 in
14 {
15 displayName = "Python 3";
16 argv = [
17 env.interpreter
18 "-m"
19 "ipykernel_launcher"
20 "-f"
21 "{connection_file}"
22 ];
23 language = "python";
24 logo32 = "${env}/${env.sitePackages}/ipykernel/resources/logo-32x32.png";
25 logo64 = "${env}/${env.sitePackages}/ipykernel/resources/logo-64x64.png";
26 };
27 };
28
29in
30{
31 inherit default;
32
33 # Definitions is an attribute set.
34
35 create =
36 {
37 definitions ? default,
38 }:
39 stdenv.mkDerivation {
40
41 name = "jupyter-kernels";
42
43 src = "/dev/null";
44
45 unpackCmd = "mkdir jupyter_kernels";
46
47 installPhase = ''
48 mkdir kernels
49
50 ${lib.concatStringsSep "\n" (
51 lib.mapAttrsToList (
52 kernelName: unfilteredKernel:
53 let
54 allowedKernelKeys = [
55 "argv"
56 "displayName"
57 "language"
58 "interruptMode"
59 "env"
60 "metadata"
61 "logo32"
62 "logo64"
63 "extraPaths"
64 ];
65 kernel = lib.filterAttrs (n: v: (lib.any (x: x == n) allowedKernelKeys)) unfilteredKernel;
66 config = builtins.toJSON (
67 kernel
68 // {
69 display_name = if (kernel.displayName != "") then kernel.displayName else kernelName;
70 }
71 // (lib.optionalAttrs (kernel ? interruptMode) { interrupt_mode = kernel.interruptMode; })
72 );
73 extraPaths =
74 kernel.extraPaths or { }
75 // lib.optionalAttrs (kernel.logo32 != null) { "logo-32x32.png" = kernel.logo32; }
76 // lib.optionalAttrs (kernel.logo64 != null) { "logo-64x64.png" = kernel.logo64; };
77 linkExtraPaths = lib.mapAttrsToList (
78 name: value: "ln -s ${value} 'kernels/${kernelName}/${name}';"
79 ) extraPaths;
80 in
81 ''
82 mkdir 'kernels/${kernelName}';
83 echo '${config}' > 'kernels/${kernelName}/kernel.json';
84 ${lib.concatStringsSep "\n" linkExtraPaths}
85 ''
86 ) definitions
87 )}
88
89 mkdir $out
90 cp -r kernels $out
91 '';
92
93 meta = {
94 description = "Wrapper to create jupyter notebook kernel definitions";
95 homepage = "https://jupyter.org/";
96 maintainers = with lib.maintainers; [ aborsu ];
97 };
98 };
99}