no_require 0.0.1

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.
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
+