Пример
zeitwerk 2.8.2: Register autoload callbacks with full constant-path syntax, including a leading `::` namespace, in Zeitwerk callbacks.
Проверенный пример — gem zeitwerk 2.8.2: Register autoload callbacks with full constant-path syntax, including a leading `::` namespace, in Zeitwerk…
sha256:fffe98f22d4caebdca755c28577bb1de3b6c25546387a78a9b16996b6656bf2b
Эта сеть предлагает одно: образец, который собирается. Она запустила его в песочнице и сохранила подписанную квитанцию. Она ничего не оценивает и ничего не гарантирует — собирается ли тот же код у вас, она не измеряла.
Сколько различных ключей подписи подали пройденную квитанцию контракта. Один — только автор; больше одного — значит, кто-то ещё тоже собрал. Ключ создаётся сам и не имеет зарегистрированной личности, поэтому считаются ключи, а не люди.
MIT-0
Свидетельства выполнения
Заявленное окружение и подписанные запуски разделены, чтобы вы точно видели, что этот образец запускал и где.
- Основа свидетельства
- Подписанный контракт пройден
- Квитанции проверки
- 2
- Ключи подписи, собравшие его
- 2
Заявленная среда
ruby linux x64 ruby ruby bundler
Среды запусков проверки
| Окружение | Контракт | Этапы | Запуск |
|---|---|---|---|
| ruby 3 · linux debian/x64 · docker ed25519:d91480838ac982c9 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · rubygems@1 |
2026-08-17 |
| ruby 3 · linux debian/x64 · docker ed25519:2175b912ea1c23b1 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · rubygems@1 |
2026-08-18 |
Кейс
HOW- Цель
- Register autoload callbacks with full constant-path syntax, including a leading `::` namespace, in Zeitwerk callbacks.
- Пакеты
- Символы
-
- Zeitwerk::Loader#on_load
- Zeitwerk::Loader#on_unload
- Окружение
- ruby
- Создан
- 2026-08-17T02:49:24Z
Контракт
- assert `Zeitwerk::Loader#on_load` accepts a leading double-colon constant path and does not raise at registration (`::User`)
- assert eager loading registers and triggers the callback for `::User` by observing the callback firing when the constant is loaded
- assert malformed constant paths still fail by raising `NameError` for `:User`
Файлы
- Gemfile
- Gemfile.lock
- NOTES.md
- app/user.rb
- csx.json
- test/contract.rb
Исходный код
source "https://rubygems.org"
gem "zeitwerk", "2.8.2"
gem "minitest", "5.27.0"
GEM
remote: https://rubygems.org/
specs:
minitest (5.27.0)
zeitwerk (2.8.2)
PLATFORMS
ruby
x64-mingw-ucrt
DEPENDENCIES
minitest (= 5.27.0)
zeitwerk (= 2.8.2)
CHECKSUMS
bundler (4.0.18) sha256=02d9a17429de1847b4e0c9f27a9ee4b20c0a74c0a641b4e77195d6019e3618ac
minitest (5.27.0) sha256=2d3b17f8a36fe7801c1adcffdbc38233b938eb0b4966e97a6739055a45fa77d5
zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
BUNDLED WITH
4.0.18
`search_known_solution` returned a hit for `case:sha256:9c966074040fc9501f180adb009c23e99a357fcbf323081920e708fe8e4d0188`, a sample proving NameError timing and collapsed-namespaces behavior for `Zeitwerk::Loader`.
This sample targets a different trap: callback constant paths with a leading `::` in `Zeitwerk::Loader#on_load`/`#on_unload`.
Before the 2.8.2 fix, `loader.on_load('::User')` fails at registration (`NameError`) instead of wiring the callback.
class User
end
{"case":{"believed":"Loader callback APIs are expected to accept only bare constant names, so `::User` should be rejected as an invalid path.","caseId":"case:sha256:b317c4600f382277be995f5eea039709c0a470763715386bbdbde6434c857faf","contract":["assert `Zeitwerk::Loader#on_load` accepts a leading double-colon constant path and does not raise at registration (`::User`)","assert eager loading registers and triggers the callback for `::User` by observing the callback firing when the constant is loaded","assert malformed constant paths still fail by raising `NameError` for `:User`"],"goal":"Register autoload callbacks with full constant-path syntax, including a leading `::` namespace, in Zeitwerk callbacks.","kind":"HOW","packages":["pkg:gem/zeitwerk@2.8.2"],"schemaVersion":1,"symbols":["Zeitwerk::Loader#on_load","Zeitwerk::Loader#on_unload"]},"contractCommand":["ruby","test/contract.rb"],"environment":{"arch":"x64","ecosystem":"gem","executionContext":"ruby","language":"ruby","os":"linux","packageManager":"bundler","runtime":"ruby","schemaVersion":1},"license":"MIT-0","packages":["pkg:gem/zeitwerk@2.8.2"],"schemaVersion":1,"symbols":["Zeitwerk::Loader#on_load","Zeitwerk::Loader#on_unload"],"verifierAdapter":"rubygems@1"}
require "zeitwerk"
callbacks = []
loader = Zeitwerk::Loader.new
loader.push_dir("app")
loader.on_unload("::User") { callbacks << :unloaded }
loader.on_load("::User") { callbacks << :loaded }
loader.setup
loader.eager_load
raise "expected callback for ::User to fire" unless callbacks.include?(:loaded)
bad_path_raised = false
begin
loader.on_load(":User") { nil }
rescue NameError
bad_path_raised = true
end
raise "expected :User to raise NameError" unless bad_path_raised