From b05603f6e412fd3bb965c05555d0d15ddf285dc5 Mon Sep 17 00:00:00 2001 From: Xavier Noria Date: Mon, 22 Apr 2024 19:52:58 +0200 Subject: [PATCH] Let Action Cable's autoloader ignore the version file Rails components version files are organized in a particular way. On one hand, ActionCable::VERSION is defined in action_cable/gem_version.rb, but that file does not follow Zeitwerk conventions, so we ignore it. Addtionally, action_cable/gem_version.rb defines ActionCable.gem_version, and we need to eager load it to have that method available for client code. On the other hand, there is also action_cable/version.rb, which loads action_cable/gem_version.rb. That file follows the conventions because by loading it, the expected constant gets defined as a side-effect, but it does so in an unusual indirect way. All in all, the setup that we had technically works, but setting an autoload for VERSION in ActionCable makes you think too much about the interactions between these two files and the autoloads triggered by the existing require_relative, which eager loads anyway. I believe this simplification is easier to understand. --- actioncable/lib/action_cable.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/actioncable/lib/action_cable.rb b/actioncable/lib/action_cable.rb index b0f605095d..33a13a833b 100644 --- a/actioncable/lib/action_cable.rb +++ b/actioncable/lib/action_cable.rb @@ -31,6 +31,7 @@ loader.ignore( "#{__dir__}/rails", # Contains generators, templates, docs, etc. "#{__dir__}/action_cable/gem_version.rb", + "#{__dir__}/action_cable/version.rb", "#{__dir__}/action_cable/deprecator.rb", )