summary refs log tree commit diff
path: root/pkgs/development/interpreters/ruby/load-ruby-env.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/interpreters/ruby/load-ruby-env.nix')
-rw-r--r--pkgs/development/interpreters/ruby/load-ruby-env.nix69
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''