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>.
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::todayis 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#platformsshould no longer be a String, useGem::Platform::CURRENTwhen 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#requireonly 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)
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.
#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 }
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.

Articles