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

loader_name[RW]

Public Class Methods

find_module_for_dir(environment, paths, dir) click to toggle source

@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
loader_for_model_object(model, file = nil, default_loader = nil) click to toggle source

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
loader_name_by_source(environment, instance, file) click to toggle source

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