feat(devshell): add language tools conditionally based on cats

- Extract mkWrapperConfig to share cats/settings between package and devshell
- Add python, R, julia, and markdown packages to devShells when their cats are enabled
- Reuse same package construction logic as specs/deps.nix for consistency
- Keep lang_packages overridable via lib.mkDefault for downstream flakes
This commit is contained in:
Daniel Winkler 2026-05-03 16:35:56 +10:00
commit e9c99811d4

102
flake.nix
View file

@ -36,30 +36,24 @@
wrappers, wrappers,
... ...
} @ inputs: let } @ inputs: let
wrapperSettings = pkgs: let mkWrapperConfig = pkgs: {
def = pkgs.lib.mkDefault;
in
wrapper.config.wrap {
inherit pkgs;
cats = { cats = {
clickhouse = def false; clickhouse = false;
gitPlugins = def true; gitPlugins = true;
julia = def false; julia = false;
lua = def true; lua = true;
markdown = def false; markdown = false;
nix = def true; nix = true;
optional = def false; optional = false;
python = def false; python = false;
r = def false; r = false;
}; };
settings = { settings = {
lang_packages = { lang_packages = {
python = with pkgs.python3Packages; [ python = with pkgs.python3Packages; [
duckdb duckdb
polars polars
]; ];
r = with pkgs.rpkgs.rPackages; [ r = with pkgs.rpkgs.rPackages; [
arrow arrow
broom broom
@ -67,14 +61,33 @@
janitor janitor
styler styler
]; ];
julia = ["DataFramesMeta" "QuackIO"]; julia = ["DataFramesMeta" "QuackIO"];
}; };
colorscheme = def "cyberdream"; colorscheme = "cyberdream";
background = def "dark"; background = "dark";
wrapRc = def true; wrapRc = true;
}; };
binName = def "vv"; binName = "vv";
};
wrapperSettings = pkgs: let
cfg = mkWrapperConfig pkgs;
def = pkgs.lib.mkDefault;
in
wrapper.config.wrap {
inherit pkgs;
cats = pkgs.lib.mapAttrs (_: v: def v) cfg.cats;
settings = {
lang_packages = {
python = def cfg.settings.lang_packages.python;
r = def cfg.settings.lang_packages.r;
julia = def cfg.settings.lang_packages.julia;
};
colorscheme = def cfg.settings.colorscheme;
background = def cfg.settings.background;
wrapRc = def cfg.settings.wrapRc;
};
binName = def cfg.binName;
}; };
systems = [ systems = [
@ -146,12 +159,55 @@
devShells = forAllSystems ( devShells = forAllSystems (
system: let system: let
pkgs = mkPkgs system; pkgs = mkPkgs system;
cfg = mkWrapperConfig pkgs;
nvimPkg = wrapperSettings pkgs; nvimPkg = wrapperSettings pkgs;
pythonPackages = let
python_packages_fn =
if pkgs ? basePythonPackages
then ps: pkgs.basePythonPackages ps ++ cfg.settings.lang_packages.python
else _: cfg.settings.lang_packages.python;
in
with pkgs; [
(python3.withPackages python_packages_fn)
nodejs
ruff
basedpyright
uv
];
rPackages = let
r_packages = (pkgs.baseRPackages or []) ++ cfg.settings.lang_packages.r;
in
with pkgs; [
(rWrapper.override {packages = r_packages;})
radianWrapper
(quarto.override {extraRPackages = r_packages;})
air-formatter
yaml-language-server
updateR
];
juliaPackages = let
julia_with_packages = pkgs.julia-bin.withPackages cfg.settings.lang_packages.julia;
in [julia_with_packages];
markdownPackages = with pkgs; [
python313Packages.pylatexenc
quarto
zk
];
shellPackages = [nvimPkg]
++ pkgs.lib.optionals cfg.cats.python pythonPackages
++ pkgs.lib.optionals cfg.cats.r rPackages
++ pkgs.lib.optionals cfg.cats.julia juliaPackages
++ pkgs.lib.optionals cfg.cats.markdown markdownPackages;
in { in {
default = pkgs.mkShell { default = pkgs.mkShell {
name = "vShell"; name = "vShell";
packages = [nvimPkg]; packages = shellPackages;
nativeBuildInputs = with pkgs; [] ++ (pkgs.lib.optionals self.wrappers.default.cats.optional [devenv]); nativeBuildInputs = with pkgs; [] ++ (pkgs.lib.optionals cfg.cats.optional [devenv]);
inputsFrom = []; inputsFrom = [];
shellHook = ""; shellHook = "";
}; };