guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Gemspecs / Add ruby-ruby-engine.


From: Ricardo Wurmus
Subject: Re: [PATCH] Gemspecs / Add ruby-ruby-engine.
Date: Tue, 5 Jan 2016 12:36:29 +0100

Ben Woodcroft <address@hidden> writes:

> I've attached a patch for a simple rubygem. This one was slightly nasty 
> because the gem for version 1.0.1 includes the .gem file for version 
> 1.0.0, which means that 1.0.0 gets silently installed instead of the 
> built and tested 1.0.1 .gem file - it is unlucky that 
> "pkg/ruby-engine-1.0.0.gem" is lexicographically before 
> "ruby-engine-1.0.1.gem".

Ideally, this would be done in a snippet, but unfortunately
“ruby-build-system” does not support snippets yet.  “ruby-pygmentize”
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 
> bundled 1.0.0 .gem file. The issue is that when the source is a .gem 
> file (ie most of the time), the gemspec is taken from the downloaded 
> .gem file directly, and in the same phase the .gem file is built. So as 
> a packager there is no way to make changes to the gemspec without 
> replacing the entire build phase. There's a number of rubygems that are 
> contaminated with junk so it would be great for there to be a simple way 
> to modify the gemspec before "gem build" is run.

The “build” phase in the “ruby-build-system” is responsible for
rebuilding the gem from source.  The “unpack” phase unpacks the gem
archive.  This should allow you to modify the gemspec in a phase
injected between “unpack” and “build”, no?

Ideally, though, we’d add support for snippets, so that removing bundled
stuff doesn’t require a new build phase.

> Would someone with more experience like to suggest a way of doing this? 
> A new "gemspec" phase before "build" that takes the gemspec out of the 
> .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 “unpack” instead?  It’s just a
side-effect of the “check” phase that the gem is installed, so I think
it’s best to move this phase right after “unpack” (because we don’t need
any of this stuff for any of the phases until “check”).

Maybe you can also add a FIXME comment (as in “ruby-pygmentize”) 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.
> +               ((".*<rdoc.*") "")
> +               ((".*<rubygems-tasks.*") "")
> +               ;; 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 installed.
> +             (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 interpreter name 
> and
> +provides query methods such as @{RubyEngine.mri?}.")

“ruby_engine” 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’s fine.  Thank you!

~~ Ricardo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]