Encontré un problema extraño en Ruby y no estoy muy seguro de si es un problema o es una función introducida en versiones recientes de Ruby.
Básicamente, cuando llamamos a un método indefinido, obtenemos un error de undefined method como se esperaba en Ruby. El problema es que también llama a inspect e imprime el objeto y todos sus atributos/valores. Si mi objeto es complejo, lleva mucho tiempo terminar de imprimir todo y, en muchas ocasiones, hace que mi servidor de rieles local se cuelgue, especialmente cuando hay un atributo que contiene datos binarios. Este problema no parece ocurrir con Ruby 2.6 pero con Ruby >= 2.7.
Para objetos simples, eso no es un problema, pero tengo un problema específico con esta gema: puppeteer-ruby . Cada objeto de esta gema tiene muchos atributos y dependencias.
Aquí hay un ejemplo, ejecuto el siguiente código en IRB con una versión diferente de Ruby y obtengo diferentes excepciones:
require 'puppeteer-ruby' browser = Puppeteer.launch(headless: true) browser.foo NoMethodError: undefined method `foo' for #<Puppeteer::Browser:0x00007fce2d553b30> Did you mean? for (irb):9:in `<main>': undefined method `foo' for #<Puppeteer::Browser:0x00007f9300550740 @ignore_https_errors=false, @default_viewport=#<Puppeteer::Viewport:0x00007f92ffbf8e90 @width=800, @height=600, @device_scale_factor=1.0, @is_mobile=false, @has_touch=false, @is_landscape=false>, @process=#<Puppeteer::BrowserRunner::BrowserProcess:0x00007f92fc5ae448 @spawnargs=["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", "--disable-background-networking", "--enable-features=NetworkService,NetworkServiceInProcess", "--disable-background-timer-throttling", "--disable-backgrounding-occluded-windows", "--disable-breakpad", "--disable-client-side-phishing-detection", "--disable-component-extensions-with-background-pages", "--disable-default-apps", "--disable-dev-shm-usage", "--disable-extensions", "--disable-features=Translate", "--disable-hang-monitor", "--disable-ipc-flooding-protection", "--disable-popup-blocking", "--disable-prompt-on-repost", "--disable-renderer-backgrounding", "--disable-sync", "--force-color-profile=srgb", "--metrics-recording-only", "--no-first-run", "--enable-automation", "--password-store=basic", "--use-mock-keychain", "--enable-blink-features=IdleDetection", "--headless", "--hide-scrollbars", "--mute-audio", "about:blank", "--remote-debugging-port=0", "--user-data-dir=/var/folders/qn/kx4kb8xx5x13gx77yy2q56fr0000gn/T/puppeteer_dev_chrome_profile-20210910-25051-m7mnxb"], @stdout=#<IO:fd 24>, @stderr=#<IO:fd 26>,......very long text after this..Eso es interesante: inspect siempre ha impreso variables internas.
En la culpa, el último cambio para inspect fue hace 9 años: rb_object_inspect#704
Un script simple usando 2.6:
> docker run -it ruby:2.6.6-alpine sh #> ruby -v ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux-musl] #> irb irb(main):001:0> class Foo; def initialize(message); @message = message; end; end => :initialize irb(main):002:0> Foo.new('hello').foo NoMethodError (undefined method `foo' for #<Foo:0x00007f35e20e0280 @message="hello">) Did you mean? for Aunque mirando la fuente de Puppeteer::Browser , parece que cambiaron a una implementación de rubí puro del navegador hace unos 2 años. Cuando lo hicieron, introdujeron muchos ivars a la clase. ¿Quizás la versión que está usando cambió entre la actualización de Ruby de 2.6 a 3.0?
Una solución simple sería inspect el parche de mono en Puppeteer::Browser , o enviar un PR al mantenedor; parece que el proyecto está activo en GitHub.