no_require 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/no_require.rb +61 -0
  2. metadata +67 -0
@@ -0,0 +1,61 @@
1
+ class NoRequire
2
+
3
+ def initialize( root, autoload_dirs=nil )
4
+ @root = root
5
+ no_require_dir( autoload_dirs ) unless autoload_dirs.nil?
6
+ end
7
+
8
+ def no_require_dir( *autoload_dirs )
9
+ add_dirs_to_loadpath( *autoload_dirs )
10
+ autoloads = generate_autoloads( *autoload_dirs )
11
+ autoloads.each {|code| Object.module_eval( code )}
12
+ end
13
+
14
+ private
15
+
16
+ def add_dirs_to_loadpath( autoload_dirs )
17
+ autoload_dirs.each do |dir|
18
+ f = File.join( @root, dir )
19
+ $LOAD_PATH << f if File.exists?( f ) && File.directory?( f )
20
+ end
21
+ end
22
+
23
+ def to_class_name( path )
24
+ path.split('/').map {|s| camelize( s ) }.join( '::' )
25
+ end
26
+
27
+ def camelize( str )
28
+ str.split( /[^a-z0-9]/i ).map{|w| w.capitalize }.join
29
+ end
30
+
31
+ def generate_autoloads( autoload_dirs )
32
+ autoload_code = []
33
+ root_segs = @root.split( '/' )
34
+ autoload_dirs.each do |file_path|
35
+ Dir[ File.join( @root, file_path, '/**/*.rb') ].each do |file|
36
+ expanded = File.expand_path( file )
37
+ autoload_code << generate_autoload_for( root_segs, expanded )
38
+ end
39
+ end
40
+ autoload_code
41
+ end
42
+
43
+ def generate_autoload_for( root_segs, expanded_file )
44
+ code = []
45
+ relative_start_idx = root_segs.length == 0 ? 0 : root_segs.length + 1
46
+ rel_file_segs = expanded_file.split( '/' )[relative_start_idx..-1]
47
+ # wrap autoload of file module statements
48
+ rel_file_segs.each_with_index do |seg, i|
49
+ if i == (rel_file_segs.length-1)
50
+ code << "autoload :#{to_class_name( File.basename( expanded_file, '.rb' ) )}, '#{expanded_file}'"
51
+ else
52
+ code << "module #{to_class_name( seg )}; "
53
+ end
54
+ end
55
+ code << "; end" * (rel_file_segs.length-1)
56
+ code.join
57
+ end
58
+
59
+ end
60
+
61
+
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: no_require
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Paul Grayson
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-03-26 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: For non-rails ruby apps, NoRequire generates appropriate autoload statements so you no longer need to manage dependencies in your code with require statements.
23
+ email: paul.grayson@gmail.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - lib/no_require.rb
32
+ has_rdoc: true
33
+ homepage: http://github.com/paulgrayson/no_require
34
+ licenses: []
35
+
36
+ post_install_message:
37
+ rdoc_options: []
38
+
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ hash: 3
47
+ segments:
48
+ - 0
49
+ version: "0"
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ hash: 3
56
+ segments:
57
+ - 0
58
+ version: "0"
59
+ requirements: []
60
+
61
+ rubyforge_project:
62
+ rubygems_version: 1.6.2
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: NoRequire
66
+ test_files: []
67
+