From 538dc85aaec30c232aae34701f23587aaf91efb5 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 I setting an autoload for VERSION in ActionCable makes you think too much about the interactions between these two files and the autoloads being 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 b0f605095dda1..33a13a833b6b9 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", )