require_all 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,3 +1,8 @@
1
+ 1.1.0:
2
+
3
+ * Add require_rel (require_all relative to the current file)
4
+ * Fix bug in auto-appending .rb ala require
5
+
1
6
  1.0.1:
2
7
 
3
8
  * Allow require_all to take a directory name as an argument
@@ -11,38 +11,55 @@ Wouldn't that be nice? Well, now you can!
11
11
 
12
12
  <code>require 'require_all'</code>
13
13
 
14
- You can now require_all in a multitude of different ways:
14
+ You can use require_all in a multitude of different ways.
15
15
 
16
- <code>require_all *args</code>
16
+ The easiest way to use require_all is to just point it at a directory
17
+ containing a bunch of .rb files:
17
18
 
18
- One of the easiest ways to require_all is to give it a glob, which will
19
- enumerate all the matching files and load them in the proper order. For
20
- example, to load all the Ruby files under the 'lib' directory, just do:
19
+ <code>require_all 'lib'</code>
21
20
 
22
- <code>require_all 'lib/**/*.rb'</code>
21
+ This will find all the .rb files under the lib directory (including all
22
+ subdirectories as well) and load them.
23
+
24
+ The proper order to in which to load them is determined automatically. If the
25
+ dependencies between the matched files are unresolvable, it will throw the
26
+ first unresolvable NameError.
23
27
 
24
- If the dependencies between the matched files are unresolvable, it will
25
- throw the first unresolvable NameError.
28
+ You can also give it a glob, which will enumerate all the matching files:
26
29
 
27
- Don't want to give it a glob? Just give it a list of files:
30
+ <code>require_all 'lib/**/*.rb'</code>
28
31
 
29
- <code>require_all Dir.glob("blah/**/*.rb").reject { |f| stupid_file(f) }</code>
32
+ It will also accept an array of files:
33
+
34
+ <code>require_all Dir.glob("blah/**/*.rb").reject { |f| stupid_file? f }</code>
30
35
 
31
36
  Or if you want, just list the files directly as arguments:
32
37
 
33
38
  <code>require_all 'lib/a.rb', 'lib/b.rb', 'lib/c.rb', 'lib/d.rb'</code>
39
+
40
+ Still have the require File.dirname(__FILE__) blues? The require_all gem also
41
+ provides a require_rel statement which requires files to relative to the
42
+ current file. So you can replace statements like:
43
+
44
+ <code>require File.dirname(__FILE__) + '/foobar'</code>
45
+
46
+ with just a simple require_rel:
47
+
48
+ <code>require_rel 'foobar'</code>
49
+
50
+ Even better, require_rel still has the full power of require_all, so you can
51
+ use require_rel to load entire directories of code too. If "foobar" is a
52
+ directory this will load all the .rb files found under that directory with
53
+ automagic dependency handling.
34
54
 
35
55
  It's just that easy! Code loading shouldn't be hard.
36
56
 
37
57
  h2. Methodology
38
58
 
39
59
  I didn't invent the approach this gem uses. It was shamelessly stolen from
40
- Merb. Once upon a time at MountainWest RubyConf we were discussing how
41
- horrible ActiveSupport's dependencies.rb hijacking of const_missing and
42
- someone described the approach Merb used to me. It was so simple and clean!
43
- Here's how it works:
60
+ Merb (which apparently stole it from elsewhere). Here's how it works:
44
61
 
45
- # Enumerate the files in the glob
62
+ # Enumerate the files to be loaded
46
63
  # Try to load all of the files. If we encounter a NameError loading a
47
64
  particular file, store that file in a "try to load it later" list.
48
65
  # If all the files loaded, great, we're done! If not, go through the
@@ -47,7 +47,7 @@ module RequireAll
47
47
  if stat.file?
48
48
  files = [arg]
49
49
  elsif stat.directory?
50
- files = Dir.glob "#{arg}/**/*.rb"
50
+ files = Dir.glob File.join(arg, '**', '*.rb')
51
51
  else
52
52
  raise ArgumentError, "#{arg} isn't a file or directory"
53
53
  end
@@ -55,6 +55,12 @@ module RequireAll
55
55
  # If the stat failed, maybe we have a glob!
56
56
  files = Dir.glob arg
57
57
 
58
+ # Maybe it's an .rb file and the .rb was omitted
59
+ if File.file?(arg + '.rb')
60
+ require(arg + '.rb')
61
+ return true
62
+ end
63
+
58
64
  # If we ain't got no files, the glob failed
59
65
  raise LoadError, "no such file to load -- #{arg}" if files.empty?
60
66
  end
@@ -107,6 +113,13 @@ module RequireAll
107
113
 
108
114
  true
109
115
  end
116
+
117
+ # Works like require_all, but paths are relative to the caller rather than
118
+ # the current working directory
119
+ def require_rel(path)
120
+ source_directory = File.dirname caller.first.sub(/:\d+$/, '')
121
+ require_all File.join(source_directory, path)
122
+ end
110
123
  end
111
124
 
112
125
  include RequireAll
@@ -2,10 +2,10 @@ require 'rubygems'
2
2
 
3
3
  GEMSPEC = Gem::Specification.new do |s|
4
4
  s.name = "require_all"
5
- s.version = "1.0.1"
5
+ s.version = "1.1.0"
6
6
  s.authors = "Tony Arcieri"
7
7
  s.email = "tony@medioh.com"
8
- s.date = "2009-06-09"
8
+ s.date = "2009-07-18"
9
9
  s.summary = "A wonderfully simple way to load your code"
10
10
  s.platform = Gem::Platform::RUBY
11
11
 
@@ -0,0 +1,2 @@
1
+ class RelativeA
2
+ end
@@ -0,0 +1,5 @@
1
+ require_rel '../a'
2
+ require_rel '../c'
3
+
4
+ class RelativeB
5
+ end
@@ -0,0 +1,2 @@
1
+ class RelativeC
2
+ end
@@ -25,7 +25,7 @@ describe "require_all" do
25
25
  end
26
26
 
27
27
  it "works like a drop-in require replacement" do
28
- require_all(@base_dir + '/c.rb').should be_true
28
+ require_all(@base_dir + '/c').should be_true
29
29
  end
30
30
 
31
31
  it "accepts lists of files" do
@@ -44,4 +44,14 @@ describe "require_all" do
44
44
  require_all("#{@base_dir}/").should be_true
45
45
  end
46
46
  end
47
+ end
48
+
49
+ describe "require_rel" do
50
+ it "provides require_all functionality relative to the current file" do
51
+ require File.dirname(__FILE__) + '/fixtures/relative/b/b'
52
+
53
+ defined?(RelativeA).should == "constant"
54
+ defined?(RelativeB).should == "constant"
55
+ defined?(RelativeC).should == "constant"
56
+ end
47
57
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: require_all
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Arcieri
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-09 00:00:00 -06:00
12
+ date: 2009-07-18 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -25,6 +25,9 @@ extra_rdoc_files:
25
25
  - CHANGES
26
26
  files:
27
27
  - lib/require_all.rb
28
+ - spec/fixtures/relative/a.rb
29
+ - spec/fixtures/relative/b/b.rb
30
+ - spec/fixtures/relative/c/c.rb
28
31
  - spec/fixtures/resolvable/a.rb
29
32
  - spec/fixtures/resolvable/b.rb
30
33
  - spec/fixtures/resolvable/c.rb