From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ricardo Wurmus Subject: Re: [PATCH] Gemspecs / Add ruby-ruby-engine. Date: Tue, 5 Jan 2016 12:36:29 +0100 Message-ID: References: <5683842C.3090706@uq.edu.au> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:45448) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aGPut-0003oG-GC for guix-devel@gnu.org; Tue, 05 Jan 2016 06:36:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aGPuq-0002bC-82 for guix-devel@gnu.org; Tue, 05 Jan 2016 06:36:43 -0500 Received: from sinope.bbbm.mdc-berlin.de ([141.80.25.23]:60177) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aGPup-0002b8-Rc for guix-devel@gnu.org; Tue, 05 Jan 2016 06:36:40 -0500 In-Reply-To: <5683842C.3090706@uq.edu.au> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org To: Ben Woodcroft Cc: "guix-devel@gnu.org" Ben Woodcroft writes: > I've attached a patch for a simple rubygem. This one was slightly nasty= =20 > because the gem for version 1.0.1 includes the .gem file for version=20 > 1.0.0, which means that 1.0.0 gets silently installed instead of the=20 > built and tested 1.0.1 .gem file - it is unlucky that=20 > "pkg/ruby-engine-1.0.0.gem" is lexicographically before=20 > "ruby-engine-1.0.1.gem". Ideally, this would be done in a snippet, but unfortunately =E2=80=9Cruby-build-system=E2=80=9D does not support snippets yet. =E2=80= =9Cruby-pygmentize=E2=80=9D also would need to use snippets to remove bundled or prebuilt stuff, but for now it has to be done in a build phase. > While I managed to install 1.0.1, I wasn't sure how best to remove the=20 > bundled 1.0.0 .gem file. The issue is that when the source is a .gem=20 > file (ie most of the time), the gemspec is taken from the downloaded=20 > .gem file directly, and in the same phase the .gem file is built. So as= =20 > a packager there is no way to make changes to the gemspec without=20 > replacing the entire build phase. There's a number of rubygems that are= =20 > contaminated with junk so it would be great for there to be a simple wa= y=20 > to modify the gemspec before "gem build" is run. The =E2=80=9Cbuild=E2=80=9D phase in the =E2=80=9Cruby-build-system=E2=80= =9D is responsible for rebuilding the gem from source. The =E2=80=9Cunpack=E2=80=9D phase unpac= ks the gem archive. This should allow you to modify the gemspec in a phase injected between =E2=80=9Cunpack=E2=80=9D and =E2=80=9Cbuild=E2=80=9D, no= ? Ideally, though, we=E2=80=99d add support for snippets, so that removing = bundled stuff doesn=E2=80=99t require a new build phase. > Would someone with more experience like to suggest a way of doing this?= =20 > A new "gemspec" phase before "build" that takes the gemspec out of the=20 > .gem so the packager can manipulate it perhaps? > > It would also be good to check that there is only one .gem file. And do what when this check fails? If included gems were removed in a snippet they would never be seen at a later point, so I think the right way to do this is support snippets. Does this make sense? Now on to the patch: > + > +(define-public ruby-ruby-engine > + (package > + (name "ruby-ruby-engine") > + (version "1.0.1") > + (source > + (origin > + (method url-fetch) > + (uri (rubygems-uri "ruby_engine" version)) > + (sha256 > + (base32 > + "1d0sd4q50zkcqhr395wj1wpn2ql52r0fpwhzjfvi1bljml7k546v")))) > + (build-system ruby-build-system) > + (arguments > + `(#:phases > + (modify-phases %standard-phases > + (add-before 'check 'clean-up Is it possible to move this after =E2=80=9Cunpack=E2=80=9D instead? It=E2= =80=99s just a side-effect of the =E2=80=9Ccheck=E2=80=9D phase that the gem is installe= d, so I think it=E2=80=99s best to move this phase right after =E2=80=9Cunpack=E2=80=9D= (because we don=E2=80=99t need any of this stuff for any of the phases until =E2=80=9Ccheck=E2=80=9D). Maybe you can also add a FIXME comment (as in =E2=80=9Cruby-pygmentize=E2= =80=9D) stating that this really should be done in a snippet. > + (lambda _ > + (delete-file "Gemfile.lock") > + (substitute* "ruby_engine.gemspec" > + ;; Remove unnecessary imports that would entail further > + ;; dependencies. > + ((".* + ((".* + ;; Remove extraneous .gem file > + (("\\\"pkg/ruby_engine-1.0.0.gem\\\",") "")) > + (substitute* "Rakefile" > + (("require 'rubygems/tasks'") "") > + (("Gem::Tasks.new") "")) > + ;; Remove extraneous .gem file that otherwise gets instal= led. > + (delete-file "pkg/ruby_engine-1.0.0.gem") > + #t))))) > + (native-inputs > + `(("bundler" ,bundler) > + ("ruby-rspec" ,ruby-rspec-2))) > + (synopsis "Simplifies checking for Ruby implementation") > + (description > + "@code{ruby_engine} provides an RubyEngine class that can be used= to check > +which implementation of Ruby is in use. It can provide the interprete= r name and > +provides query methods such as @{RubyEngine.mri?}.") =E2=80=9Cruby_engine=E2=80=9D is a name, so I would not use @code here. = How about this: The ruby_engine package provides a @code{RubyEngine} class that can be used to check which implementation of Ruby is in use. ... > + (home-page > + "https://github.com/janlelis/ruby_engine") Please keep this on one line. Otherwise it=E2=80=99s fine. Thank you! ~~ Ricardo