Class: Puppet::Util::Autoload
Overview
Autoload paths, either based on names or all at once.
Class Attribute Summary collapse
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
#requiredopts, #set_options, #symbolize_options
Constructor Details
#initialize(obj, path, options = {}) ⇒ Autoload
Returns a new instance of Autoload.
187
188
189
190
191
192
193
194
195
196
197
|
# File 'lib/puppet/util/autoload.rb', line 187
def initialize(obj, path, options = {})
@path = path.to_s
raise ArgumentError, "Autoload paths cannot be fully qualified" if Puppet::Util.absolute_path?(@path)
@object = obj
self.class[obj] = self
set_options(options)
@wrap = true unless defined?(@wrap)
end
|
Class Attribute Details
.autoloaders ⇒ Object
14
15
16
|
# File 'lib/puppet/util/autoload.rb', line 14
def autoloaders
@autoloaders
end
|
15
16
17
|
# File 'lib/puppet/util/autoload.rb', line 15
def loaded
@loaded
end
|
Instance Attribute Details
185
186
187
|
# File 'lib/puppet/util/autoload.rb', line 185
def object
@object
end
|
185
186
187
|
# File 'lib/puppet/util/autoload.rb', line 185
def objwarn
@objwarn
end
|
185
186
187
|
# File 'lib/puppet/util/autoload.rb', line 185
def path
@path
end
|
185
186
187
|
# File 'lib/puppet/util/autoload.rb', line 185
def wrap
@wrap
end
|
Class Method Details
.changed?(name) ⇒ Boolean
42
43
44
45
46
47
48
49
50
51
52
|
# File 'lib/puppet/util/autoload.rb', line 42
def changed?(name)
name = cleanpath(name).chomp('.rb')
return true unless loaded.include?(name)
file, old_mtime = loaded[name]
return true unless file == get_file(name)
begin
old_mtime.to_i != File.mtime(file).to_i
rescue Errno::ENOENT
true
end
end
|
.cleanpath(path) ⇒ Object
Normalize a path. This converts ALT_SEPARATOR to SEPARATOR on Windows and eliminates unnecessary parts of a path.
170
171
172
173
174
175
176
177
178
179
|
# File 'lib/puppet/util/autoload.rb', line 170
def cleanpath(path)
if Puppet::Util.absolute_path?(path)
File.expand_path(path)
else
Pathname.new(path).cleanpath.to_s
end
end
|
.files_in_dir(dir, path) ⇒ Object
96
97
98
99
100
101
|
# File 'lib/puppet/util/autoload.rb', line 96
def files_in_dir(dir, path)
dir = Pathname.new(File.expand_path(dir))
Dir.glob(File.join(dir, path, "*.rb")).collect do |file|
Pathname.new(file).relative_path_from(dir).to_s
end
end
|
.files_to_load(path) ⇒ Object
92
93
94
|
# File 'lib/puppet/util/autoload.rb', line 92
def files_to_load(path)
search_directories.map {|dir| files_in_dir(dir, path) }.flatten.uniq
end
|
.gem_directories ⇒ Object
160
161
162
|
# File 'lib/puppet/util/autoload.rb', line 160
def gem_directories
gem_source.directories
end
|
.gem_source ⇒ Object
18
19
20
|
# File 'lib/puppet/util/autoload.rb', line 18
def gem_source
@gem_source ||= Puppet::Util::RubyGems::Source.new
end
|
.get_file(name, env = nil) ⇒ Object
Get the correct file to load for a given path returns nil if no file is found
86
87
88
89
90
|
# File 'lib/puppet/util/autoload.rb', line 86
def get_file(name, env=nil)
name = name + '.rb' unless name =~ /\.rb$/
path = search_directories(env).find { |dir| Puppet::FileSystem::File.exist?(File.join(dir, name)) }
path and File.join(path, name)
end
|
150
151
152
153
154
155
156
157
158
|
# File 'lib/puppet/util/autoload.rb', line 150
def libdirs()
if (Puppet.settings.app_defaults_initialized?)
Puppet[:libdir].split(File::PATH_SEPARATOR)
else
[]
end
end
|
.load_file(name, env = nil) ⇒ Object
Load a single plugin by name. We use ‘load’ here so we can reload a given plugin.
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# File 'lib/puppet/util/autoload.rb', line 56
def load_file(name, env=nil)
file = get_file(name.to_s, env)
return false unless file
begin
mark_loaded(name, file)
Kernel.load file, @wrap
return true
rescue SystemExit,NoMemoryError
raise
rescue Exception => detail
message = "Could not autoload #{name}: #{detail}"
Puppet.log_exception(detail, message)
raise Puppet::Error, message
end
end
|
.loadall(path) ⇒ Object
72
73
74
75
76
77
78
|
# File 'lib/puppet/util/autoload.rb', line 72
def loadall(path)
files_to_load(path).each do |file|
name = file.chomp(".rb")
load_file(name) unless loaded?(name)
end
end
|
.loaded?(path) ⇒ Boolean
Has a given path been loaded? This is used for testing whether a changed file should be loaded or just ignored. This is only used in network/client/master, when downloading plugins, to see if a given plugin is currently loaded and thus should be reloaded.
27
28
29
30
|
# File 'lib/puppet/util/autoload.rb', line 27
def loaded?(path)
path = cleanpath(path).chomp('.rb')
loaded.include?(path)
end
|
.mark_loaded(name, file) ⇒ Object
Save the fact that a given path has been loaded. This is so we can load downloaded plugins if they’ve already been loaded into memory.
35
36
37
38
39
40
|
# File 'lib/puppet/util/autoload.rb', line 35
def mark_loaded(name, file)
name = cleanpath(name).chomp('.rb')
ruby_file = name + ".rb"
$LOADED_FEATURES << ruby_file unless $LOADED_FEATURES.include?(ruby_file)
loaded[name] = [file, File.mtime(file)]
end
|
.module_directories(env = nil) ⇒ Object
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
# File 'lib/puppet/util/autoload.rb', line 103
def module_directories(env=nil)
require 'puppet/node/environment' unless defined?(Puppet::Node::Environment)
real_env = Puppet::Node::Environment.new(env)
$env_module_directories ||= {}
if Puppet.settings.app_defaults_initialized?
$env_module_directories[real_env] ||= real_env.modulepath.collect do |dir|
Dir.entries(dir).reject { |f| f =~ /^\./ }.collect { |f| File.join(dir, f) }
end.flatten.collect { |d| File.join(d, "lib") }.find_all do |d|
FileTest.directory?(d)
end
else
[]
end
end
|
.reload_changed ⇒ Object
80
81
82
|
# File 'lib/puppet/util/autoload.rb', line 80
def reload_changed
loaded.keys.each { |file| load_file(file) if changed?(file) }
end
|
.search_directories(env = nil) ⇒ Object
164
165
166
|
# File 'lib/puppet/util/autoload.rb', line 164
def search_directories(env=nil)
[gem_directories, module_directories(env), libdirs(), $LOAD_PATH].flatten
end
|
Instance Method Details
#changed?(name) ⇒ Boolean
213
214
215
|
# File 'lib/puppet/util/autoload.rb', line 213
def changed?(name)
self.class.changed?(expand(name))
end
|
#expand(name) ⇒ Object
221
222
223
|
# File 'lib/puppet/util/autoload.rb', line 221
def expand(name)
::File.join(@path, name.to_s)
end
|
#files_to_load ⇒ Object
217
218
219
|
# File 'lib/puppet/util/autoload.rb', line 217
def files_to_load
self.class.files_to_load(@path)
end
|
#load(name, env = nil) ⇒ Object
199
200
201
|
# File 'lib/puppet/util/autoload.rb', line 199
def load(name, env=nil)
self.class.load_file(expand(name), env)
end
|
Load all instances that we can. This uses require, rather than load, so that already-loaded files don’t get reloaded unnecessarily.
205
206
207
|
# File 'lib/puppet/util/autoload.rb', line 205
def loadall
self.class.loadall(@path)
end
|
#loaded?(name) ⇒ Boolean
209
210
211
|
# File 'lib/puppet/util/autoload.rb', line 209
def loaded?(name)
self.class.loaded?(expand(name))
end
|