87 lines
2.3 KiB
Nix
87 lines
2.3 KiB
Nix
{
|
|
pkgs,
|
|
prev,
|
|
lib,
|
|
forFlakeOutputs ? false,
|
|
forPythonScope ? false,
|
|
...
|
|
}:
|
|
let
|
|
dirs = path: lib.attrNames (lib.filterAttrs (_: t: t == "directory") (builtins.readDir path));
|
|
pythonPackagesDir = ./by-category/pythonPackages;
|
|
|
|
packagesFromTree =
|
|
base: callPackage:
|
|
lib.foldl' (
|
|
acc: shorthand:
|
|
let
|
|
shorthandDir = base + "/${shorthand}";
|
|
names = dirs shorthandDir;
|
|
|
|
addOne =
|
|
name:
|
|
let
|
|
pkgDir = shorthandDir + "/${name}";
|
|
defaultFile = pkgDir + "/default.nix";
|
|
imported = builtins.tryEval (import defaultFile);
|
|
in
|
|
if !builtins.pathExists defaultFile || !imported.success then
|
|
{ }
|
|
else if builtins.isFunction imported.value then
|
|
{ ${name} = callPackage defaultFile { }; }
|
|
else if lib.isDerivation imported.value then
|
|
{ ${name} = imported.value; }
|
|
else
|
|
{ };
|
|
in
|
|
acc // lib.foldl' (a: n: a // addOne n) { } names
|
|
) { } (dirs base);
|
|
|
|
byNamePkgs =
|
|
if builtins.pathExists ./by-name then packagesFromTree ./by-name pkgs.callPackage else { };
|
|
|
|
byCategoryPkgs = import ./by-category {
|
|
inherit
|
|
pkgs
|
|
prev
|
|
lib
|
|
packagesFromTree
|
|
;
|
|
};
|
|
|
|
overlayAttrs = byNamePkgs // byCategoryPkgs;
|
|
directFlakePackages = lib.filterAttrs (_: lib.isDerivation) overlayAttrs;
|
|
|
|
flakePythonPackages =
|
|
let
|
|
pyPkgs = if pkgs ? python313Packages then pkgs.python313Packages else pkgs.python3Packages;
|
|
treePkgs =
|
|
if builtins.pathExists pythonPackagesDir then
|
|
removeAttrs (packagesFromTree pythonPackagesDir pyPkgs.callPackage) [
|
|
"python-packages"
|
|
]
|
|
else
|
|
{ };
|
|
prefabPkgs =
|
|
if builtins.pathExists (pythonPackagesDir + "/prefab-builder.nix") then
|
|
prev.lib.customisation.callPackagesWith (
|
|
pyPkgs
|
|
// {
|
|
lib = prev.lib;
|
|
pkgs = prev;
|
|
pyPkgs = pyPkgs;
|
|
fetchFromGitHub = prev.fetchFromGitHub;
|
|
fetchPypi = prev.fetchPypi;
|
|
}
|
|
) (pythonPackagesDir + "/prefab-builder.nix") { }
|
|
else
|
|
{ };
|
|
in
|
|
treePkgs // prefabPkgs;
|
|
in
|
|
if forPythonScope then
|
|
flakePythonPackages
|
|
else if forFlakeOutputs then
|
|
directFlakePackages
|
|
else
|
|
overlayAttrs
|