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.
180
181
182
183
184
185
186
|
# File 'lib/puppet/util/autoload.rb', line 180
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
set_options(options)
end
|
Class Attribute Details
13
14
15
|
# File 'lib/puppet/util/autoload.rb', line 13
def loaded
@loaded
end
|
Instance Attribute Details
178
179
180
|
# File 'lib/puppet/util/autoload.rb', line 178
def object
@object
end
|
178
179
180
|
# File 'lib/puppet/util/autoload.rb', line 178
def path
@path
end
|
Class Method Details
.changed?(name) ⇒ Boolean
39
40
41
42
43
44
45
46
47
48
49
50
|
# File 'lib/puppet/util/autoload.rb', line 39
def changed?(name)
name = cleanpath(name).chomp('.rb')
return true unless loaded.include?(name)
file, old_mtime = loaded[name]
environment = Puppet.lookup(:current_environment)
return true unless file == get_file(name, environment)
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.
166
167
168
169
170
171
172
173
174
175
|
# File 'lib/puppet/util/autoload.rb', line 166
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
94
95
96
97
98
99
|
# File 'lib/puppet/util/autoload.rb', line 94
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, env = nil) ⇒ Object
90
91
92
|
# File 'lib/puppet/util/autoload.rb', line 90
def files_to_load(path, env = nil)
search_directories(env).map {|dir| files_in_dir(dir, path) }.flatten.uniq
end
|
.gem_directories ⇒ Object
156
157
158
|
# File 'lib/puppet/util/autoload.rb', line 156
def gem_directories
gem_source.directories
end
|
.get_file(name, env) ⇒ Object
Get the correct file to load for a given path returns nil if no file is found
84
85
86
87
88
|
# File 'lib/puppet/util/autoload.rb', line 84
def get_file(name, env)
name = name + '.rb' unless name =~ /\.rb$/
path = search_directories(env).find { |dir| Puppet::FileSystem.exist?(File.join(dir, name)) }
path and File.join(path, name)
end
|
146
147
148
149
150
151
152
153
154
|
# File 'lib/puppet/util/autoload.rb', line 146
def libdirs()
if (Puppet.settings.app_defaults_initialized?)
[Puppet[:libdir]]
else
[]
end
end
|
.load_file(name, env) ⇒ Object
Load a single plugin by name. We use ‘load’ here so we can reload a given plugin.
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
# File 'lib/puppet/util/autoload.rb', line 54
def load_file(name, env)
file = get_file(name.to_s, env)
return false unless file
begin
mark_loaded(name, file)
Kernel.load file
return true
rescue SystemExit,NoMemoryError
raise
rescue Exception => detail
message = "Could not autoload #{name}: #{detail}"
Puppet.log_exception(detail, message)
raise Puppet::Error, message, detail.backtrace
end
end
|
.loadall(path, env = nil) ⇒ Object
70
71
72
73
74
75
76
|
# File 'lib/puppet/util/autoload.rb', line 70
def loadall(path, env = nil)
files_to_load(path, env).each do |file|
name = file.chomp(".rb")
load_file(name, env) 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.
24
25
26
27
|
# File 'lib/puppet/util/autoload.rb', line 24
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.
32
33
34
35
36
37
|
# File 'lib/puppet/util/autoload.rb', line 32
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) ⇒ Object
101
102
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
|
# File 'lib/puppet/util/autoload.rb', line 101
def module_directories(env)
$env_module_directories ||= {}
if Puppet.settings.app_defaults_initialized?
env ||= Puppet.lookup(:environments).get(Puppet[:environment])
if env
$env_module_directories[env] ||= env.modulepath.collect do |dir|
Dir.entries(dir).reject { |f| f =~ /^\./ }.collect { |f| File.join(dir, f, "lib") }
end.flatten.find_all do |d|
FileTest.directory?(d)
end
else
[]
end
else
[]
end
end
|
.reload_changed ⇒ Object
78
79
80
|
# File 'lib/puppet/util/autoload.rb', line 78
def reload_changed
loaded.keys.each { |file| load_file(file, nil) if changed?(file) }
end
|
.search_directories(env) ⇒ Object
160
161
162
|
# File 'lib/puppet/util/autoload.rb', line 160
def search_directories(env)
[gem_directories, module_directories(env), libdirs(), $LOAD_PATH].flatten
end
|
Instance Method Details
#changed?(name) ⇒ Boolean
210
211
212
|
# File 'lib/puppet/util/autoload.rb', line 210
def changed?(name)
self.class.changed?(expand(name))
end
|
#expand(name) ⇒ Object
218
219
220
|
# File 'lib/puppet/util/autoload.rb', line 218
def expand(name)
::File.join(@path, name.to_s)
end
|
#files_to_load ⇒ Object
214
215
216
|
# File 'lib/puppet/util/autoload.rb', line 214
def files_to_load
self.class.files_to_load(@path)
end
|
#load(name, env = nil) ⇒ Object
188
189
190
|
# File 'lib/puppet/util/autoload.rb', line 188
def load(name, env = nil)
self.class.load_file(expand(name), env)
end
|
#loadall(env = nil) ⇒ Object
Load all instances from a path of Autoload.search_directories matching the relative path this Autoloader was initialized with. For example, if we have created a Puppet::Util::Autoload for Puppet::Type::User with a path of ‘puppet/provider/user’, the search_directories path will be searched for all ruby files matching puppet/provider/user/*.rb and they will then be loaded from the first directory in the search path providing them. So earlier entries in the search path may shadow later entries.
This uses require, rather than load, so that already-loaded files don’t get reloaded unnecessarily.
202
203
204
|
# File 'lib/puppet/util/autoload.rb', line 202
def loadall(env = nil)
self.class.loadall(@path, env)
end
|
#loaded?(name) ⇒ Boolean
206
207
208
|
# File 'lib/puppet/util/autoload.rb', line 206
def loaded?(name)
self.class.loaded?(expand(name))
end
|