def test_rename_to_bak_file(fx_mk_temp_dir): temp_file = os.path.join(mock_paths.TEST_TEMP_DIR, "mock_file.txt") sdk_helpers.write_file(temp_file, mock_data.mock_file_contents) sdk_helpers.rename_to_bak_file(temp_file) files_in_dir = os.listdir(mock_paths.TEST_TEMP_DIR) regex = re.compile(r'^mock_file\.txt-\d+\d+\d+\d+\d+\d+\d+\.bak$') matched_file_name = list(filter(regex.match, files_in_dir))[0] assert regex.match(matched_file_name)
def _reload_package(args): old_params, path_customize_py_bak = [], "" # Get + validate package, customize.py and setup.py paths path_package = os.path.abspath(args.package) # Get basename of path_to_src (version information is stripped from the basename). path_package_basename = re.split(VERSION_REGEX, os.path.basename(path_package), 1)[0] sdk_helpers.validate_dir_paths(os.R_OK, path_package) path_customize_py = os.path.join(path_package, path_package_basename, package_helpers.PATH_CUSTOMIZE_PY) sdk_helpers.validate_file_paths(os.W_OK, path_customize_py) path_setup_py_file = os.path.join(path_package, package_helpers.PATH_SETUP_PY) sdk_helpers.validate_file_paths(os.R_OK, path_setup_py_file) # Set package + output args correctly (this handles if user runs 'codegen --reload -p .') args.package = os.path.basename(path_package) args.output = os.path.dirname(path_package) LOG.info("'codegen --reload' started for '%s'", args.package) # Load the customize.py module customize_py_module = package_helpers.load_customize_py_module(path_customize_py, warn=False) try: # Get the 'old_params' from customize.py old_params = customize_py_module.codegen_reload_data() except AttributeError: raise SDKException(u"Corrupt customize.py. No reload method found in {0}".format(path_customize_py)) if not old_params: raise SDKException(u"No reload params found in {0}".format(path_customize_py)) # Rename the old customize.py with .bak path_customize_py_bak = sdk_helpers.rename_to_bak_file(path_customize_py) # If local export file exists then save it to a .bak file. # (Older packages may not have the /util/data/export.res file) path_export_res = os.path.join(path_package, path_package_basename, package_helpers.PATH_UTIL_DATA_DIR, package_helpers.BASE_NAME_LOCAL_EXPORT_RES) if os.path.isfile(path_export_res): path_export_res_bak = sdk_helpers.rename_to_bak_file(path_export_res) else: path_export_res_bak = None try: # Map command line arg name to dict key returned by codegen_reload_data() in customize.py mapping_tuples = [ ("messagedestination", "message_destinations"), ("function", "functions"), ("workflow", "workflows"), ("rule", "actions"), ("field", "incident_fields"), ("artifacttype", "incident_artifact_types"), ("datatable", "datatables"), ("task", "automatic_tasks"), ("script", "scripts") ] # Merge old_params with new params specified on command line args = CmdCodegen.merge_codegen_params(old_params, args, mapping_tuples) # Parse the setup.py file setup_py_attributes = package_helpers.parse_setup_py(path_setup_py_file, package_helpers.SUPPORTED_SETUP_PY_ATTRIBUTE_NAMES) LOG.debug("Regenerating codegen '%s' package now", args.package) # Regenerate the package CmdCodegen._gen_package(args, setup_py_attributes=setup_py_attributes) LOG.info("\nNOTE: Ensure the MANIFEST.in file includes line:\nrecursive-include %s/util *\n", args.package) LOG.info("'codegen --reload' complete for '%s'", args.package) except Exception as err: LOG.error(u"Error running resilient-sdk codegen --reload\n\nERROR:%s", err) # This is required in finally block as user may kill using keyboard interrupt finally: # If an error occurred, customize.py does not exist, rename the backup file to original if not os.path.isfile(path_customize_py): LOG.info(u"An error occurred. Renaming customize.py.bak to customize.py") sdk_helpers.rename_file(path_customize_py_bak, package_helpers.BASE_NAME_CUSTOMIZE_PY) if not os.path.isfile(path_export_res) and path_export_res_bak: LOG.info(u"An error occurred. Renaming export.res.bak to export.res") sdk_helpers.rename_file(path_export_res_bak, package_helpers.BASE_NAME_LOCAL_EXPORT_RES)
def _set_version(args): new_version = args.set_version if not sdk_helpers.is_valid_version_syntax(new_version): raise SDKException( "{0} is not a valid version".format(new_version)) new_version_int = list(map(int, (re.findall(r"\d+", new_version)))) # Get absolute path_to_src path_to_src = os.path.abspath(args.package) # Get path to setup.py file path_setup_py_file = os.path.join(path_to_src, package_helpers.BASE_NAME_SETUP_PY) # Parse the setup.py file setup_py_attributes = package_helpers.parse_setup_py( path_setup_py_file, package_helpers.SUPPORTED_SETUP_PY_ATTRIBUTE_NAMES) package_name = setup_py_attributes.get("name", "") LOG.info("Setting Resilient Platform version for %s to %s", package_name, new_version) # Get the customize file location. path_customize_py = package_helpers.get_configuration_py_file_path( "customize", setup_py_attributes) # Get customize.py ImportDefinition customize_py_import_definition = package_helpers.get_import_definition_from_customize_py( path_customize_py) old_version = customize_py_import_definition["server_version"][ "version"] LOG.info("Old Version: %s", old_version) LOG.info("New Version: %s", new_version) # Set the new version customize_py_import_definition["server_version"][ "version"] = new_version customize_py_import_definition["server_version"][ "major"] = new_version_int[0] customize_py_import_definition["server_version"][ "minor"] = new_version_int[1] customize_py_import_definition["server_version"][ "build_number"] = new_version_int[2] LOG.info("Loading old customize.py file") # Load the customize.py module customize_py_module = package_helpers.load_customize_py_module( path_customize_py, warn=False) # Get the 'old_params' from customize.py old_params = customize_py_module.codegen_reload_data() # Rename the old customize.py with .bak path_customize_py_bak = sdk_helpers.rename_to_bak_file( path_customize_py) # If local export file exists then save it to a .bak file. # (Older packages may not have the /util/data/export.res file) # Figure out the path of the files first dir_customize_py = os.path.dirname(path_customize_py) path_local_export_res = os.path.join( dir_customize_py, package_helpers.PATH_LOCAL_EXPORT_RES) path_local_export_res_bak = None if os.path.isfile(path_local_export_res): path_local_export_res_bak = sdk_helpers.rename_to_bak_file( path_local_export_res) try: jinja_data = sdk_helpers.get_from_export( customize_py_import_definition, message_destinations=old_params.get("message_destinations"), functions=old_params.get("functions"), workflows=old_params.get("workflows"), rules=old_params.get("actions"), fields=old_params.get("incident_fields"), artifact_types=old_params.get("incident_artifact_types"), datatables=old_params.get("datatables"), tasks=old_params.get("automatic_tasks"), scripts=old_params.get("scripts")) jinja_data["export_data"] = sdk_helpers.minify_export( customize_py_import_definition, message_destinations=sdk_helpers.get_object_api_names( ResilientObjMap.MESSAGE_DESTINATIONS, jinja_data.get("message_destinations")), functions=sdk_helpers.get_object_api_names( ResilientObjMap.FUNCTIONS, jinja_data.get("functions")), workflows=sdk_helpers.get_object_api_names( ResilientObjMap.WORKFLOWS, jinja_data.get("workflows")), rules=sdk_helpers.get_object_api_names( ResilientObjMap.RULES, jinja_data.get("rules")), fields=jinja_data.get("all_fields"), artifact_types=sdk_helpers.get_object_api_names( ResilientObjMap.INCIDENT_ARTIFACT_TYPES, jinja_data.get("artifact_types")), datatables=sdk_helpers.get_object_api_names( ResilientObjMap.DATATABLES, jinja_data.get("datatables")), tasks=sdk_helpers.get_object_api_names( ResilientObjMap.TASKS, jinja_data.get("tasks")), phases=sdk_helpers.get_object_api_names( ResilientObjMap.PHASES, jinja_data.get("phases")), scripts=sdk_helpers.get_object_api_names( ResilientObjMap.SCRIPTS, jinja_data.get("scripts"))) # Add package_name to jinja_data jinja_data["package_name"] = package_name # Add version jinja_data["version"] = setup_py_attributes.get( "version", package_helpers.MIN_SETUP_PY_VERSION) # Instansiate Jinja2 Environment with path to Jinja2 templates for customize.py jinja_env = sdk_helpers.setup_jinja_env( "data/codegen/templates/package_template/package/util") jinja_template = jinja_env.get_template("customize.py.jinja2") LOG.info("Writing new customize.py file") # Render & write jinja2 template jinja_rendered_text = jinja_template.render(jinja_data) sdk_helpers.write_file(path_customize_py, jinja_rendered_text) # Instansiate Jinja2 Environment with path to Jinja2 templates for /util/dat/export.res #jinja_env = sdk_helpers.setup_jinja_env("data/codegen/templates/package_template/package/util/data") jinja_template = jinja_env.get_template("/data/export.res.jinja2") LOG.debug("Writing new /util/data/export.res file") # Render jinja2 template jinja_rendered_text = jinja_template.render(jinja_data) # Make sure the /util/data directory is there if it is not dir_local_export_res = os.path.dirname(path_local_export_res) if not os.path.exists(dir_local_export_res): os.makedirs(dir_local_export_res) # Write the file sdk_helpers.write_file(path_local_export_res, jinja_rendered_text) LOG.info("'dev --set-version' complete for '%s'", package_name) except Exception as err: LOG.error( u"Error running resilient-sdk dev --set-version\n\nERROR:%s", err) # This is required in finally block as user may kill using keyboard interrupt finally: # If an error occurred, customize.py does not exist, rename the backup file to original if not os.path.isfile(path_customize_py): LOG.info( u"An error occurred. Renaming customize.py.bak to customize.py" ) sdk_helpers.rename_file(path_customize_py_bak, package_helpers.BASE_NAME_CUSTOMIZE_PY) if path_local_export_res_bak and not os.path.isfile( path_local_export_res): LOG.info( u"An error occurred. Renaming /util/data/export.res.bak to export.res" ) sdk_helpers.rename_file( path_local_export_res_bak, package_helpers.BASE_NAME_LOCAL_EXPORT_RES)
def _get_results_from_log_file(cls, args): """ - Gets all function names from the payload_samples directory - Traverses the file at the path specified by args.gather_results (in a reversed order) - Looks for lines containing ``[<fn_name>] Result: {'version': 2.0, 'success': True...`` - Parses it and generates an output_json_example.json and output_json_schema.json file for each ``Result`` found - Uses the libary ``genson`` to generate the JSON schema from a Python Dictionary :param args: (required) the cmd line arguments :type args: argparse.ArgumentParser :raises: an SDKException if args.package is not a valid path """ # Check if Python >= MIN_SUPPORTED_PY_VERSION if not sdk_helpers.is_python_min_supported_version(constants.ERROR_WRONG_PYTHON_VERSION): raise SDKException(constants.ERROR_WRONG_PYTHON_VERSION) path_package = os.path.abspath(args.package) path_log_file = args.gather_results path_payload_samples_dir = os.path.join(path_package, package_helpers.BASE_NAME_PAYLOAD_SAMPLES_DIR) LOG.debug("\nPath to project: %s", path_package) sdk_helpers.validate_dir_paths(os.W_OK, path_package) package_name = package_helpers.get_package_name(path_package) LOG.info("'codegen %s' started for '%s'", constants.SUB_CMD_OPT_GATHER_RESULTS, package_name) try: sdk_helpers.validate_dir_paths(os.W_OK, path_payload_samples_dir) except SDKException as e: if constants.ERROR_NOT_FIND_DIR in e.message: LOG.warning("WARNING: no '%s' found. Running 'codegen --reload' to create the default missing files\n%s", package_helpers.BASE_NAME_PAYLOAD_SAMPLES_DIR, constants.LOG_DIVIDER) args.reload = True cls._reload_package(args) LOG.warning(constants.LOG_DIVIDER) else: raise e functions_that_need_payload_samples = args.function if args.function else os.listdir(path_payload_samples_dir) results_scraped = sdk_helpers.scrape_results_from_log_file(path_log_file) for fn_name in functions_that_need_payload_samples: fn_results = results_scraped.get(fn_name) if not fn_results: package_helpers.color_output("WARNING: No results could be found for '{0}' in '{1}'".format(fn_name, path_log_file), constants.VALIDATE_LOG_LEVEL_WARNING, do_print=True) continue LOG.info("Results found for '[%s]'", fn_name) path_payload_samples_fn_name = os.path.join(path_payload_samples_dir, fn_name) path_output_json_example = os.path.join(path_payload_samples_fn_name, package_helpers.BASE_NAME_PAYLOAD_SAMPLES_EXAMPLE) path_output_json_schema = os.path.join(path_payload_samples_fn_name, package_helpers.BASE_NAME_PAYLOAD_SAMPLES_SCHEMA) path_output_json_example_bak = sdk_helpers.rename_to_bak_file(path_output_json_example) path_output_json_schema_bak = sdk_helpers.rename_to_bak_file(path_output_json_schema) try: LOG.debug("Writing JSON example file for '%s' to '%s'", fn_name, path_output_json_example) sdk_helpers.write_file(path_output_json_example, json.dumps(fn_results, indent=2)) LOG.debug("Writing JSON schema file for '%s' to '%s'", fn_name, path_output_json_schema) builder = CustomSchemaBuilder(schema_uri=constants.CODEGEN_JSON_SCHEMA_URI) main_genson_builder_overwrites(builder) builder.add_object(fn_results) sdk_helpers.write_file(path_output_json_schema, builder.to_json(indent=2)) finally: if not os.path.isfile(path_output_json_example) and path_output_json_example_bak: LOG.info(u"An error occurred. Renaming %s.bak to %s", package_helpers.BASE_NAME_PAYLOAD_SAMPLES_EXAMPLE, package_helpers.BASE_NAME_PAYLOAD_SAMPLES_EXAMPLE) sdk_helpers.rename_file(path_output_json_example_bak, package_helpers.BASE_NAME_PAYLOAD_SAMPLES_EXAMPLE) if not os.path.isfile(path_output_json_schema) and path_output_json_schema_bak: LOG.info(u"An error occurred. Renaming %s.bak to %s", package_helpers.BASE_NAME_PAYLOAD_SAMPLES_SCHEMA, package_helpers.BASE_NAME_PAYLOAD_SAMPLES_SCHEMA) sdk_helpers.rename_file(path_output_json_schema_bak, package_helpers.BASE_NAME_PAYLOAD_SAMPLES_SCHEMA) LOG.info("'codegen %s' complete for '%s'", constants.SUB_CMD_OPT_GATHER_RESULTS, package_name)
def _reload_package(args): old_params, path_customize_py_bak = [], "" # Get absolute path to package path_package = os.path.abspath(args.package) LOG.debug("\nPath to project: %s", path_package) # Ensure the package directory exists and we have WRITE access sdk_helpers.validate_dir_paths(os.W_OK, path_package) path_setup_py_file = os.path.join(path_package, package_helpers.BASE_NAME_SETUP_PY) package_name = package_helpers.get_package_name(path_package) if not sdk_helpers.is_valid_package_name(package_name): raise SDKException(u"'{0}' is not a valid package name. 'name' attribute in setup.py file is not valid or not specified".format(package_name)) LOG.debug("\nProject name: %s", package_name) # Generate path to customize.py file + validate we have permissions to read it path_customize_py = os.path.join(path_package, package_name, package_helpers.PATH_CUSTOMIZE_PY) sdk_helpers.validate_file_paths(os.W_OK, path_customize_py) # Set package + output args correctly (this handles if user runs 'codegen --reload -p .') args.package = package_name args.output = path_package LOG.info("'codegen --reload' started for '%s'", args.package) # Load the customize.py module customize_py_module = package_helpers.load_customize_py_module(path_customize_py, warn=False) try: # Get the 'old_params' from customize.py old_params = customize_py_module.codegen_reload_data() except AttributeError: raise SDKException(u"Corrupt customize.py. No reload method found in {0}".format(path_customize_py)) if not old_params: raise SDKException(u"No reload params found in {0}".format(path_customize_py)) # Rename the old customize.py with .bak path_customize_py_bak = sdk_helpers.rename_to_bak_file(path_customize_py) # If local export file exists then save it to a .bak file. # (Older packages may not have the /util/data/export.res file) path_export_res = os.path.join(path_package, package_name, package_helpers.PATH_UTIL_DATA_DIR, package_helpers.BASE_NAME_LOCAL_EXPORT_RES) if os.path.isfile(path_export_res): path_export_res_bak = sdk_helpers.rename_to_bak_file(path_export_res) else: path_export_res_bak = None try: # Map command line arg name to dict key returned by codegen_reload_data() in customize.py mapping_tuples = [ ("messagedestination", "message_destinations"), ("function", "functions"), ("workflow", "workflows"), ("rule", "actions"), ("field", "incident_fields"), ("artifacttype", "incident_artifact_types"), ("incidenttype", "incident_types"), ("datatable", "datatables"), ("task", "automatic_tasks"), ("script", "scripts"), ("playbook", "playbooks") ] # Merge old_params with new params specified on command line args = CmdCodegen.merge_codegen_params(old_params, args, mapping_tuples) # Parse the setup.py file setup_py_attributes = package_helpers.parse_setup_py(path_setup_py_file, package_helpers.SUPPORTED_SETUP_PY_ATTRIBUTE_NAMES) LOG.debug("Regenerating codegen '%s' package now", args.package) # Regenerate the package path_reloaded = CmdCodegen._gen_package(args, setup_py_attributes=setup_py_attributes) LOG.info("\nNOTE: Ensure the MANIFEST.in file includes line:\nrecursive-include %s/util *\n", args.package) LOG.info("'codegen --reload' complete for '%s'", args.package) return path_reloaded # This is required in finally block as user may kill using keyboard interrupt finally: # If an error occurred, customize.py does not exist, rename the backup file to original if not os.path.isfile(path_customize_py): LOG.info(u"An error occurred. Renaming customize.py.bak to customize.py") sdk_helpers.rename_file(path_customize_py_bak, package_helpers.BASE_NAME_CUSTOMIZE_PY) if not os.path.isfile(path_export_res) and path_export_res_bak: LOG.info(u"An error occurred. Renaming export.res.bak to export.res") sdk_helpers.rename_file(path_export_res_bak, package_helpers.BASE_NAME_LOCAL_EXPORT_RES)
def execute_command(self, args): LOG.debug("docgen called with %s", args) # Set docgen name for SDKException SDKException.command_ran = self.CMD_NAME # Get absolute path_to_src path_to_src = os.path.abspath(args.p) LOG.debug("Path to project: %s", path_to_src) # Instansiate Jinja2 Environment with path to Jinja2 templates jinja_env = sdk_helpers.setup_jinja_env("data/docgen/templates") # Load the Jinja2 Templates readme_template = jinja_env.get_template(README_TEMPLATE_NAME) # Generate path to setup.py file path_setup_py_file = os.path.join(path_to_src, package_helpers.BASE_NAME_SETUP_PY) try: # Ensure we have read permissions for setup.py sdk_helpers.validate_file_paths(os.R_OK, path_setup_py_file) except SDKException as err: err.message += "\nEnsure you are in the directory of the package you want to run docgen for" raise err # Parse the setup.py file setup_py_attributes = package_helpers.parse_setup_py( path_setup_py_file, package_helpers.SUPPORTED_SETUP_PY_ATTRIBUTE_NAMES) package_name = setup_py_attributes.get("name", "") # Generate paths to other required directories + files path_customize_py_file = os.path.join( path_to_src, package_name, package_helpers.PATH_CUSTOMIZE_PY) path_config_py_file = os.path.join(path_to_src, package_name, package_helpers.PATH_CONFIG_PY) path_readme = os.path.join(path_to_src, package_helpers.BASE_NAME_README) path_screenshots_dir = os.path.join(path_to_src, package_helpers.PATH_SCREENSHOTS) path_payload_samples_dir = os.path.join( path_to_src, package_helpers.BASE_NAME_PAYLOAD_SAMPLES_DIR) # Ensure we have read permissions for each required file and the file exists sdk_helpers.validate_file_paths(os.R_OK, path_setup_py_file, path_customize_py_file, path_config_py_file) # Check doc/screenshots directory exists, if not, create it + copy default screenshot if not os.path.isdir(path_screenshots_dir): os.makedirs(path_screenshots_dir) shutil.copy(package_helpers.PATH_DEFAULT_SCREENSHOT, path_screenshots_dir) # Get the resilient_circuits dependency string from setup.py file res_circuits_dep_str = package_helpers.get_dependency_from_install_requires( setup_py_attributes.get("install_requires"), "resilient_circuits") if not res_circuits_dep_str: res_circuits_dep_str = package_helpers.get_dependency_from_install_requires( setup_py_attributes.get("install_requires"), "resilient-circuits") # Get ImportDefinition from customize.py customize_py_import_def = package_helpers.get_import_definition_from_customize_py( path_customize_py_file) # Parse the app.configs from the config.py file jinja_app_configs = package_helpers.get_configs_from_config_py( path_config_py_file) # Get field names from ImportDefinition field_names = [] for f in customize_py_import_def.get("fields", []): f_export_key = f.get("export_key") if "incident/" in f_export_key and f_export_key not in IGNORED_INCIDENT_FIELDS: field_names.append(f.get(ResilientObjMap.FIELDS, "")) # Get data from ImportDefinition import_def_data = sdk_helpers.get_from_export( customize_py_import_def, message_destinations=sdk_helpers.get_object_api_names( ResilientObjMap.MESSAGE_DESTINATIONS, customize_py_import_def.get("message_destinations")), functions=sdk_helpers.get_object_api_names( ResilientObjMap.FUNCTIONS, customize_py_import_def.get("functions")), workflows=sdk_helpers.get_object_api_names( ResilientObjMap.WORKFLOWS, customize_py_import_def.get("workflows")), rules=sdk_helpers.get_object_api_names( ResilientObjMap.RULES, customize_py_import_def.get("actions")), fields=field_names, artifact_types=sdk_helpers.get_object_api_names( ResilientObjMap.INCIDENT_ARTIFACT_TYPES, customize_py_import_def.get("incident_artifact_types")), datatables=sdk_helpers.get_object_api_names( ResilientObjMap.DATATABLES, customize_py_import_def.get("types")), tasks=sdk_helpers.get_object_api_names( ResilientObjMap.TASKS, customize_py_import_def.get("automatic_tasks")), scripts=sdk_helpers.get_object_api_names( ResilientObjMap.SCRIPTS, customize_py_import_def.get("scripts")), playbooks=sdk_helpers.get_object_api_names( ResilientObjMap.PLAYBOOKS, customize_py_import_def.get("playbooks", []))) # Lists we use in Jinja Templates jinja_functions = self._get_function_details( import_def_data.get("functions", []), import_def_data.get("workflows", [])) jinja_scripts = self._get_script_details( import_def_data.get("scripts", [])) jinja_rules = self._get_rule_details(import_def_data.get("rules", [])) jinja_datatables = self._get_datatable_details( import_def_data.get("datatables", [])) jinja_custom_fields = self._get_custom_fields_details( import_def_data.get("fields", [])) jinja_custom_artifact_types = self._get_custom_artifact_details( import_def_data.get("artifact_types", [])) jinja_playbooks = self._get_playbook_details( import_def_data.get("playbooks", [])) # Other variables for Jinja Templates package_name_dash = package_name.replace("_", "-") server_version = customize_py_import_def.get("server_version", {}) supported_app = sdk_helpers.does_url_contain( setup_py_attributes.get("url", ""), "ibm.com/mysupport") # See if a payload_samples dir exists and use the contents for function results try: sdk_helpers.validate_dir_paths(os.R_OK, path_payload_samples_dir) for f in jinja_functions: fn_name = f.get("x_api_name") path_payload_samples_fn_name = os.path.join( path_payload_samples_dir, fn_name) path_output_json_example = os.path.join( path_payload_samples_fn_name, package_helpers.BASE_NAME_PAYLOAD_SAMPLES_EXAMPLE) try: sdk_helpers.validate_file_paths(os.R_OK, path_output_json_example) f["results"] = sdk_helpers.read_json_file( path_output_json_example) except SDKException as e: sdk_helpers.handle_file_not_found_error( e, u"Error getting results. No '{0}' file found for '{1}'." .format( package_helpers.BASE_NAME_PAYLOAD_SAMPLES_EXAMPLE, fn_name)) except SDKException as e: sdk_helpers.handle_file_not_found_error( e, u"Error getting results. No '{0}' directory found.".format( package_helpers.BASE_NAME_PAYLOAD_SAMPLES_EXAMPLE)) LOG.info("Rendering README for %s", package_name_dash) # Render the README Jinja2 Templeate with parameters rendered_readme = readme_template.render({ "name_underscore": package_name, "name_dash": package_name_dash, "display_name": setup_py_attributes.get("display_name", package_name), "short_description": setup_py_attributes.get("description"), "long_description": setup_py_attributes.get("long_description"), "version": setup_py_attributes.get("version"), "server_version": server_version.get("version"), "all_dependencies": setup_py_attributes.get("install_requires", []), "res_circuits_dependency_str": res_circuits_dep_str, "author": setup_py_attributes.get("author"), "support_url": setup_py_attributes.get("url"), "supported_app": supported_app, "app_configs": jinja_app_configs[1], "functions": jinja_functions, "scripts": jinja_scripts, "rules": jinja_rules, "datatables": jinja_datatables, "custom_fields": jinja_custom_fields, "custom_artifact_types": jinja_custom_artifact_types, "playbooks": jinja_playbooks, "placeholder_string": constants.DOCGEN_PLACEHOLDER_STRING }) # Create a backup if needed of README sdk_helpers.rename_to_bak_file(path_readme, package_helpers.PATH_DEFAULT_README) LOG.info("Writing README to: %s", path_readme) # Write the new README sdk_helpers.write_file(path_readme, rendered_readme)
def test_rename_to_bak_file_if_file_not_exist(fx_mk_temp_dir): temp_file = os.path.join(mock_paths.TEST_TEMP_DIR, "mock_file.txt") path_to_backup = sdk_helpers.rename_to_bak_file(temp_file) assert temp_file == path_to_backup