modules : added doc strings, fixed minor style issues, filtered from dependencies blacklisted modules
This commit is contained in:
		| @@ -488,7 +488,7 @@ def _read_config_file(filename, schema): | |||||||
|  |  | ||||||
|     elif not os.path.isfile(filename): |     elif not os.path.isfile(filename): | ||||||
|         raise ConfigFileError( |         raise ConfigFileError( | ||||||
|             "Invlaid configuration. %s exists but is not a file." % filename) |             "Invalid configuration. %s exists but is not a file." % filename) | ||||||
|  |  | ||||||
|     elif not os.access(filename, os.R_OK): |     elif not os.access(filename, os.R_OK): | ||||||
|         raise ConfigFileError("Config file is not readable: %s" % filename) |         raise ConfigFileError("Config file is not readable: %s" % filename) | ||||||
|   | |||||||
| @@ -63,8 +63,9 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| def print_help(): | def print_help(): | ||||||
|     """For use by commands to tell user how to activate shell support.""" |     """ | ||||||
|  |     For use by commands to tell user how to activate shell support. | ||||||
|  |     """ | ||||||
|     tty.msg("This command requires spack's shell integration.", |     tty.msg("This command requires spack's shell integration.", | ||||||
|             "", |             "", | ||||||
|             "To initialize spack's shell commands, you must run one of", |             "To initialize spack's shell commands, you must run one of", | ||||||
| @@ -114,6 +115,20 @@ def inspect_path(prefix): | |||||||
|  |  | ||||||
|  |  | ||||||
| def dependencies(spec, request='all'): | def dependencies(spec, request='all'): | ||||||
|  |     """ | ||||||
|  |     Returns the list of dependent specs for a given spec, according to the given request | ||||||
|  |  | ||||||
|  |     Args: | ||||||
|  |         spec: target spec | ||||||
|  |         request: either 'none', 'direct' or 'all' | ||||||
|  |  | ||||||
|  |     Returns: | ||||||
|  |         empty list if 'none', direct dependency list if 'direct', all dependencies if 'all' | ||||||
|  |     """ | ||||||
|  |     if request not in ('none', 'direct', 'all'): | ||||||
|  |         raise tty.error("Wrong value for argument 'request' : should be one of ('none', 'direct', 'all') " | ||||||
|  |                         " [current value is '%s']" % request) | ||||||
|  |  | ||||||
|     if request == 'none': |     if request == 'none': | ||||||
|         return [] |         return [] | ||||||
|  |  | ||||||
| @@ -132,6 +147,18 @@ def dependencies(spec, request='all'): | |||||||
|  |  | ||||||
|  |  | ||||||
| def parse_config_options(module_generator): | def parse_config_options(module_generator): | ||||||
|  |     """ | ||||||
|  |     Parse the configuration file and returns a bunch of items that will be needed during module file generation | ||||||
|  |  | ||||||
|  |     Args: | ||||||
|  |         module_generator: module generator for a given spec | ||||||
|  |  | ||||||
|  |     Returns: | ||||||
|  |         autoloads: list of specs to be autoloaded | ||||||
|  |         prerequisites: list of specs to be marked as prerequisite | ||||||
|  |         filters: list of environment variables whose modification is blacklisted in module files | ||||||
|  |         env: list of custom environment modifications to be applied in the module file | ||||||
|  |     """ | ||||||
|     autoloads, prerequisites, filters = [], [], [] |     autoloads, prerequisites, filters = [], [], [] | ||||||
|     env = EnvironmentModifications() |     env = EnvironmentModifications() | ||||||
|     # Get the configuration for this kind of generator |     # Get the configuration for this kind of generator | ||||||
| @@ -160,15 +187,20 @@ def parse_config_options(module_generator): | |||||||
|  |  | ||||||
|  |  | ||||||
| def update_single(spec, configuration, autoloads, prerequisites, filters, env): | def update_single(spec, configuration, autoloads, prerequisites, filters, env): | ||||||
|  |     """ | ||||||
|  |     Updates the entries in the arguments according to the configuration | ||||||
|  |  | ||||||
|  |     Args: | ||||||
|  |         spec: [in] target spec | ||||||
|  |         configuration: [in] configuration file for the current type of module file generator | ||||||
|  |         autoloads: [inout] list of dependencies to be automatically loaded | ||||||
|  |         prerequisites: [inout] list of prerequisites | ||||||
|  |         filters: [inout] list of environment variables whose modification is to be blacklisted | ||||||
|  |         env: [inout] list of modifications to the environment | ||||||
|  |     """ | ||||||
|     # Get list of modules that will be loaded automatically |     # Get list of modules that will be loaded automatically | ||||||
|     try: |     autoloads.extend(dependencies(spec, configuration.get('autoload', 'none'))) | ||||||
|         autoloads.extend(dependencies(spec, configuration['autoload'])) |     prerequisites.extend(dependencies(spec, configuration.get('prerequisites', 'none'))) | ||||||
|     except KeyError: |  | ||||||
|         pass |  | ||||||
|     try: |  | ||||||
|         prerequisites.extend(dependencies(spec, configuration['prerequisites'])) |  | ||||||
|     except KeyError: |  | ||||||
|         pass |  | ||||||
|  |  | ||||||
|     # Filter modifications to environment variables |     # Filter modifications to environment variables | ||||||
|     try: |     try: | ||||||
| @@ -188,6 +220,24 @@ def update_single(spec, configuration, autoloads, prerequisites, filters, env): | |||||||
|         pass |         pass | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def filter_blacklisted(specs, module_name): | ||||||
|  |     """ | ||||||
|  |     Given a sequence of specs, filters the ones that are blacklisted in the module configuration file. | ||||||
|  |  | ||||||
|  |     Args: | ||||||
|  |         specs: sequence of spec instances | ||||||
|  |         module_name: type of module file objects | ||||||
|  |  | ||||||
|  |     Yields: | ||||||
|  |         non blacklisted specs | ||||||
|  |     """ | ||||||
|  |     for x in specs: | ||||||
|  |         if module_types[module_name](x).blacklisted: | ||||||
|  |             tty.debug('\tFILTER : %s' % x) | ||||||
|  |             continue | ||||||
|  |         yield x | ||||||
|  |  | ||||||
|  |  | ||||||
| class EnvModule(object): | class EnvModule(object): | ||||||
|     name = 'env_module' |     name = 'env_module' | ||||||
|     formats = {} |     formats = {} | ||||||
| @@ -230,14 +280,14 @@ def blacklisted(self): | |||||||
|         whitelist_matches = [x for x in configuration.get('whitelist', []) if self.spec.satisfies(x)] |         whitelist_matches = [x for x in configuration.get('whitelist', []) if self.spec.satisfies(x)] | ||||||
|         blacklist_matches = [x for x in configuration.get('blacklist', []) if self.spec.satisfies(x)] |         blacklist_matches = [x for x in configuration.get('blacklist', []) if self.spec.satisfies(x)] | ||||||
|         if whitelist_matches: |         if whitelist_matches: | ||||||
|             message = '\t%s is whitelisted [matches : ' % self.spec.cshort_spec |             message = '\tWHITELIST : %s [matches : ' % self.spec.cshort_spec | ||||||
|             for rule in whitelist_matches: |             for rule in whitelist_matches: | ||||||
|                 message += '%s ' % rule |                 message += '%s ' % rule | ||||||
|             message += ' ]' |             message += ' ]' | ||||||
|             tty.debug(message) |             tty.debug(message) | ||||||
|  |  | ||||||
|         if blacklist_matches: |         if blacklist_matches: | ||||||
|             message = '\t%s is blacklisted [matches : ' % self.spec.cshort_spec |             message = '\tBLACKLIST : %s [matches : ' % self.spec.cshort_spec | ||||||
|             for rule in blacklist_matches: |             for rule in blacklist_matches: | ||||||
|                 message += '%s ' % rule |                 message += '%s ' % rule | ||||||
|             message += ' ]' |             message += ' ]' | ||||||
| @@ -258,7 +308,7 @@ def write(self): | |||||||
|         """ |         """ | ||||||
|         if self.blacklisted: |         if self.blacklisted: | ||||||
|             return |             return | ||||||
|         tty.debug("\t%s : writing module file" % self.spec.cshort_spec) |         tty.debug("\tWRITE : %s [%s]" % (self.spec.cshort_spec, self.file_name)) | ||||||
|  |  | ||||||
|         module_dir = os.path.dirname(self.file_name) |         module_dir = os.path.dirname(self.file_name) | ||||||
|         if not os.path.exists(module_dir): |         if not os.path.exists(module_dir): | ||||||
| @@ -273,7 +323,7 @@ def write(self): | |||||||
|         spack_env = EnvironmentModifications() |         spack_env = EnvironmentModifications() | ||||||
|         # TODO : the code down below is quite similar to build_environment.setup_package and needs to be |         # TODO : the code down below is quite similar to build_environment.setup_package and needs to be | ||||||
|         # TODO : factored out to a single place |         # TODO : factored out to a single place | ||||||
|         for item in dependencies(self.spec, 'All'): |         for item in dependencies(self.spec, 'all'): | ||||||
|             package = self.spec[item.name].package |             package = self.spec[item.name].package | ||||||
|             modules = parent_class_modules(package.__class__) |             modules = parent_class_modules(package.__class__) | ||||||
|             for mod in modules: |             for mod in modules: | ||||||
| @@ -292,9 +342,9 @@ def write(self): | |||||||
|  |  | ||||||
|         # Build up the module file content |         # Build up the module file content | ||||||
|         module_file_content = self.header |         module_file_content = self.header | ||||||
|         for x in autoloads: |         for x in filter_blacklisted(autoloads, self.name): | ||||||
|             module_file_content += self.autoload(x) |             module_file_content += self.autoload(x) | ||||||
|         for x in prerequisites: |         for x in filter_blacklisted(prerequisites, self.name): | ||||||
|             module_file_content += self.prerequisite(x) |             module_file_content += self.prerequisite(x) | ||||||
|         for line in self.process_environment_command(filter_environment_blacklist(env, filters)): |         for line in self.process_environment_command(filter_environment_blacklist(env, filters)): | ||||||
|             module_file_content += line |             module_file_content += line | ||||||
| @@ -421,8 +471,7 @@ def use_name(self): | |||||||
|     def header(self): |     def header(self): | ||||||
|         # TCL Modulefile header |         # TCL Modulefile header | ||||||
|         header = '#%Module1.0\n' |         header = '#%Module1.0\n' | ||||||
|         header += '## Module file created by spack (https://github.com/LLNL/spack)' |         header += '## Module file created by spack (https://github.com/LLNL/spack) on %s\n' % datetime.datetime.now() | ||||||
|         header += ' on %s\n' % datetime.datetime.now() |  | ||||||
|         header += '##\n' |         header += '##\n' | ||||||
|         header += '## %s\n' % self.spec.short_spec |         header += '## %s\n' % self.spec.short_spec | ||||||
|         header += '##\n' |         header += '##\n' | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 alalazo
					alalazo