RubyGems Beta 0.9.4.6

Eric Hodel | Sat, 20 Oct 2007 08:10:12 GMT

RubyGems 0.9.4.6 is a beta release for the upcoming 0.9.5 which adds several new features and fixes several bugs.

To upgrade to the beta:

gem update --system --source http://segment7.net/

To file bugs:

http://rubyforge.org/tracker/?func=add&group_id=126&atid=575

When filing a bug, gem env output will be helpful in diagnosing the issue.

If you find a bug where RubyGems crashes, please provide debug output. You can do that with gem --debug the_command. For example:

<samp>$ gem --debug unknown_command
Exception `RuntimeError' at [...]/rubygems/command_manager.rb:114 - Unknown command unknown_command
ERROR:  While executing gem ... (RuntimeError)
    Unknown command unknown_command
        [...]/rubygems/command_manager.rb:114:in `find_command'
        [...]/rubygems/command_manager.rb:103:in `process_args'
        [...]/rubygems/command_manager.rb:74:in `run'
        [...]/rubygems/gem_runner.rb:39:in `run'
        /usr/local/bin/gem:22</samp>

Changes Since 0.9.4.5

  • gem update won’t install gems multiple times (due to dependencies)
  • gem.bat and bin stubs on mswin platforms are improved and compatible with the One-Click Installer
  • gem install no longer installs dependencies for old versions of a gem
  • Removed gem* commands are now replaced with stubs that warn
  • RubyGems now installs correctly with RUBYOPT=-rubygems<code> </ul> For the rest of the updates since RubyGems 0.9.4, see the <a href="http://blog.segment7.net/articles/2007/10/13/rubygems-beta-0-9-4-5">RubyGems Beta 0.9.4.5 release notes</a>.

    Posted in ,  | no comments

RubyGems Beta 0.9.4.5

Eric Hodel | Sat, 13 Oct 2007 23:43:55 GMT

RubyGems 0.9.4.5 is a beta release for the upcoming 0.9.5 which adds several new features and fixes several bugs.

To upgrade to the beta:

gem update --system --source http://segment7.net/

To file bugs:

http://rubyforge.org/tracker/?func=add&group_id=126&atid=575

When filing a bug, gem env output will be helpful in diagnosing the issue.

If you find a bug where RubyGems crashes, please provide debug output. You can do that with gem --debug the_command. For example:

<samp>$ gem --debug unknown_command
Exception `RuntimeError' at [...]/rubygems/command_manager.rb:114 - Unknown command unknown_command
ERROR:  While executing gem ... (RuntimeError)
    Unknown command unknown_command
        [...]/rubygems/command_manager.rb:114:in `find_command'
        [...]/rubygems/command_manager.rb:103:in `process_args'
        [...]/rubygems/command_manager.rb:74:in `run'
        [...]/rubygems/gem_runner.rb:39:in `run'
        /usr/local/bin/gem:22</samp>

Changes

Select new features include:

  • Automatic installation of platform gems
  • New bandwidth and memory friendlier index file format
  • “Offline” mode (—no-update-sources)
  • Bulk update threshold can be specified (-B,—bulk-threshold)
  • New gem fetch command
  • gem now has “really verbose” output when you specify -v
  • Ruby 1.9 compatible

Other changes include:

  • Time::today is deprecated and will be removed at a future date
  • gem install --include-dependencies (-y) is now deprecated since it is the default, use—ignore-dependencies to turn off automatic dependency installation
  • Multi-version diamond dependencies only are installed once
  • Processing a YAML bulk index update takes less memory
  • gem install -i makes sure all depenencies are installed
  • gem update --system reinstalls into the prefix it was originally installed in
  • gem update --system respects—no-rdoc and—no-ri flags
  • HTTP basic authentication support for proxies
  • Gem::Specification#platforms should no longer be a String, use Gem::Platform::CURRENT when building binary gems instead
  • gem env has more diagnostic information
  • require ‘rubygems’ loads less code
  • sources.gem is gone, RubyGems now uses built-in defaults
  • gem install --source will no longer add—source by default, use gem sources --add to make it a permanent extra source
  • gem query (list) no longer prints details by default
  • Exact gem names are matched in various places
  • mkrf extensions are now supported
  • A gem can depend on a specific RubyGems version
  • gem_server is now gem server
  • gemlock is now gem lock
  • gem_mirror is now gem mirror
  • gemwhich is now gem which
  • gemri is no longer included with RubyGems
  • index_gem_repository.rb is now gem generate_index
  • gem performs more validation of parameters
  • Custom rdoc styles are now supported
  • Gem indexer no longer removes quick index during index creation
  • Kernel#require only rescues a LoadError for the file being required now
  • gem dependencies can now display some information for remote gems

Notes and issues:

  • Old gem scripts (gem_mirror, gem_server, gemlock, gemri, gemwhich, index_gem_repository.rb) are not cleaned up
  • There still appears to be a bug related to bulk updates of YAML indexes

Special Thanks

  • Daniel Berger for win32 testing of early betas
  • Luis Lavena for help with win32 platforms
  • Tom Copeland for help testing and releasing the new indexer
  • Wilson Bilkovich for the new index format
  • To the rest of the RubyGems bug reporters and patch contributors

The full set of changes including contributors is included in the ChangeLog.

Platforms

RubyGems now automatically handles platform gems. This means that gem install will no longer prompt for gem selection. RubyGems uses Ruby’s built-in configuration to match the running ruby’s platform to choose the correct gem to install. The automatically chosen platform may be overridden with the—platform option.

The dependency, fetch, install, outdated, specification, uninstall and update commands all respond to—platform.

For more information, see gem help platforms

Thanks

Keep those gems coming!

—Jim & Chad & Eric (for the RubyGems team)

Posted in ,  | 4 comments

Time.today going away

Eric Hodel | Mon, 08 Oct 2007 22:22:32 GMT

So you’ve been using Time::today for some time, and thought it was part of time.rb or ActiveSupport? Well, you’d be wrong. I was!

It turns out that rubygems/specification.rb defines Time::today, and that’s wrong. RubyGems has no business adding methods to the core when it doesn’t need to, so I’ve marked it for removal.

If you want to use Time::today in the future you’ll need to define it in your code somewhere, here is its definition:

require 'time'

def Time.today
  t = Time.now
  t - (t.to_i % 86400)
end unless Time.respond_to? :today

Go ahead and throw it in wherever you think is appropriate. I suggest you do this now.

UPDATED: Now with a better Time::today.

Posted in ,  | 6 comments

#sort_by and #sort_obj

Eric Hodel | Sun, 07 Oct 2007 08:42:32 GMT

I was speeding up RubyGems and found a bunch of places that still used #sort instead of #sort_by. #sort_by is faster than #sort because it performs fewer comparisons resulting in fewer method calls.

All these places were external to the thing I was sorting, so they’d need to know how to perform the sorting, which is just plain wrong. I did a bit of thinking, and created a #sort_obj method to return an object that can be used for sorting instead.

So Gem::Specification#<=> went from:

def <=>(other)
  platform_num = platform == Gem::Platform::RUBY ? -1 : 1
  other_platform_num = other.platform == Gem::Platform::RUBY ? -1 : 1

  [@name, @version, platform_num] <=>
    [other.name, other.version, other_platform_num]
end

To:

def sort_obj
  [@name, @version.to_ints, @platform == Gem::Platform::RUBY ? -1 : 1]
end

def <=>(other)
  sort_obj <=> other.sort_obj
end

So now instead of:

specs.sort_by do |spec|
  [@name, @version.to_ints, @platform == Gem::Platform::RUBY ? -1 : 1]
end

I can write:

specs.sort_by { |spec| spec.sort_obj }

Posted in ,  | no comments

RubyGems Beta Approaching

Eric Hodel | Fri, 05 Oct 2007 18:01:36 GMT

RubyGems 0.9.5 is almost done, and has loads of good stuff in it, including platform support and an improved indexer script:

[W]e were rebuilding the gem index on RubyForge, [...] doing it “in place”, so that the current index would be overwritten and then populated over the course of the build.  These take a fair while – 10 minutes or so – and during that time the index was essentially empty.  Booooo.

Well, no longer.  Eric Hodel has twiddled the gem index builder to build it in a temporary directory and then move it in place.  So those gem index outages should be a thing of the past.  Thanks Eric!

More reliable gem installs via Junior developer

This will also reduce the number of bulk index updates dramatically, since it’ll actually be there nearly all the time.

Also, Wilson Bilkovich added a new Marshal formatted index that will reduce both bandwidth usage and memory consumption. Instead of 120M or so it takes to do a bulk yaml index update, it takes about 30M with a Marshal index update. You’ll have to wait for the beta to test this one out, though.

Posted in ,  | 7 comments