def delete_by_id(id: int, config: Dict[str, str]): """ Edit the content of an artifact by id. Arguments: id: - the ID (the one you see with kb list) associated to the artifact to delete config: - a configuration dictionary containing at least the following keys: PATH_KB_DB - the database path of KB PATH_KB_DATA - the data directory of KB PATH_KB_HIST - the history menu path of KB EDITOR - the editor program to call """ conn = db.create_connection(config["PATH_KB_DB"]) artifact_id = history.get_artifact_id(config["PATH_KB_HIST"], id) artifact = db.get_artifact_by_id(conn, artifact_id) if not artifact: return db.delete_artifact_by_id(conn, artifact_id) category_path = Path(config["PATH_KB_DATA"], artifact.category) try: Path(category_path, artifact.title).unlink() except FileNotFoundError: pass if fs.count_files(category_path) == 0: fs.remove_directory(category_path) print("Artifact {category}/{title} removed!".format( category=artifact.category, title=artifact.title))
def delete(args: Dict[str, str], config: Dict[str, str]): """ Delete a list of artifacts from the kb knowledge base. Arguments: args: - a dictionary containing the following fields: id -> a list of IDs (the ones you see with kb list) associated to the artifacts we want to delete title -> the title assigned to the artifact(s) category -> the category assigned to the artifact(s) config: - a configuration dictionary containing at least the following keys: PATH_KB_DB - the database path of KB PATH_KB_DATA - the data directory of KB PATH_KB_HIST - the history menu path of KB """ initializer.init(config) conn = db.create_connection(config["PATH_KB_DB"]) if args["id"]: for i in args["id"]: artifact_id = history.get_artifact_id(config["PATH_KB_HIST"], i) artifact = db.get_artifact_by_id(conn, artifact_id) if not artifact: continue db.delete_artifact_by_id(conn, artifact_id) category_path = Path(config["PATH_KB_DATA"], artifact.category) Path(category_path, artifact.title).unlink() if fs.count_files(category_path) == 0: fs.remove_directory(category_path) print("Artifact {category}/{title} removed!".format( category=artifact.category, title=artifact.title)) sys.exit(0) # else if a title is specified elif args["title"]: artifacts = db.get_artifacts_by_filter(conn, title=args["title"], category=args["category"], is_strict=True) if len(artifacts) == 1: artifact = artifacts.pop() db.delete_artifact_by_id(conn, artifact.id) print("Artifact {}/{} removed!".format(artifact.category, artifact.title)) else: print( "There is more than one artifact with that title, please specify a category")
def view_by_id(id: int, config: Dict[str, str], open_editor: bool, color_mode: bool): """ View the content of an artifact by id. Arguments: id: - the ID (the one you see with kb list) associated to the artifact we want to edit config: - a configuration dictionary containing at least the following keys: PATH_KB_DB - the database path of KB PATH_KB_DATA - the data directory of KB PATH_KB_HIST - the history menu path of KB EDITOR - the editor program to call open_editor - a boolean, if True it will open the artifact as a temporary copy in editor color_mode - a boolean, if True the colors on screen will be enabled when printed on stdout """ conn = db.create_connection(config["PATH_KB_DB"]) artifact_id = history.get_artifact_id(config["PATH_KB_HIST"], id) artifact = db.get_artifact_by_id(conn, artifact_id) if not artifact: sys.exit(1) category_path = Path(config["PATH_KB_DATA"], artifact.category) artifact_path = Path(category_path, artifact.title) if open_editor: tmpfname = fs.get_temp_filepath() fs.copy_file(artifact_path, tmpfname) shell_cmd = shlex.split(config["EDITOR"]) + [tmpfname] call(shell_cmd) fs.remove_file(tmpfname) sys.exit(0) # View File if fs.is_text_file(artifact_path): markers = get_template(artifact, config) viewer.view(artifact_path, markers, color=color_mode) else: opener.open_non_text_file(artifact_path)
def get_artifact(conn, hist_file_path: str, list_id: int) -> Artifact: """ Get an artifact based on the list ID (ID shown by kb list). This function is based on the history file path that is used to retrieve the correspondence between list ID and database artifact ID Arguments: hist_file_path - the path to the history file, this is by default in $HOME/.kb/recent.hist list_id - the ID shown by kb list Returns: The artifact corresponding to list_id shown by kb list None in case of non-valid list ID """ artifact_id = get_artifact_id(hist_file_path, list_id) return db.get_artifact_by_id(conn, artifact_id)
def view(args: Dict[str, str], config: Dict[str, str]): """ View an artifact contained in the knowledge base of kb. Arguments: args: - a dictionary containing the following fields: id -> the IDs (the one you see with kb list) associated to the artifact to view title -> the title of the artifact to view category -> the category of the artifact to view editor -> a boolean, if True the file will be opened in a text editor as a temporary file hence the original will not be affected config: - a configuration dictionary containing at least the following keys: PATH_KB_DB - the database path of KB PATH_KB_DATA - the data directory of KB PATH_KB_HIST - the history menu path of KB PATH_KB_MARKERS - the file associated to the markers EDITOR - the editor program to call """ # Check initialization initializer.init(config) conn = db.create_connection(config["PATH_KB_DB"]) if args["id"]: artifact_id = history.get_artifact_id( config["PATH_KB_HIST"], args["id"]) artifact = db.get_artifact_by_id(conn, artifact_id) if not artifact: sys.exit(1) category_path = Path(config["PATH_KB_DATA"], artifact.category) artifact_path = Path(category_path, artifact.title) if args["editor"]: with tempfile.NamedTemporaryFile() as tmpfname: fs.copy_file(artifact_path, tmpfname.name) call([config["EDITOR"], tmpfname.name]) sys.exit(0) # View File if fs.is_text_file(artifact_path): markers = get_markers(config["PATH_KB_MARKERS"]) color_mode = not args["no_color"] viewer.view(artifact_path, markers, color=color_mode) else: opener.open_non_text_file(artifact_path) elif args["title"]: artifact = db.get_uniq_artifact_by_filter(conn, title=args["title"], category=args["category"], is_strict=True) if artifact: category_path = Path(config["PATH_KB_DATA"], artifact.category) artifact_path = Path(category_path, artifact.title) content = "" if args["editor"]: call([config["EDITOR"], artifact_path]) sys.exit(0) # View File if fs.is_text_file(artifact_path): markers = get_markers(config["PATH_KB_MARKERS"]) color_mode = not args["no_color"] viewer.view(artifact_path, markers, color=color_mode) else: opener.open_non_text_file(artifact_path) else: print( "There is no artifact with that title, please specify a category")