Module: Aidp::Loader

Defined in:
lib/aidp/loader.rb

Overview

Zeitwerk-based class loader with hot code reloading support

This module configures Zeitwerk for autoloading AIDP classes and provides a reload capability similar to Rails development mode. When files change (e.g., after git pull in watch mode), calling Aidp::Loader.reload! will unload all classes and allow them to be reloaded on next reference.

Examples:

Enable reloading in development

Aidp::Loader.setup(enable_reloading: true)
# ... code changes on disk ...
Aidp::Loader.reload!

Production mode (no reloading)

Aidp::Loader.setup(enable_reloading: false)
Aidp::Loader.eager_load!

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.loaderZeitwerk::Loader?

Returns The configured loader instance.

Returns:

  • (Zeitwerk::Loader, nil)

    The configured loader instance



24
25
26
# File 'lib/aidp/loader.rb', line 24

def loader
  @loader
end

.reloading_enabledBoolean

Returns Whether reloading is enabled.

Returns:

  • (Boolean)

    Whether reloading is enabled



27
28
29
# File 'lib/aidp/loader.rb', line 27

def reloading_enabled
  @reloading_enabled
end

Class Method Details

.eager_load!void

This method returns an undefined value.

Eager load all classes (production mode)



112
113
114
# File 'lib/aidp/loader.rb', line 112

def eager_load!
  @loader&.eager_load
end

.reload!Boolean

Reload all autoloaded classes

This unloads all classes managed by Zeitwerk and allows them to be reloaded on next reference. Only works if enable_reloading was true during setup.

Returns:

  • (Boolean)

    Whether reload was performed



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/aidp/loader.rb', line 72

def reload!
  unless @loader
    Aidp.log_warn("loader", "reload_skipped", reason: "loader_not_setup")
    return false
  end

  unless @reloading_enabled
    Aidp.log_warn("loader", "reload_skipped", reason: "reloading_disabled")
    return false
  end

  Aidp.log_info("loader", "reload_started")

  begin
    @loader.reload
    Aidp.log_info("loader", "reload_complete")
    true
  rescue => e
    Aidp.log_error("loader", "reload_failed", error: e.message)
    false
  end
end

.reloading?Boolean

Check if loader is set up for reloading

Returns:

  • (Boolean)


98
99
100
# File 'lib/aidp/loader.rb', line 98

def reloading?
  @reloading_enabled == true
end

.reset!void

This method returns an undefined value.

Reset the loader (mainly for testing)



119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/aidp/loader.rb', line 119

def reset!
  if @loader
    begin
      @loader.unload if @reloading_enabled
    rescue Zeitwerk::SetupRequired
      # If loader was never set up, skip unload
    end
    @loader.unregister
  end
  @loader = nil
  @reloading_enabled = false
end

.setup(enable_reloading: false, eager_load: false) ⇒ Zeitwerk::Loader

Set up the Zeitwerk loader for AIDP

Parameters:

  • enable_reloading (Boolean) (defaults to: false)

    Whether to enable hot reloading

  • eager_load (Boolean) (defaults to: false)

    Whether to eager load all classes

Returns:

  • (Zeitwerk::Loader)

    The configured loader



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/aidp/loader.rb', line 34

def setup(enable_reloading: false, eager_load: false)
  return @loader if @loader

  Aidp.log_debug("loader", "setup_started",
    enable_reloading: enable_reloading,
    eager_load: eager_load)

  @reloading_enabled = enable_reloading
  @loader = create_loader
  configure_inflections(@loader)
  configure_ignores(@loader)

  if enable_reloading
    @loader.enable_reloading
    Aidp.log_debug("loader", "reloading_enabled")
  end

  @loader.setup

  if eager_load && !enable_reloading
    @loader.eager_load
    Aidp.log_debug("loader", "eager_load_complete")
  end

  Aidp.log_info("loader", "setup_complete",
    reloading: enable_reloading,
    eager_loaded: eager_load && !enable_reloading)

  @loader
end

.setup?Boolean

Check if loader is set up

Returns:

  • (Boolean)


105
106
107
# File 'lib/aidp/loader.rb', line 105

def setup?
  !@loader.nil?
end