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.
185
186
187
188
189
190
191
|
# File 'lib/puppet/util/autoload.rb', line 185
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
Returns the value of attribute loaded.
22
23
24
|
# File 'lib/puppet/util/autoload.rb', line 22
def loaded
@loaded
end
|
Instance Attribute Details
Returns the value of attribute object.
183
184
185
|
# File 'lib/puppet/util/autoload.rb', line 183
def object
@object
end
|
Returns the value of attribute path.
183
184
185
|
# File 'lib/puppet/util/autoload.rb', line 183
def path
@path
end
|
Class Method Details
.changed?(name) ⇒ Boolean
48
49
50
51
52
53
54
55
56
57
58
59
|
# File 'lib/puppet/util/autoload.rb', line 48
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.
171
172
173
174
175
176
177
178
179
180
|
# File 'lib/puppet/util/autoload.rb', line 171
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
103
104
105
106
107
108
|
# File 'lib/puppet/util/autoload.rb', line 103
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
99
100
101
|
# File 'lib/puppet/util/autoload.rb', line 99
def files_to_load(path, env = nil)
search_directories(env).map {|dir| files_in_dir(dir, path) }.flatten.uniq
end
|
.gem_directories ⇒ Object
161
162
163
|
# File 'lib/puppet/util/autoload.rb', line 161
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
93
94
95
96
97
|
# File 'lib/puppet/util/autoload.rb', line 93
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
|
151
152
153
154
155
156
157
158
159
|
# File 'lib/puppet/util/autoload.rb', line 151
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.
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
# File 'lib/puppet/util/autoload.rb', line 63
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}") % { name: name, detail: detail }
Puppet.log_exception(detail, message)
raise Puppet::Error, message, detail.backtrace
end
end
|
.loadall(path, env = nil) ⇒ Object
79
80
81
82
83
84
85
|
# File 'lib/puppet/util/autoload.rb', line 79
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.
33
34
35
36
|
# File 'lib/puppet/util/autoload.rb', line 33
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.
41
42
43
44
45
46
|
# File 'lib/puppet/util/autoload.rb', line 41
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
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
149
|
# File 'lib/puppet/util/autoload.rb', line 110
def module_directories(env)
if Puppet.settings.app_defaults_initialized?
env ||= Puppet.lookup(:environments).get(Puppet[:environment])
if env
Puppet::Util::ModuleDirectoriesAdapter.adapt(env) do |a|
a.directories ||= 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
end.directories
else
[]
end
else
[]
end
end
|
.reload_changed ⇒ Object
87
88
89
|
# File 'lib/puppet/util/autoload.rb', line 87
def reload_changed
loaded.keys.each { |file| load_file(file, nil) if changed?(file) }
end
|
.search_directories(env) ⇒ Object
165
166
167
|
# File 'lib/puppet/util/autoload.rb', line 165
def search_directories(env)
[gem_directories, module_directories(env), libdirs(), $LOAD_PATH].flatten
end
|
Instance Method Details
#changed?(name) ⇒ Boolean
215
216
217
|
# File 'lib/puppet/util/autoload.rb', line 215
def changed?(name)
self.class.changed?(expand(name))
end
|
#expand(name) ⇒ Object
223
224
225
|
# File 'lib/puppet/util/autoload.rb', line 223
def expand(name)
::File.join(@path, name.to_s)
end
|
#files_to_load ⇒ Object
219
220
221
|
# File 'lib/puppet/util/autoload.rb', line 219
def files_to_load
self.class.files_to_load(@path)
end
|
#load(name, env = nil) ⇒ Object
193
194
195
|
# File 'lib/puppet/util/autoload.rb', line 193
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.
207
208
209
|
# File 'lib/puppet/util/autoload.rb', line 207
def loadall(env = nil)
self.class.loadall(@path, env)
end
|
#loaded?(name) ⇒ Boolean
211
212
213
|
# File 'lib/puppet/util/autoload.rb', line 211
def loaded?(name)
self.class.loaded?(expand(name))
end
|