zeitwerk 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/lib/zeitwerk/kernel.rb +3 -3
 - data/lib/zeitwerk/loader.rb +33 -62
 - data/lib/zeitwerk/loader/callbacks.rb +43 -0
 - data/lib/zeitwerk/version.rb +1 -1
 - metadata +3 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 172e4bb51ab526d5f4f606f0c4099cd9d4b8bdfe15a2ec851ed58e7095018f07
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 74b2d3f010de6374d919e7cae4d759a86490d91bfb7cd3f743b314e10569d2e9
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 57531ede94526489ffb47235b0113ff6cb290c5d21c4b03dbbdea79a55b0e6b74d685b8f5d57f5b0bf9ec85986e731368bd57b9f5dd0ccfdc40033e5b570bbaa
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: d50a101226b04214af4bcc6961422501044a4b9bede6d18bc06a622736bedd7d19fa9b8b9191b8f08042382d0bebcfb8e0162aa7aef37eddd2e17dbcdc6ee8a6
         
     | 
    
        data/lib/zeitwerk/kernel.rb
    CHANGED
    
    | 
         @@ -14,17 +14,17 @@ module Kernel 
     | 
|
| 
       14 
14 
     | 
    
         
             
                if loader = Zeitwerk::Registry.loader_for(path)
         
     | 
| 
       15 
15 
     | 
    
         
             
                  if path.end_with?(".rb")
         
     | 
| 
       16 
16 
     | 
    
         
             
                    zeitwerk_original_require(path).tap do |required|
         
     | 
| 
       17 
     | 
    
         
            -
                      loader. 
     | 
| 
      
 17 
     | 
    
         
            +
                      loader.on_file_autoloaded(path) if required
         
     | 
| 
       18 
18 
     | 
    
         
             
                    end
         
     | 
| 
       19 
19 
     | 
    
         
             
                  else
         
     | 
| 
       20 
     | 
    
         
            -
                    loader. 
     | 
| 
      
 20 
     | 
    
         
            +
                    loader.on_dir_autoloaded(path)
         
     | 
| 
       21 
21 
     | 
    
         
             
                  end
         
     | 
| 
       22 
22 
     | 
    
         
             
                else
         
     | 
| 
       23 
23 
     | 
    
         
             
                  zeitwerk_original_require(path).tap do |required|
         
     | 
| 
       24 
24 
     | 
    
         
             
                    if required
         
     | 
| 
       25 
25 
     | 
    
         
             
                      realpath = $LOADED_FEATURES.last
         
     | 
| 
       26 
26 
     | 
    
         
             
                      if loader = Zeitwerk::Registry.loader_for(realpath)
         
     | 
| 
       27 
     | 
    
         
            -
                        loader. 
     | 
| 
      
 27 
     | 
    
         
            +
                        loader.on_file_autoloaded(realpath)
         
     | 
| 
       28 
28 
     | 
    
         
             
                      end
         
     | 
| 
       29 
29 
     | 
    
         
             
                    end
         
     | 
| 
       30 
30 
     | 
    
         
             
                  end
         
     | 
    
        data/lib/zeitwerk/loader.rb
    CHANGED
    
    | 
         @@ -5,6 +5,9 @@ require "securerandom" 
     | 
|
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            module Zeitwerk
         
     | 
| 
       7 
7 
     | 
    
         
             
              class Loader
         
     | 
| 
      
 8 
     | 
    
         
            +
                require_relative "loader/callbacks"
         
     | 
| 
      
 9 
     | 
    
         
            +
                include Callbacks
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       8 
11 
     | 
    
         
             
                # @return [String]
         
     | 
| 
       9 
12 
     | 
    
         
             
                attr_reader :tag
         
     | 
| 
       10 
13 
     | 
    
         | 
| 
         @@ -117,11 +120,7 @@ module Zeitwerk 
     | 
|
| 
       117 
120 
     | 
    
         
             
                  @eager_loaded = false
         
     | 
| 
       118 
121 
     | 
    
         | 
| 
       119 
122 
     | 
    
         
             
                  @tracer = TracePoint.new(:class) do |tp|
         
     | 
| 
       120 
     | 
    
         
            -
                     
     | 
| 
       121 
     | 
    
         
            -
                      if subdirs = lazy_subdirs.delete(tp.self.name)
         
     | 
| 
       122 
     | 
    
         
            -
                        subdirs.each { |subdir| set_autoloads_in_dir(subdir, tp.self) }
         
     | 
| 
       123 
     | 
    
         
            -
                      end
         
     | 
| 
       124 
     | 
    
         
            -
                    end
         
     | 
| 
      
 123 
     | 
    
         
            +
                    on_namespace_loaded(tp.self)
         
     | 
| 
       125 
124 
     | 
    
         
             
                  end
         
     | 
| 
       126 
125 
     | 
    
         | 
| 
       127 
126 
     | 
    
         
             
                  Registry.register_loader(self)
         
     | 
| 
         @@ -147,14 +146,12 @@ module Zeitwerk 
     | 
|
| 
       147 
146 
     | 
    
         
             
                # @param path [<String, Pathname>]
         
     | 
| 
       148 
147 
     | 
    
         
             
                # @return [void]
         
     | 
| 
       149 
148 
     | 
    
         
             
                def push_dir(path)
         
     | 
| 
       150 
     | 
    
         
            -
                   
     | 
| 
       151 
     | 
    
         
            -
             
     | 
| 
       152 
     | 
    
         
            -
                     
     | 
| 
       153 
     | 
    
         
            -
             
     | 
| 
       154 
     | 
    
         
            -
             
     | 
| 
       155 
     | 
    
         
            -
                     
     | 
| 
       156 
     | 
    
         
            -
                      raise ArgumentError, "the root directory #{abspath} does not exist"
         
     | 
| 
       157 
     | 
    
         
            -
                    end
         
     | 
| 
      
 149 
     | 
    
         
            +
                  abspath = File.expand_path(path)
         
     | 
| 
      
 150 
     | 
    
         
            +
                  if dir?(abspath)
         
     | 
| 
      
 151 
     | 
    
         
            +
                    raise_if_conflicting_directory(abspath)
         
     | 
| 
      
 152 
     | 
    
         
            +
                    root_dirs[abspath] = true
         
     | 
| 
      
 153 
     | 
    
         
            +
                  else
         
     | 
| 
      
 154 
     | 
    
         
            +
                    raise ArgumentError, "the root directory #{abspath} does not exist"
         
     | 
| 
       158 
155 
     | 
    
         
             
                  end
         
     | 
| 
       159 
156 
     | 
    
         
             
                end
         
     | 
| 
       160 
157 
     | 
    
         | 
| 
         @@ -192,12 +189,13 @@ module Zeitwerk 
     | 
|
| 
       192 
189 
     | 
    
         
             
                # @return [void]
         
     | 
| 
       193 
190 
     | 
    
         
             
                def setup
         
     | 
| 
       194 
191 
     | 
    
         
             
                  mutex.synchronize do
         
     | 
| 
       195 
     | 
    
         
            -
                     
     | 
| 
       196 
     | 
    
         
            -
             
     | 
| 
       197 
     | 
    
         
            -
             
     | 
| 
       198 
     | 
    
         
            -
             
     | 
| 
       199 
     | 
    
         
            -
             
     | 
| 
       200 
     | 
    
         
            -
             
     | 
| 
      
 192 
     | 
    
         
            +
                    break if @setup
         
     | 
| 
      
 193 
     | 
    
         
            +
             
     | 
| 
      
 194 
     | 
    
         
            +
                    expand_ignored_glob_patterns
         
     | 
| 
      
 195 
     | 
    
         
            +
                    non_ignored_root_dirs.each { |root_dir| set_autoloads_in_dir(root_dir, Object) }
         
     | 
| 
      
 196 
     | 
    
         
            +
                    do_preload
         
     | 
| 
      
 197 
     | 
    
         
            +
             
     | 
| 
      
 198 
     | 
    
         
            +
                    @setup = true
         
     | 
| 
       201 
199 
     | 
    
         
             
                  end
         
     | 
| 
       202 
200 
     | 
    
         
             
                end
         
     | 
| 
       203 
201 
     | 
    
         | 
| 
         @@ -226,6 +224,7 @@ module Zeitwerk 
     | 
|
| 
       226 
224 
     | 
    
         
             
                      # array lookups, since directories are not stored in $LOADED_FEATURES.
         
     | 
| 
       227 
225 
     | 
    
         
             
                      $LOADED_FEATURES.delete(path) if ruby?(path)
         
     | 
| 
       228 
226 
     | 
    
         
             
                    end
         
     | 
| 
      
 227 
     | 
    
         
            +
             
     | 
| 
       229 
228 
     | 
    
         
             
                    autoloads.clear
         
     | 
| 
       230 
229 
     | 
    
         
             
                    loaded.clear
         
     | 
| 
       231 
230 
     | 
    
         
             
                    lazy_subdirs.clear
         
     | 
| 
         @@ -274,7 +273,7 @@ module Zeitwerk 
     | 
|
| 
       274 
273 
     | 
    
         
             
                  end
         
     | 
| 
       275 
274 
     | 
    
         
             
                end
         
     | 
| 
       276 
275 
     | 
    
         | 
| 
       277 
     | 
    
         
            -
                # Says if the given constant path  
     | 
| 
      
 276 
     | 
    
         
            +
                # Says if the given constant path has been loaded.
         
     | 
| 
       278 
277 
     | 
    
         
             
                #
         
     | 
| 
       279 
278 
     | 
    
         
             
                # @param cpath [String]
         
     | 
| 
       280 
279 
     | 
    
         
             
                # @return [Boolean]
         
     | 
| 
         @@ -285,7 +284,7 @@ module Zeitwerk 
     | 
|
| 
       285 
284 
     | 
    
         
             
                # --- Class methods ---------------------------------------------------------------------------
         
     | 
| 
       286 
285 
     | 
    
         | 
| 
       287 
286 
     | 
    
         
             
                class << self
         
     | 
| 
       288 
     | 
    
         
            -
                  # @return [#call, nil]
         
     | 
| 
      
 287 
     | 
    
         
            +
                  # @return [#call, #debug, nil]
         
     | 
| 
       289 
288 
     | 
    
         
             
                  attr_accessor :default_logger
         
     | 
| 
       290 
289 
     | 
    
         | 
| 
       291 
290 
     | 
    
         
             
                  # @private
         
     | 
| 
         @@ -296,6 +295,7 @@ module Zeitwerk 
     | 
|
| 
       296 
295 
     | 
    
         
             
                  #
         
     | 
| 
       297 
296 
     | 
    
         
             
                  #   require "zeitwerk"
         
     | 
| 
       298 
297 
     | 
    
         
             
                  #   loader = Zeitwerk::Loader.new
         
     | 
| 
      
 298 
     | 
    
         
            +
                  #   loader.tag = File.basename(__FILE__, ".rb")
         
     | 
| 
       299 
299 
     | 
    
         
             
                  #   loader.inflector = Zeitwerk::GemInflector.new
         
     | 
| 
       300 
300 
     | 
    
         
             
                  #   loader.push_dir(__dir__)
         
     | 
| 
       301 
301 
     | 
    
         
             
                  #
         
     | 
| 
         @@ -326,37 +326,6 @@ module Zeitwerk 
     | 
|
| 
       326 
326 
     | 
    
         | 
| 
       327 
327 
     | 
    
         
             
                self.mutex = Mutex.new
         
     | 
| 
       328 
328 
     | 
    
         | 
| 
       329 
     | 
    
         
            -
                # --- Callbacks -------------------------------------------------------------------------------
         
     | 
| 
       330 
     | 
    
         
            -
             
     | 
| 
       331 
     | 
    
         
            -
                # Callback invoked from Kernel when a managed file is loaded.
         
     | 
| 
       332 
     | 
    
         
            -
                #
         
     | 
| 
       333 
     | 
    
         
            -
                # @private
         
     | 
| 
       334 
     | 
    
         
            -
                # @param file [String]
         
     | 
| 
       335 
     | 
    
         
            -
                # @return [void]
         
     | 
| 
       336 
     | 
    
         
            -
                def on_file_loaded(file)
         
     | 
| 
       337 
     | 
    
         
            -
                  parent, cname = autoloads[file]
         
     | 
| 
       338 
     | 
    
         
            -
                  loaded.add(cpath(parent, cname))
         
     | 
| 
       339 
     | 
    
         
            -
                  log("constant #{cpath(parent, cname)} loaded from file #{file}") if logger
         
     | 
| 
       340 
     | 
    
         
            -
                end
         
     | 
| 
       341 
     | 
    
         
            -
             
     | 
| 
       342 
     | 
    
         
            -
                # Callback invoked from Kernel when a managed directory is loaded.
         
     | 
| 
       343 
     | 
    
         
            -
                #
         
     | 
| 
       344 
     | 
    
         
            -
                # @private
         
     | 
| 
       345 
     | 
    
         
            -
                # @param dir [String]
         
     | 
| 
       346 
     | 
    
         
            -
                # @return [void]
         
     | 
| 
       347 
     | 
    
         
            -
                def on_dir_loaded(dir)
         
     | 
| 
       348 
     | 
    
         
            -
                  parent, cname = autoloads[dir]
         
     | 
| 
       349 
     | 
    
         
            -
             
     | 
| 
       350 
     | 
    
         
            -
                  autovivified_module = parent.const_set(cname, Module.new)
         
     | 
| 
       351 
     | 
    
         
            -
                  log("module #{autovivified_module.name} autovivified from directory #{dir}") if logger
         
     | 
| 
       352 
     | 
    
         
            -
             
     | 
| 
       353 
     | 
    
         
            -
                  loaded.add(autovivified_module.name)
         
     | 
| 
       354 
     | 
    
         
            -
             
     | 
| 
       355 
     | 
    
         
            -
                  if subdirs = lazy_subdirs[autovivified_module.name]
         
     | 
| 
       356 
     | 
    
         
            -
                    subdirs.each { |subdir| set_autoloads_in_dir(subdir, autovivified_module) }
         
     | 
| 
       357 
     | 
    
         
            -
                  end
         
     | 
| 
       358 
     | 
    
         
            -
                end
         
     | 
| 
       359 
     | 
    
         
            -
             
     | 
| 
       360 
329 
     | 
    
         
             
                private # -------------------------------------------------------------------------------------
         
     | 
| 
       361 
330 
     | 
    
         | 
| 
       362 
331 
     | 
    
         
             
                # @return [<String>]
         
     | 
| 
         @@ -554,16 +523,18 @@ module Zeitwerk 
     | 
|
| 
       554 
523 
     | 
    
         
             
                end
         
     | 
| 
       555 
524 
     | 
    
         | 
| 
       556 
525 
     | 
    
         
             
                def raise_if_conflicting_directory(dir)
         
     | 
| 
       557 
     | 
    
         
            -
                   
     | 
| 
       558 
     | 
    
         
            -
                     
     | 
| 
       559 
     | 
    
         
            -
             
     | 
| 
       560 
     | 
    
         
            -
             
     | 
| 
       561 
     | 
    
         
            -
                       
     | 
| 
       562 
     | 
    
         
            -
                         
     | 
| 
       563 
     | 
    
         
            -
             
     | 
| 
       564 
     | 
    
         
            -
                           
     | 
| 
       565 
     | 
    
         
            -
             
     | 
| 
       566 
     | 
    
         
            -
             
     | 
| 
      
 526 
     | 
    
         
            +
                  self.class.mutex.synchronize do
         
     | 
| 
      
 527 
     | 
    
         
            +
                    Registry.loaders.each do |loader|
         
     | 
| 
      
 528 
     | 
    
         
            +
                      next if loader == self
         
     | 
| 
      
 529 
     | 
    
         
            +
             
     | 
| 
      
 530 
     | 
    
         
            +
                      loader.dirs.each do |already_managed_dir|
         
     | 
| 
      
 531 
     | 
    
         
            +
                        if dir.start_with?(already_managed_dir) || already_managed_dir.start_with?(dir)
         
     | 
| 
      
 532 
     | 
    
         
            +
                          require "pp"
         
     | 
| 
      
 533 
     | 
    
         
            +
                          raise ConflictingDirectory,
         
     | 
| 
      
 534 
     | 
    
         
            +
                            "loader\n\n#{pretty_inspect}\n\nwants to manage directory #{dir}," \
         
     | 
| 
      
 535 
     | 
    
         
            +
                            " which is already managed by\n\n#{loader.pretty_inspect}\n"
         
     | 
| 
      
 536 
     | 
    
         
            +
                          EOS
         
     | 
| 
      
 537 
     | 
    
         
            +
                        end
         
     | 
| 
       567 
538 
     | 
    
         
             
                      end
         
     | 
| 
       568 
539 
     | 
    
         
             
                    end
         
     | 
| 
       569 
540 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -0,0 +1,43 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Zeitwerk::Loader::Callbacks
         
     | 
| 
      
 2 
     | 
    
         
            +
              # Invoked from our decorated Kernel#require when a managed file is autoloaded.
         
     | 
| 
      
 3 
     | 
    
         
            +
              #
         
     | 
| 
      
 4 
     | 
    
         
            +
              # @private
         
     | 
| 
      
 5 
     | 
    
         
            +
              # @param file [String]
         
     | 
| 
      
 6 
     | 
    
         
            +
              # @return [void]
         
     | 
| 
      
 7 
     | 
    
         
            +
              def on_file_autoloaded(file)
         
     | 
| 
      
 8 
     | 
    
         
            +
                parent, cname = autoloads[file]
         
     | 
| 
      
 9 
     | 
    
         
            +
                loaded.add(cpath(parent, cname))
         
     | 
| 
      
 10 
     | 
    
         
            +
                log("constant #{cpath(parent, cname)} loaded from file #{file}") if logger
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              # Invoked from our decorated Kernel#require when a managed directory is
         
     | 
| 
      
 14 
     | 
    
         
            +
              # autoloaded.
         
     | 
| 
      
 15 
     | 
    
         
            +
              #
         
     | 
| 
      
 16 
     | 
    
         
            +
              # @private
         
     | 
| 
      
 17 
     | 
    
         
            +
              # @param dir [String]
         
     | 
| 
      
 18 
     | 
    
         
            +
              # @return [void]
         
     | 
| 
      
 19 
     | 
    
         
            +
              def on_dir_autoloaded(dir)
         
     | 
| 
      
 20 
     | 
    
         
            +
                parent, cname = autoloads[dir]
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                autovivified_module = parent.const_set(cname, Module.new)
         
     | 
| 
      
 23 
     | 
    
         
            +
                log("module #{autovivified_module.name} autovivified from directory #{dir}") if logger
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                loaded.add(autovivified_module.name)
         
     | 
| 
      
 26 
     | 
    
         
            +
                on_namespace_loaded(autovivified_module)
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              # Invoked when a class or module is created or reopened, either from the
         
     | 
| 
      
 30 
     | 
    
         
            +
              # tracer or from module autovivification. If the namespace has matching
         
     | 
| 
      
 31 
     | 
    
         
            +
              # subdirectories, we descend into them now.
         
     | 
| 
      
 32 
     | 
    
         
            +
              #
         
     | 
| 
      
 33 
     | 
    
         
            +
              # @private
         
     | 
| 
      
 34 
     | 
    
         
            +
              # @param namespace [Module]
         
     | 
| 
      
 35 
     | 
    
         
            +
              # @return [void]
         
     | 
| 
      
 36 
     | 
    
         
            +
              def on_namespace_loaded(namespace)
         
     | 
| 
      
 37 
     | 
    
         
            +
                if subdirs = lazy_subdirs.delete(namespace.name)
         
     | 
| 
      
 38 
     | 
    
         
            +
                  subdirs.each do |subdir|
         
     | 
| 
      
 39 
     | 
    
         
            +
                    set_autoloads_in_dir(subdir, namespace)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
              end
         
     | 
| 
      
 43 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/zeitwerk/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: zeitwerk
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1.3. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.3.1
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Xavier Noria
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2019-02- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2019-02-23 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies: []
         
     | 
| 
       13 
13 
     | 
    
         
             
            description: |2
         
     | 
| 
       14 
14 
     | 
    
         
             
                  Zeitwerk implements constant autoloading with Ruby semantics. Each gem
         
     | 
| 
         @@ -27,6 +27,7 @@ files: 
     | 
|
| 
       27 
27 
     | 
    
         
             
            - lib/zeitwerk/inflector.rb
         
     | 
| 
       28 
28 
     | 
    
         
             
            - lib/zeitwerk/kernel.rb
         
     | 
| 
       29 
29 
     | 
    
         
             
            - lib/zeitwerk/loader.rb
         
     | 
| 
      
 30 
     | 
    
         
            +
            - lib/zeitwerk/loader/callbacks.rb
         
     | 
| 
       30 
31 
     | 
    
         
             
            - lib/zeitwerk/registry.rb
         
     | 
| 
       31 
32 
     | 
    
         
             
            - lib/zeitwerk/version.rb
         
     | 
| 
       32 
33 
     | 
    
         
             
            homepage: https://github.com/fxn/zeitwerk
         
     |