mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-14 21:38:38 +00:00
fd6427a282
(Re-applied cleanly on top of main: PR #18 was rebase-merged, so the branch that became #19 conflicted on the already-landed commits. This carries ONLY the librarian state fix - the sole content difference between that branch and main - so nothing else is touched or lost.) The worker threads open cr_results/rr_results/not_in_db/s_results.json in place ('r+'), crashing with FileNotFoundError in a fresh container. New conjurer_librarian/lib_paths.py resolves all four under a persistent dir (CONJURER_LIBRARIAN_STATE_DIR, default /lib_temp_files) and seeds missing ones with '{}' on import; shared by conjurer_librarian.py and scrape_bot.py (no circular import). ndb_database/database initialised to {} before load so a corrupt persisted file degrades to empty instead of NameError. search_bot /search_bot2 open the DOI DB 'r' not 'r+' so /doi can stay read-only. Docker: STATE_DIR env + VOLUME, compose mounts /srv/librarian/state:/lib_temp_files. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
42 lines
1.6 KiB
Python
42 lines
1.6 KiB
Python
"""Resolved, seeded paths for the librarian's runtime JSON state.
|
|
|
|
``conjurer_librarian.py`` and ``scrape_bot.py`` open these files in place with
|
|
mode ``r+``, which requires them to already exist - in a fresh container the
|
|
working directory has none of them, so the worker threads crashed with
|
|
FileNotFoundError.
|
|
|
|
They now live in a single mounted, persistent directory
|
|
(``CONJURER_LIBRARIAN_STATE_DIR``, default ``/lib_temp_files``) and are seeded
|
|
with an empty JSON object on import, so a fresh container/volume never crashes
|
|
and the accumulated results survive restarts.
|
|
"""
|
|
import os
|
|
|
|
STATE_DIR = os.getenv("CONJURER_LIBRARIAN_STATE_DIR", "/lib_temp_files")
|
|
|
|
CR_RESULTS = os.path.join(STATE_DIR, "cr_results.json") # Crossref raw hits
|
|
RR_RESULTS = os.path.join(STATE_DIR, "rr_results.json") # refined results
|
|
NOT_IN_DB = os.path.join(STATE_DIR, "not_in_db.json") # DOIs to scrape
|
|
S_RESULTS = os.path.join(STATE_DIR, "s_results.json") # final send results
|
|
|
|
_ALL = (CR_RESULTS, RR_RESULTS, NOT_IN_DB, S_RESULTS)
|
|
|
|
|
|
def ensure_state_files():
|
|
"""Create the state dir and seed any missing file with an empty JSON dict."""
|
|
try:
|
|
os.makedirs(STATE_DIR, exist_ok=True)
|
|
except OSError as exc: # pragma: no cover - surfaced in logs, not fatal
|
|
print(f"lib_paths: cannot create {STATE_DIR}: {exc}")
|
|
return
|
|
for path in _ALL:
|
|
if not os.path.exists(path):
|
|
try:
|
|
with open(path, "w", encoding="utf-8") as handle:
|
|
handle.write("{}")
|
|
except OSError as exc: # pragma: no cover
|
|
print(f"lib_paths: cannot seed {path}: {exc}")
|
|
|
|
|
|
ensure_state_files()
|