diff --git a/multimv/__init__.py b/multimv/__init__.py new file mode 100644 index 0000000..6cf495d --- /dev/null +++ b/multimv/__init__.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +from argparse import ArgumentParser, Namespace +from pathlib import Path +import shlex + +def main(): + parser = ArgumentParser() + parser.add_argument("-m", "--method", choices=["re"], default="re") + parser.add_argument("-g", "--global", dest="global_", action="store_true") + parser.add_argument("-i", "--ignore-case", action="store_true") + parser.add_argument("-d", "--dry-run", action="store_true") + parser.add_argument("-q", "--quiet", action="store_true") + parser.add_argument("pattern") + parser.add_argument("replacement") + parser.add_argument("files", nargs="*", type=Path) + args = parser.parse_args() + + + # Per method code + if args.method == "re": + import re + + def new_path(old): + return old.with_name( + re.sub( + args.pattern, + repl=args.replacement, + string=old.name, + flags=(re.I if args.ignore_case else 0), + count=(0 if args.global_ else 1), + ) + ) + + + # Generic code + moves = [] + for old in args.files: + if old != (new := new_path(old)): + moves.append(Namespace(old=old, new=new)) + + if any(m.new.exists() for m in moves): + raise Error # Collides with pre-existing file + + if len({m.new for m in moves}) < len(moves): + raise Error # List has duplicates + + for move in moves: + if not args.quiet: + print( + f"- {shlex.quote(str(move.old))}", + f"+ {shlex.quote(str(move.new))}", + sep="\n", + ) + if not args.dry_run: + move.old.rename(move.new) diff --git a/multimv/__main__.py b/multimv/__main__.py deleted file mode 100644 index 332e72a..0000000 --- a/multimv/__main__.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python3 -from argparse import ArgumentParser, Namespace -from pathlib import Path -import shlex - - -parser = ArgumentParser() -parser.add_argument("-m", "--method", choices=["re"], default="re") -parser.add_argument("-g", "--global", dest="global_", action="store_true") -parser.add_argument("-i", "--ignore-case", action="store_true") -parser.add_argument("-d", "--dry-run", action="store_true") -parser.add_argument("-q", "--quiet", action="store_true") -parser.add_argument("pattern") -parser.add_argument("replacement") -parser.add_argument("files", nargs="*", type=Path) -args = parser.parse_args() - - -# Per method code -if args.method == "re": - import re - - def new_path(old): - return old.with_name( - re.sub( - args.pattern, - repl=args.replacement, - string=old.name, - flags=(re.I if args.ignore_case else 0), - count=(0 if args.global_ else 1), - ) - ) - - -# Generic code -moves = [] -for old in args.files: - if old != (new := new_path(old)): - moves.append(Namespace(old=old, new=new)) - -if any(m.new.exists() for m in moves): - raise Error # Collides with pre-existing file - -if len({m.new for m in moves}) < len(moves): - raise Error # List has duplicates - -for move in moves: - if not args.quiet: - print( - f"- {shlex.quote(str(move.old))}", - f"+ {shlex.quote(str(move.new))}", - sep="\n", - ) - if not args.dry_run: - move.old.rename(move.new) diff --git a/pyproject.toml b/pyproject.toml index 158a7fc..dc9bf24 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "multimv" -version = "0.1.0" +version = "0.2.0" description = "Multi mv via fixed string / regex / bash pattern substitutions" authors = ["Summer"] license = "MIT" @@ -8,6 +8,9 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.6" +[tool.poetry.scripts] +multimv = 'multimv:main' + [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api"