about summary refs log tree commit diff
path: root/pkgs/development/ruby-modules/bundler-env/default.nix
diff options
context:
space:
mode:
authorJudson <nyarly@gmail.com>2017-02-19 10:18:54 -0800
committerJudson <nyarly@gmail.com>2017-02-19 10:18:54 -0800
commitc765f680e3675faff57e05f41072616bac56b67a (patch)
treeda63e5cd67fb07dfbd24c01d906b854ac446855b /pkgs/development/ruby-modules/bundler-env/default.nix
parent13d6681ce72ac265f03013247f60ab3d001779e0 (diff)
downloadnixlib-c765f680e3675faff57e05f41072616bac56b67a.tar
nixlib-c765f680e3675faff57e05f41072616bac56b67a.tar.gz
nixlib-c765f680e3675faff57e05f41072616bac56b67a.tar.bz2
nixlib-c765f680e3675faff57e05f41072616bac56b67a.tar.lz
nixlib-c765f680e3675faff57e05f41072616bac56b67a.tar.xz
nixlib-c765f680e3675faff57e05f41072616bac56b67a.tar.zst
nixlib-c765f680e3675faff57e05f41072616bac56b67a.zip
Updates to bundlerEnv
Diffstat (limited to 'pkgs/development/ruby-modules/bundler-env/default.nix')
-rw-r--r--pkgs/development/ruby-modules/bundler-env/default.nix66
1 files changed, 52 insertions, 14 deletions
diff --git a/pkgs/development/ruby-modules/bundler-env/default.nix b/pkgs/development/ruby-modules/bundler-env/default.nix
index 57ca23d41436..e82a6af0085e 100644
--- a/pkgs/development/ruby-modules/bundler-env/default.nix
+++ b/pkgs/development/ruby-modules/bundler-env/default.nix
@@ -46,11 +46,20 @@ let
 
   importedGemset = import gemset';
 
-  filteredGemset = (lib.filterAttrs (name: attrs:
-    if (builtins.hasAttr "groups" attrs)
-    then (builtins.any (gemGroup: builtins.any (group: group == gemGroup) groups) attrs.groups)
-    else true
-  ) importedGemset);
+  platformMatches = attrs: (
+  !(attrs ? "platforms") ||
+    builtins.any (platform:
+      platform.engine == ruby.rubyEngine &&
+        (!(platform ? "version") || platform.version == ruby.version.majMin)
+    ) attrs.platforms
+  );
+
+  groupMatches = attrs: (
+  !(attrs ? "groups") ||
+    builtins.any (gemGroup: builtins.any (group: group == gemGroup) groups) attrs.groups
+  );
+
+  filteredGemset = lib.filterAttrs (name: attrs: platformMatches attrs && groupMatches attrs) importedGemset;
 
   applyGemConfigs = attrs:
     (if gemConfig ? "${attrs.gemName}"
@@ -67,25 +76,54 @@ let
     if hasBundler then gems.bundler
     else defs.bundler.override (attrs: { inherit ruby; });
 
-  gems = lib.flip lib.mapAttrs configuredGemset (name: attrs:
-    buildRubyGem ((removeAttrs attrs ["source"]) // attrs.source // {
-      inherit ruby;
-      gemName = name;
-      gemPath = map (gemName: gems."${gemName}") (attrs.dependencies or []);
-    }));
+  pathDerivation = {
+    usesGemspec ? false, ...
+  }@attrs:
+    let
+      res = {
+          inherit usesGemspec;
+          type = "derivation";
+          name = attrs.gemName;
+          version = attrs.version;
+          outPath = attrs.path;
+          outputs = [ "out" ];
+          out = res;
+          outputName = "out";
+        };
+    in res;
+
+  buildGem = name: attrs: (
+    let
+      gemAttrs = ((removeAttrs attrs ["source"]) // attrs.source // {
+        inherit ruby;
+        gemName = name;
+        gemPath = map (gemName: gems."${gemName}") (attrs.dependencies or []);
+      });
+    in
+    if gemAttrs.type == "path" then pathDerivation gemAttrs
+    else buildRubyGem gemAttrs);
+
+  gems = lib.flip lib.mapAttrs configuredGemset (name: attrs: buildGem name attrs);
+
+  maybeCopyAll = { usesGemspec ? false, ...}@main:
+  (if usesGemspec then ''
+  cp -a ${gemdir}/* $out/
+  '' else ""
+  );
 
   # We have to normalize the Gemfile.lock, otherwise bundler tries to be
   # helpful by doing so at run time, causing executables to immediately bail
   # out. Yes, I'm serious.
   confFiles = runCommand "gemfile-and-lockfile" {} ''
     mkdir -p $out
-    cp ${gemfile'} $out/Gemfile
-    cp ${lockfile'} $out/Gemfile.lock
+    ${maybeCopyAll mainGem}
+    cp ${gemfile'} $out/Gemfile || ls -l $out/Gemfile
+    cp ${lockfile'} $out/Gemfile.lock || ls -l $out/Gemfile.lock
   '';
 
   envPaths = lib.attrValues gems ++ lib.optional (!hasBundler) bundler;
 
-  binPaths = if mainGem != null then [ mainGem ] else envPaths;
+  binPaths = if mainGem != null then [ mainGem ] ++ envPaths else envPaths;
 
   bundlerEnv = buildEnv {
     inherit ignoreCollisions;