zeitwerk 1.4.0 → 1.4.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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/lib/zeitwerk/loader.rb +6 -0
- data/lib/zeitwerk/loader/callbacks.rb +20 -5
- data/lib/zeitwerk/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3e5a11bbda38b569f50eabcaf7dd6e53ce209120b5d1b4f2a933edae9230d14
|
4
|
+
data.tar.gz: 52107af4754d7cc305c1978172920eb7b8c180b4d8660080902143a422287ad2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8133b49d1231e2f2c797c02151787b0fbb95eba0c9a573ae90ea2e722a736f583876820296536e6206bd711f2d23789fc867e55e34771968a005e74352df43c2
|
7
|
+
data.tar.gz: 243a54e0a4e5c947851271c196617cfd113cdcc2795de00dc9c5d6909351825a92e15f868880584d1ce84d6e0168219c109bad1d83a64b82c25af9a18beeb903
|
data/README.md
CHANGED
@@ -295,9 +295,9 @@ class MyInflector < Zeitwerk::Inflector
|
|
295
295
|
end
|
296
296
|
```
|
297
297
|
|
298
|
-
The first argument, `basename`, is a string with the basename of the file or directory to be inflected. In the case of a file, without extension. The inflector needs to return this basename inflected. Therefore, a simple constant name without colons.
|
298
|
+
The first argument, `basename`, is a string with the basename of the file or directory to be inflected. In the case of a file, without extension. In the case of a directory, without trailing slash. The inflector needs to return this basename inflected. Therefore, a simple constant name without colons.
|
299
299
|
|
300
|
-
The second argument, `abspath`, is a string with the absolute path to the file or directory in case you need it to decide how to inflect the basename.
|
300
|
+
The second argument, `abspath`, is a string with the absolute path to the file or directory in case you need it to decide how to inflect the basename. Paths to directories don't have trailing slashes.
|
301
301
|
|
302
302
|
Then, assign the inflector:
|
303
303
|
|
data/lib/zeitwerk/loader.rb
CHANGED
@@ -113,6 +113,10 @@ module Zeitwerk
|
|
113
113
|
# @return [Mutex]
|
114
114
|
attr_reader :mutex
|
115
115
|
|
116
|
+
# @private
|
117
|
+
# @return [Mutex]
|
118
|
+
attr_reader :mutex2
|
119
|
+
|
116
120
|
def initialize
|
117
121
|
@initialized_at = Time.now
|
118
122
|
|
@@ -130,7 +134,9 @@ module Zeitwerk
|
|
130
134
|
@shadowed_files = {}
|
131
135
|
@eager_load_exclusions = Set.new
|
132
136
|
|
137
|
+
# TODO: find a better name for these mutexes.
|
133
138
|
@mutex = Mutex.new
|
139
|
+
@mutex2 = Mutex.new
|
134
140
|
@setup = false
|
135
141
|
@eager_loaded = false
|
136
142
|
|
@@ -17,13 +17,28 @@ module Zeitwerk::Loader::Callbacks
|
|
17
17
|
# @param dir [String]
|
18
18
|
# @return [void]
|
19
19
|
def on_dir_autoloaded(dir)
|
20
|
-
|
20
|
+
# Module#autoload does not serialize concurrent requires, and we handle
|
21
|
+
# directories ourselves.
|
22
|
+
#
|
23
|
+
# That introduces a race condition here in which thread t1 autovivifies the
|
24
|
+
# module, and while autoloads are being set on that module object, thread t2
|
25
|
+
# autoloads the same namespace.
|
26
|
+
#
|
27
|
+
# In that situation, t2 resets the constant to store a new module. That not
|
28
|
+
# only sets the constant twice (undesirable per se), but it gets worse,
|
29
|
+
# because the module object created by t2 won't have any of the autoloads
|
30
|
+
# for child constants set, since t1 correctly deleted the lazy_dirs entry,
|
31
|
+
# thus resulting in NameErrors when client code tries to reach them.
|
32
|
+
mutex2.synchronize do
|
33
|
+
parent, cname = autoloads[dir]
|
34
|
+
break if loaded_cpaths.include?(cpath(parent, cname))
|
21
35
|
|
22
|
-
|
23
|
-
|
36
|
+
autovivified_module = parent.const_set(cname, Module.new)
|
37
|
+
log("module #{autovivified_module.name} autovivified from directory #{dir}") if logger
|
24
38
|
|
25
|
-
|
26
|
-
|
39
|
+
loaded_cpaths.add(autovivified_module.name)
|
40
|
+
on_namespace_loaded(autovivified_module)
|
41
|
+
end
|
27
42
|
end
|
28
43
|
|
29
44
|
# Invoked when a class or module is created or reopened, either from the
|
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.4.
|
4
|
+
version: 1.4.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-03-
|
11
|
+
date: 2019-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |2
|
14
14
|
Zeitwerk implements constant autoloading with Ruby semantics. Each gem
|