Merge pull request #51884 from alyssais/bundlerEnv-groups

bundlerEnv: improve handling of groups
This commit is contained in:
Alyssa Ross 2018-12-12 23:51:52 +00:00 committed by GitHub
commit b450083ee3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 9 deletions

View file

@ -94,6 +94,15 @@ rec {
attrValues = builtins.attrValues or (attrs: attrVals (attrNames attrs) attrs);
/* Given a set of attribute names, return the set of the corresponding
attributes from the given set.
Example:
getAttrs [ "a" "b" ] { a = 1; b = 2; c = 3; }
=> { a = 1; b = 2; }
*/
getAttrs = names: attrs: genAttrs names (name: attrs.${name});
/* Collect each attribute named `attr' from a list of attribute
sets. Sets that don't contain the named attribute are ignored.

View file

@ -61,10 +61,10 @@ let
boolToString mergeAttrs flip mapNullable inNixShell min max
importJSON warn info nixpkgsVersion version mod compare
splitByAndCompare functionArgs setFunctionArgs isFunction;
inherit (fixedPoints) fix fix' extends composeExtensions
inherit (fixedPoints) fix fix' converge extends composeExtensions
makeExtensible makeExtensibleWithCustomName;
inherit (attrsets) attrByPath hasAttrByPath setAttrByPath
getAttrFromPath attrVals attrValues catAttrs filterAttrs
getAttrFromPath attrVals attrValues getAttrs catAttrs filterAttrs
filterAttrsRecursive foldAttrs collect nameValuePair mapAttrs
mapAttrs' mapAttrsToList mapAttrsRecursive mapAttrsRecursiveCond
genAttrs isDerivation toDerivation optionalAttrs

View file

@ -24,6 +24,16 @@ rec {
# for a concrete example.
fix' = f: let x = f x // { __unfix__ = f; }; in x;
# Return the fixpoint that `f` converges to when called recursively, starting
# with the input `x`.
#
# nix-repl> converge (x: x / 2) 16
# 0
converge = f: x:
if (f x) == x
then x
else converge f (f x);
# Modify the contents of an explicitly recursive attribute set in a way that
# honors `self`-references. This is accomplished with a function
#

View file

@ -17,7 +17,7 @@
, postBuild ? null
, document ? []
, meta ? {}
, groups ? ["default"]
, groups ? null
, ignoreCollisions ? false
, buildInputs ? []
, ...

View file

@ -1,5 +1,10 @@
{ lib, gemConfig, ... }:
rec {
let
inherit (lib) attrValues concatMap converge filterAttrs getAttrs
intersectLists;
in rec {
bundlerFiles = {
gemfile ? null
, lockfile ? null
@ -22,7 +27,19 @@ rec {
else gemset;
};
filterGemset = {ruby, groups,...}: gemset: lib.filterAttrs (name: attrs: platformMatches ruby attrs && groupMatches groups attrs) 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") ||
@ -33,10 +50,9 @@ rec {
) attrs.platforms
);
groupMatches = groups: attrs: (
!(attrs ? "groups") ||
builtins.any (gemGroup: builtins.any (group: group == gemGroup) groups) attrs.groups
);
groupMatches = groups: attrs:
groups == null || !(attrs ? "groups") ||
(intersectLists (groups ++ [ "default" ]) attrs.groups) != [];
applyGemConfigs = attrs:
(if gemConfig ? "${attrs.gemName}"