zeitwerk 2.6.9 → 2.6.10
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 +1 -1
- data/lib/zeitwerk/loader/helpers.rb +44 -0
- data/lib/zeitwerk/loader.rb +12 -46
- 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: 2b2955613976d014a322168f1976a93b29e388b4c72ecf5acdbb0186d212fe7c
|
|
4
|
+
data.tar.gz: 57df7539d6fa37fcf41f1d37b6c2fa0a8db5af7af02333da35566fca92a03d8a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 625ef1f9a15205afa2efea139f63b5b800660d57631fda75deccd172f72e82fb6454efe7465edb8024a9a8536b463fa523ead1582dc13aac54dfddb5535e31a9
|
|
7
|
+
data.tar.gz: d0e0b1ff25b25ce5b9d3223fa01b3f04b4eefa7e316d55bad95686265f194aee24599e146c1ef9a05dd20dc16f670733e17e494ccd469ea9aef7e4a8b2fb973c
|
data/README.md
CHANGED
|
@@ -1296,7 +1296,7 @@ If the argument corresponds to an [ignored file or directory](#ignoring-parts-of
|
|
|
1296
1296
|
loader.cpath_expected_at("non_existing_file.rb") # => Zeitwerk::Error
|
|
1297
1297
|
```
|
|
1298
1298
|
|
|
1299
|
-
`
|
|
1299
|
+
`Zeitwerk::NameError` is raised if a constant path cannot be derived from it:
|
|
1300
1300
|
|
|
1301
1301
|
```ruby
|
|
1302
1302
|
loader.cpath_expected_at("8.rb") # => Zeitwerk::NameError
|
|
@@ -140,4 +140,48 @@ module Zeitwerk::Loader::Helpers
|
|
|
140
140
|
private def crem(parent, cname)
|
|
141
141
|
parent.__send__(:remove_const, cname)
|
|
142
142
|
end
|
|
143
|
+
|
|
144
|
+
CNAME_VALIDATOR = Module.new
|
|
145
|
+
private_constant :CNAME_VALIDATOR
|
|
146
|
+
|
|
147
|
+
# @raise [Zeitwerk::NameError]
|
|
148
|
+
# @sig (String, String) -> Symbol
|
|
149
|
+
private def cname_for(basename, abspath)
|
|
150
|
+
cname = inflector.camelize(basename, abspath)
|
|
151
|
+
|
|
152
|
+
unless cname.is_a?(String)
|
|
153
|
+
raise TypeError, "#{inflector.class}#camelize must return a String, received #{cname.inspect}"
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
if cname.include?("::")
|
|
157
|
+
raise Zeitwerk::NameError.new(<<~MESSAGE, cname)
|
|
158
|
+
wrong constant name #{cname} inferred by #{inflector.class} from
|
|
159
|
+
|
|
160
|
+
#{abspath}
|
|
161
|
+
|
|
162
|
+
#{inflector.class}#camelize should return a simple constant name without "::"
|
|
163
|
+
MESSAGE
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
begin
|
|
167
|
+
CNAME_VALIDATOR.const_defined?(cname, false)
|
|
168
|
+
rescue ::NameError => error
|
|
169
|
+
path_type = ruby?(abspath) ? "file" : "directory"
|
|
170
|
+
|
|
171
|
+
raise Zeitwerk::NameError.new(<<~MESSAGE, error.name)
|
|
172
|
+
#{error.message} inferred by #{inflector.class} from #{path_type}
|
|
173
|
+
|
|
174
|
+
#{abspath}
|
|
175
|
+
|
|
176
|
+
Possible ways to address this:
|
|
177
|
+
|
|
178
|
+
* Tell Zeitwerk to ignore this particular #{path_type}.
|
|
179
|
+
* Tell Zeitwerk to ignore one of its parent directories.
|
|
180
|
+
* Rename the #{path_type} to comply with the naming conventions.
|
|
181
|
+
* Modify the inflector to handle this case.
|
|
182
|
+
MESSAGE
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
cname.to_sym
|
|
186
|
+
end
|
|
143
187
|
end
|
data/lib/zeitwerk/loader.rb
CHANGED
|
@@ -237,15 +237,13 @@ module Zeitwerk
|
|
|
237
237
|
return unless dir?(abspath) || ruby?(abspath)
|
|
238
238
|
return if ignored_path?(abspath)
|
|
239
239
|
|
|
240
|
-
|
|
241
|
-
abspaths = []
|
|
240
|
+
paths = []
|
|
242
241
|
|
|
243
242
|
if ruby?(abspath)
|
|
244
243
|
basename = File.basename(abspath, ".rb")
|
|
245
244
|
return if hidden?(basename)
|
|
246
245
|
|
|
247
|
-
|
|
248
|
-
abspaths << abspath
|
|
246
|
+
paths << [basename, abspath]
|
|
249
247
|
walk_up_from = File.dirname(abspath)
|
|
250
248
|
else
|
|
251
249
|
walk_up_from = abspath
|
|
@@ -260,28 +258,15 @@ module Zeitwerk
|
|
|
260
258
|
basename = File.basename(dir)
|
|
261
259
|
return if hidden?(basename)
|
|
262
260
|
|
|
263
|
-
unless collapse?(dir)
|
|
264
|
-
cnames << inflector.camelize(basename, dir).to_sym
|
|
265
|
-
abspaths << dir
|
|
266
|
-
end
|
|
261
|
+
paths << [basename, abspath] unless collapse?(dir)
|
|
267
262
|
end
|
|
268
263
|
|
|
269
264
|
return unless root_namespace
|
|
270
265
|
|
|
271
|
-
if
|
|
266
|
+
if paths.empty?
|
|
272
267
|
real_mod_name(root_namespace)
|
|
273
268
|
else
|
|
274
|
-
|
|
275
|
-
# problematic one, if any.
|
|
276
|
-
cnames.reverse!
|
|
277
|
-
|
|
278
|
-
cname_validator = Module.new
|
|
279
|
-
cnames.each_with_index do |cname, i|
|
|
280
|
-
cname_validator.const_defined?(cname, false)
|
|
281
|
-
rescue ::NameError
|
|
282
|
-
j = -(i + 1)
|
|
283
|
-
raise Zeitwerk::NameError.new("cannot derive a constant name from #{abspaths[j]}")
|
|
284
|
-
end
|
|
269
|
+
cnames = paths.reverse_each.map { |b, a| cname_for(b, a) }
|
|
285
270
|
|
|
286
271
|
if root_namespace == Object
|
|
287
272
|
cnames.join("::")
|
|
@@ -422,34 +407,15 @@ module Zeitwerk
|
|
|
422
407
|
# @sig (String, Module) -> void
|
|
423
408
|
private def set_autoloads_in_dir(dir, parent)
|
|
424
409
|
ls(dir) do |basename, abspath|
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
410
|
+
if ruby?(basename)
|
|
411
|
+
basename.delete_suffix!(".rb")
|
|
412
|
+
autoload_file(parent, cname_for(basename, abspath), abspath)
|
|
413
|
+
else
|
|
414
|
+
if collapse?(abspath)
|
|
415
|
+
set_autoloads_in_dir(abspath, parent)
|
|
430
416
|
else
|
|
431
|
-
|
|
432
|
-
set_autoloads_in_dir(abspath, parent)
|
|
433
|
-
else
|
|
434
|
-
cname = inflector.camelize(basename, abspath).to_sym
|
|
435
|
-
autoload_subdir(parent, cname, abspath)
|
|
436
|
-
end
|
|
417
|
+
autoload_subdir(parent, cname_for(basename, abspath), abspath)
|
|
437
418
|
end
|
|
438
|
-
rescue ::NameError => error
|
|
439
|
-
path_type = ruby?(abspath) ? "file" : "directory"
|
|
440
|
-
|
|
441
|
-
raise NameError.new(<<~MESSAGE, error.name)
|
|
442
|
-
#{error.message} inferred by #{inflector.class} from #{path_type}
|
|
443
|
-
|
|
444
|
-
#{abspath}
|
|
445
|
-
|
|
446
|
-
Possible ways to address this:
|
|
447
|
-
|
|
448
|
-
* Tell Zeitwerk to ignore this particular #{path_type}.
|
|
449
|
-
* Tell Zeitwerk to ignore one of its parent directories.
|
|
450
|
-
* Rename the #{path_type} to comply with the naming conventions.
|
|
451
|
-
* Modify the inflector to handle this case.
|
|
452
|
-
MESSAGE
|
|
453
419
|
end
|
|
454
420
|
end
|
|
455
421
|
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: 2.6.
|
|
4
|
+
version: 2.6.10
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Xavier Noria
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-07-
|
|
11
|
+
date: 2023-07-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: |2
|
|
14
14
|
Zeitwerk implements constant autoloading with Ruby semantics. Each gem
|