| 
									
										
										
										
											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 |