feat: make the inclusion of each notebook's note optional via --include-notes when listing notebooks
This commit is contained in:
parent
a591fe20e8
commit
3d93be39d6
8 changed files with 632 additions and 512 deletions
|
|
@ -8,8 +8,15 @@ from halig.commands.base import BaseCommand
|
||||||
|
|
||||||
|
|
||||||
class NotebooksCommand(BaseCommand):
|
class NotebooksCommand(BaseCommand):
|
||||||
def __init__(self, max_depth: int | float, *args, **kwargs):
|
def __init__(
|
||||||
|
self,
|
||||||
|
max_depth: int | float,
|
||||||
|
include_notes: bool = False,
|
||||||
|
*args,
|
||||||
|
**kwargs,
|
||||||
|
):
|
||||||
self.max_depth = max_depth
|
self.max_depth = max_depth
|
||||||
|
self.include_notes = include_notes
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
def build_tree(self, root_path: Path):
|
def build_tree(self, root_path: Path):
|
||||||
|
|
@ -24,7 +31,7 @@ class NotebooksCommand(BaseCommand):
|
||||||
if item.name != ".git":
|
if item.name != ".git":
|
||||||
item_tree_node = current_tree_node.add(item.name)
|
item_tree_node = current_tree_node.add(item.name)
|
||||||
q.append((item, item_tree_node, depth + 1))
|
q.append((item, item_tree_node, depth + 1))
|
||||||
else:
|
elif self.include_notes and item.name.endswith(".age"):
|
||||||
current_tree_node.add(item.name)
|
current_tree_node.add(item.name)
|
||||||
return tree
|
return tree
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ time you perform a search, this flag should be set. Afterwards, you should only
|
||||||
when new notes have been added or older ones have been changed, since it's a slow
|
when new notes have been added or older ones have been changed, since it's a slow
|
||||||
operation"""
|
operation"""
|
||||||
OPTION_PLAIN_HELP = "Show the note as plaintext"
|
OPTION_PLAIN_HELP = "Show the note as plaintext"
|
||||||
|
OPTION_INCLUDE_NODES_HELP = "Include each notebook's notes when listing"
|
||||||
# ARGUMENTS
|
# ARGUMENTS
|
||||||
ARGUMENT_EDIT_NOTE_HELP = """A valid, settings-relative path.
|
ARGUMENT_EDIT_NOTE_HELP = """A valid, settings-relative path.
|
||||||
Be aware that valid can also mean implicit notes, that is, pointing to a
|
Be aware that valid can also mean implicit notes, that is, pointing to a
|
||||||
|
|
|
||||||
|
|
@ -52,12 +52,17 @@ def notebooks(
|
||||||
"-l",
|
"-l",
|
||||||
help=literals.OPTION_LEVEL_HELP,
|
help=literals.OPTION_LEVEL_HELP,
|
||||||
),
|
),
|
||||||
|
include_notes: bool = Option(False, help=literals.OPTION_INCLUDE_NODES_HELP),
|
||||||
config: Optional[Path] = config_option, # noqa: UP007
|
config: Optional[Path] = config_option, # noqa: UP007
|
||||||
):
|
):
|
||||||
if level < 0:
|
if level < 0:
|
||||||
level = float("inf") # type: ignore[assignment]
|
level = float("inf") # type: ignore[assignment]
|
||||||
settings = load_from_file(config)
|
settings = load_from_file(config)
|
||||||
command = NotebooksCommand(settings=settings, max_depth=level)
|
command = NotebooksCommand(
|
||||||
|
settings=settings,
|
||||||
|
max_depth=level,
|
||||||
|
include_notes=include_notes,
|
||||||
|
)
|
||||||
command.run()
|
command.run()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ from rich import print
|
||||||
|
|
||||||
def now():
|
def now():
|
||||||
tz = local_timezone()
|
tz = local_timezone()
|
||||||
return pendulum.now(tz)
|
return pendulum.now(tz) # type: ignore[reportArgumentType]
|
||||||
|
|
||||||
|
|
||||||
def capture(fn: Callable):
|
def capture(fn: Callable):
|
||||||
|
|
@ -24,7 +24,7 @@ def capture(fn: Callable):
|
||||||
print(f"[red]{exc}")
|
print(f"[red]{exc}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
except Exception as exc: # noqa: BLE001
|
except Exception as exc: # noqa: BLE001
|
||||||
print(f"[beld red] Unexpected error: {exc}")
|
print(f"[bold red] Unexpected error: {exc}")
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,14 @@ def test_build_tree_max_depth_2(notes, notebooks_command: NotebooksCommand):
|
||||||
work = tree.children[1]
|
work = tree.children[1]
|
||||||
assert personal.label == "Personal"
|
assert personal.label == "Personal"
|
||||||
assert work.label == "Work"
|
assert work.label == "Work"
|
||||||
assert len(work.children) == 2
|
assert len(work.children) == 1
|
||||||
assert len(personal.children) == 1
|
assert len(personal.children) == 0
|
||||||
|
|
||||||
|
|
||||||
def test_build_tree_max_depth_inf(notes, notebooks_command: NotebooksCommand):
|
def test_build_tree_max_depth_inf(notes, settings):
|
||||||
tree = notebooks_command.build_tree(notebooks_command.settings.notebooks_root_path)
|
tree = NotebooksCommand(max_depth=float("inf"), settings=settings, include_notes=True).build_tree(
|
||||||
|
settings.notebooks_root_path
|
||||||
|
)
|
||||||
personal = tree.children[0]
|
personal = tree.children[0]
|
||||||
work = tree.children[1]
|
work = tree.children[1]
|
||||||
assert personal.label == "Personal"
|
assert personal.label == "Personal"
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from halig import utils
|
||||||
from halig.commands.reencrypt import ReencryptCommand
|
from halig.commands.reencrypt import ReencryptCommand
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -14,3 +15,11 @@ def test_reencrypt(reencrypt_command):
|
||||||
for note_path in reencrypt_command.traverse():
|
for note_path in reencrypt_command.traverse():
|
||||||
with note_path.open("rb") as f:
|
with note_path.open("rb") as f:
|
||||||
assert reencrypt_command.encryptor.decrypt(f.read()) == b""
|
assert reencrypt_command.encryptor.decrypt(f.read()) == b""
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("current_daily")
|
||||||
|
def test_reencrypt_warns_no_matching_key(reencrypt_command, halig_ssh_path, capfd):
|
||||||
|
reencrypt_command.encryptor.identities = []
|
||||||
|
reencrypt_command.run()
|
||||||
|
out, _ = capfd.readouterr()
|
||||||
|
assert f'because no matching keys were found, skipping ...' in out
|
||||||
|
|
|
||||||
|
|
@ -41,22 +41,6 @@ def ssh_recipient(halig_ssh_public_key: str) -> Recipient:
|
||||||
return Recipient.from_str(halig_ssh_public_key)
|
return Recipient.from_str(halig_ssh_public_key)
|
||||||
|
|
||||||
|
|
||||||
# @pytest.fixture()
|
|
||||||
# def halig_path(fs, halig_ssh_public_key, halig_ssh_private_key) -> Path:
|
|
||||||
# fs.add_real_paths(["/etc/localtime"])
|
|
||||||
# ssh_path = Path("~/.ssh").expanduser()
|
|
||||||
# ssh_path.mkdir(parents=True)
|
|
||||||
#
|
|
||||||
# with (ssh_path / "id_ed25519").open("w") as f:
|
|
||||||
# f.write(halig_ssh_private_key)
|
|
||||||
#
|
|
||||||
# with (ssh_path / "id_ed25519.pub").open("w") as f:
|
|
||||||
# f.write(halig_ssh_public_key)
|
|
||||||
#
|
|
||||||
# halig_path = Path("~/.config/halig").expanduser()
|
|
||||||
# halig_path.mkdir(parents=True)
|
|
||||||
# return halig_path
|
|
||||||
|
|
||||||
@pytest.fixture()
|
@pytest.fixture()
|
||||||
def halig_ssh_path(tmp_path: Path, halig_ssh_public_key, halig_ssh_private_key) -> Path:
|
def halig_ssh_path(tmp_path: Path, halig_ssh_public_key, halig_ssh_private_key) -> Path:
|
||||||
ssh_path = tmp_path / ".ssh"
|
ssh_path = tmp_path / ".ssh"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue