fast_require 0.0.0 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +22 -0
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/benchmark/benchmark.rb +7 -0
- data/benchmark/benchmark_slow.rb +6 -0
- data/bin/fast_require +4 -0
- data/lib/fast_require.rb +166 -29
- data/lib/rubygems_plugin.rb +5 -0
- data/spec/files/attempt_double_load.rb +4 -0
- data/spec/files/b.rb +4 -6
- data/spec/files/d.rb +1 -0
- data/spec/files/e.rb +1 -0
- data/spec/files/fast.rb +2 -1
- data/spec/files/gem_after.rb +10 -0
- data/spec/files/gem_before.rb +9 -0
- data/spec/files/large.rb +5 -0
- data/spec/files/non_dot_rb.rb +0 -0
- data/spec/files/require_full_path.rb +6 -0
- data/spec/files/require_non_dot_rb_fails.rb +6 -0
- data/spec/files/require_twice_in_dir_pwd.rb +6 -0
- data/spec/files/requires_itself.rb +7 -0
- data/spec/files/slow.rb +1 -1
- data/spec/spec.fast_require.rb +111 -56
- metadata +39 -7
- data/TODO.LIST +0 -8
data/README
CHANGED
@@ -0,0 +1,22 @@
|
|
1
|
+
A little utility to make
|
2
|
+
require 'xxx'
|
3
|
+
|
4
|
+
take much less time.
|
5
|
+
|
6
|
+
This is almost *necessary* for using 1.9.x on windows, and helps with 1.8, too.
|
7
|
+
|
8
|
+
If you've ever wondered why ruby feels slow...sometimes it's just the startup time, my friend. This helps with that.
|
9
|
+
|
10
|
+
Benchmarks:
|
11
|
+
|
12
|
+
loading
|
13
|
+
|
14
|
+
fast 0.34375 slow 3.203125
|
15
|
+
|
16
|
+
|
17
|
+
test rails app, running script/console "puts 333"
|
18
|
+
|
19
|
+
windows:
|
20
|
+
1.9.1
|
21
|
+
without:
|
22
|
+
|
data/Rakefile
CHANGED
@@ -3,9 +3,10 @@
|
|
3
3
|
s.name = "fast_require"
|
4
4
|
s.summary = "A tool designed to speedup library loading in Ruby by caching library locations"
|
5
5
|
s.email = "rogerdpack@gmail.com"
|
6
|
-
s.homepage = "http://github.com/rdp/
|
6
|
+
s.homepage = "http://github.com/rdp/fast_require"
|
7
7
|
s.authors = ["Roger Pack"]
|
8
8
|
s.add_development_dependency 'rspec'
|
9
9
|
s.add_development_dependency 'sane'
|
10
|
+
s.add_development_dependency 'ruby-prof'
|
10
11
|
# s.add_dependency
|
11
12
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.3
|
data/bin/fast_require
ADDED
data/lib/fast_require.rb
CHANGED
@@ -1,13 +1,102 @@
|
|
1
1
|
module FastRequire
|
2
|
+
$FAST_REQUIRE_DEBUG ||= false
|
3
|
+
def self.setup
|
4
|
+
@@dir = File.expand_path('~/.ruby_fast_require_cache')
|
2
5
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
+
Dir.mkdir @@dir unless File.directory?(@@dir)
|
7
|
+
@@loc = @@dir + '/' + RUBY_VERSION + '-' + RUBY_PLATFORM + '-' + sanitize(File.expand_path($0).gsub(/[\/:]/, '_')) + sanitize(Dir.pwd)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.sanitize filename
|
11
|
+
filename.gsub(/[\/:]/, '_')
|
12
|
+
end
|
13
|
+
|
14
|
+
FastRequire.setup
|
15
|
+
|
16
|
+
if File.exist?(@@loc)
|
17
|
+
@@require_locs = Marshal.restore( File.open(@@loc, 'rb') {|f| f.read})
|
6
18
|
else
|
7
19
|
@@require_locs = {}
|
8
20
|
end
|
9
21
|
@@already_loaded = {}
|
10
|
-
|
22
|
+
|
23
|
+
# try to see where this file was loaded from, from $:
|
24
|
+
# partial_name might be abc.rb, or might be abc
|
25
|
+
# partial_name might be a full path, too
|
26
|
+
def self.guess_discover partial_name, add_dot_rb = false
|
27
|
+
|
28
|
+
# test for full path first
|
29
|
+
# unfortunately it has to be a full separate test
|
30
|
+
# for windoze sake, as drive letter could be different than slapping a '/' on the dir to test list...
|
31
|
+
tests = [partial_name]
|
32
|
+
|
33
|
+
if add_dot_rb
|
34
|
+
tests << partial_name + '.rb'
|
35
|
+
tests << partial_name + '.so'
|
36
|
+
end
|
37
|
+
|
38
|
+
tests.each{|b|
|
39
|
+
# assume that .rb.rb is...valid...
|
40
|
+
if File.file?(b) && ((b[-3..-1] == '.rb') || (b[-3..-1] == '.so'))
|
41
|
+
return File.expand_path(b)
|
42
|
+
end
|
43
|
+
}
|
44
|
+
|
45
|
+
for dir in $:
|
46
|
+
if File.file?(b = (dir + '/' + partial_name))
|
47
|
+
# make sure we require a file that has the right suffix...
|
48
|
+
if (b[-3..-1] == '.rb') || (b[-3..-1] == '.so')
|
49
|
+
return File.expand_path(b)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
if add_dot_rb && (partial_name[-3..-1] != '.rb') && (partial_name[-3..-1] != '.so')
|
56
|
+
guess_discover(partial_name + '.rb') || guess_discover(partial_name + '.so')
|
57
|
+
else
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
$LOADED_FEATURES.each{|already_loaded|
|
63
|
+
# in 1.8 they might be partial paths
|
64
|
+
# in 1.9, they might be non collapsed paths
|
65
|
+
# so we have to sanitize them here...
|
66
|
+
# XXXX File.exist? is a bit too loose, here...
|
67
|
+
if File.exist?(already_loaded)
|
68
|
+
key = File.expand_path(already_loaded)
|
69
|
+
else
|
70
|
+
key = FastRequire.guess_discover(already_loaded) || already_loaded
|
71
|
+
end
|
72
|
+
@@already_loaded[key] = true
|
73
|
+
}
|
74
|
+
|
75
|
+
@@already_loaded[File.expand_path(__FILE__)] = true # this file itself isn't in loaded features, yet, but very soon will be..
|
76
|
+
# special case--I hope...
|
77
|
+
|
78
|
+
# disallow re-requiring $0
|
79
|
+
@@require_locs[$0] = File.expand_path($0) # so when we run into it on a require, we will skip it...
|
80
|
+
@@already_loaded[File.expand_path($0)] = true
|
81
|
+
|
82
|
+
|
83
|
+
# XXXX within a very long depth to require fast_require,
|
84
|
+
# require 'a' => 'b' => 'c' => 'd' & fast_require
|
85
|
+
# then
|
86
|
+
# => 'b.rb'
|
87
|
+
# it works always
|
88
|
+
|
89
|
+
def self.already_loaded
|
90
|
+
@@already_loaded
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.require_locs
|
94
|
+
@@require_locs
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.dir
|
98
|
+
@@dir
|
99
|
+
end
|
11
100
|
|
12
101
|
at_exit {
|
13
102
|
FastRequire.save
|
@@ -17,47 +106,95 @@ module FastRequire
|
|
17
106
|
File.open(@@loc, 'wb'){|f| f.write Marshal.dump(@@require_locs)}
|
18
107
|
end
|
19
108
|
|
20
|
-
def self.
|
109
|
+
def self.clear_all!
|
21
110
|
require 'fileutils'
|
22
|
-
FileUtils.
|
111
|
+
FileUtils.rm_rf @@dir if File.exist? @@dir
|
23
112
|
@@require_locs.clear
|
113
|
+
setup
|
24
114
|
end
|
25
115
|
|
26
116
|
def require_cached lib
|
27
|
-
|
28
|
-
|
29
|
-
@@already_loaded[
|
30
|
-
|
31
|
-
|
32
|
-
original_non_cached_require
|
117
|
+
lib = lib.to_s unless lib.is_a?(String) # might not be zactly 1.9 compat...
|
118
|
+
if known_loc = @@require_locs[lib]
|
119
|
+
return false if @@already_loaded[known_loc]
|
120
|
+
@@already_loaded[known_loc] = true
|
121
|
+
if known_loc =~ /.so$/
|
122
|
+
puts 'doing original_non_cached_require on .so full path ' + known_loc if $FAST_REQUIRE_DEBUG
|
123
|
+
original_non_cached_require known_loc # not much we can do there...too bad...
|
33
124
|
else
|
34
|
-
puts 'doing eval on ' + lib + '=>' +
|
35
|
-
|
36
|
-
|
37
|
-
end
|
125
|
+
puts 'doing eval on ' + lib + '=>' + known_loc if $FAST_REQUIRE_DEBUG
|
126
|
+
$LOADED_FEATURES << known_loc # *must*
|
127
|
+
return eval(File.open(known_loc, 'rb') {|f| f.read}, TOPLEVEL_BINDING, known_loc) || true # note the b here--this means it's reading .rb files as binary, which *typically* works--if it breaks re-save the offending file in binary mode, or file an issue on the tracker...
|
128
|
+
end
|
38
129
|
else
|
130
|
+
# we don't know the location--let Ruby's original require do the heavy lifting for us here
|
39
131
|
old = $LOADED_FEATURES.dup
|
40
132
|
if(original_non_cached_require lib)
|
133
|
+
# debugger might land here the first time you run a script and it doesn't have a require
|
134
|
+
# cached yet...
|
41
135
|
new = $LOADED_FEATURES - old
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
136
|
+
found = new.last
|
137
|
+
|
138
|
+
# incredibly, in 1.8.6, this doesn't always get set to a full path
|
139
|
+
if RUBY_VERSION < '1.9'
|
140
|
+
if !File.file?(found)
|
141
|
+
# discover the full path.
|
142
|
+
dir = $:.find{|path| File.file?(path + '/' + found)}
|
143
|
+
found = dir + '/' + found
|
144
|
+
end
|
145
|
+
found = File.expand_path(found);
|
146
|
+
end
|
147
|
+
puts 'found new loc:' + lib + '=>' + found if $FAST_REQUIRE_DEBUG
|
148
|
+
@@require_locs[lib] = found
|
149
|
+
@@already_loaded[found] = true
|
150
|
+
return true
|
151
|
+
else
|
152
|
+
puts 'already loaded, apparently' + lib if $FAST_REQUIRE_DEBUG
|
153
|
+
# this probably was something like
|
154
|
+
# the first pass was require 'regdeferred'
|
155
|
+
# now it's a different require 'regdeferred.rb'
|
156
|
+
# which fails (or vice versa)
|
157
|
+
# so figure out why
|
158
|
+
# calc location, expand, map back
|
159
|
+
where_found = FastRequire.guess_discover(lib, true)
|
160
|
+
if where_found
|
161
|
+
puts 'inferred ghost loc:' + lib + '=>' + where_found if $FAST_REQUIRE_DEBUG
|
162
|
+
@@require_locs[lib] = where_found
|
163
|
+
# unfortunately if it's our first pass
|
164
|
+
# and we are in the middle of a "real" require
|
165
|
+
# that is circular
|
166
|
+
# then $LOADED_FEATURES or (AFAIK) nothing will have been set
|
167
|
+
# for us to be able to assert that
|
168
|
+
# so...I think we'll end up
|
169
|
+
# just fudging for a bit
|
170
|
+
# raise 'not found' unless @@already_loaded[where_found] # should have already been set...I think...
|
171
|
+
else
|
172
|
+
if $FAST_REQUIRE_DEBUG
|
173
|
+
# happens for enumerator XXXX
|
174
|
+
puts 'unable to infer' + lib + ' in ' if $FAST_REQUIRE_DEBUG
|
175
|
+
end
|
176
|
+
end
|
177
|
+
return false # XXXX test all these return values
|
178
|
+
end
|
46
179
|
end
|
47
|
-
|
180
|
+
end
|
181
|
+
|
182
|
+
def self.resetup!
|
183
|
+
eval "module ::Kernel; alias :require :require_cached; end"
|
48
184
|
end
|
49
185
|
end
|
50
186
|
|
51
187
|
module Kernel
|
52
|
-
|
188
|
+
|
53
189
|
if(defined?(@already_using_fast_require))
|
54
|
-
raise '
|
190
|
+
raise 'twice not allowed...'
|
191
|
+
# *shouldn't* get here...unless I'm wrong...
|
55
192
|
else
|
56
193
|
@already_using_fast_require = true
|
194
|
+
include FastRequire
|
195
|
+
# overwrite old require...
|
196
|
+
alias :original_non_cached_require :require
|
197
|
+
FastRequire.resetup!
|
57
198
|
end
|
58
|
-
|
59
|
-
|
60
|
-
# overwrite require...
|
61
|
-
alias :original_non_cached_require :require
|
62
|
-
alias :require :require_cached
|
63
|
-
end
|
199
|
+
|
200
|
+
end
|
data/spec/files/b.rb
CHANGED
data/spec/files/d.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'fast_require'
|
data/spec/files/e.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'fast_require'
|
data/spec/files/fast.rb
CHANGED
@@ -0,0 +1,10 @@
|
|
1
|
+
require '../lib/fast_require.rb'
|
2
|
+
require 'rubygems'
|
3
|
+
Gem::Specification
|
4
|
+
|
5
|
+
#require '_dbg'
|
6
|
+
raise if FastRequire.already_loaded.to_a.flatten.grep(/files\/b.rb/).length > 0
|
7
|
+
require 'files/b.rb'
|
8
|
+
raise if(require 'files/b.rb')
|
9
|
+
raise unless FastRequire.already_loaded.to_a.flatten.grep(/files\/b.rb/).length > 0
|
10
|
+
#raise 'I dont trust this'
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
Gem::Specification
|
3
|
+
|
4
|
+
require '../lib/fast_require.rb'
|
5
|
+
|
6
|
+
raise if FastRequire.already_loaded.to_a.flatten.grep(/files\/b.rb/).length > 0
|
7
|
+
require 'files/b.rb'
|
8
|
+
raise if(require 'files/b.rb')
|
9
|
+
raise unless FastRequire.already_loaded.to_a.flatten.grep(/files\/b.rb/).length > 0
|
data/spec/files/large.rb
ADDED
File without changes
|
@@ -0,0 +1,6 @@
|
|
1
|
+
require File.dirname(File.expand_path(__FILE__)) + '/../../lib/fast_require.rb'
|
2
|
+
raise if (require File.dirname(File.expand_path(__FILE__)) + '/../../lib/fast_require.rb') # another test, why not? :)
|
3
|
+
paths = [File.expand_path('b.rb'), File.expand_path('b')]
|
4
|
+
paths.each{|p| require p}
|
5
|
+
paths.each{|p| raise unless FastRequire.require_locs.keys.include?(p)}
|
6
|
+
|
@@ -0,0 +1,6 @@
|
|
1
|
+
$:.unshift 'bin'
|
2
|
+
require File.dirname(File.expand_path(__FILE__)) + '/../../lib/fast_require.rb'
|
3
|
+
require 'non_dot_rb.rb' # succeed
|
4
|
+
require 'non_dot_rb' # fails (well, returns false), we think it succeeds, but it in the wrong place, so when we run the second time, it loads the wrong file
|
5
|
+
|
6
|
+
# unless my gem is working right
|
@@ -0,0 +1,6 @@
|
|
1
|
+
require File.dirname(File.expand_path(__FILE__)) + '/../../lib/fast_require.rb'
|
2
|
+
raise if (require File.dirname(File.expand_path(__FILE__)) + '/../../lib/fast_require.rb') # another test, why not? :)
|
3
|
+
require 'b.rb'
|
4
|
+
require 'b'
|
5
|
+
raise unless FastRequire.require_locs.keys.include?('b.rb') && FastRequire.require_locs.keys.include?('b')
|
6
|
+
|
data/spec/files/slow.rb
CHANGED
data/spec/spec.fast_require.rb
CHANGED
@@ -1,95 +1,150 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# $FAST_REQUIRE_DEBUG
|
2
|
+
require 'rubygems' if RUBY_VERSION < '1.9'
|
3
3
|
require 'sane'
|
4
4
|
require 'spec/autorun'
|
5
5
|
require 'benchmark'
|
6
|
-
require 'spec/adapters/mock_frameworks/rspec'
|
7
|
-
#require 'ruby-debug'
|
8
6
|
|
9
|
-
#assert !defined?(FastRequire) # so that we can loadup our unit tests sanely, using the old way LOL.
|
10
7
|
require_relative '../lib/fast_require'
|
11
8
|
|
12
9
|
describe "faster requires" do
|
13
10
|
|
11
|
+
before do
|
12
|
+
FastRequire.clear_all!
|
13
|
+
@old_length = $LOADED_FEATURES.length
|
14
|
+
$b = 0
|
15
|
+
@ruby = OS.ruby_bin + " "
|
16
|
+
end
|
17
|
+
|
14
18
|
def with_file(filename = 'test')
|
15
19
|
FileUtils.touch filename + '.rb'
|
16
20
|
yield
|
17
21
|
FileUtils.rm filename + '.rb'
|
18
22
|
end
|
19
23
|
|
20
|
-
it "should be able to
|
24
|
+
it "should be able to do a single require" do
|
25
|
+
old = $LOADED_FEATURES.dup
|
21
26
|
Dir.chdir('files') do
|
22
|
-
|
27
|
+
3
|
28
|
+
#require '_dbg'
|
29
|
+
3
|
30
|
+
assert require('c')
|
23
31
|
assert !(require 'c')
|
24
32
|
end
|
33
|
+
new = $LOADED_FEATURES - old
|
34
|
+
raise new.inspect if new.length > 1
|
25
35
|
end
|
26
36
|
|
27
|
-
it "should be able to go two deep
|
37
|
+
it "should be able to go two sub-requires deep appropriately" do
|
28
38
|
Dir.chdir('files') do
|
29
|
-
assert(require
|
39
|
+
assert(require('a_requires_b'))
|
30
40
|
assert !(require 'a_requires_b')
|
31
41
|
assert !(require 'a_requires_b')
|
32
42
|
$b.should == 1
|
33
43
|
end
|
34
44
|
end
|
35
|
-
|
45
|
+
|
36
46
|
it "should be faster" do
|
37
47
|
Dir.chdir('files') do
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
48
|
+
slow = Benchmark.realtime { assert system("#{OS.ruby_bin} slow.rb")}
|
49
|
+
Benchmark.realtime { assert system("#{OS.ruby_bin} fast.rb")} # warmup
|
50
|
+
fast = Benchmark.realtime { assert system("#{OS.ruby_bin} fast.rb")}
|
51
|
+
pps 'fast', fast, 'slow', slow
|
52
|
+
assert fast < slow
|
43
53
|
end
|
44
54
|
end
|
45
|
-
|
46
|
-
it "should
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
it "should do two of the same requires" do
|
54
|
-
with_file('test') do
|
55
|
-
assert(require 'test')
|
56
|
-
assert(!(require 'test'))
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
before do # each
|
61
|
-
#FastRequire.clear!
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
it "should require files still" do
|
66
|
-
with_file('file1') { require 'file1'}
|
55
|
+
|
56
|
+
it "should work with large complex gem" do
|
57
|
+
Dir.chdir('files') do
|
58
|
+
assert(system("#{OS.ruby_bin} large.rb"))
|
59
|
+
assert(system("#{OS.ruby_bin} large.rb"))
|
60
|
+
assert(system("#{OS.ruby_bin} large.rb"))
|
61
|
+
end
|
67
62
|
end
|
68
63
|
|
69
|
-
it "should
|
64
|
+
it "should not re-save the cache file if it hasn't changed [?]"
|
65
|
+
|
66
|
+
it "should require .so files still, and only load them once" do
|
70
67
|
# ruby-prof gem
|
71
|
-
2.times { require 'ruby_prof' } # .so
|
68
|
+
2.times { require 'ruby_prof'; RubyProf } # .so
|
69
|
+
assert $LOADED_FEATURES.length == (@old_length + 1)
|
72
70
|
end
|
73
71
|
|
74
|
-
it "should add
|
75
|
-
|
72
|
+
it "should add requires to $LOADED_FEATURES" do
|
73
|
+
with_file('file2') {require 'file2'}
|
76
74
|
assert ($LOADED_FEATURES.grep(/file2.rb/)).length > 0
|
75
|
+
assert $LOADED_FEATURES.length == (@old_length + 1)
|
77
76
|
end
|
78
77
|
|
79
|
-
it "should
|
80
|
-
|
81
|
-
# maybe with and
|
82
|
-
end
|
83
|
-
|
84
|
-
it "should have a faster require method--faster, my friend, faster!"
|
85
|
-
|
86
|
-
it "should save a file" do
|
87
|
-
#FastRequire.clear!
|
88
|
-
loc = File.expand_path('~/.ruby_fast_require_location')
|
89
|
-
assert !File.exist?(loc)
|
78
|
+
it "should save a file as a cache in a dir" do
|
79
|
+
assert Dir[FastRequire.dir + '/*'].length == 0 # all clear
|
90
80
|
FastRequire.save
|
91
|
-
assert
|
81
|
+
assert Dir[FastRequire.dir + '/*'].length > 0
|
92
82
|
end
|
93
|
-
|
94
|
-
it "should
|
95
|
-
|
83
|
+
|
84
|
+
it "should have different caches based on the file being run, and Dir.pwd" do
|
85
|
+
# that wouldn't help much at all for ruby-prof runs, but...we do what we can
|
86
|
+
assert Dir[FastRequire.dir + '/*'].length == 0 # all clear
|
87
|
+
Dir.chdir('files') do
|
88
|
+
assert system("ruby -I../../lib d.rb")
|
89
|
+
assert system("ruby -I../../lib e.rb")
|
90
|
+
assert system("ruby -C.. -I../lib files/e.rb")
|
91
|
+
end
|
92
|
+
assert Dir[FastRequire.dir + '/*'].length == 3
|
93
|
+
assert Dir[FastRequire.dir + '/*spec_files_d*'].length == 1 # use full path
|
94
|
+
assert Dir[FastRequire.dir + '/*spec_files_e*'].length == 2 # different dirs
|
95
|
+
end
|
96
|
+
|
97
|
+
context "should work with ascii files well" do # most are binary, so...low prio
|
98
|
+
it "could cache the converted file, if that speeds things up"
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
def ruby filename
|
103
|
+
assert system(@ruby + " " + filename)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should override rubygems' require if rubygems is loaded after the fact...maybe by hooking to Gem::const_defined or something" do
|
107
|
+
ruby "files/gem_after.rb"
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should override rubygems' require if rubygems is loaded before the fact" do
|
111
|
+
ruby "files/gem_before.rb"
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should throw if you require it twice" do
|
115
|
+
Dir.chdir('files') do
|
116
|
+
assert !system(@ruby + 'attempt_double_load.rb')
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should force require 'abc' to not load file called exactly abc" do
|
121
|
+
Dir.chdir('files') do
|
122
|
+
ruby 'require_non_dot_rb_fails.rb'
|
123
|
+
ruby 'require_non_dot_rb_fails.rb' # should succeed
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should be able to handle full paths" do
|
128
|
+
Dir.chdir('files') do
|
129
|
+
ruby 'require_full_path.rb'
|
130
|
+
ruby 'require_full_path.rb'
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should handle Pathname too" do
|
135
|
+
require 'pathname'
|
136
|
+
require Pathname.new('spec.fast_require.rb')
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should work well with rubygems for gem libs (installed), themselves"
|
140
|
+
|
141
|
+
it "should disallow a file requiring itself" do
|
142
|
+
ruby 'files/requires_itself.rb'
|
143
|
+
ruby 'files/requires_itself.rb'
|
144
|
+
end
|
145
|
+
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
|
150
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fast_require
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roger Pack
|
@@ -9,8 +9,8 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-01-
|
13
|
-
default_executable:
|
12
|
+
date: 2010-01-27 00:00:00 -07:00
|
13
|
+
default_executable: fast_require
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
@@ -32,10 +32,20 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: "0"
|
34
34
|
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: ruby-prof
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
35
45
|
description:
|
36
46
|
email: rogerdpack@gmail.com
|
37
|
-
executables:
|
38
|
-
|
47
|
+
executables:
|
48
|
+
- fast_require
|
39
49
|
extensions: []
|
40
50
|
|
41
51
|
extra_rdoc_files:
|
@@ -43,17 +53,28 @@ extra_rdoc_files:
|
|
43
53
|
files:
|
44
54
|
- README
|
45
55
|
- Rakefile
|
46
|
-
- TODO.LIST
|
47
56
|
- VERSION
|
57
|
+
- benchmark/benchmark.rb
|
58
|
+
- benchmark/benchmark_slow.rb
|
59
|
+
- bin/fast_require
|
48
60
|
- lib/fast_require.rb
|
61
|
+
- lib/rubygems_plugin.rb
|
49
62
|
- spec/files/a_requires_b.rb
|
63
|
+
- spec/files/attempt_double_load.rb
|
50
64
|
- spec/files/b.rb
|
51
65
|
- spec/files/c.rb
|
66
|
+
- spec/files/d.rb
|
67
|
+
- spec/files/e.rb
|
52
68
|
- spec/files/fast.rb
|
69
|
+
- spec/files/gem_after.rb
|
70
|
+
- spec/files/large.rb
|
71
|
+
- spec/files/non_dot_rb.rb
|
72
|
+
- spec/files/require_full_path.rb
|
73
|
+
- spec/files/require_twice_in_dir_pwd.rb
|
53
74
|
- spec/files/slow.rb
|
54
75
|
- spec/spec.fast_require.rb
|
55
76
|
has_rdoc: true
|
56
|
-
homepage: http://github.com/rdp/
|
77
|
+
homepage: http://github.com/rdp/fast_require
|
57
78
|
licenses: []
|
58
79
|
|
59
80
|
post_install_message:
|
@@ -81,9 +102,20 @@ signing_key:
|
|
81
102
|
specification_version: 3
|
82
103
|
summary: A tool designed to speedup library loading in Ruby by caching library locations
|
83
104
|
test_files:
|
105
|
+
- spec/files/attempt_double_load.rb
|
84
106
|
- spec/files/a_requires_b.rb
|
85
107
|
- spec/files/b.rb
|
86
108
|
- spec/files/c.rb
|
109
|
+
- spec/files/d.rb
|
110
|
+
- spec/files/e.rb
|
87
111
|
- spec/files/fast.rb
|
112
|
+
- spec/files/gem_after.rb
|
113
|
+
- spec/files/gem_before.rb
|
114
|
+
- spec/files/large.rb
|
115
|
+
- spec/files/non_dot_rb.rb
|
116
|
+
- spec/files/requires_itself.rb
|
117
|
+
- spec/files/require_full_path.rb
|
118
|
+
- spec/files/require_non_dot_rb_fails.rb
|
119
|
+
- spec/files/require_twice_in_dir_pwd.rb
|
88
120
|
- spec/files/slow.rb
|
89
121
|
- spec/spec.fast_require.rb
|
data/TODO.LIST
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
irb(main):001:0> $LOADED_FEATURES << 'abc.rb'
|
2
|
-
=> ["enumerator.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/enc/encdb.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/enc/trans/transdb.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/enc/iso_8859_1.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/rubygems.rb", "E:/installs/ruby191p376/lib/ruby/gems/1.9.1/gems/faster_rubygems-0.1.0/lib/faster_rubygems.rb", "E:/installs/ruby191p376/lib/ruby/gems/1.9.1/gems/faster_rubygems-0.1.0/lib/ubygemsf.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/rbconfig.rb", "E:/installs/ruby191p376/lib/ruby/gems/1.9.1/gems/backtracer-0.7.2/lib/shared.rb", "E:/installs/ruby191p376/lib/ruby/gems/1.9.1/gems/backtracer-0.7.2/lib/backtracer.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/e2mmap.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/init.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/workspace.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/context.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/extend-command.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/output-method.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/notifier.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/slex.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/ruby-token.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/ruby-lex.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/src_encoding.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/magic-file.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/enc/euc_jp.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/enc/shift_jis.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/etc.so", "E:/installs/ruby191p376/lib/ruby/1.9.1/i386-mingw32/dl.so", "E:/installs/ruby191p376/lib/ruby/site_ruby/1.9.1/rbreadline.rb", "E:/installs/ruby191p376/lib/ruby/site_ruby/1.9.1/readline.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/input-method.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb/locale.rb", "E:/installs/ruby191p376/lib/ruby/1.9.1/irb.rb", "abc.rb"]
|
3
|
-
irb(main):002:0> require 'abc'
|
4
|
-
=> false
|
5
|
-
|
6
|
-
this could be optimized more for 1.9
|
7
|
-
|
8
|
-
Also, could loaded_features be made into a hash for much faster comparison?
|