diff options
Diffstat (limited to 'pkgs/development/interpreters/ruby/load-ruby-env.nix')
-rw-r--r-- | pkgs/development/interpreters/ruby/load-ruby-env.nix | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/pkgs/development/interpreters/ruby/load-ruby-env.nix b/pkgs/development/interpreters/ruby/load-ruby-env.nix new file mode 100644 index 00000000000..c4356ed5f50 --- /dev/null +++ b/pkgs/development/interpreters/ruby/load-ruby-env.nix @@ -0,0 +1,69 @@ +{ 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'' |