def load_py(stream, filepath=None): """Load python-formatted data from a stream. Args: stream (file-like object). Returns: dict. """ with add_sys_paths(config.package_definition_build_python_paths): return _load_py(stream, filepath=filepath)
def _get_preprocessed(self, data): """ Returns: (DeveloperPackage, new_data) 2-tuple IF the preprocess function changed the package; otherwise None. """ from rez.serialise import process_python_objects from rez.utils.data_utils import get_dict_diff_str from copy import deepcopy def _get_package_level(): return getattr(self, "preprocess", None) def _get_global_level(): # load globally configured preprocess function package_preprocess_function = self.config.package_preprocess_function if not package_preprocess_function: return None elif isfunction(package_preprocess_function): preprocess_func = package_preprocess_function else: if '.' not in package_preprocess_function: print_error( "Setting 'package_preprocess_function' must be of " "form 'module[.module.module...].funcname'. Package " "preprocessing has not been applied.") return None elif isinstance(package_preprocess_function, basestring): if '.' not in package_preprocess_function: print_error( "Setting 'package_preprocess_function' must be of " "form 'module[.module.module...].funcname'. " "Package preprocessing has not been applied.") return None name, funcname = package_preprocess_function.rsplit('.', 1) try: module = __import__(name=name, fromlist=[funcname]) except Exception as e: print_error( "Failed to load preprocessing function '%s': %s" % (package_preprocess_function, str(e))) return None setattr(module, "InvalidPackageError", InvalidPackageError) preprocess_func = getattr(module, funcname) else: print_error("Invalid package_preprocess_function: %s" % package_preprocess_function) return None if not preprocess_func or not isfunction(preprocess_func): print_error("Function '%s' not found" % package_preprocess_function) return None return preprocess_func with add_sys_paths(config.package_definition_build_python_paths): preprocess_mode = PreprocessMode[ self.config.package_preprocess_mode] package_preprocess = _get_package_level() global_preprocess = _get_global_level() if preprocess_mode == PreprocessMode.after: preprocessors = [global_preprocess, package_preprocess] elif preprocess_mode == PreprocessMode.before: preprocessors = [package_preprocess, global_preprocess] else: preprocessors = [package_preprocess or global_preprocess] preprocessed_data = deepcopy(data) for preprocessor in preprocessors: if not preprocessor: continue level = "global" if preprocessor == global_preprocess else "local" print_info("Applying {0} preprocess function".format(level)) # apply preprocessing try: preprocessor(this=self, data=preprocessed_data) except InvalidPackageError: raise except Exception as e: print_error("Failed to apply preprocess: %s: %s" % (e.__class__.__name__, str(e))) return None # if preprocess added functions, these may need to be converted to # SourceCode instances preprocessed_data = process_python_objects(preprocessed_data) if preprocessed_data == data: return None # recreate package from modified package data package = create_package(self.name, preprocessed_data, package_cls=self.__class__) # print summary of changed package attributes txt = get_dict_diff_str( data, preprocessed_data, title="Package attributes were changed in preprocessing:") print_info(txt) return package, preprocessed_data