70 lines
1.9 KiB
Nix
70 lines
1.9 KiB
Nix
{ ruby, lib, callPackage, gemFixes, fetchurl, fetchgit, buildRubyGem }@defs:
|
|
|
|
# This function builds a set of gems. You first convert your Gemfile to an attrset
|
|
# called a "gemset", and then use this function to build the gemset.
|
|
#
|
|
# A gemset looks like the following:
|
|
#
|
|
# {
|
|
# libv8 = {
|
|
# version = "3.16.14.7";
|
|
# src = {
|
|
# type = "gem";
|
|
# sha256 = "...";
|
|
# };
|
|
# };
|
|
# therubyracer = {
|
|
# version = "0.12.1";
|
|
# dependencies = [ "libv8" ];
|
|
# src = {
|
|
# type = "gem";
|
|
# sha256 = "...";
|
|
# };
|
|
# };
|
|
# }
|
|
#
|
|
# If you use these gems as build inputs, the GEM_PATH will be updated
|
|
# appropriately, and command like `bundle exec` should work out of the box.
|
|
|
|
{ gemset, ruby ? defs.ruby, fixes ? gemFixes }@args:
|
|
|
|
let
|
|
const = x: y: x;
|
|
|
|
fetchers.path = attrs: attrs.src.path;
|
|
fetchers.gem = attrs: fetchurl {
|
|
url = "${attrs.src.source or "https://rubygems.org"}/downloads/${attrs.name}-${attrs.version}.gem";
|
|
inherit (attrs.src) sha256;
|
|
};
|
|
fetchers.git = attrs: fetchgit {
|
|
inherit (attrs.src) url rev sha256 fetchSubmodules;
|
|
leaveDotGit = true;
|
|
};
|
|
|
|
instantiate = (attrs:
|
|
let
|
|
defaultAttrs = {
|
|
name = "${attrs.name}-${attrs.version}";
|
|
inherit ruby gemPath;
|
|
};
|
|
gemPath = map (name: gemset''."${name}") (attrs.dependencies or []);
|
|
fixedAttrs = attrs // (fixes."${attrs.name}" or (const {})) attrs;
|
|
withSource = fixedAttrs //
|
|
(if (lib.isDerivation fixedAttrs.src || builtins.isString fixedAttrs.src)
|
|
then {}
|
|
else { src = (fetchers."${fixedAttrs.src.type}" fixedAttrs); });
|
|
|
|
in
|
|
buildRubyGem (withSource // defaultAttrs)
|
|
);
|
|
|
|
gemset' = if builtins.isAttrs gemset then gemset else import gemset;
|
|
|
|
gemset'' = lib.flip lib.mapAttrs gemset' (name: attrs:
|
|
if (lib.isDerivation attrs)
|
|
then attrs
|
|
else instantiate (attrs // { inherit name; })
|
|
);
|
|
|
|
in gemset''
|