summary refs log tree commit diff
path: root/pkgs/development/ruby-modules/with-packages
diff options
context:
space:
mode:
authorMichael Fellinger <michael.fellinger@iohk.io>2019-05-18 17:45:38 +0000
committerAlyssa Ross <hi@alyssa.is>2019-09-03 19:44:49 +0000
commit1f49035aca52303abb2e09976baf36f297eb68a6 (patch)
tree32b26f3234324bc1789347857258e44e879da795 /pkgs/development/ruby-modules/with-packages
parent92665777fd403eb62fe77d6d6f2196d61ce959de (diff)
downloadnixpkgs-1f49035aca52303abb2e09976baf36f297eb68a6.tar
nixpkgs-1f49035aca52303abb2e09976baf36f297eb68a6.tar.gz
nixpkgs-1f49035aca52303abb2e09976baf36f297eb68a6.tar.bz2
nixpkgs-1f49035aca52303abb2e09976baf36f297eb68a6.tar.lz
nixpkgs-1f49035aca52303abb2e09976baf36f297eb68a6.tar.xz
nixpkgs-1f49035aca52303abb2e09976baf36f297eb68a6.tar.zst
nixpkgs-1f49035aca52303abb2e09976baf36f297eb68a6.zip
ruby.withPackages: init
Co-authored-by: Alyssa Ross <hi@alyssa.is>
Diffstat (limited to 'pkgs/development/ruby-modules/with-packages')
-rw-r--r--pkgs/development/ruby-modules/with-packages/Gemfile159
-rw-r--r--pkgs/development/ruby-modules/with-packages/default.nix75
-rw-r--r--pkgs/development/ruby-modules/with-packages/require_exceptions.nix84
-rw-r--r--pkgs/development/ruby-modules/with-packages/test.nix48
-rwxr-xr-xpkgs/development/ruby-modules/with-packages/test.rb76
5 files changed, 442 insertions, 0 deletions
diff --git a/pkgs/development/ruby-modules/with-packages/Gemfile b/pkgs/development/ruby-modules/with-packages/Gemfile
new file mode 100644
index 00000000000..0cd04f07b94
--- /dev/null
+++ b/pkgs/development/ruby-modules/with-packages/Gemfile
@@ -0,0 +1,159 @@
+source 'https://rubygems.org' do
+  gem 'addressable'
+  gem 'atk'
+  gem 'awesome_print'
+  gem 'bacon'
+  # gem 'bundler' already got a package for that
+  gem 'byebug'
+  gem 'cairo'
+  gem 'cairo-gobject'
+  gem 'camping'
+  # gem 'capybara-webkit' takes too long to build right now since webkit depends on ruby
+  gem 'charlock_holmes'
+  gem 'cld3'
+  gem 'cocoapods'
+  gem 'cocoapods-acknowledgements'
+  gem 'cocoapods-art'
+  gem 'cocoapods-bin'
+  gem 'cocoapods-browser'
+  gem 'cocoapods-bugsnag'
+  gem 'cocoapods-check'
+  gem 'cocoapods-clean'
+  gem 'cocoapods-clean_build_phases_scripts'
+  gem 'cocoapods-core'
+  gem 'cocoapods-coverage'
+  gem 'cocoapods-deintegrate'
+  gem 'cocoapods-dependencies'
+  gem 'cocoapods-deploy'
+  gem 'cocoapods-downloader'
+  gem 'cocoapods-expert-difficulty'
+  gem 'cocoapods-fix-react-native'
+  gem 'cocoapods-generate'
+  gem 'cocoapods-git_url_rewriter'
+  gem 'cocoapods-keys'
+  gem 'cocoapods-no-dev-schemes'
+  gem 'cocoapods-open'
+  gem 'cocoapods-packager'
+  gem 'cocoapods-playgrounds'
+  gem 'cocoapods-plugins'
+  gem 'cocoapods-prune-localizations'
+  gem 'cocoapods-rome'
+  gem 'cocoapods-search'
+  gem 'cocoapods-sorted-search'
+  gem 'cocoapods-static-swift-framework'
+  gem 'cocoapods-stats'
+  gem 'cocoapods-tdfire-binary'
+  gem 'cocoapods-testing'
+  gem 'cocoapods-trunk'
+  gem 'cocoapods-try'
+  gem 'cocoapods-try-release-fix'
+  gem 'cocoapods-update-if-you-dare'
+  gem 'cocoapods-whitelist'
+  gem 'cocoapods-wholemodule'
+  gem 'coderay'
+  gem 'concurrent-ruby'
+  gem 'curb'
+  gem 'curses'
+  gem 'daemons'
+  gem 'dep-selector-libgecode'
+  gem 'digest-sha3'
+  gem 'domain_name'
+  gem 'do_sqlite3'
+  gem 'ethon'
+  gem 'eventmachine'
+  gem 'excon'
+  gem 'faraday'
+  gem 'ffi'
+  gem 'ffi-rzmq-core'
+  gem 'fog-dnsimple'
+  gem 'gdk_pixbuf2'
+  gem 'gio2'
+  gem 'gitlab-markup'
+  gem 'glib2'
+  # gem 'gobject-introspection' fails on require
+  gem 'gpgme'
+  # gem 'grpc' fails to build
+  gem 'gtk2'
+  gem 'hashie'
+  gem 'highline'
+  gem 'hike'
+  gem 'hitimes'
+  gem 'hpricot'
+  gem 'httpclient'
+  gem 'http-cookie'
+  gem 'iconv'
+  gem 'idn-ruby'
+  gem 'jbuilder'
+  gem 'jekyll'
+  gem 'jmespath'
+  gem 'jwt'
+  gem 'libv8'
+  gem 'libxml-ruby'
+  gem 'magic'
+  gem 'markaby'
+  gem 'method_source'
+  gem 'mini_magick'
+  gem 'msgpack'
+  gem 'mysql2'
+  # gem 'mysql' deprecated
+  gem 'ncursesw'
+  gem 'netrc'
+  gem 'net-scp'
+  gem 'net-ssh'
+  gem 'nokogiri'
+  gem 'opus-ruby'
+  gem 'ovirt-engine-sdk'
+  gem 'pango'
+  gem 'patron'
+  gem 'pcaprub'
+  gem 'pg'
+  gem 'pry'
+  gem 'pry-byebug'
+  gem 'pry-doc'
+  gem 'public_suffix'
+  gem 'puma'
+  gem 'rails'
+  gem 'rainbow'
+  # gem 'rbczmq' deprecated
+  gem 'rbnacl'
+  gem 'rb-readline'
+  gem 're2'
+  gem 'redis'
+  gem 'redis-rack'
+  gem 'rest-client'
+  gem 'rmagick'
+  gem 'rpam2'
+  gem 'rspec'
+  gem 'rubocop'
+  gem 'rubocop-performance'
+  gem 'ruby-libvirt'
+  gem 'ruby-lxc'
+  gem 'ruby-progressbar'
+  gem 'ruby-terminfo'
+  gem 'ruby-vips'
+  gem 'rubyzip'
+  gem 'rugged'
+  gem 'sassc'
+  gem 'scrypt'
+  gem 'semian'
+  gem 'sequel'
+  gem 'sequel_pg'
+  gem 'simplecov'
+  gem 'sinatra'
+  gem 'slop'
+  gem 'snappy'
+  gem 'sqlite3'
+  gem 'taglib-ruby'
+  gem 'therubyracer'
+  gem 'thrift'
+  gem 'tilt'
+  gem 'tiny_tds'
+  gem 'treetop'
+  gem 'typhoeus'
+  gem 'tzinfo'
+  gem 'unf_ext'
+  gem 'uuid4r'
+  gem 'whois'
+  # gem 'xapian-ruby' doesn't contain ruby code
+  gem 'zookeeper'
+end
diff --git a/pkgs/development/ruby-modules/with-packages/default.nix b/pkgs/development/ruby-modules/with-packages/default.nix
new file mode 100644
index 00000000000..ac0a33f4561
--- /dev/null
+++ b/pkgs/development/ruby-modules/with-packages/default.nix
@@ -0,0 +1,75 @@
+{ stdenv, lib, buildEnv, buildRubyGem, ruby, gemConfig, makeWrapper }:
+
+/*
+Example usage:
+nix-shell -E "(import <nixpkgs> {}).ruby.withPackages (pkgs: with pkgs; [ pry nokogiri ])"
+
+You can also use this for writing ruby scripts that run anywhere that has nix
+using a nix-shell shebang:
+  #!/usr/bin/env nix-shell
+  #!nix-shell -i ruby -p "ruby.withPackages (pkgs: with pkgs; [ pry nokogiri ])"
+
+
+Run the following in the nixpkgs root directory to update the ruby-packages.nix:
+./maintainers/scripts/update-ruby-packages
+*/
+
+let
+  functions = import ../bundled-common/functions.nix { inherit lib gemConfig; };
+
+  buildGems = gemset:
+    let
+      realGemset = if builtins.isAttrs gemset then gemset else import gemset;
+      builtGems =
+        lib.mapAttrs (name: initialAttrs:
+          let
+            attrs = functions.applyGemConfigs ({ inherit ruby; gemName = name; } // initialAttrs);
+          in
+            buildRubyGem (functions.composeGemAttrs ruby builtGems name attrs)
+        ) realGemset;
+    in builtGems;
+
+  gems = buildGems (import ../../../top-level/ruby-packages.nix);
+
+  withPackages = selector:
+    let
+      selected = selector gems;
+
+      gemEnv = buildEnv {
+        name = "ruby-gems";
+        paths = selected;
+        pathsToLink = [ "/lib" "/bin" "/nix-support" ];
+      };
+
+      wrappedRuby = stdenv.mkDerivation {
+        name = "wrapped-${ruby.name}";
+        nativeBuildInputs = [ makeWrapper ];
+        buildCommand = ''
+          mkdir -p $out/bin
+          for i in ${ruby}/bin/*; do
+            makeWrapper "$i" $out/bin/$(basename "$i") --set GEM_PATH ${gemEnv}/${ruby.gemPath}
+          done
+        '';
+      };
+
+    in stdenv.mkDerivation {
+      name = "${ruby.name}-with-packages";
+      nativeBuildInputs = [ makeWrapper ];
+      buildInputs = [ selected ruby ];
+
+      unpackPhase = ":";
+
+      installPhase = ''
+        for i in ${ruby}/bin/* ${gemEnv}/bin/*; do
+          rm -f $out/bin/$(basename "$i")
+          makeWrapper "$i" $out/bin/$(basename "$i") --set GEM_PATH ${gemEnv}/${ruby.gemPath}
+        done
+      '';
+
+      passthru = {
+        inherit wrappedRuby;
+        gems = selected;
+      };
+    };
+
+in { inherit withPackages gems buildGems; }
diff --git a/pkgs/development/ruby-modules/with-packages/require_exceptions.nix b/pkgs/development/ruby-modules/with-packages/require_exceptions.nix
new file mode 100644
index 00000000000..e6ae3b5013f
--- /dev/null
+++ b/pkgs/development/ruby-modules/with-packages/require_exceptions.nix
@@ -0,0 +1,84 @@
+let
+  cocoapod-plugin = name: ''
+    require "cocoapods"
+    require "#{Gem::Specification.find_by_name(%(${name})).gem_dir}/lib/cocoapods_plugin"
+  '';
+in {
+  actioncable = [ "action_cable" ];
+  actionmailer = [ "action_mailer" ];
+  actionpack = [ "action_pack" ];
+  actionview = [ "action_view" ];
+  activejob = [ "active_job" ];
+  activemodel = [ "active_model" ];
+  activerecord = [ "active_record" ];
+  activestorage = [ "active_storage" ];
+  activesupport = [ "active_support" ];
+  atk = [ "atk" ];
+  CFPropertyList = [ "cfpropertylist" ];
+  cocoapods-acknowledgements = [ "cocoapods" "cocoapods_acknowledgements" ];
+  cocoapods-art = [ "cocoapods_art" ];
+  cocoapods-browser = [ "cocoapods" "cocoapods_plugin" ];
+  cocoapods-bugsnag = cocoapod-plugin "cocoapods-bugsnag";
+  cocoapods-clean = [ "cocoapods_clean" ];
+  cocoapods-coverage = [ "cocoapods_coverage" ];
+  cocoapods-deintegrate = [ ]; # used by cocoapods
+  cocoapods-dependencies = [ "cocoapods_dependencies" ];
+  cocoapods-deploy = cocoapod-plugin "cocoapods-deploy";
+  cocoapods-generate = cocoapod-plugin "cocoapods-generate";
+  cocoapods-git_url_rewriter = cocoapod-plugin "cocoapods-git_url_rewriter";
+  cocoapods-keys = []; # osx only cocoapod-plugin "cocoapods-keys";
+  cocoapods-open = [ "cocoapods" "cocoapods_plugin" ];
+  cocoapods-packager = [ "cocoapods_packager" ];
+  cocoapods-packager-pro = [ ]; # requires osx
+  cocoapods-plugins = [ "cocoapods_plugins" ];
+  cocoapods-sorted-search = [ ]; # requires osx
+  cocoapods-check = cocoapod-plugin "cocoapods-check";
+  cocoapods-disable-podfile-validations = cocoapod-plugin "cocoapods-disable-podfile-validations";
+  cocoapods-stats = [ "cocoapods_stats" ];
+  cocoapods-testing = [ "cocoapods_testing" ];
+  cocoapods-trunk = [ "cocoapods_trunk" ];
+  cocoapods-try = [ "cocoapods_try" ];
+  cocoapods-try-release-fix = cocoapod-plugin "cocoapods-try-release-fix";
+  digest-sha3 = [ "digest/sha3" ];
+  ffi-compiler = [ "ffi-compiler/loader" ];
+  fog-core = [ "fog/core" ];
+  fog-dnsimple = [ "fog/dnsimple" ];
+  fog-json = [ "fog/json" ];
+  forwardable-extended = [ "forwardable/extended" ];
+  gdk_pixbuf2 = [ "gdk_pixbuf2" ];
+  gitlab-markup = [ "github/markup" ];
+  gobject-introspection = [ "gobject-introspection" ];
+  gtk2 = [ ]; # requires display
+  idn-ruby = [ "idn" ];
+  jekyll-sass-converter = []; # tested through jekyll
+  libxml-ruby = [ "libxml" ];
+  multipart-post = [ "multipart_post" ];
+  unicode-display_width = [ "unicode/display_width" ];
+  nap = [ "rest" ];
+  net-scp = [ "net/scp" ];
+  net-ssh = [ "net/ssh" ];
+  nio4r = [ "nio" ];
+  osx_keychain = [ ]; # requires osx
+  ovirt-engine-sdk = [ "ovirtsdk4" ];
+  pango = [ "pango" ];
+  rack-test = [ "rack/test" ];
+  railties = [ "rails" ];
+  rspec-core = [ "rspec/core" ];
+  rspec-expectations = [ "rspec/expectations" ];
+  rspec-mocks = [ "rspec/mocks" ];
+  rspec-support = [ "rspec/support" ];
+  RubyInline = [ "inline" ];
+  ruby-libvirt = [ "libvirt" ];
+  ruby-lxc = [ "lxc" ];
+  ruby-macho = [ "macho" ];
+  ruby-terminfo = [ "terminfo" ];
+  rubyzip = [ "zip" ];
+  sequel_pg = [ "pg" "sequel" "sequel/adapters/postgresql" "sequel_pg" ];
+  simplecov-html = [ ]; # tested through simplecov
+  sinatra = [ "sinatra/base" ];
+  sprockets-rails = [ "sprockets/rails" ];
+  taglib-ruby = [ "taglib" ];
+  websocket-driver = [ "websocket/driver" ];
+  websocket-extensions = [ "websocket/extensions" ];
+  ZenTest = [ "zentest" ];
+}
diff --git a/pkgs/development/ruby-modules/with-packages/test.nix b/pkgs/development/ruby-modules/with-packages/test.nix
new file mode 100644
index 00000000000..92ded1004e3
--- /dev/null
+++ b/pkgs/development/ruby-modules/with-packages/test.nix
@@ -0,0 +1,48 @@
+# a generic test suite for all gems for all ruby versions.
+# use via nix-build.
+let
+  pkgs = import ../../../.. {};
+  lib = pkgs.lib;
+  stdenv = pkgs.stdenv;
+
+  rubyVersions = with pkgs; [
+    ruby_2_4
+    ruby_2_5
+    ruby_2_6
+  ];
+
+  gemTests =
+    (lib.mapAttrs
+      (name: gem: [ name ])
+      pkgs.ruby.gems) //
+    (import ./require_exceptions.nix);
+
+  tests = ruby:
+    lib.mapAttrs (name: gem:
+      let
+        test =
+          if builtins.isList gemTests."${name}"
+          then pkgs.writeText "${name}.rb" ''
+                puts "${name} GEM_HOME: #{ENV['GEM_HOME']}"
+                ${lib.concatStringsSep "\n" (map (n: "require '${n}'") gemTests."${name}")}
+              ''
+          else pkgs.writeText "${name}.rb" gemTests."${name}";
+
+        deps = ruby.withPackages (g: [ g."${name}" ]);
+      in stdenv.mkDerivation {
+        name = "test-gem-${ruby.name}-${name}";
+        buildInputs = [ deps ];
+        buildCommand = ''
+          INLINEDIR=$PWD ruby ${test}
+          touch $out
+        '';
+      }
+    ) ruby.gems;
+in
+  stdenv.mkDerivation {
+    name = "test-all-ruby-gems";
+    buildInputs = builtins.foldl' (sum: ruby: sum ++ ( builtins.attrValues (tests ruby) )) [] rubyVersions;
+    buildCommand = ''
+      touch $out
+    '';
+  }
diff --git a/pkgs/development/ruby-modules/with-packages/test.rb b/pkgs/development/ruby-modules/with-packages/test.rb
new file mode 100755
index 00000000000..760402d070c
--- /dev/null
+++ b/pkgs/development/ruby-modules/with-packages/test.rb
@@ -0,0 +1,76 @@
+#!/usr/bin/env ruby
+
+# this is a quick and dirty test suite for easier analyzing of breakages in a
+# manual testing.
+# For automated testing use the test.nix
+
+require 'fileutils'
+
+class FakeGemfile
+  attr_reader :gems
+
+  def initialize
+    @gems = []
+  end
+
+  def source(_source, &block)
+    instance_exec(&block)
+  end
+
+  def gem(name)
+    @gems << name
+  end
+end
+
+gemfile = File.expand_path(File.join(__dir__, 'Gemfile'))
+packages = FakeGemfile.new.instance_eval(File.read(gemfile), gemfile)
+
+test_cases = packages.map { |pkg| [pkg, "require '#{pkg}'"] }.to_h
+
+test_cases.merge!(
+  'digest-sha3' => "require 'digest/sha3'",
+  'gitlab-markup' => "require 'github/markup'",
+  'idn-ruby' => "require 'idn'",
+  'net-scp' => "require 'net/scp'",
+  'taglib-ruby' => "require 'taglib'",
+  'net-ssh' => "require 'net/ssh'",
+  'ruby-libvirt' => "require 'libvirt'",
+  'ruby-lxc' => "require 'lxc'",
+  'rubyzip' => "require 'zip'",
+  'sinatra' => "require 'sinatra/base'",
+  'libxml-ruby' => "require 'libxml'",
+  'ruby-terminfo' => "require 'terminfo'",
+  'ovirt-engine-sdk' => "require 'ovirtsdk4'",
+  'fog-dnsimple' => "require 'fog/dnsimple'"
+)
+
+test_cases['sequel_pg'] = <<~TEST
+  require 'pg'
+  require 'sequel'
+  require 'sequel/adapters/postgresql'
+  require 'sequel_pg'
+TEST
+
+tmpdir = File.expand_path(File.join(__dir__, 'tests'))
+FileUtils.rm_rf(tmpdir)
+FileUtils.mkdir_p(tmpdir)
+
+failing = test_cases.reject do |name, test_case|
+  test_case = <<~SHELL
+    #!/usr/bin/env nix-shell
+    #!nix-shell -i ruby -E "(import ../../../.. {}).ruby.withPackages (r: [ r.#{name} ] )"
+    #{test_case}
+  SHELL
+
+  file = File.join(tmpdir, "#{name}_test.rb")
+  File.write(file, test_case)
+  FileUtils.chmod('u=wrx', file)
+
+  system(file) && FileUtils.rm(file)
+end
+
+exit if failing.empty?
+
+puts "Following gems failed: #{failing.keys.join(' ')}"
+puts "tests for failing gems remain in #{tmpdir}"
+exit 1