Apply Initializer Prepends on Each Code Reload - #51255
Merged
Merged
Conversation
Currently, the extra functionality `prepend`ed onto these classes by initializer logic is only applied once when the application configuration is initially loaded. This works fine in most environments, but in environments in which we want to be able to reload code on the fly (currently only `development`) this means that the modifications are lost after reload. To fix, we hook the `prepend` call itself into the `to_prepare` event, which explicitly runs once per code reload in environments which support code reloading, and only once during initial load otherwise. - https://guides.rubyonrails.org/configuring.html#initialization-events - https://stackoverflow.com/questions/8895103/how-can-i-keep-my-initializer-configuration-from-being-lost-in-development-mode
Hamms
marked this pull request as ready for review
April 11, 2023 16:34
davidsbailey
approved these changes
Apr 11, 2023
davidsbailey
left a comment
Member
There was a problem hiding this comment.
nice fix! I am already excited for faster tests!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Currently, the extra functionality
prepended onto these classes by initializer logic is only applied once when the application configuration is initially loaded. This works fine in most environments, but in environments in which we want to be able to reload code on the fly (currently onlydevelopment) this means that the modifications are lost after reload.To fix, we hook the
prependcall itself into theto_prepareevent, which explicitly runs once per code reload in environments which support code reloading, and only once during initial load otherwise.Links
Testing story
Tested locally to confirm that the functionality added by the initializer is applied to the class after reload, and that repeated reloading does not result in either loss of functionality or repeated reapplying of functionality.
Before this change, after creating a new user account in my local development environment,
User.last.sign_ins.countandUser.last.user_geos.countboth return0. With this change, both return1.Follow-up work
This is required to be able to set
cache_classes = falsein the test environment