The module scheme allows loading bindings using the Puppet autoloader. Optional uris are handled by checking if the symbolic name can be resolved to a loadable file from modules.
URI
The uri is on the format: `module:/[? | ?optional]` where `fqn` is a fully qualified bindings name starting with the module name or ‘*’ to denote ‘any module’. A URI query of `?` or `?optional` makes the request optional; if no loadable file is found, it is simply skipped.
@todo
Does currently only support checking of optionality against files under a module. If the result should be loaded from any other location it can not be marked as optional as it will be ignored.
Expands URIs with wildcards @param uri [URI] the uri to possibly expand @return [Array<URI>] the URIs to exclude @api public
# File lib/puppet/pops/binder/scheme_handler/module_scheme.rb, line 65 def expand_excluded(uri, composer) result = [] split_name, fqn = fqn_from_path(uri) case split_name[ 0 ] when '*' # create new URIs, one per module name composer.name_to_module.each_pair do | name, mod | result << URI.parse('module:/' + ([name] + split_name).join('::')) end when nil raise ArgumentError, "Bad bindings uri, the #{uri} has neither module name or wildcard '*' in its first path position" else # create a clean copy (get rid of optional, fragments etc. and any trailing stuff result << URI.parse('module:/' + split_name.join('::')) end result end
Expands URIs with wildcards and checks optionality. @param uri [URI] the uri to possibly expand @return [Array<URI>] the URIs to include @api public
# File lib/puppet/pops/binder/scheme_handler/module_scheme.rb, line 25 def expand_included(uri, composer) result = [] split_name, fqn = fqn_from_path(uri) # supports wild card in the module name case split_name[0] when '*' # create new URIs, one per module name that has a corresponding .rb file relative to its # '<root>/lib/puppet/bindings/' # composer.name_to_module.each_pair do | mod_name, mod | expanded_name_parts = [mod_name] + split_name[1..-1] expanded_name = expanded_name_parts.join('::') if Puppet::Pops::Binder::BindingsLoader.loadable?(mod.path, expanded_name) result << URI.parse('module:/' + expanded_name) end end when nil raise ArgumentError, "Bad bindings uri, the #{uri} has neither module name or wildcard '*' in its first path position" else joined_name = split_name.join('::') # skip optional uri if it does not exist if is_optional?(uri) mod = composer.name_to_module[split_name[0]] if mod && Puppet::Binder::BindingsLoader.loadable?(mod.path, joined_name) result << URI.parse('module:/' + joined_name) end else # assume it exists (do not give error if not, since it may be excluded later) result << URI.parse('module:/' + joined_name) end end result end