tapioca
tapioca copied to clipboard
Rescue ActiveSupport::DeprecationException to prevent crashes
Motivation
This fixes a crash I was seeing with the Dotenv gem. They use ActiveSupport::Deprecation::DeprecatedConstantProxy for their old Railtie module so it blows up if anything touches it (since we raise on deprecation warnings in our app).
Implementation
I added some begin...rescue blocks to catch any deprecation exceptions and suppress them.
Tests
I've added some tests to ensure that tapioca ignores DeprecationException for these cases. These are the only locations where it was crashing, and now tapioca dsl runs without errors.
Crash Backtrace
/Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/dsl/compilers/active_support_concern.rb:76:in 'block in Tapioca::Dsl::Compilers::ActiveSupportConcern.gather_constants': DEPRECATION WARNING: Dotenv::Railtie is deprecated! Use Dotenv::Rails instead. (called from Kernel#load at ./bin/tapioca:27) (ActiveSupport::DeprecationException)
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/dsl/compilers/active_support_concern.rb:73:in 'Array#select'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/dsl/compilers/active_support_concern.rb:73:in 'Tapioca::Dsl::Compilers::ActiveSupportConcern.gather_constants'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/sorbet-runtime-0.6.12466/lib/types/private/methods/_methods.rb:279:in 'UnboundMethod#bind_call'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/sorbet-runtime-0.6.12466/lib/types/private/methods/_methods.rb:279:in 'block in Tapioca::Dsl::Compilers::ActiveSupportConcern._on_method_added'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/dsl/compiler.rb:46:in 'Tapioca::Dsl::Compiler.processable_constants'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/dsl/pipeline.rb:127:in 'block in Tapioca::Dsl::Pipeline#gather_constants'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/dsl/pipeline.rb:126:in 'Array#each'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/dsl/pipeline.rb:126:in 'Tapioca::Dsl::Pipeline#gather_constants'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/sorbet-runtime-0.6.12466/lib/types/private/methods/_methods.rb:279:in 'UnboundMethod#bind_call'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/sorbet-runtime-0.6.12466/lib/types/private/methods/_methods.rb:279:in 'block in Tapioca::Dsl::Pipeline#_on_method_added'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/dsl/pipeline.rb:53:in 'Tapioca::Dsl::Pipeline#run'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/sorbet-runtime-0.6.12466/lib/types/private/methods/_methods.rb:279:in 'UnboundMethod#bind_call'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/sorbet-runtime-0.6.12466/lib/types/private/methods/_methods.rb:279:in 'block in Tapioca::Dsl::Pipeline#_on_method_added'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/commands/abstract_dsl.rb:65:in 'Tapioca::Commands::AbstractDsl#generate_dsl_rbi_files'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/commands/dsl_generate.rb:17:in 'Tapioca::Commands::DslGenerate#execute'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/sorbet-runtime-0.6.12466/lib/types/private/methods/_methods.rb:279:in 'UnboundMethod#bind_call'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/sorbet-runtime-0.6.12466/lib/types/private/methods/_methods.rb:279:in 'block in Tapioca::Commands::DslGenerate#_on_method_added'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/commands/command.rb:28:in 'block in Tapioca::Commands::Command#run'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca.rb:20:in 'block in Tapioca.silence_warnings'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/site_ruby/3.4.0/rubygems/user_interaction.rb:46:in 'Gem::DefaultUserInteraction.use_ui'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca.rb:19:in 'Tapioca.silence_warnings'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/commands/command.rb:27:in 'Tapioca::Commands::Command#run'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/sorbet-runtime-0.6.12466/lib/types/private/methods/_methods.rb:279:in 'UnboundMethod#bind_call'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/sorbet-runtime-0.6.12466/lib/types/private/methods/_methods.rb:279:in 'block in Tapioca::Commands::Command#_on_method_added'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/lib/tapioca/cli.rb:179:in 'Tapioca::Cli#dsl'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/thor-1.4.0/lib/thor/command.rb:28:in 'Thor::Command#run'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/thor-1.4.0/lib/thor/invocation.rb:127:in 'Thor::Invocation#invoke_command'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/thor-1.4.0/lib/thor.rb:538:in 'Thor.dispatch'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/thor-1.4.0/lib/thor/base.rb:584:in 'Thor::Base::ClassMethods#start'
from /Users/ndbroadbent/.local/share/mise/installs/ruby/3.4.4/lib/ruby/gems/3.4.0/gems/tapioca-0.17.7/exe/tapioca:31:in '<top (required)>'
from ./bin/tapioca:27:in 'Kernel#load'
from ./bin/tapioca:27:in '<main>'
I have signed the CLA!