Fix snapshot capture runtime errors
Data.define blocks use class_eval, which preserves the caller's
lexical scope for constant assignment. Reopening with `class Config`
nests SentryConfig and DefaultUser under Config properly.
Assisted-by: Claude Opus 4.6 via Claude Code
diff --git a/lib/ketchup/config.rb b/lib/ketchup/config.rb
index 88e505e..b7df85b 100644
--- a/lib/ketchup/config.rb
+++ b/lib/ketchup/config.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
-Config = Data.define(:database_url, :sentry, :default_user) do
+Config = Data.define(:database_url, :sentry, :default_user)
+
+class Config
SentryConfig = Data.define(:dsn, :env)
DefaultUser = Data.define(:login, :name) do
def self.parse(value)
diff --git a/lib/ketchup/snapshots.rb b/lib/ketchup/snapshots.rb
index cfec6cd..8ed25d7 100644
--- a/lib/ketchup/snapshots.rb
+++ b/lib/ketchup/snapshots.rb
@@ -9,6 +9,7 @@ require "pathname"
require "ferrum"
require "puma"
require "puma/configuration"
+require "rack/builder"
require_relative "seed"
require_relative "web"
@@ -47,6 +48,7 @@ module Ketchup
`diff -u #{baseline_file.path} #{current_file.path}`.lines.drop(2).filter_map do |line|
name = line[1..].chomp
+ next if name.empty?
case line[0]
when " " then Comparison.new(name: name, baseline: @baseline.fetch(name), current: @current.fetch(name))
when "-" then Comparison.new(name: name, baseline: @baseline.fetch(name), current: nil)
@@ -214,7 +216,8 @@ module Ketchup
require_relative "dev_auth"
app = Rack::Builder.app do
- use Ketchup::DevAuth, Config::DefaultUser.new(login: "snapshot@example.com", name: "Snapshot User")
+ default_user = Config::DefaultUser.new(login: "snapshot@example.com", name: "Snapshot User")
+ use Ketchup::DevAuth, default_user
run Web.freeze.app
end