Add rename subcommand and test happy case
This commit is contained in:
parent
1d8008ae0b
commit
5424bc3434
@ -1,6 +1,7 @@
|
||||
[build-system]
|
||||
requires = ["setuptools>=61.0"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "z-py"
|
||||
version = "0.0.1"
|
||||
@ -17,8 +18,13 @@ classifiers = [
|
||||
]
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
[project.urls]
|
||||
"Homepage" = "https://github.com/starr-dusT/z-py"
|
||||
"Repository" = "https://github.com/starr-dusT/z-py"
|
||||
|
||||
[project.scripts]
|
||||
z = "z.z:main"
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
addopts = "--ignore=tests/helpers"
|
@ -1,3 +1,4 @@
|
||||
from .z import *
|
||||
from .create import *
|
||||
from .tags import *
|
||||
from .rename import *
|
||||
|
@ -6,15 +6,24 @@ import datetime
|
||||
import re
|
||||
|
||||
# Format: <timestamp>--<title>__<tag1>_<tag2>.<ext>
|
||||
def normalize_name(name: str, tags: str, time: Union[datetime.date, None] = None, ext: str ="md"):
|
||||
if "-" in name or "_" in name:
|
||||
raise ArgumentTypeError("Title cannot have '-' or '_'")
|
||||
if "-" in name or "_" in tags:
|
||||
raise ArgumentTypeError("Note cannot have '-' or '_'")
|
||||
def normalize_name(name: str, tags: str, time: Union[str, None] = None, ext: str ="md"):
|
||||
if "--" in name or "__" in name:
|
||||
raise ArgumentTypeError("Title cannot have '--' or '__'")
|
||||
if "--" not in tags and "__" not in tags:
|
||||
if "_" in tags and "," in tags:
|
||||
raise ArgumentTypeError("Tags must be seperated by ',' or '_'")
|
||||
elif "_" in tags:
|
||||
tag_sep = "_"
|
||||
else:
|
||||
tag_sep = ","
|
||||
else:
|
||||
raise ArgumentTypeError("Tags cannot have '--' or '__'")
|
||||
|
||||
# timestamp
|
||||
if time:
|
||||
f = time.strftime("%Y%m%dT%H%M%S")
|
||||
if not re.match("[0-9]{8}T[0-9]{6}", time):
|
||||
raise ArgumentTypeError("Time must be string in format: YYMMDDTHHmmSS")
|
||||
f = time
|
||||
else:
|
||||
f = datetime.datetime.now().strftime("%Y%m%dT%H%M%S")
|
||||
|
||||
@ -24,14 +33,14 @@ def normalize_name(name: str, tags: str, time: Union[datetime.date, None] = None
|
||||
|
||||
# tags
|
||||
f += "__"
|
||||
for tag in tags.split(","):
|
||||
for tag in tags.split(tag_sep):
|
||||
tag = tag.strip()
|
||||
tag = re.sub(r" ", "-", tag)
|
||||
f += tag + "_"
|
||||
f = f[:-1]
|
||||
|
||||
# ext
|
||||
if ext[0] == ".":
|
||||
if ext + " "[0] == ".":
|
||||
f += ext
|
||||
else:
|
||||
f += "." + ext
|
||||
|
28
src/z/rename.py
Normal file
28
src/z/rename.py
Normal file
@ -0,0 +1,28 @@
|
||||
import os
|
||||
from typing import Union
|
||||
from z.create import normalize_name
|
||||
from argparse import ArgumentTypeError
|
||||
|
||||
def rename_file(source:str, dest:str, tags:str, date:Union[str, None] = None):
|
||||
ext = None
|
||||
if '.' in dest:
|
||||
os.rename(source, normalize_name(dest.split('.')[0], tags, time=date, ext=dest.split('.')[1]))
|
||||
else:
|
||||
if '.' in source:
|
||||
os.rename(source, normalize_name(dest, tags, time=date, ext=source.split('.')[1]))
|
||||
else:
|
||||
os.rename(source, normalize_name(dest, tags, time=date, ext=""))
|
||||
|
||||
def main(args):
|
||||
tags = args.source.split("__")[1] if "--" in args.source else ""
|
||||
|
||||
if args.timestamp:
|
||||
date = args.source.split("--")[0] if "--" in args.source else -1
|
||||
if date == -1:
|
||||
raise ArgumentTypeError("Timestamp option only works for source files that are formatted like Denote files.")
|
||||
rename_file(args.source, args.dest, tags, date=date)
|
||||
else:
|
||||
rename_file(args.source, args.dest, tags)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(None)
|
@ -1,6 +1,6 @@
|
||||
from pathlib import Path
|
||||
import argparse
|
||||
from z import create, tags
|
||||
from z import create, tags, rename
|
||||
import sys
|
||||
|
||||
def init_parser():
|
||||
@ -14,6 +14,12 @@ def init_parser():
|
||||
create_parser.add_argument("-s", "--silo", nargs="?", default="", const="", help="Optionally create note in silo")
|
||||
create_parser.add_argument("-o", "--outline", nargs="?", default="", const="", help="Optionally initialize note with outline")
|
||||
|
||||
rename_parser = sub_parsers.add_parser("rename", help="rename note")
|
||||
rename_parser.set_defaults(func=rename.main)
|
||||
rename_parser.add_argument("source", help="name of note to change")
|
||||
rename_parser.add_argument("dest", help="new name of note")
|
||||
rename_parser.add_argument("-t", "--timestamp", action="store_true", help="don't update timestamp of note")
|
||||
|
||||
tags_parser = sub_parsers.add_parser("tags", help="edit tags")
|
||||
tags_parser.set_defaults(func=tags.main)
|
||||
tags_parser.add_argument("file", help="name of file to create")
|
||||
|
3
tests/__init__.py
Normal file
3
tests/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
import sys
|
||||
|
||||
sys.path.append("src")
|
3
tests/conftest.py
Normal file
3
tests/conftest.py
Normal file
@ -0,0 +1,3 @@
|
||||
import sys
|
||||
import os
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), 'helpers'))
|
12
tests/helpers/utils.py
Normal file
12
tests/helpers/utils.py
Normal file
@ -0,0 +1,12 @@
|
||||
import shutil
|
||||
import os
|
||||
|
||||
def pre_test(tmp_path):
|
||||
owd = os.getcwd()
|
||||
path = tmp_path / "z"
|
||||
shutil.copytree("./example", path)
|
||||
os.chdir(path / "test")
|
||||
return owd
|
||||
|
||||
def post_test(owd):
|
||||
os.chdir(owd)
|
46
tests/test_rename.py
Normal file
46
tests/test_rename.py
Normal file
@ -0,0 +1,46 @@
|
||||
from z.z import main
|
||||
import glob
|
||||
import utils
|
||||
import sys
|
||||
import os
|
||||
from unittest.mock import patch
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
def path_search(glob_str:str):
|
||||
return glob.glob(glob_str)
|
||||
|
||||
def read_file(file_path:str):
|
||||
with open(file_path, "r") as f:
|
||||
return f.read()
|
||||
|
||||
def test_rename_denote(tmp_path):
|
||||
utils.pre_test(tmp_path)
|
||||
|
||||
# New timestamp
|
||||
src = "19700101T000000--example-file-3__test1_test2_test3"
|
||||
input = "new example file 3"
|
||||
with patch("sys.argv", ["", "rename", src, input]):
|
||||
main()
|
||||
# original file gone
|
||||
assert not path_search(src)
|
||||
# new file created
|
||||
files = path_search("*--new-example-file-3__test1_test2_test3")
|
||||
assert len(files) == 1
|
||||
# contents unchanged
|
||||
assert read_file(files[0]) == "test 3"
|
||||
|
||||
# Keep old timestamp
|
||||
src = "19700101T000000--example-file-4__test1_test2_test3"
|
||||
input = "new example file 4"
|
||||
with patch("sys.argv", ["", "rename", src, input, "-t"]):
|
||||
main()
|
||||
# original file gone
|
||||
assert not path_search(src)
|
||||
# new file created
|
||||
files = path_search("19700101T000000--new-example-file-4__test1_test2_test3")
|
||||
assert len(files) == 1
|
||||
# contents unchanged
|
||||
assert read_file(files[0]) == "test 4"
|
||||
|
||||
utils.post_test(tmp_path)
|
Loading…
x
Reference in New Issue
Block a user