Source code for scitex_path._version

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Time-stamp: "2024-11-02 20:48:24 (ywatanabe)"
# File: scitex-path/src/scitex_path/_version.py

import os
import re
from glob import glob


[docs] def find_latest(dirname, fname, ext, version_prefix="_v"): """Find the latest versioned file in a directory. Parameters ---------- dirname : str Directory to search in. fname : str Base filename without version number or extension. ext : str File extension including the dot (e.g., '.txt'). version_prefix : str, optional Prefix before the version number. Default is '_v'. Returns ------- str or None Path to the latest versioned file, or None if not found. """ version_pattern = re.compile( rf"({re.escape(fname)}{re.escape(version_prefix)})(\d+)({re.escape(ext)})$" ) glob_pattern = os.path.join(dirname, f"{fname}{version_prefix}*{ext}") files = glob(glob_pattern) highest_version = 0 latest_file = None for file in files: filename = os.path.basename(file) match = version_pattern.search(filename) if match: version_num = int(match.group(2)) if version_num > highest_version: highest_version = version_num latest_file = file return latest_file
[docs] def increment_version(dirname, fname, ext, version_prefix="_v"): """Generate the next version of a filename based on existing versioned files. Parameters ---------- dirname : str Directory to search in. fname : str Base filename without version number or extension. ext : str File extension including the dot (e.g., '.txt'). version_prefix : str, optional Prefix before the version number. Default is '_v'. Returns ------- str Full path for the next version of the file. Example ------- >>> increment_version('/path/to/dir', 'myfile', '.txt') '/path/to/dir/myfile_v001.txt' """ version_pattern = re.compile( rf"({re.escape(fname)}{re.escape(version_prefix)})(\d+)({re.escape(ext)})$" ) glob_pattern = os.path.join(dirname, f"{fname}{version_prefix}*{ext}") files = glob(glob_pattern) highest_version = 0 base, suffix = None, None for file in files: filename = os.path.basename(file) match = version_pattern.search(filename) if match: base, version_str, suffix = match.groups() version_num = int(version_str) if version_num > highest_version: highest_version = version_num if base is None or suffix is None: base = f"{fname}{version_prefix}" suffix = ext highest_version = 0 next_version_number = highest_version + 1 next_version_str = f"{base}{next_version_number:03d}{suffix}" next_filepath = os.path.join(dirname, next_version_str) return next_filepath
# EOF