diff options
author | Michael Fellinger <michael.fellinger@iohk.io> | 2019-05-18 17:45:38 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2019-09-03 19:44:49 +0000 |
commit | 1f49035aca52303abb2e09976baf36f297eb68a6 (patch) | |
tree | 32b26f3234324bc1789347857258e44e879da795 /pkgs/development/ruby-modules/with-packages | |
parent | 92665777fd403eb62fe77d6d6f2196d61ce959de (diff) | |
download | nixpkgs-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')
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 |