class Puppet::Pops::Adapters::LoaderAdapter
A LoaderAdapter
adapts an object with a {Loader}. This is used to make further loading from the perspective of the adapted object take place in the perspective of this Loader
.
It is typically enough to adapt the root of a model as a search is made towards the root of the model until a loader is found, but there is no harm in duplicating this information provided a contained object is adapted with the correct loader.
@see Utils#find_adapter @api private
Attributes
Public Class Methods
@api private
# File lib/puppet/pops/adapters.rb 137 def self.find_module_for_dir(environment, paths, dir) 138 return nil if dir.nil? 139 file_path = Pathname.new(dir) 140 paths.each do |path| 141 begin 142 relative_path = file_path.relative_path_from(path).to_s.split(File::SEPARATOR) 143 rescue ArgumentError 144 # file_path was not relative to the module_path. That's OK. 145 next 146 end 147 if relative_path.length > 1 148 mod = environment.module(relative_path[0]) 149 return mod unless mod.nil? 150 end 151 end 152 nil 153 end
Finds the loader to use when loading originates from the source position of the given argument.
@param instance [Model::PopsObject] The model object @param file [String] the file from where the model was parsed @param default_loader [Loader] the loader to return if no loader is found for the model @return [Loader] the found loader or default_loader if it could not be found
# File lib/puppet/pops/adapters.rb 86 def self.loader_for_model_object(model, file = nil, default_loader = nil) 87 loaders = Puppet.lookup(:loaders) { nil } 88 if loaders.nil? 89 default_loader || Loaders.static_loader 90 else 91 loader_name = loader_name_by_source(loaders.environment, model, file) 92 if loader_name.nil? 93 default_loader || loaders[Loader::ENVIRONMENT_PRIVATE] 94 else 95 loaders[loader_name] 96 end 97 end 98 end
Attempts to find the module that `instance` originates from by looking at it's {SourcePosAdapter} and compare the `locator.file` found there with the module paths given in the environment found in the given `scope`. If the file is found to be relative to a path, then the first segment of the relative path is interpreted as the name of a module. The object that the {SourcePosAdapter} is adapted to will then be adapted to the private loader for that module and that adapter is returned.
The method returns `nil` when no module could be found.
@param environment [Puppet::Node::Environment] the current environment @param instance [Model::PopsObject] the AST
for the code @param file [String] the path to the file for the code or `nil` @return [String] the name of the loader associated with the source @api private
# File lib/puppet/pops/adapters.rb 124 def self.loader_name_by_source(environment, instance, file) 125 file = instance.file if file.nil? 126 return nil if file.nil? || EMPTY_STRING == file 127 pn_adapter = PathsAndNameCacheAdapter.adapt(environment) 128 dir = File.dirname(file) 129 pn_adapter.cache.fetch(dir) do |key| 130 mod = find_module_for_dir(environment, pn_adapter.paths, dir) 131 loader_name = mod.nil? ? nil : "#{mod.name} private" 132 pn_adapter.cache[key] = loader_name 133 end 134 end