26053cae74
"default" isn't really a group, it's more the absence of one. With Bundler, this means that a gem should be installed unconditionally, regardless of which groups are specified. It doesn't really make sense to allow these gems to be omitted from a bundlerEnv.
93 lines
2.5 KiB
Nix
93 lines
2.5 KiB
Nix
{ lib, gemConfig, ... }:
|
|
|
|
let
|
|
inherit (lib) attrValues concatMap converge filterAttrs getAttrs
|
|
intersectLists;
|
|
|
|
in rec {
|
|
bundlerFiles = {
|
|
gemfile ? null
|
|
, lockfile ? null
|
|
, gemset ? null
|
|
, gemdir ? null
|
|
, ...
|
|
}: {
|
|
inherit gemdir;
|
|
|
|
gemfile =
|
|
if gemfile == null then assert gemdir != null; gemdir + "/Gemfile"
|
|
else gemfile;
|
|
|
|
lockfile =
|
|
if lockfile == null then assert gemdir != null; gemdir + "/Gemfile.lock"
|
|
else lockfile;
|
|
|
|
gemset =
|
|
if gemset == null then assert gemdir != null; gemdir + "/gemset.nix"
|
|
else gemset;
|
|
};
|
|
|
|
filterGemset = { ruby, groups, ... }: gemset:
|
|
let
|
|
platformGems = filterAttrs (_: platformMatches ruby) gemset;
|
|
directlyMatchingGems = filterAttrs (_: groupMatches groups) platformGems;
|
|
|
|
expandDependencies = gems:
|
|
let
|
|
depNames = concatMap (gem: gem.dependencies or []) (attrValues gems);
|
|
deps = getAttrs depNames platformGems;
|
|
in
|
|
gems // deps;
|
|
in
|
|
converge expandDependencies directlyMatchingGems;
|
|
|
|
platformMatches = {rubyEngine, version, ...}: attrs: (
|
|
!(attrs ? "platforms") ||
|
|
builtins.length attrs.platforms == 0 ||
|
|
builtins.any (platform:
|
|
platform.engine == rubyEngine &&
|
|
(!(platform ? "version") || platform.version == version.majMin)
|
|
) attrs.platforms
|
|
);
|
|
|
|
groupMatches = groups: attrs:
|
|
groups == null || !(attrs ? "groups") ||
|
|
(intersectLists (groups ++ [ "default" ]) attrs.groups) != [];
|
|
|
|
applyGemConfigs = attrs:
|
|
(if gemConfig ? "${attrs.gemName}"
|
|
then attrs // gemConfig."${attrs.gemName}" attrs
|
|
else attrs);
|
|
|
|
genStubsScript = { lib, ruby, confFiles, bundler, groups, binPaths, ... }: ''
|
|
${ruby}/bin/ruby ${./gen-bin-stubs.rb} \
|
|
"${ruby}/bin/ruby" \
|
|
"${confFiles}/Gemfile" \
|
|
"$out/${ruby.gemPath}" \
|
|
"${bundler}/${ruby.gemPath}" \
|
|
${lib.escapeShellArg binPaths} \
|
|
${lib.escapeShellArg groups}
|
|
'';
|
|
|
|
pathDerivation = { gemName, version, path, ... }:
|
|
let
|
|
res = {
|
|
type = "derivation";
|
|
bundledByPath = true;
|
|
name = gemName;
|
|
version = version;
|
|
outPath = path;
|
|
outputs = [ "out" ];
|
|
out = res;
|
|
outputName = "out";
|
|
};
|
|
in res;
|
|
|
|
composeGemAttrs = ruby: gems: name: attrs: ((removeAttrs attrs ["platforms"]) // {
|
|
inherit ruby;
|
|
inherit (attrs.source) type;
|
|
source = removeAttrs attrs.source ["type"];
|
|
gemName = name;
|
|
gemPath = map (gemName: gems."${gemName}") (attrs.dependencies or []);
|
|
});
|
|
}
|