zeroload 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/README.markdown +6 -2
- data/lib/Zeroload.rb +117 -0
- data/lib/{zeroload/version.rb → Zeroload/Version.rb} +1 -1
- data/lib/Zeroload/no_patch.rb +9 -0
- data/zeroload.gemspec +2 -2
- metadata +5 -5
- data/lib/zeroload.rb +0 -21
- data/lib/zeroload/auto.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3044e8cfa181f2091ca8133fc4799d199fe06aa9
|
4
|
+
data.tar.gz: ab6233dfc22ac453539d27aec3e0960911952fe4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a9703f11a869319b104784e233487d92932646e5f6c03d1942fa7c75f98bce0ec17a6ff9ef49c78cbfa2b2708fc30ba372e499c42217815f24a347eded122e3
|
7
|
+
data.tar.gz: a1ea891510cf0f3ed460cafb838904cd6fc451045e684458acb16e569ac6876dfc85271afa803e7efd9d4c3a8902b9b81a9c0a7d71d65c29b0c9e8be4105b48d
|
data/README.markdown
CHANGED
@@ -35,7 +35,7 @@ Given the files
|
|
35
35
|
|
36
36
|
The contents of lib/Foo.rb is:
|
37
37
|
|
38
|
-
require "
|
38
|
+
require "Zeroload"
|
39
39
|
|
40
40
|
module Foo
|
41
41
|
zeroload!
|
@@ -51,7 +51,8 @@ And the contents of lib/Foo/bar.rb is:
|
|
51
51
|
class Bar
|
52
52
|
zeroload! # only necessary if there's stuff nested below
|
53
53
|
|
54
|
-
|
54
|
+
# Code of Foo::Bar
|
55
|
+
end
|
55
56
|
end
|
56
57
|
|
57
58
|
|
@@ -73,3 +74,6 @@ Caveats
|
|
73
74
|
* [see Revision 33078](https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/33078)
|
74
75
|
* **Q:** But isn't Kernel#autoload deprecated?
|
75
76
|
* **A:** Sadly, the state on this is not entirely clear. But it seems it is no longer deprecated.
|
77
|
+
* **Q:** But with autoloaded constants, Module#constants will not report all constants.
|
78
|
+
* **A:** That is not correct. Autoloaded (but not yet loaded) constants show up with
|
79
|
+
Module#constants. But you can also use Zeroconf.preload! to load all constants at once.
|
data/lib/Zeroload.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
require "Zeroload/Version"
|
2
|
+
|
3
|
+
# Zeroload
|
4
|
+
# Automatically autoload all constants for a module. This requires a change from
|
5
|
+
# the current convention of putting class Foo::BarBaz into foo/barbaz.rb (or
|
6
|
+
# foo/bar_baz.rb in rails) to using Foo/BarBaz.rb instead.
|
7
|
+
#
|
8
|
+
# @example Usage
|
9
|
+
# require "Zeroload"
|
10
|
+
#
|
11
|
+
# class Foo
|
12
|
+
# zeroload! # calls Zeroload.module(Foo)
|
13
|
+
# end
|
14
|
+
# Foo::Bar # will now load Foo/Bar.rb
|
15
|
+
#
|
16
|
+
module Zeroload
|
17
|
+
|
18
|
+
# Controls whether Module is automatically patched or not.
|
19
|
+
# Zeroload/no_patch.rb sets it to false. It is not advised to use this
|
20
|
+
# option, since using zeroload is viral.
|
21
|
+
#
|
22
|
+
Patch = true unless defined?(Patch)
|
23
|
+
|
24
|
+
# All registered autoloads. A nested hash of the structure:
|
25
|
+
# `{NestedModuleName: {UnnestedModuleName => path}`
|
26
|
+
# e.g. `{"Foo::Bar" => {"Baz" => "/absolute/path/to/Foo/Bar/Baz.rb"}}`
|
27
|
+
#
|
28
|
+
Registry = {}
|
29
|
+
|
30
|
+
# Module#name as UnboundMethod
|
31
|
+
#
|
32
|
+
Name = Module.instance_method(:name)
|
33
|
+
|
34
|
+
# Patches the Module class, adding Module#zeroload!, which invokes
|
35
|
+
#
|
36
|
+
# @return self
|
37
|
+
#
|
38
|
+
def self.patch!
|
39
|
+
::Module.class_eval do
|
40
|
+
def zeroload!(directory=nil, *args)
|
41
|
+
directory ||= caller_locations.first.absolute_path.sub(/\.[^.]*\z/, "")
|
42
|
+
|
43
|
+
Zeroload.module(self, directory, *args)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
patch! if Patch
|
51
|
+
|
52
|
+
# Register a module to be zero-loaded.
|
53
|
+
# Use Module#zeroload! instead.
|
54
|
+
#
|
55
|
+
# @param [Module, Class] mod
|
56
|
+
# The module which should be autoloaded.
|
57
|
+
# @param [String, nil] directory
|
58
|
+
# The directory in which to search for nested constants.
|
59
|
+
#
|
60
|
+
# @return mod
|
61
|
+
# Returns the module which is zeroloaded
|
62
|
+
#
|
63
|
+
def self.module(mod, directory=nil)
|
64
|
+
directory ||= caller_locations.first.absolute_path.sub(/\.[^.]*\z/, "".freeze)
|
65
|
+
mod_name = Name.bind(mod).call rescue nil # some modules don't have a name
|
66
|
+
Registry[mod_name] ||= {} if mod_name
|
67
|
+
|
68
|
+
Dir.glob("#{directory}/*.{rb,so,bundle,dll}") do |path|
|
69
|
+
name = File.basename(path)
|
70
|
+
if /\A[A-Z]/ =~ name
|
71
|
+
name = :"#{name.sub(/\.[^.]*\z/, "".freeze)}"
|
72
|
+
|
73
|
+
warn "#{mod} autoloads #{mod}::#{name} from #{path}" if $VERBOSE
|
74
|
+
|
75
|
+
Registry[mod_name][name] = path if mod_name
|
76
|
+
mod.autoload name, path
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
mod
|
81
|
+
end
|
82
|
+
|
83
|
+
# Preload all zeroloaded constants for all or a given module.
|
84
|
+
#
|
85
|
+
# @note
|
86
|
+
# Module#constants properly lists all constants, even if the file
|
87
|
+
# has not yet been loaded.
|
88
|
+
#
|
89
|
+
# @param [Module, Class] mod
|
90
|
+
# The module whose autoloaded constants should be preloaded
|
91
|
+
# @param [true, false] recursive
|
92
|
+
# Whether the constants should be recursively loaded, or only the current
|
93
|
+
# level
|
94
|
+
#
|
95
|
+
# @return nil
|
96
|
+
#
|
97
|
+
def self.preload!(mod=nil, recursive=true)
|
98
|
+
if mod
|
99
|
+
nested_mod_name = Name.bind(mod).call rescue nil # some modules don't have a name
|
100
|
+
preload = Registry[nested_mod_name]
|
101
|
+
|
102
|
+
if preload
|
103
|
+
preload.each_key do |name|
|
104
|
+
loaded = mod.const_get(name)
|
105
|
+
preload!(loaded, true) if recursive
|
106
|
+
end
|
107
|
+
end
|
108
|
+
else
|
109
|
+
Registry.dup.each do |nested_mod_name, zeroloaded|
|
110
|
+
loaded = Object.const_get(nested_mod_name) # Object.const_get does not like Symbols for nested modules.
|
111
|
+
Zeroload.preload!(loaded, true)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
nil
|
116
|
+
end
|
117
|
+
end
|
data/zeroload.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "zeroload"
|
3
|
-
s.version = "0.0.
|
3
|
+
s.version = "0.0.2"
|
4
4
|
s.authors = "Stefan Rusterholz"
|
5
5
|
s.email = "stefan.rusterholz@gmail.com"
|
6
6
|
s.homepage = "https://github.com/apeiros/jacob"
|
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
Automatically autoload all constants for a module.
|
16
16
|
SUMMARY
|
17
17
|
|
18
|
-
s.required_ruby_version = ">= 2.
|
18
|
+
s.required_ruby_version = ">= 2.0.0" # TODO: figure out, when autoload became thread-safe
|
19
19
|
s.files =
|
20
20
|
Dir['bin/**/*'] +
|
21
21
|
Dir['lib/**/*'] +
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zeroload
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Rusterholz
|
@@ -21,9 +21,9 @@ extra_rdoc_files: []
|
|
21
21
|
files:
|
22
22
|
- README.markdown
|
23
23
|
- Rakefile
|
24
|
-
- lib/
|
25
|
-
- lib/
|
26
|
-
- lib/
|
24
|
+
- lib/Zeroload.rb
|
25
|
+
- lib/Zeroload/Version.rb
|
26
|
+
- lib/Zeroload/no_patch.rb
|
27
27
|
- zeroload.gemspec
|
28
28
|
homepage: https://github.com/apeiros/jacob
|
29
29
|
licenses:
|
@@ -37,7 +37,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 2.
|
40
|
+
version: 2.0.0
|
41
41
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
42
|
requirements:
|
43
43
|
- - ">="
|
data/lib/zeroload.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'zeroload/version'
|
2
|
-
require 'zeroload/auto'
|
3
|
-
|
4
|
-
# Zeroload
|
5
|
-
# Automatically autoload all constants for a module. This requires a change from
|
6
|
-
# the current convention of putting class Foo::BarBaz into foo/barbaz.rb (or
|
7
|
-
# foo/bar_baz.rb in rails) to using Foo/BarBaz.rb instead.
|
8
|
-
module Zeroload
|
9
|
-
def self.module(mod, directory=nil)
|
10
|
-
directory ||= caller_locations.first.absolute_path.sub(/\.[^.]*\z/, "".freeze)
|
11
|
-
|
12
|
-
Dir.glob("#{directory}/*.{rb,so,bundle,dll}") do |path|
|
13
|
-
name = File.basename(path)
|
14
|
-
if /\A[A-Z]/ =~ name
|
15
|
-
name.sub!(/\.[^.]*\z/, "".freeze)
|
16
|
-
warn "#{mod} autoloads #{name} from #{path}" if $VERBOSE
|
17
|
-
mod.autoload :"#{name}", path
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|