Skip to content

Commit 6ca4b71

Browse files
committed
python subpackage options for extras
1 parent 7633b48 commit 6ca4b71

2 files changed

Lines changed: 48 additions & 4 deletions

File tree

modules/kernels/python/default.nix

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
, settings
1111
, settingsSchema
12+
, subPackageSettingsSchema
1213
}:
1314

1415
with { inherit (settings) packages; };
@@ -23,11 +24,31 @@ let
2324
displayName = name + " " + python3.version;
2425
kernelName = "python3";
2526

26-
packageOptions = python3.pkgs;
27-
packageSearch = common.searcher packageOptions;
27+
packageOptionsBase = python3.pkgs;
28+
packageSearch = common.searcher packageOptionsBase;
29+
30+
# For makeEnvironment.nix's chooseMeta lookup: lazily add settingsSchema to packages
31+
# that have optional-dependencies, so the UI knows extras are available.
32+
# Nix's laziness means only actually-accessed packages get evaluated.
33+
packageOptions = lib.mapAttrs (_name: pkg:
34+
if (builtins.tryEval (pkg ? optional-dependencies && pkg.optional-dependencies != {})).value or false
35+
then pkg // { inherit subPackageSettingsSchema; settingsSchema = subPackageSettingsSchema; }
36+
else pkg
37+
) packageOptionsBase;
38+
39+
resolvePackage = p:
40+
let
41+
pname = common.packageName p;
42+
basePkg = builtins.getAttr pname packageOptionsBase;
43+
extras = if lib.isAttrs p then (p.extras or []) else [];
44+
extraPkgs = lib.concatMap (extra:
45+
basePkg.optional-dependencies.${extra} or []
46+
) extras;
47+
in [basePkg] ++ extraPkgs;
48+
2849
allPackages =
29-
[packageOptions.ipykernel packageOptions.ipywidgets]
30-
++ map (x: builtins.getAttr x packageOptions) (map common.packageName packages)
50+
[packageOptionsBase.ipykernel packageOptionsBase.ipywidgets]
51+
++ lib.concatMap resolvePackage packages
3152
;
3253

3354
pythonWithPackages = f: python3.withPackages (_: allPackages ++ f packageOptions);

modules/kernels/python/module.nix

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,30 @@ let
1313
example = "Package outputs to include";
1414
type = types.listOf types.str;
1515
};
16+
extras = mkOption {
17+
example = "Extras (optional-dependencies) to enable for the package";
18+
type = types.listOf types.str;
19+
default = [];
20+
};
1621
};
1722
};
1823

24+
subPackageEvaluated = lib.evalModules {
25+
modules = [
26+
{
27+
options = {
28+
subPackage = {
29+
extras = mkOption {
30+
example = "Extras (optional-dependencies) to enable for the package";
31+
type = types.listOf types.str;
32+
default = [];
33+
};
34+
};
35+
};
36+
}
37+
];
38+
};
39+
1940
mkOptions = packageOption: {
2041
enable = mkOption {
2142
example = "Enable Python 3 kernel";
@@ -162,6 +183,7 @@ in
162183

163184
settings = config.kernels.python3;
164185
settingsSchema = nixosOptionsToSettingsSchema { componentsToDrop = 2; } options.kernels.python3;
186+
subPackageSettingsSchema = nixosOptionsToSettingsSchema { componentsToDrop = 1; } subPackageEvaluated.options.subPackage;
165187
};
166188
})
167189

@@ -174,6 +196,7 @@ in
174196

175197
settings = config.kernels.pypy3;
176198
settingsSchema = nixosOptionsToSettingsSchema { componentsToDrop = 2; } options.kernels.pypy3;
199+
subPackageSettingsSchema = nixosOptionsToSettingsSchema { componentsToDrop = 1; } subPackageEvaluated.options.subPackage;
177200
};
178201
})
179202
];

0 commit comments

Comments
 (0)