--27844531-POCO-38270576 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: quoted-printable Chad Fowler: > On Wed, 24 Dec 2003, Curt Hibbs wrote: >> Phil Tomson wrote: >>> Something like: >>> # let's see if they've already got rexml: >>> begin >>> require 'rexml' >>> rescue MissingPackage # or whatever it's really called >>> # it's really not here, so go look for one to download >>> else >>> # it is here already, maybe check out the version somehow >>> # otherwise everything should be OK >>> end >> This is too simple. RubyGems should also check that the proper >> version is installed. I haven't made a RubyGem, yet, but why not treat: dependencies: { :rexml => { :at_least => '2.7.2' } } as a translation to: dependencies.each do |lib, tests| begin has_gem(lib => tests) rescue RubyGems::NotInstalledError begin require lookup_lib(lib) tests.each { |test, version| test_version(test, version) } rescue LoadError, RubyGems::VersionError download_gem(lib, version) end end end lookup_lib would be something like: def lookup_lib(lib) RubyGems::KNOWN_LIBS[lib] or lib end Where KNOWN_LIBS might look like: RubyGems::KNOWN_LIBS['rexml'] = 'rexml/document' One of the things that should be encouraged is perhaps creating a VERSION constant as a VersionTuple (see the attached file). This would mean that you *don't* have to enter manual-installation- entry stuff. It would be a bit more complex for things that require an external library (e.g., compiled RubyGems, such as libxml or libxslt), but the pattern is the same. -austin -- austin ziegler * austin / halostatue.ca * Toronto, ON, Canada software designer * pragmatic programmer * 2003.12.25 * 20.29.36 --27844531-POCO-38270576 Content-Type: application/octet-stream; name="version_tuple.rb" Content-Transfer-Encoding: Base64 Content-Disposition: attachment; filename="version_tuple.rb" Y2xhc3MgVmVyc2lvblR1cGxlCiAgaW5jbHVkZSBDb21wYXJhYmxlCgogIGRlZiBpbml0aWFsaXpl KCp2ZXJzaW9uKQogICAgQHZlcnNpb24gPSB2ZXJzaW9uCiAgZW5kCgogIGRlZiB0b19zdHIKICAg IEB2ZXJzaW9uLmpvaW4oJy4nKQogIGVuZAoKICBkZWYgdG9fcwogICAgdG9fc3RyCiAgZW5kCgog IGRlZiB0b190dXBsZQogICAgQHZlcnNpb24KICBlbmQKCiAgZGVmIDw9PihvdGhlcikKICAgIGNv bXBhcmUgPSBAdmVyc2lvbi56aXAob3RoZXIudG9fdHVwbGUpCiAgICByZXMgPSBuaWwKICAgIGNv bXBhcmUuZWFjaCBkbyB8YSwgYnwKICAgICAgZSA9IChhIDw9PiBiKQogICAgICBuZXh0IGlmIGUu bmlsPyBvciBlLnplcm8/CiAgICAgIHJlcyA9IGUKICAgICAgYnJlYWsKICAgIGVuZAogICAgcmVz IHx8PSBAdmVyc2lvbi5zaXplIDw9PiBvdGhlci50b190dXBsZS5zaXplCiAgICByZXMKICBlbmQK CiAgZGVmIHNlbGYuW10oKnZlcnNpb24pCiAgICBWZXJzaW9uVHVwbGUubmV3KCp2ZXJzaW9uKQog IGVuZAplbmQKCm1vZHVsZSBLZXJuZWwKICBkZWYgbW9kdWxlX3ZlcnNpb24oKnZlcnNpb24pCiAg ICBWZXJzaW9uVHVwbGUubmV3KCp2ZXJzaW9uKQogIGVuZAplbmQKCmlmICQwID09IF9fRklMRV9f CiAgcmVxdWlyZSAndGVzdC91bml0JwoKICBjbGFzcyBUZXN0VmVyc2lvblR1cGxlIDwgVGVzdDo6 VW5pdDo6VGVzdENhc2UKICAgIGRlZiBzZXR1cAogICAgICBAdGVzdF92ZXJzaW9uID0gWwogICAg ICAgICAgIyAxLjYuMSA8PT4gKgogICAgICAgIFs6QHgxNjEsICA6QHgxNjEsICAgIDBdLCBbOkB4 MTYxLCAgOkB4MjYxLCAgIC0xXSwKICAgICAgICBbOkB4MTYxLCAgOkB4MjcxLCAgIC0xXSwgWzpA eDE2MSwgIDpAeDI3MiwgICAtMV0sCiAgICAgICAgWzpAeDE2MSwgIDpAeDI3MjQsICAtMV0sCiAg ICAgICAgICAjIDIuNi4xIDw9PiAqCiAgICAgICAgWzpAeDI2MSwgIDpAeDE2MSwgICAgMV0sIFs6 QHgyNjEsICA6QHgyNjEsICAgIDBdLAogICAgICAgIFs6QHgyNjEsICA6QHgyNzEsICAgLTFdLCBb OkB4MjYxLCAgOkB4MjcyLCAgIC0xXSwKICAgICAgICBbOkB4MjYxLCAgOkB4MjcyNCwgIC0xXSwK ICAgICAgICAgICMgMi43LjEgPD0+ICoKICAgICAgICBbOkB4MjcxLCAgOkB4MTYxLCAgICAxXSwg WzpAeDI3MSwgIDpAeDI2MSwgICAgMV0sCiAgICAgICAgWzpAeDI3MSwgIDpAeDI3MSwgICAgMF0s IFs6QHgyNzEsICA6QHgyNzIsICAgLTFdLAogICAgICAgIFs6QHgyNzEsICA6QHgyNzI0LCAgLTFd LAogICAgICAgICAgIyAyLjcuMiA8PT4gKgogICAgICAgIFs6QHgyNzIsICA6QHgxNjEsICAgIDFd LCBbOkB4MjcyLCAgOkB4MjYxLCAgICAxXSwKICAgICAgICBbOkB4MjcyLCAgOkB4MjcxLCAgICAx XSwgWzpAeDI3MiwgIDpAeDI3MiwgICAgMF0sCiAgICAgICAgWzpAeDI3MiwgIDpAeDI3MjQsICAt MV0sCiAgICAgICAgICAjIDIuNy4yLjQgPD0+ICoKICAgICAgICBbOkB4MjcyNCwgOkB4MTYxLCAg ICAxXSwgWzpAeDI3MjQsIDpAeDI2MSwgICAgMV0sCiAgICAgICAgWzpAeDI3MjQsIDpAeDI3MSwg ICAgMV0sIFs6QHgyNzI0LCA6QHgyNzIsICAgIDBdLAogICAgICAgIFs6QHgyNzI0LCA6QHgyNzI0 LCAgLTFdLAogICAgICBdCiAgICBlbmQKCiAgICBkZWYgdGVzdF9zcGFjZXNoaXAKICAgICAgYXNz ZXJ0X25vdGhpbmdfcmFpc2VkIGRvCiAgICAgICAgQHgxNjEgID0gVmVyc2lvblR1cGxlWzEsIDYs IDFdCiAgICAgICAgQHgyNjEgID0gVmVyc2lvblR1cGxlWzIsIDYsIDFdCiAgICAgICAgQHgyNzEg ID0gVmVyc2lvblR1cGxlWzIsIDcsIDFdCiAgICAgICAgQHgyNzIgID0gVmVyc2lvblR1cGxlWzIs IDcsIDJdCiAgICAgICAgQHgyNzI0ID0gVmVyc2lvblR1cGxlWzIsIDcsIDIsIDRdCiAgICAgIGVu ZAoKICAgICAgQHRlc3RfdmVyc2lvbi5lYWNoIGRvIHx2MSwgdjIsIHJlc3wKICAgICAgICBhc3Nl cnQocmVzLCBpbnN0YW5jZV92YXJpYWJsZV9nZXQodjEpIDw9PiBpbnN0YW5jZV92YXJpYWJsZV9n ZXQodjIpKQogICAgICBlbmQKICAgIGVuZAogIGVuZAplbmQK --27844531-POCO-38270576--