CodeSampleX

Пример

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

Контракт

  1. assert `Zeitwerk::Loader#on_load` accepts a leading double-colon constant path and does not raise at registration (`::User`)
  2. assert eager loading registers and triggers the callback for `::User` by observing the callback firing when the constant is loaded
  3. assert malformed constant paths still fail by raising `NameError` for `:User`

Файлы

  • Gemfile
  • Gemfile.lock
  • NOTES.md
  • app/user.rb
  • csx.json
  • test/contract.rb

Скачать артефакт с исходным кодом (tar.gz)

Исходный код

Gemfile
source "https://rubygems.org"

gem "zeitwerk", "2.8.2"
gem "minitest", "5.27.0"
Gemfile.lock
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
NOTES.md
`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.
app/user.rb
class User
end
csx.json
{"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"}
test/contract.rb
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

Исходный сидер

csx-seed