2024-02-26 20:26:06 -08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
raise "This needs to be required before Cachable gets loaded normally." if defined?(Cachable)
|
|
|
|
|
|
|
|
# Collect all classes that mix in Cachable so that those caches can be cleared in-between tests.
|
|
|
|
module Cachable
|
|
|
|
private_class_method def self.included(klass)
|
|
|
|
# It's difficult to backtrack from a singleton class to find the original class
|
|
|
|
# and you can always just extend this module instead for equivalent behavior.
|
|
|
|
raise ArgumentError, "Don't use Cachable with singleton classes" if klass.singleton_class?
|
|
|
|
|
|
|
|
super if defined?(super)
|
|
|
|
end
|
|
|
|
|
|
|
|
private_class_method def self.extended(klass)
|
|
|
|
Registry.class_list << klass
|
|
|
|
# Ignore the `Formula` class that gets inherited from a lot and
|
|
|
|
# that has caches that we don't need to clear on the class level.
|
|
|
|
klass.extend(Inherited) if klass.name != "Formula"
|
|
|
|
super if defined?(super)
|
|
|
|
end
|
|
|
|
|
|
|
|
module Inherited
|
|
|
|
private
|
|
|
|
|
|
|
|
def inherited(klass)
|
|
|
|
# A class might inherit Cachable at the instance level
|
|
|
|
# and in that case we just want to skip registering it.
|
|
|
|
Registry.class_list << klass if klass.respond_to?(:clear_cache)
|
|
|
|
super if defined?(super)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
module Registry
|
|
|
|
# A list of all classes that have been loaded into memory that mixin or
|
|
|
|
# inherit `Cachable` at the class or module level.
|
|
|
|
#
|
2024-04-26 20:55:51 +02:00
|
|
|
# NOTE: Classes that inherit from `Formula` are excluded since it's not
|
|
|
|
# necessary to track and clear individual formula caches.
|
2024-02-26 20:26:06 -08:00
|
|
|
def self.class_list
|
|
|
|
@class_list ||= []
|
|
|
|
end
|
|
|
|
|
|
|
|
# Clear the cache of every class or module that mixes in or inherits
|
|
|
|
# `Cachable` at the class or module level.
|
|
|
|
#
|
2024-04-26 20:55:51 +02:00
|
|
|
# NOTE: Classes that inherit from `Formula` are excluded since it's not
|
|
|
|
# necessary to track and clear individual formula caches.
|
2024-02-26 20:26:06 -08:00
|
|
|
def self.clear_all_caches
|
|
|
|
class_list.each(&:clear_cache)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|