From c765f680e3675faff57e05f41072616bac56b67a Mon Sep 17 00:00:00 2001 From: Judson Date: Sun, 19 Feb 2017 10:18:54 -0800 Subject: Updates to bundlerEnv --- .../ruby-modules/bundler-env/default.nix | 66 +++++++++++++++++----- 1 file changed, 52 insertions(+), 14 deletions(-) (limited to 'pkgs/development/ruby-modules/bundler-env/default.nix') 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; -- cgit 1.4.1