1{ lib, gemConfig, ... }:
2rec {
3 bundlerFiles = {
4 gemfile ? null
5 , lockfile ? null
6 , gemset ? null
7 , gemdir ? null
8 , ...
9 }: {
10 inherit gemdir;
11
12 gemfile =
13 if gemfile == null then assert gemdir != null; gemdir + "/Gemfile"
14 else gemfile;
15
16 lockfile =
17 if lockfile == null then assert gemdir != null; gemdir + "/Gemfile.lock"
18 else lockfile;
19
20 gemset =
21 if gemset == null then assert gemdir != null; gemdir + "/gemset.nix"
22 else gemset;
23 };
24
25 filterGemset = {ruby, groups,...}@env: gemset: lib.filterAttrs (name: attrs: platformMatches ruby attrs && groupMatches groups attrs) gemset;
26
27 platformMatches = {rubyEngine, version, ...}@ruby: attrs: (
28 !(attrs ? "platforms") ||
29 builtins.length attrs.platforms == 0 ||
30 builtins.any (platform:
31 platform.engine == rubyEngine &&
32 (!(platform ? "version") || platform.version == version.majMin)
33 ) attrs.platforms
34 );
35
36 groupMatches = groups: attrs: (
37 !(attrs ? "groups") ||
38 builtins.any (gemGroup: builtins.any (group: group == gemGroup) groups) attrs.groups
39 );
40
41 applyGemConfigs = attrs:
42 (if gemConfig ? "${attrs.gemName}"
43 then attrs // gemConfig."${attrs.gemName}" attrs
44 else attrs);
45
46 genStubsScript = { lib, ruby, confFiles, bundler, groups, binPaths, ... }: ''
47 ${ruby}/bin/ruby ${./gen-bin-stubs.rb} \
48 "${ruby}/bin/ruby" \
49 "${confFiles}/Gemfile" \
50 "$out/${ruby.gemPath}" \
51 "${bundler}/${ruby.gemPath}" \
52 ${lib.escapeShellArg binPaths} \
53 ${lib.escapeShellArg groups}
54 '';
55
56 pathDerivation = { gemName, version, path, ... }:
57 let
58 res = {
59 type = "derivation";
60 bundledByPath = true;
61 name = gemName;
62 version = version;
63 outPath = path;
64 outputs = [ "out" ];
65 out = res;
66 outputName = "out";
67 };
68 in res;
69
70 composeGemAttrs = ruby: gems: name: attrs: ((removeAttrs attrs ["platforms"]) // {
71 inherit ruby;
72 inherit (attrs.source) type;
73 source = removeAttrs attrs.source ["type"];
74 gemName = name;
75 gemPath = map (gemName: gems."${gemName}") (attrs.dependencies or []);
76 });
77}