faster_rubygems 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,58 @@
1
+ A helper to dramatically speedup the time it takes to load rubygems
2
+
3
+ i.e. "require 'rubygems'" no longer has to sap valuable time from your life.
4
+
5
+ inspired by a request from Yehuda Katz [1] and 1.9's fast gem_prelude.
6
+
7
+ Speed difference (windows box, lots of gem):
8
+
9
+ $ time ruby examples/require_rubygems_normal.rb
10
+
11
+ real 0m1.109s
12
+
13
+ $ time ruby examples/require_fast_start.rb
14
+
15
+ real 0m0.500s
16
+
17
+ Yea! Finally ruby script startup times that don't spend forever just reloading gem paths.
18
+
19
+ It acts about the same as gem_prelude (prelude is 1.9 only currently) -- adds the paths of the highest version of each gem into your load path so they're ready to be required.
20
+
21
+ == installation ==
22
+
23
+ git clone git://github.com/rdp/faster_rubygems.git
24
+ ruby faster_rubygems/install.rb # done
25
+
26
+ == usage ==
27
+ require 'frubygems'
28
+ or
29
+ require 'rubygemsf'
30
+
31
+ (both do the same thing).
32
+
33
+ If you were really clever I suppose you could figure out how to override the default rubygem behavior to do this, always :)
34
+
35
+ == Speed differences ==
36
+
37
+ For those interested, speed difference example on linux (250 gems):
38
+ $ time ruby examples/require_rubygems_normal.rb
39
+ ruby examples/require_rubygems_normal.rb 0.57s user 0.05s system 85%
40
+ cpu 0.726 total
41
+
42
+ $ time ruby examples/require_fast_start.rb
43
+ ruby examples/require_fast_start.rb 0.04s user 0.02s system 46% cpu
44
+ 0.121 total
45
+
46
+ Note also that a few non conforming gems require the use of require 'rubygems' no matter what (they're pretty rare, though--you probably won't run into them, and I'm not aware of any).
47
+
48
+ Note: you don't need this for ruby 1.9, which already preloads via gem_prelude, but it won't hurt to use it in 1.9--it defaults to a no-op, so doesn't hurt.
49
+
50
+ Related projects:
51
+
52
+ http://github.com/fabien/minigems/tree/master
53
+ 1.9's gem_prelude
54
+ http://www.ruby-forum.com/topic/191673
55
+
56
+ Author may be reached via github rogerdpack
57
+
58
+ [1] http://rubyforge.org/tracker/index.php?func=detail&aid=21288&group_id=126&atid=578
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ begin
2
+ require 'jeweler'
3
+ raise 'do it by hand'
4
+ Jeweler::Tasks.new do |gemspec|
5
+ gemspec.name = "faster_rubygems"
6
+ gemspec.summary = "faster gem loading"
7
+ # gemspec.description = "Describe your gem"
8
+ # gemspec.email = "josh@technicalpickles.com"
9
+ # gemspec.homepage = "http://github.com/technicalpickles/the-perfect-gem"
10
+ # gemspec.description = "TODO"
11
+ # gemspec.authors = ["Josh Nichols"]
12
+ end
13
+ rescue LoadError
14
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
15
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,3 @@
1
+ require File.dirname(__FILE__) + '/../rubygems_fast'
2
+ require 'fastercsv' # load a gem
3
+ puts 'done'
@@ -0,0 +1,3 @@
1
+ require 'rubygems'
2
+ require 'fastercsv'
3
+ puts 'done'
data/ext/mkrf_conf.rb ADDED
@@ -0,0 +1,11 @@
1
+ puts 'in mkrf'
2
+ require 'rubygems'
3
+ require 'sane'
4
+ #require '_dbg'
5
+ puts File.dirname(__FILE__)
6
+ a = File.expand_path(File.dirname(__FILE__)) + "/../install.rb" # install it for them
7
+ load a
8
+
9
+ f = File.open(File.join(File.dirname(__FILE__), "Rakefile"), "w") # create dummy rakefile to indicate success
10
+ f.write("task :default\n")
11
+ f.close
data/install.rb ADDED
@@ -0,0 +1,12 @@
1
+ require 'fileutils'
2
+ require 'rbconfig'
3
+
4
+ Dir.chdir File.dirname(__FILE__) + '/lib' do
5
+ for file in Dir['*.rb'] do
6
+ FileUtils.cp file, Config::CONFIG['sitelibdir'] + '/' + file
7
+ end
8
+ end
9
+
10
+ require 'frubygems' # test it out now :P
11
+
12
+ puts 'Installed--thank you for trying out -- require \'frubygems\''
data/lib/frubygems.rb ADDED
@@ -0,0 +1 @@
1
+ require 'rubygems_fast'
@@ -0,0 +1,58 @@
1
+ if RUBY_VERSION < '1.9'
2
+ require 'rbconfig'
3
+
4
+ gem_paths = []
5
+ gem_paths << Config::CONFIG['libdir'] + '/ruby/gems/' + RUBY_VERSION[0..2] + '/gems'
6
+
7
+ # handle ~/.gem
8
+ gem_paths << File.expand_path('~') + '/.gem/ruby/' + RUBY_VERSION[0..2] + '/gems'
9
+
10
+ # handle ENV['GEM_PATH'] if it exists
11
+ gem_paths << ENV['GEM_PATH'].split(':').select{|path| path + '/.gems'} if ENV['GEM_PATH'] # TODO should this override or supplement?
12
+
13
+ # TODO
14
+ # spec: should find highest version of files
15
+ # spec: with multiple paths should find all files :P
16
+
17
+ all_gems = []
18
+
19
+ for gem_path in gem_paths.flatten do
20
+
21
+ all_gems << Dir.glob(gem_path + '/*')
22
+
23
+ end
24
+ all_gems.flatten!.sort!.reverse!
25
+
26
+ already_loaded_gems = {}
27
+
28
+ for gem in all_gems do
29
+
30
+ version = gem.split('-')[-1]
31
+ if version =~ /\d+\.\d+\.\d+/
32
+ name = gem.split('-')[0..-2]
33
+ else
34
+ gem =~ /(.*)(\d+\.\d+\.\d+).*$/ # like abc-1.2.3-mswin32-60 or what not
35
+ version = $2
36
+ name = $1
37
+ next unless version # a few oddities like rbfind-1.1
38
+ end
39
+
40
+ if(!already_loaded_gems[name])
41
+ already_loaded_gems[name] = true
42
+ if File.directory? gem + '/lib'
43
+ $: << gem + '/lib'
44
+ else
45
+ # unfortunately a few gems load from, say gem/something_not_lib/gemname.rb
46
+ for dir in Dir.glob(gem + '/*') do
47
+ if File.directory? dir
48
+ $: << dir
49
+ # if anybody wants anything lower than that, let me know
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ end
56
+ else
57
+ # not needed in 1.9, which by default loads gem_prelude
58
+ end
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: faster_rubygems
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors: []
7
+
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-29 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email:
18
+ executables: []
19
+
20
+ extensions:
21
+ - ext/mkrf_conf.rb
22
+ extra_rdoc_files:
23
+ - README
24
+ files:
25
+ - README
26
+ - Rakefile
27
+ - VERSION
28
+ - examples/require_fast_start.rb
29
+ - examples/require_rubygems_normal.rb
30
+ - ext/mkrf_conf.rb
31
+ - install.rb
32
+ - lib/frubygems.rb
33
+ - lib/rubygems_fast.rb
34
+ has_rdoc: true
35
+ homepage:
36
+ licenses: []
37
+
38
+ post_install_message: |+
39
+
40
+
41
+ installed! require 'frubygems' now
42
+
43
+ rdoc_options:
44
+ - --charset=UTF-8
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: "0"
52
+ version:
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ version:
59
+ requirements: []
60
+
61
+ rubyforge_project:
62
+ rubygems_version: 1.3.5
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: faster gem loading
66
+ test_files:
67
+ - examples/require_fast_start.rb
68
+ - examples/require_rubygems_normal.rb