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):
|
||||
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.include_notes = include_notes
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
def build_tree(self, root_path: Path):
|
||||
|
|
@ -24,7 +31,7 @@ class NotebooksCommand(BaseCommand):
|
|||
if item.name != ".git":
|
||||
item_tree_node = current_tree_node.add(item.name)
|
||||
q.append((item, item_tree_node, depth + 1))
|
||||
else:
|
||||
elif self.include_notes and item.name.endswith(".age"):
|
||||
current_tree_node.add(item.name)
|
||||
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
|
||||
operation"""
|
||||
OPTION_PLAIN_HELP = "Show the note as plaintext"
|
||||
OPTION_INCLUDE_NODES_HELP = "Include each notebook's notes when listing"
|
||||
# ARGUMENTS
|
||||
ARGUMENT_EDIT_NOTE_HELP = """A valid, settings-relative path.
|
||||
Be aware that valid can also mean implicit notes, that is, pointing to a
|
||||
|
|
|
|||
|
|
@ -52,12 +52,17 @@ def notebooks(
|
|||
"-l",
|
||||
help=literals.OPTION_LEVEL_HELP,
|
||||
),
|
||||
include_notes: bool = Option(False, help=literals.OPTION_INCLUDE_NODES_HELP),
|
||||
config: Optional[Path] = config_option, # noqa: UP007
|
||||
):
|
||||
if level < 0:
|
||||
level = float("inf") # type: ignore[assignment]
|
||||
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()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ from rich import print
|
|||
|
||||
def now():
|
||||
tz = local_timezone()
|
||||
return pendulum.now(tz)
|
||||
return pendulum.now(tz) # type: ignore[reportArgumentType]
|
||||
|
||||
|
||||
def capture(fn: Callable):
|
||||
|
|
@ -24,7 +24,7 @@ def capture(fn: Callable):
|
|||
print(f"[red]{exc}")
|
||||
sys.exit(1)
|
||||
except Exception as exc: # noqa: BLE001
|
||||
print(f"[beld red] Unexpected error: {exc}")
|
||||
print(f"[bold red] Unexpected error: {exc}")
|
||||
sys.exit(2)
|
||||
|
||||
return wrapper
|
||||
|
|
|
|||
|
|
@ -25,12 +25,14 @@ def test_build_tree_max_depth_2(notes, notebooks_command: NotebooksCommand):
|
|||
work = tree.children[1]
|
||||
assert personal.label == "Personal"
|
||||
assert work.label == "Work"
|
||||
assert len(work.children) == 2
|
||||
assert len(personal.children) == 1
|
||||
assert len(work.children) == 1
|
||||
assert len(personal.children) == 0
|
||||
|
||||
|
||||
def test_build_tree_max_depth_inf(notes, notebooks_command: NotebooksCommand):
|
||||
tree = notebooks_command.build_tree(notebooks_command.settings.notebooks_root_path)
|
||||
def test_build_tree_max_depth_inf(notes, settings):
|
||||
tree = NotebooksCommand(max_depth=float("inf"), settings=settings, include_notes=True).build_tree(
|
||||
settings.notebooks_root_path
|
||||
)
|
||||
personal = tree.children[0]
|
||||
work = tree.children[1]
|
||||
assert personal.label == "Personal"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import pytest
|
||||
|
||||
from halig import utils
|
||||
from halig.commands.reencrypt import ReencryptCommand
|
||||
|
||||
|
||||
|
|
@ -14,3 +15,11 @@ def test_reencrypt(reencrypt_command):
|
|||
for note_path in reencrypt_command.traverse():
|
||||
with note_path.open("rb") as f:
|
||||
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)
|
||||
|
||||
|
||||
# @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()
|
||||
def halig_ssh_path(tmp_path: Path, halig_ssh_public_key, halig_ssh_private_key) -> Path:
|
||||
ssh_path = tmp_path / ".ssh"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue