Functional Weave
Code in Python

todo.export-csv@1.0.0

impl/python.py

1,419 bytes · the Python implementation · view raw

Imports name this capability’s declared dependencies, which fune builds next to it in your project; each one links to its page.

from typing import List, Sequence

from .todo_item import Todo  ← from todo.item ^1.0.0 · built alongside by fune

_HEADER = (
    "id", "title", "notes", "done", "priority", "due", "tags",
    "recurrenceFrequency", "recurrenceInterval", "recurrenceAnchor", "createdAt", "completedAt", "order",
)


def _field(text: str) -> str:
    """Quote a field only when RFC 4180 needs it: a comma, a double quote, CR or LF."""
    if not any(ch in text for ch in ',"\r\n'):
        return text
    return '"' + text.replace('"', '""') + '"'


def export_csv(todos: Sequence[Todo]) -> str:
    """Todos as CSV under a fixed 13-column header, one CRLF-ended row each, in the order given."""
    lines: List[str] = [",".join(_HEADER)]
    for todo in todos:
        rule = todo.recurrence
        cells = [
            todo.id,
            todo.title,
            todo.notes if todo.notes is not None else "",
            "true" if todo.done else "false",
            todo.priority,
            todo.due if todo.due is not None else "",
            " ".join(todo.tags),
            "" if rule is None else rule.frequency,
            "" if rule is None else str(rule.interval),
            "" if rule is None else rule.anchor,
            todo.created_at,
            todo.completed_at if todo.completed_at is not None else "",
            str(todo.order),
        ]
        lines.append(",".join(_field(cell) for cell in cells))
    return "".join(line + "\r\n" for line in lines)