def parse_macro_mode_args(mode="macro", argv=None): """Parse options/arguments for rose macro and upgrade.""" opt_parser = RoseOptionParser() options = ["conf_dir", "meta_path", "non_interactive", "output_dir"] if mode == "macro": options.extend(["fix", "validate_all"]) elif mode == "upgrade": options.extend(["downgrade", "all_versions"]) else: raise KeyError("Wrong mode: {0}".format(mode)) opt_parser.add_my_options(*options) if argv is None: opts, args = opt_parser.parse_args() else: opts, args = opt_parser.parse_args(argv) opts, args = opt_parser.parse_args(argv) if mode == "upgrade" and len(args) > 1: sys.stderr.write(opt_parser.get_usage()) return None if opts.conf_dir is None: opts.conf_dir = os.getcwd() opts.conf_dir = os.path.abspath(opts.conf_dir) if opts.output_dir is not None: opts.output_dir = os.path.abspath(opts.output_dir) sys.path.append(os.getenv("ROSE_HOME")) add_opt_meta_paths(opts.meta_path) config_name = os.path.basename(opts.conf_dir) config_file_path = os.path.join(opts.conf_dir, rose.SUB_CONFIG_NAME) if (not os.path.exists(config_file_path) or not os.path.isfile(config_file_path)): rose.reporter.Reporter()(ERROR_LOAD_CONFIG_DIR.format(opts.conf_dir), kind=rose.reporter.Reporter.KIND_ERR, level=rose.reporter.Reporter.FAIL) return None # Load the configuration and the metadata macros. config_loader = rose.config.ConfigLoader() app_config = config_loader(config_file_path) standard_format_config(app_config) # Load meta config if it exists. meta_config = rose.config.ConfigNode() meta_path, warning = load_meta_path(app_config, opts.conf_dir) if meta_path is None: if mode == "macro": text = ERROR_LOAD_METADATA.format("") if warning: text = warning rose.reporter.Reporter()(text, kind=rose.reporter.Reporter.KIND_ERR, level=rose.reporter.Reporter.FAIL) return None else: meta_config = load_meta_config(app_config, directory=opts.conf_dir, config_type=rose.SUB_CONFIG_NAME, ignore_meta_error=True) return app_config, meta_config, config_name, args, opts
def main(): opt_parser = RoseOptionParser() opt_parser.add_my_options("auto_type", "conf_dir", "output_dir") opts, args = opt_parser.parse_args() if opts.conf_dir is None: opts.conf_dir = os.getcwd() opts.conf_dir = os.path.abspath(opts.conf_dir) prop_val_map = {} for arg in args: if "=" in arg: key, val = arg.split("=", 1) prop_val_map.update({key: val}) else: prop_val_map.update({arg: ""}) for filename in [rose.SUB_CONFIG_NAME, rose.TOP_CONFIG_NAME]: path = os.path.join(opts.conf_dir, filename) if os.path.isfile(path): break else: sys.exit(opt_parser.get_usage()) source_config = rose.config.load(path) meta_path = os.path.join(opts.conf_dir, rose.CONFIG_META_DIR, rose.META_CONFIG_NAME) if os.path.isfile(meta_path): metadata_config = rose.config.load(meta_path) else: metadata_config = rose.config.ConfigNode() metadata_config = metadata_gen(source_config, metadata_config, auto_type=opts.type, prop_map=prop_val_map) if opts.output_dir is None: dest = os.path.dirname(meta_path) else: dest = opts.output_dir if not os.path.isdir(dest): os.mkdir(dest) dest_file = os.path.join(dest, rose.META_CONFIG_NAME) rose.config.dump(metadata_config, dest_file)
def parse_macro_mode_args(mode="macro", argv=None): """Parse options/arguments for rose macro and upgrade.""" opt_parser = RoseOptionParser() options = ["conf_dir", "meta_path", "non_interactive", "output_dir"] if mode == "macro": options.extend(["fix", "validate_all"]) elif mode == "upgrade": options.extend(["downgrade", "all_versions"]) else: raise KeyError("Wrong mode: {0}".format(mode)) opt_parser.add_my_options(*options) if argv is None: opts, args = opt_parser.parse_args() else: opts, args = opt_parser.parse_args(argv) if mode == "upgrade" and len(args) > 1: sys.stderr.write(opt_parser.get_usage()) return None if mode == "macro" and opts.validate_all and opts.output_dir: sys.stderr.write(opt_parser.get_usage()) return None if opts.conf_dir is None: opts.conf_dir = os.getcwd() opts.conf_dir = os.path.abspath(opts.conf_dir) if opts.output_dir is not None: opts.output_dir = os.path.abspath(opts.output_dir) sys.path.append(os.getenv("ROSE_HOME")) add_opt_meta_paths(opts.meta_path) config_name = os.path.basename(opts.conf_dir) config_file_path = os.path.join(opts.conf_dir, rose.SUB_CONFIG_NAME) if (not os.path.exists(config_file_path) or not os.path.isfile(config_file_path)): rose.reporter.Reporter()(ERROR_LOAD_CONFIG_DIR.format(opts.conf_dir), kind=rose.reporter.Reporter.KIND_ERR, level=rose.reporter.Reporter.FAIL) return None optional_keys = [] optional_dir = os.path.join(opts.conf_dir, rose.config.OPT_CONFIG_DIR) optional_glob = os.path.join(optional_dir, rose.GLOB_OPT_CONFIG_FILE) for path in glob.glob(optional_glob): filename = os.path.basename(path) # filename is a null string if path is to a directory. result = re.match(rose.RE_OPT_CONFIG_FILE, filename) if not result: continue optional_keys.append(result.group(1)) # Load the configuration and the metadata macros. config_loader = rose.config.ConfigLoader() app_config, config_map = config_loader.load_with_opts( config_file_path, more_keys=optional_keys, return_config_map=True) standard_format_config(app_config) for conf_key, config in config_map.items(): standard_format_config(config) # Load meta config if it exists. meta_config = rose.config.ConfigNode() meta_path, warning = load_meta_path(app_config, opts.conf_dir) if meta_path is None: if mode == "macro": text = ERROR_LOAD_METADATA.format("") if warning: text = warning rose.reporter.Reporter()(text, kind=rose.reporter.Reporter.KIND_ERR, level=rose.reporter.Reporter.FAIL) return None else: meta_config = load_meta_config(app_config, directory=opts.conf_dir, config_type=rose.SUB_CONFIG_NAME, ignore_meta_error=True) return app_config, config_map, meta_config, config_name, args, opts