esbi-cli 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- esbi_cli/__init__.py +8 -0
- esbi_cli/ask/__init__.py +0 -0
- esbi_cli/ask/answer.py +256 -0
- esbi_cli/bench/__init__.py +0 -0
- esbi_cli/bench/cases.py +57 -0
- esbi_cli/bench/metrics.py +23 -0
- esbi_cli/bench/report.py +117 -0
- esbi_cli/bench/runner.py +114 -0
- esbi_cli/capture/__init__.py +0 -0
- esbi_cli/capture/inbox.py +63 -0
- esbi_cli/capture/legacy.py +49 -0
- esbi_cli/cli.py +1387 -0
- esbi_cli/config.py +344 -0
- esbi_cli/doctor.py +391 -0
- esbi_cli/evaluate.py +91 -0
- esbi_cli/export.py +137 -0
- esbi_cli/extract/__init__.py +107 -0
- esbi_cli/extract/clip.py +30 -0
- esbi_cli/extract/html.py +60 -0
- esbi_cli/extract/image.py +58 -0
- esbi_cli/extract/pdf.py +109 -0
- esbi_cli/gitops.py +101 -0
- esbi_cli/index.py +303 -0
- esbi_cli/ingest/__init__.py +0 -0
- esbi_cli/ingest/apply.py +480 -0
- esbi_cli/ingest/chunks.py +49 -0
- esbi_cli/ingest/connect.py +87 -0
- esbi_cli/ingest/digest.py +91 -0
- esbi_cli/ingest/pipeline.py +176 -0
- esbi_cli/ingest/plan.py +231 -0
- esbi_cli/ingest/read.py +105 -0
- esbi_cli/ingest/retrieve.py +59 -0
- esbi_cli/init.py +176 -0
- esbi_cli/interrupts.py +90 -0
- esbi_cli/lang.py +341 -0
- esbi_cli/links.py +10 -0
- esbi_cli/lint/__init__.py +0 -0
- esbi_cli/lint/checks.py +178 -0
- esbi_cli/lint/report.py +60 -0
- esbi_cli/llm/__init__.py +0 -0
- esbi_cli/llm/adapter.py +393 -0
- esbi_cli/llm/schemas.py +146 -0
- esbi_cli/mail/__init__.py +0 -0
- esbi_cli/mail/convert.py +194 -0
- esbi_cli/mail/credentials.py +65 -0
- esbi_cli/mail/fetch.py +154 -0
- esbi_cli/mail/imap.py +92 -0
- esbi_cli/netguard.py +127 -0
- esbi_cli/privacy.py +81 -0
- esbi_cli/queue.py +179 -0
- esbi_cli/reingest.py +165 -0
- esbi_cli/report/__init__.py +0 -0
- esbi_cli/report/daily_index.py +235 -0
- esbi_cli/report/index_md.py +21 -0
- esbi_cli/report/readstate.py +26 -0
- esbi_cli/run.py +100 -0
- esbi_cli/runlock.py +31 -0
- esbi_cli/runlog.py +80 -0
- esbi_cli/schedule.py +106 -0
- esbi_cli/templates/SCHEMA.md +52 -0
- esbi_cli/templates/clipper-template.json +17 -0
- esbi_cli/templates/clipper-youtube-template.json +18 -0
- esbi_cli/templates/config.example.toml +108 -0
- esbi_cli/update.py +247 -0
- esbi_cli/vault.py +188 -0
- esbi_cli/wizards/clipper.sh +271 -0
- esbi_cli/wizards/email.sh +265 -0
- esbi_cli-0.2.1.dist-info/METADATA +167 -0
- esbi_cli-0.2.1.dist-info/RECORD +72 -0
- esbi_cli-0.2.1.dist-info/WHEEL +4 -0
- esbi_cli-0.2.1.dist-info/entry_points.txt +3 -0
- esbi_cli-0.2.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""One-time import of an older notes folder: Links/DD-MM-YYYY.md files (one [url] per line) and PDFs/."""
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from datetime import date, datetime
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
from esbi_cli.queue import Queue
|
|
9
|
+
|
|
10
|
+
_URL = re.compile(r"https?://[^\s\]\)>]+")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class ImportResult:
|
|
15
|
+
added: int = 0
|
|
16
|
+
duplicates: int = 0
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _file_date(path: Path) -> date | None:
|
|
20
|
+
"""The day a legacy links file stands for, from its DD-MM-YYYY name."""
|
|
21
|
+
try:
|
|
22
|
+
return datetime.strptime(path.stem, "%d-%m-%Y").date()
|
|
23
|
+
except ValueError:
|
|
24
|
+
return None
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _link_file_order(path: Path) -> tuple[int, date | str]:
|
|
28
|
+
"""Chronological by file name; oddly named files go last."""
|
|
29
|
+
day = _file_date(path)
|
|
30
|
+
return (0, day) if day else (1, path.stem)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def import_legacy(legacy_vault: Path, queue: Queue) -> ImportResult:
|
|
34
|
+
"""Queue every URL and PDF of the legacy vault. Read-only: never touches the old files."""
|
|
35
|
+
result = ImportResult()
|
|
36
|
+
|
|
37
|
+
def add(target: str, **details) -> None:
|
|
38
|
+
if queue.add(target, origin="legacy", **details):
|
|
39
|
+
result.added += 1
|
|
40
|
+
else:
|
|
41
|
+
result.duplicates += 1
|
|
42
|
+
|
|
43
|
+
for links_file in sorted((legacy_vault / "Links").glob("*.md"), key=_link_file_order):
|
|
44
|
+
saved_on = _file_date(links_file)
|
|
45
|
+
for url in _URL.findall(links_file.read_text(encoding="utf-8")):
|
|
46
|
+
add(url, captured=saved_on) # oldest file first, so the first save date wins
|
|
47
|
+
for pdf in sorted((legacy_vault / "PDFs").glob("*.pdf")):
|
|
48
|
+
add(str(pdf.resolve()), label=pdf.stem)
|
|
49
|
+
return result
|