Class: ActiveSupport::Reloader

Inherits:
ExecutionWrapper show all
Defined in:
activesupport/lib/active_support/reloader.rb

Overview

– This class defines several callbacks:

to_prepare -- Run once at application startup, and also from
+to_run+.

to_run -- Run before a work run that is reloading. If
+reload_classes_only_on_change+ is true (the default), the class
unload will have already occurred.

to_complete -- Run after a work run that has reloaded. If
+reload_classes_only_on_change+ is false, the class unload will
have occurred after the work run, but before this callback.

before_class_unload -- Run immediately before the classes are
unloaded.

after_class_unload -- Run immediately after the classes are
unloaded.

Constant Summary

Constants inherited from ExecutionWrapper

ExecutionWrapper::Null

Constants included from Callbacks

Callbacks::CALLBACK_FILTER_TYPES

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ExecutionWrapper

active?, active_key, #complete, error_reporter, perform, register_hook, #run, to_complete, to_run

Methods included from Callbacks

#run_callbacks

Methods included from Concern

#append_features, #class_methods, extended, #included, #prepend_features, #prepended

Constructor Details

#initializeReloader

Returns a new instance of Reloader.



98
99
100
101
# File 'activesupport/lib/active_support/reloader.rb', line 98

def initialize
  super
  @locked = false
end

Class Method Details

.after_class_unload(*args, &block) ⇒ Object

Registers a callback that will run immediately after the classes are unloaded.



43
44
45
# File 'activesupport/lib/active_support/reloader.rb', line 43

def self.after_class_unload(*args, &block)
  set_callback(:class_unload, :after, *args, &block)
end

.before_class_unload(*args, &block) ⇒ Object

Registers a callback that will run immediately before the classes are unloaded.



38
39
40
# File 'activesupport/lib/active_support/reloader.rb', line 38

def self.before_class_unload(*args, &block)
  set_callback(:class_unload, *args, &block)
end

.check!Object

:nodoc:



86
87
88
# File 'activesupport/lib/active_support/reloader.rb', line 86

def self.check! # :nodoc:
  @should_reload ||= check.call
end

.prepare!Object

:nodoc:



94
95
96
# File 'activesupport/lib/active_support/reloader.rb', line 94

def self.prepare! # :nodoc:
  new.run_callbacks(:prepare)
end

.reload!Object

Initiate a manual reload



50
51
52
53
54
55
56
57
58
59
# File 'activesupport/lib/active_support/reloader.rb', line 50

def self.reload!
  executor.wrap do
    new.tap do |instance|
      instance.run!
    ensure
      instance.complete!
    end
  end
  prepare!
end

.reloaded!Object

:nodoc:



90
91
92
# File 'activesupport/lib/active_support/reloader.rb', line 90

def self.reloaded! # :nodoc:
  @should_reload = false
end

.run!(reset: false) ⇒ Object

:nodoc:



61
62
63
64
65
66
67
# File 'activesupport/lib/active_support/reloader.rb', line 61

def self.run!(reset: false) # :nodoc:
  if check!
    super
  else
    Null
  end
end

.to_prepare(*args, &block) ⇒ Object

Registers a callback that will run once at application startup and every time the code is reloaded.



33
34
35
# File 'activesupport/lib/active_support/reloader.rb', line 33

def self.to_prepare(*args, &block)
  set_callback(:prepare, *args, &block)
end

.wrap(**kwargs) ⇒ Object

Run the supplied block as a work unit, reloading code as needed



70
71
72
73
74
75
76
77
78
79
80
81
# File 'activesupport/lib/active_support/reloader.rb', line 70

def self.wrap(**kwargs)
  return yield if active?

  executor.wrap(**kwargs) do
    instance = run!
    begin
      yield
    ensure
      instance.complete!
    end
  end
end

Instance Method Details

#class_unload!(&block) ⇒ Object

:nodoc:



125
126
127
128
# File 'activesupport/lib/active_support/reloader.rb', line 125

def class_unload!(&block) # :nodoc:
  require_unload_lock!
  run_callbacks(:class_unload, &block)
end

#complete!Object

:nodoc:



130
131
132
133
134
135
# File 'activesupport/lib/active_support/reloader.rb', line 130

def complete! # :nodoc:
  super
  self.class.reloaded!
ensure
  release_unload_lock!
end

#release_unload_lock!Object

Release the unload lock if it has been previously obtained



113
114
115
116
117
118
# File 'activesupport/lib/active_support/reloader.rb', line 113

def release_unload_lock!
  if @locked
    @locked = false
    ActiveSupport::Dependencies.interlock.done_unloading
  end
end

#require_unload_lock!Object

Acquire the ActiveSupport::Dependencies::Interlock unload lock, ensuring it will be released automatically



105
106
107
108
109
110
# File 'activesupport/lib/active_support/reloader.rb', line 105

def require_unload_lock!
  unless @locked
    ActiveSupport::Dependencies.interlock.start_unloading
    @locked = true
  end
end

#run!Object

:nodoc:



120
121
122
123
# File 'activesupport/lib/active_support/reloader.rb', line 120

def run! # :nodoc:
  super
  release_unload_lock!
end