Compare commits

..

No commits in common. "d745444609279a04b3f5241f0ee9545be5781392" and "f6397185c469f35fbca2557403547e53d55fb302" have entirely different histories.

4 changed files with 26 additions and 45 deletions

View File

@ -3,8 +3,6 @@ from pyn.config import load_config
from pyn import commands, todo # type: ignore
import sys
def main():
options = vars(parser.parse_args())
@ -24,8 +22,7 @@ def main():
try:
f(**options)
except RuntimeError as e:
sys.stderr.write(f"{e}\n")
parser.exit(1)
parser.exit(e)
if __name__ == "__main__":

View File

@ -5,15 +5,7 @@ from pyn import notes
import sys
import os
group = parser.add_subparsers(help="available note commands")
def cmd_config(config):
print(config)
show_config = group.add_parser("config", help="show config")
show_config.set_defaults(func=cmd_config)
group = parser.add_subparsers(help="available commands")
### Add a note
@ -24,7 +16,7 @@ def cmd_add_note(config, title, notebook):
body = "" if sys.stdin.isatty() else sys.stdin.read()
notes.append_template(filename, "note", title=title, body=body)
notes.append_template(config, filename, "note", title=title, body=body)
if not body:
notes.edit_file(config, filename)

View File

@ -7,7 +7,7 @@ from pyn.config import Config
from datetime import datetime
from shutil import copyfileobj
from collections import namedtuple
from typing import Any, Generator
from typing import Any
Entry = namedtuple("Entry", ("notebook", "filename"))
SearchResult = namedtuple("SearchResult", ("filename", "line_number", "snippet"))
@ -15,13 +15,12 @@ SearchResult = namedtuple("SearchResult", ("filename", "line_number", "snippet")
NOTE_HEADING = """---
date: {date}
notebook: {notebook}
---
"""
---"""
TEMPLATES = {
"heading": NOTE_HEADING,
"note": "\n# {title}\n\n{body}\n---\n",
"todo": "* [ ] {item}\n",
"note": "\n\n# {title}\n\n{body}\n---",
"todo": "\n* [ ] {item}",
}
@ -45,6 +44,7 @@ def get_note_filename(
notebook_path.mkdir(parents=True, exist_ok=True)
note_path.touch()
append_template(
config,
note_path,
"heading",
date=now.isoformat(timespec="seconds"),
@ -54,7 +54,9 @@ def get_note_filename(
return note_path
def append_template(filename: pathlib.Path, template: str, **context: Any) -> None:
def append_template(
config: Config, filename: pathlib.Path, template: str, **context: dict[str, Any]
) -> None:
rendered = TEMPLATES[template].format(**context)
with open(filename, "a") as f:
f.write(rendered)
@ -62,26 +64,19 @@ def append_template(filename: pathlib.Path, template: str, **context: Any) -> No
def edit_file(config: Config, filename: pathlib.Path) -> None:
cmd = config.editor.copy()
cmd.append(str(filename))
cmd.append(filename)
subprocess.check_call(cmd)
def get_file_list(
config: Config, notebook: str | None = None, show_hidden: bool = False
) -> Generator[pathlib.Path]:
def get_file_list(config: Config, notebook: str = None) -> list[pathlib.Path]:
root = config.directory / notebook if notebook else config.directory
for d, dirs, files in root.walk():
if not show_hidden:
dirs[:] = [d for d in dirs if d[0] != "."]
for d, _, files in root.walk():
for filename in files:
yield d / filename
def search_filenames(
config: Config, title: str, notebook: str | None = None
) -> pathlib.Path:
def search_filenames(config: Config, title: str, notebook: str = None) -> pathlib.Path:
root = config.directory / notebook if notebook else config.directory
cmd = ["fzf", "-1", "-i"]
@ -102,7 +97,7 @@ def file_entry(config: Config, filepath: pathlib.Path) -> Entry:
return Entry(str(relative.parent), relative.name)
def cat_files(*filenames: pathlib.Path) -> None:
def cat_files(*filenames: list[pathlib.Path]) -> None:
for filename in filenames:
with open(filename, "r") as f:
copyfileobj(f, sys.stdout)
@ -111,10 +106,10 @@ def cat_files(*filenames: pathlib.Path) -> None:
def search_contents(
config: Config,
query: str,
notebook: str | None = None,
file_matcher: str = "*.md",
notebook: str = None,
file_matcher: str = None,
full_line: bool = False,
) -> Generator[SearchResult]:
) -> list[SearchResult]:
root = config.directory / notebook if notebook else config.directory
cmd = ["grep", "-rFn", query, str(root)]

View File

@ -1,8 +1,8 @@
from pyn.common import parser, logger
from pyn.config import Config
from pyn import notes
from pyn.commands import group as parent_group
from shutil import get_terminal_size
import sys
p = parent_group.add_parser("todo", help="manipulate todo items")
@ -12,9 +12,9 @@ group = p.add_subparsers()
def cmd_add_todo(config: Config, item: list[str], notebook: str, create: bool) -> None:
item_str = " ".join(item)
item = " ".join(item)
filename = notes.get_note_filename(config, "todo", notebook)
notes.append_template(filename, "todo", item=item_str)
notes.append_template(config, filename, "todo", item=item)
add_todo = group.add_parser("add", aliases=["a"])
@ -29,6 +29,7 @@ add_todo.set_defaults(func=cmd_add_todo)
def cmd_list_pending(config: Config, notebook: str):
nb = None
cols, _ = get_terminal_size()
fmt = "{snippet:" + str(cols - 20) + "s} {name}"
for result in notes.search_contents(
config, "* [ ]", notebook, file_matcher="*-todo.md"
):
@ -36,11 +37,7 @@ def cmd_list_pending(config: Config, notebook: str):
if entry.notebook != nb:
nb = entry.notebook
print(f"\nNotebook: {entry.notebook}")
name = result.filename.name
sys.stdout.write(result.snippet)
sys.stdout.write(" " * (cols - len(result.snippet) - len(name)))
sys.stdout.write(name)
sys.stdout.write("\n")
print(fmt.format(snippet=result.snippet, name=result.filename.name))
pending_todo = group.add_parser("pending", aliases="p", help="list pending tasks")
@ -59,7 +56,7 @@ def cmd_mark_complete(
if reverse:
checked, unchecked = unchecked, checked
item_str = " ".join(item)
item = " ".join(item)
results = list(
notes.search_contents(
config, f"* [{unchecked}] {item}", notebook, full_line=True
@ -72,7 +69,7 @@ def cmd_mark_complete(
if not multiple and len(results) > 1:
raise RuntimeError("Multiple items matched - use --multiple to allow update")
update = f"* [{checked}] {item_str}"
update = f"* [{checked}] {item}"
for result in results:
entry = notes.file_entry(config, result.filename)
with open(result.filename, "r") as f: