zeitwerk 2.5.1 → 2.5.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.md +20 -8
- data/lib/zeitwerk/kernel.rb +10 -9
- data/lib/zeitwerk/loader.rb +9 -12
- 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: edfc3d6e8c62e95f5a008e6625b5b7f2ff7e0067e3d311ec352e1bf6c6922c27
|
4
|
+
data.tar.gz: 9087c6cc6524a8fd2b6843c283496e29cc5d9157421f6ba7994feb362f383333
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d31bf02d352d61024f553f21b14093bc4d8cfc9276c106e8a67b499044aaf12bdd076288c89828b342a1980f163706b62c82d9bd21c15cdc4cadacf117e5299
|
7
|
+
data.tar.gz: 89cc85a2efeb95760de195fc2acf854256dba89cdee2208992c33ba5d8cb78ad71adaddc757026660dbc4a2d562e1efa623572b91d2107e9cf30020ea83524ab
|
data/README.md
CHANGED
@@ -50,8 +50,8 @@
|
|
50
50
|
- [Rules of thumb](#rules-of-thumb)
|
51
51
|
- [Debuggers](#debuggers)
|
52
52
|
- [debug.rb](#debugrb)
|
53
|
-
- [Break](#break)
|
54
53
|
- [Byebug](#byebug)
|
54
|
+
- [Break](#break)
|
55
55
|
- [Pronunciation](#pronunciation)
|
56
56
|
- [Supported Ruby versions](#supported-ruby-versions)
|
57
57
|
- [Testing](#testing)
|
@@ -810,7 +810,9 @@ Kernel.module_eval do
|
|
810
810
|
end
|
811
811
|
```
|
812
812
|
|
813
|
-
|
813
|
+
`Kernel` is already defined by Ruby so the module cannot be autoloaded. Also, that file does not define a constant path after the path name. Therefore, Zeitwerk should not process it at all.
|
814
|
+
|
815
|
+
The extension can still coexist with the rest of the project, you only need to tell Zeitwerk to ignore it:
|
814
816
|
|
815
817
|
```ruby
|
816
818
|
kernel_ext = "#{__dir__}/my_gem/core_ext/kernel.rb"
|
@@ -826,6 +828,14 @@ loader.ignore(core_ext)
|
|
826
828
|
loader.setup
|
827
829
|
```
|
828
830
|
|
831
|
+
Now, that file has to be loaded manually with `require` or `require_relative`:
|
832
|
+
|
833
|
+
```ruby
|
834
|
+
require_relative "my_gem/core_ext/kernel"
|
835
|
+
```
|
836
|
+
|
837
|
+
and you can do that anytime, before configuring the loader, or after configuring the loader, does not matter.
|
838
|
+
|
829
839
|
<a id="markdown-use-case-the-adapter-pattern" name="use-case-the-adapter-pattern"></a>
|
830
840
|
#### Use case: The adapter pattern
|
831
841
|
|
@@ -973,17 +983,19 @@ With that, when Zeitwerk scans the file system and reaches the gem directories `
|
|
973
983
|
<a id="markdown-debugrb" name="debugrb"></a>
|
974
984
|
#### debug.rb
|
975
985
|
|
976
|
-
The new [debug.rb](https://github.com/ruby/debug) gem and Zeitwerk
|
986
|
+
The new [debug.rb](https://github.com/ruby/debug) gem and Zeitwerk are mostly compatible. This is the new debugger that is going to ship with Ruby 3.1.
|
977
987
|
|
978
|
-
|
979
|
-
#### Break
|
980
|
-
|
981
|
-
Zeitwerk works fine with [@gsamokovarov](https://github.com/gsamokovarov)'s [Break](https://github.com/gsamokovarov/break) debugger.
|
988
|
+
There's one exception, though: Due to a technical limitation of tracepoints, explicit namespaces are not autoloaded while expressions are evaluated in the REPL. See [ruby/debug#408](https://github.com/ruby/debug/issues/408).
|
982
989
|
|
983
990
|
<a id="markdown-byebug" name="byebug"></a>
|
984
991
|
#### Byebug
|
985
992
|
|
986
|
-
Zeitwerk and [Byebug](https://github.com/deivid-rodriguez/byebug)
|
993
|
+
Zeitwerk and [Byebug](https://github.com/deivid-rodriguez/byebug) have a similar edge incompatibility.
|
994
|
+
|
995
|
+
<a id="markdown-break" name="break"></a>
|
996
|
+
#### Break
|
997
|
+
|
998
|
+
Zeitwerk works fine with [@gsamokovarov](https://github.com/gsamokovarov)'s [Break](https://github.com/gsamokovarov/break) debugger.
|
987
999
|
|
988
1000
|
<a id="markdown-pronunciation" name="pronunciation"></a>
|
989
1001
|
## Pronunciation
|
data/lib/zeitwerk/kernel.rb
CHANGED
@@ -24,22 +24,23 @@ module Kernel
|
|
24
24
|
def require(path)
|
25
25
|
if loader = Zeitwerk::Registry.loader_for(path)
|
26
26
|
if path.end_with?(".rb")
|
27
|
-
zeitwerk_original_require(path)
|
28
|
-
|
29
|
-
|
27
|
+
required = zeitwerk_original_require(path)
|
28
|
+
loader.on_file_autoloaded(path) if required
|
29
|
+
required
|
30
30
|
else
|
31
31
|
loader.on_dir_autoloaded(path)
|
32
|
+
$LOADED_FEATURES << path
|
32
33
|
true
|
33
34
|
end
|
34
35
|
else
|
35
|
-
zeitwerk_original_require(path)
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
end
|
36
|
+
required = zeitwerk_original_require(path)
|
37
|
+
if required
|
38
|
+
abspath = $LOADED_FEATURES.last
|
39
|
+
if loader = Zeitwerk::Registry.loader_for(abspath)
|
40
|
+
loader.on_file_autoloaded(abspath)
|
41
41
|
end
|
42
42
|
end
|
43
|
+
required
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
data/lib/zeitwerk/loader.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "set"
|
4
|
-
require "securerandom"
|
5
4
|
|
6
5
|
module Zeitwerk
|
7
6
|
class Loader
|
@@ -124,13 +123,7 @@ module Zeitwerk
|
|
124
123
|
# @sig () -> void
|
125
124
|
def unload
|
126
125
|
mutex.synchronize do
|
127
|
-
|
128
|
-
# autoloads to later remove them from $LOADED_FEATURES, thus making them
|
129
|
-
# loadable by Kernel#require again.
|
130
|
-
#
|
131
|
-
# Directories are not stored in $LOADED_FEATURES, keeping track of files
|
132
|
-
# is enough.
|
133
|
-
unloaded_files = Set.new
|
126
|
+
abspaths_of_unloaded_crefs = Set.new
|
134
127
|
|
135
128
|
autoloads.each do |abspath, (parent, cname)|
|
136
129
|
if parent.autoload?(cname)
|
@@ -140,7 +133,7 @@ module Zeitwerk
|
|
140
133
|
# and the constant path would escape unloadable_cpath? This is just
|
141
134
|
# defensive code to clean things up as much as we are able to.
|
142
135
|
unload_cref(parent, cname)
|
143
|
-
|
136
|
+
abspaths_of_unloaded_crefs.add(abspath)
|
144
137
|
end
|
145
138
|
end
|
146
139
|
|
@@ -151,10 +144,14 @@ module Zeitwerk
|
|
151
144
|
end
|
152
145
|
|
153
146
|
unload_cref(parent, cname)
|
154
|
-
|
147
|
+
abspaths_of_unloaded_crefs.add(abspath)
|
155
148
|
end
|
156
149
|
|
157
|
-
unless
|
150
|
+
unless abspaths_of_unloaded_crefs.empty?
|
151
|
+
# We remove these abspaths from $LOADED_FEATURES because, otherwise,
|
152
|
+
# `require`'s idempotence would prevent newly defined autoloads from
|
153
|
+
# loading them again.
|
154
|
+
#
|
158
155
|
# Bootsnap decorates Kernel#require to speed it up using a cache and
|
159
156
|
# this optimization does not check if $LOADED_FEATURES has the file.
|
160
157
|
#
|
@@ -166,7 +163,7 @@ module Zeitwerk
|
|
166
163
|
# Rails applications may depend on bootsnap, so for unloading to work
|
167
164
|
# in that setting it is preferable that we restrict our API choice to
|
168
165
|
# one of those methods.
|
169
|
-
$LOADED_FEATURES.reject! { |file|
|
166
|
+
$LOADED_FEATURES.reject! { |file| abspaths_of_unloaded_crefs.member?(file) }
|
170
167
|
end
|
171
168
|
|
172
169
|
autoloads.clear
|
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: 2.5.
|
4
|
+
version: 2.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Xavier Noria
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |2
|
14
14
|
Zeitwerk implements constant autoloading with Ruby semantics. Each gem
|