zeitwerk 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/zeitwerk/kernel.rb +3 -3
- data/lib/zeitwerk/loader.rb +33 -62
- data/lib/zeitwerk/loader/callbacks.rb +43 -0
- data/lib/zeitwerk/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 172e4bb51ab526d5f4f606f0c4099cd9d4b8bdfe15a2ec851ed58e7095018f07
|
4
|
+
data.tar.gz: 74b2d3f010de6374d919e7cae4d759a86490d91bfb7cd3f743b314e10569d2e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57531ede94526489ffb47235b0113ff6cb290c5d21c4b03dbbdea79a55b0e6b74d685b8f5d57f5b0bf9ec85986e731368bd57b9f5dd0ccfdc40033e5b570bbaa
|
7
|
+
data.tar.gz: d50a101226b04214af4bcc6961422501044a4b9bede6d18bc06a622736bedd7d19fa9b8b9191b8f08042382d0bebcfb8e0162aa7aef37eddd2e17dbcdc6ee8a6
|
data/lib/zeitwerk/kernel.rb
CHANGED
@@ -14,17 +14,17 @@ module Kernel
|
|
14
14
|
if loader = Zeitwerk::Registry.loader_for(path)
|
15
15
|
if path.end_with?(".rb")
|
16
16
|
zeitwerk_original_require(path).tap do |required|
|
17
|
-
loader.
|
17
|
+
loader.on_file_autoloaded(path) if required
|
18
18
|
end
|
19
19
|
else
|
20
|
-
loader.
|
20
|
+
loader.on_dir_autoloaded(path)
|
21
21
|
end
|
22
22
|
else
|
23
23
|
zeitwerk_original_require(path).tap do |required|
|
24
24
|
if required
|
25
25
|
realpath = $LOADED_FEATURES.last
|
26
26
|
if loader = Zeitwerk::Registry.loader_for(realpath)
|
27
|
-
loader.
|
27
|
+
loader.on_file_autoloaded(realpath)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
data/lib/zeitwerk/loader.rb
CHANGED
@@ -5,6 +5,9 @@ require "securerandom"
|
|
5
5
|
|
6
6
|
module Zeitwerk
|
7
7
|
class Loader
|
8
|
+
require_relative "loader/callbacks"
|
9
|
+
include Callbacks
|
10
|
+
|
8
11
|
# @return [String]
|
9
12
|
attr_reader :tag
|
10
13
|
|
@@ -117,11 +120,7 @@ module Zeitwerk
|
|
117
120
|
@eager_loaded = false
|
118
121
|
|
119
122
|
@tracer = TracePoint.new(:class) do |tp|
|
120
|
-
|
121
|
-
if subdirs = lazy_subdirs.delete(tp.self.name)
|
122
|
-
subdirs.each { |subdir| set_autoloads_in_dir(subdir, tp.self) }
|
123
|
-
end
|
124
|
-
end
|
123
|
+
on_namespace_loaded(tp.self)
|
125
124
|
end
|
126
125
|
|
127
126
|
Registry.register_loader(self)
|
@@ -147,14 +146,12 @@ module Zeitwerk
|
|
147
146
|
# @param path [<String, Pathname>]
|
148
147
|
# @return [void]
|
149
148
|
def push_dir(path)
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
raise ArgumentError, "the root directory #{abspath} does not exist"
|
157
|
-
end
|
149
|
+
abspath = File.expand_path(path)
|
150
|
+
if dir?(abspath)
|
151
|
+
raise_if_conflicting_directory(abspath)
|
152
|
+
root_dirs[abspath] = true
|
153
|
+
else
|
154
|
+
raise ArgumentError, "the root directory #{abspath} does not exist"
|
158
155
|
end
|
159
156
|
end
|
160
157
|
|
@@ -192,12 +189,13 @@ module Zeitwerk
|
|
192
189
|
# @return [void]
|
193
190
|
def setup
|
194
191
|
mutex.synchronize do
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
192
|
+
break if @setup
|
193
|
+
|
194
|
+
expand_ignored_glob_patterns
|
195
|
+
non_ignored_root_dirs.each { |root_dir| set_autoloads_in_dir(root_dir, Object) }
|
196
|
+
do_preload
|
197
|
+
|
198
|
+
@setup = true
|
201
199
|
end
|
202
200
|
end
|
203
201
|
|
@@ -226,6 +224,7 @@ module Zeitwerk
|
|
226
224
|
# array lookups, since directories are not stored in $LOADED_FEATURES.
|
227
225
|
$LOADED_FEATURES.delete(path) if ruby?(path)
|
228
226
|
end
|
227
|
+
|
229
228
|
autoloads.clear
|
230
229
|
loaded.clear
|
231
230
|
lazy_subdirs.clear
|
@@ -274,7 +273,7 @@ module Zeitwerk
|
|
274
273
|
end
|
275
274
|
end
|
276
275
|
|
277
|
-
# Says if the given constant path
|
276
|
+
# Says if the given constant path has been loaded.
|
278
277
|
#
|
279
278
|
# @param cpath [String]
|
280
279
|
# @return [Boolean]
|
@@ -285,7 +284,7 @@ module Zeitwerk
|
|
285
284
|
# --- Class methods ---------------------------------------------------------------------------
|
286
285
|
|
287
286
|
class << self
|
288
|
-
# @return [#call, nil]
|
287
|
+
# @return [#call, #debug, nil]
|
289
288
|
attr_accessor :default_logger
|
290
289
|
|
291
290
|
# @private
|
@@ -296,6 +295,7 @@ module Zeitwerk
|
|
296
295
|
#
|
297
296
|
# require "zeitwerk"
|
298
297
|
# loader = Zeitwerk::Loader.new
|
298
|
+
# loader.tag = File.basename(__FILE__, ".rb")
|
299
299
|
# loader.inflector = Zeitwerk::GemInflector.new
|
300
300
|
# loader.push_dir(__dir__)
|
301
301
|
#
|
@@ -326,37 +326,6 @@ module Zeitwerk
|
|
326
326
|
|
327
327
|
self.mutex = Mutex.new
|
328
328
|
|
329
|
-
# --- Callbacks -------------------------------------------------------------------------------
|
330
|
-
|
331
|
-
# Callback invoked from Kernel when a managed file is loaded.
|
332
|
-
#
|
333
|
-
# @private
|
334
|
-
# @param file [String]
|
335
|
-
# @return [void]
|
336
|
-
def on_file_loaded(file)
|
337
|
-
parent, cname = autoloads[file]
|
338
|
-
loaded.add(cpath(parent, cname))
|
339
|
-
log("constant #{cpath(parent, cname)} loaded from file #{file}") if logger
|
340
|
-
end
|
341
|
-
|
342
|
-
# Callback invoked from Kernel when a managed directory is loaded.
|
343
|
-
#
|
344
|
-
# @private
|
345
|
-
# @param dir [String]
|
346
|
-
# @return [void]
|
347
|
-
def on_dir_loaded(dir)
|
348
|
-
parent, cname = autoloads[dir]
|
349
|
-
|
350
|
-
autovivified_module = parent.const_set(cname, Module.new)
|
351
|
-
log("module #{autovivified_module.name} autovivified from directory #{dir}") if logger
|
352
|
-
|
353
|
-
loaded.add(autovivified_module.name)
|
354
|
-
|
355
|
-
if subdirs = lazy_subdirs[autovivified_module.name]
|
356
|
-
subdirs.each { |subdir| set_autoloads_in_dir(subdir, autovivified_module) }
|
357
|
-
end
|
358
|
-
end
|
359
|
-
|
360
329
|
private # -------------------------------------------------------------------------------------
|
361
330
|
|
362
331
|
# @return [<String>]
|
@@ -554,16 +523,18 @@ module Zeitwerk
|
|
554
523
|
end
|
555
524
|
|
556
525
|
def raise_if_conflicting_directory(dir)
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
526
|
+
self.class.mutex.synchronize do
|
527
|
+
Registry.loaders.each do |loader|
|
528
|
+
next if loader == self
|
529
|
+
|
530
|
+
loader.dirs.each do |already_managed_dir|
|
531
|
+
if dir.start_with?(already_managed_dir) || already_managed_dir.start_with?(dir)
|
532
|
+
require "pp"
|
533
|
+
raise ConflictingDirectory,
|
534
|
+
"loader\n\n#{pretty_inspect}\n\nwants to manage directory #{dir}," \
|
535
|
+
" which is already managed by\n\n#{loader.pretty_inspect}\n"
|
536
|
+
EOS
|
537
|
+
end
|
567
538
|
end
|
568
539
|
end
|
569
540
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Zeitwerk::Loader::Callbacks
|
2
|
+
# Invoked from our decorated Kernel#require when a managed file is autoloaded.
|
3
|
+
#
|
4
|
+
# @private
|
5
|
+
# @param file [String]
|
6
|
+
# @return [void]
|
7
|
+
def on_file_autoloaded(file)
|
8
|
+
parent, cname = autoloads[file]
|
9
|
+
loaded.add(cpath(parent, cname))
|
10
|
+
log("constant #{cpath(parent, cname)} loaded from file #{file}") if logger
|
11
|
+
end
|
12
|
+
|
13
|
+
# Invoked from our decorated Kernel#require when a managed directory is
|
14
|
+
# autoloaded.
|
15
|
+
#
|
16
|
+
# @private
|
17
|
+
# @param dir [String]
|
18
|
+
# @return [void]
|
19
|
+
def on_dir_autoloaded(dir)
|
20
|
+
parent, cname = autoloads[dir]
|
21
|
+
|
22
|
+
autovivified_module = parent.const_set(cname, Module.new)
|
23
|
+
log("module #{autovivified_module.name} autovivified from directory #{dir}") if logger
|
24
|
+
|
25
|
+
loaded.add(autovivified_module.name)
|
26
|
+
on_namespace_loaded(autovivified_module)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Invoked when a class or module is created or reopened, either from the
|
30
|
+
# tracer or from module autovivification. If the namespace has matching
|
31
|
+
# subdirectories, we descend into them now.
|
32
|
+
#
|
33
|
+
# @private
|
34
|
+
# @param namespace [Module]
|
35
|
+
# @return [void]
|
36
|
+
def on_namespace_loaded(namespace)
|
37
|
+
if subdirs = lazy_subdirs.delete(namespace.name)
|
38
|
+
subdirs.each do |subdir|
|
39
|
+
set_autoloads_in_dir(subdir, namespace)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/zeitwerk/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zeitwerk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Xavier Noria
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |2
|
14
14
|
Zeitwerk implements constant autoloading with Ruby semantics. Each gem
|
@@ -27,6 +27,7 @@ files:
|
|
27
27
|
- lib/zeitwerk/inflector.rb
|
28
28
|
- lib/zeitwerk/kernel.rb
|
29
29
|
- lib/zeitwerk/loader.rb
|
30
|
+
- lib/zeitwerk/loader/callbacks.rb
|
30
31
|
- lib/zeitwerk/registry.rb
|
31
32
|
- lib/zeitwerk/version.rb
|
32
33
|
homepage: https://github.com/fxn/zeitwerk
|