import click import shutil from pathlib import Path from datetime import datetime from ._natural_sort import natural_sort DEVELOPER_DRIVE = Path("/mnt/e/") PATH_ISSUES = DEVELOPER_DRIVE / "Safeguard-MBP-issues" PATH_WORKBOOKS = DEVELOPER_DRIVE / "Safeguard MBP Workbooks" PATH_WIN_DESKTOP = Path("/mnt/c/Users/Holgi/Desktop") TODAY = datetime.now().strftime("%y%m%d") CRLF = "\r\n" EXCEL_CHANGELOGS = { "changes_hyb_workbook": "J1", "changes_qc_cy5_workbook": "J1", "changes_qc_dry_workbook": "L1", "changes_qc_workbook": "J1", } EXCEL_CHANGELOG_HEADERS = [ "Sheet\tWell\tContents\tComment", "-----\t----\t--------\t-------", "", ] def _folder_content(folder): nondotted = (i for i in folder.iterdir() if not i.stem.startswith(".")) return (i for i in nondotted if not i.stem.startswith("~")) def _files_in_folder(folder, suffix): files = (f for f in _folder_content(folder) if f.is_file()) return (f for f in files if f.suffix == suffix) def get_latest_version(parent=PATH_ISSUES): folders = (i for i in _folder_content(parent) if i.is_dir()) versions = natural_sort(f.name for f in folders if f.stem.lower().startswith("v")) return versions[-1] def get_next_version(parent=PATH_ISSUES, echo_current=True): latest = get_latest_version(parent) if echo_current: print("current version:", latest) try: head, tail = latest.rsplit(".", 1) next_minor = int(tail) + 1 next_version = f"{head}.{next_minor}" except: next_version = "" return next_version def create_new_version_folder(new_version, parent=PATH_ISSUES): new_folder_path = parent / new_version if new_folder_path.exists(): print(f"Folder for version {new_version} already exists, aborting") return new_folder_path.mkdir() return new_folder_path def create_excel_changelogs(new_version, parent): for name, cell in EXCEL_CHANGELOGS.items(): new_file = parent / f"{name}_{new_version}.txt" with new_file.open("w") as fh: data_line = "\t".join(["Settings", cell, new_version, ""]) content_lines = EXCEL_CHANGELOG_HEADERS + [data_line, "", ""] fh.write(CRLF.join(content_lines)) def create_changelog_entry(new_version, parent=PATH_ISSUES): textfiles = _files_in_folder(parent, ".txt") changelog = next(f for f in textfiles if f.stem.lower().startswith("change")) content = [] with changelog.open("r") as fh: stripped_lines = (line.rstrip() for line in fh) for line in stripped_lines: content.append(line) if line.startswith("----"): content.append("") content.append(f"{new_version}, work in progress:") content.append(" - describe your changes here") with changelog.open("w") as fh: fh.write(CRLF.join(content)) def copy_changelog(destination, date, latest): textfiles = _files_in_folder(PATH_ISSUES, ".txt") changelog = next(f for f in textfiles if f.stem.lower().startswith("change")) new_path = destination / f"{date}_CHANGELOG_{latest}.txt" print(changelog.name, "->", new_path) shutil.copyfile(changelog, new_path) def copy_workbook_changelogs(destination, date, latest): source = PATH_ISSUES / latest textfiles = _files_in_folder(source, ".txt") logs = (f for f in textfiles if f.stem.lower().startswith("change")) for log_file in logs: parts = log_file.stem.split("_") if parts[-1] == latest: new_path = destination / f"{date}_{log_file.name}" else: new_path = destination / f"{date}_{log_file.stem}_{latest}.txt" print(log_file.name, "->", new_path) shutil.copyfile(log_file, new_path) def copy_workbooks(destination, date, latest): for excel_file in _files_in_folder(PATH_WORKBOOKS, ".xlsx"): new_path = destination / f"{date}_{excel_file.stem}_{latest}.xlsx" print(excel_file.name, "->", new_path) shutil.copyfile(excel_file, new_path) @click.command() @click.option( "-v", "--version", required=True, prompt="new version", default=get_next_version, show_default="next minor version", ) def sg_mbp_new_version(version): """ creates a new version folder, new excel changes files and modifies the overall changelog in "E:\Safeguard-MBP-issues" """ folder = create_new_version_folder(version) if folder is not None: create_excel_changelogs(version, folder) create_changelog_entry(version) @click.command() def sg_mbp_release(): """ Before running this command: \b - make the requiered edits to the workbooks - edit the changelog in "E:\Safeguard-MBP-issues" - create a new versions folder in "E:\Safeguard-MBP-issues", e.g. "v3.9.49" - note the changes in the excel changelogs in the created version folder The command will collect all data into one folder on the Desktop to be published """ latest = get_latest_version() new_folder_name = f"{TODAY} {latest}" new_folder_path = PATH_WIN_DESKTOP / new_folder_name if new_folder_path.exists(): raise IOError(f"Folder exists on desktop: {new_folder_name}") else: new_folder_path.mkdir() copy_workbooks(new_folder_path, TODAY, latest) copy_workbook_changelogs(new_folder_path, TODAY, latest) copy_changelog(new_folder_path, TODAY, latest)