116 lines
4.8 KiB
Python
116 lines
4.8 KiB
Python
from __future__ import annotations
|
|
|
|
import sqlite3
|
|
from pathlib import Path
|
|
|
|
|
|
def build_fixture_zotero_dir(zotero_dir: Path) -> None:
|
|
storage_dir = zotero_dir / "storage" / "ATTACH01"
|
|
storage_dir.mkdir(parents=True, exist_ok=True)
|
|
(storage_dir / "paper.txt").write_text(
|
|
"This paper studies card pipelines for research writing.",
|
|
encoding="utf-8",
|
|
)
|
|
|
|
conn = sqlite3.connect(zotero_dir / "zotero.sqlite")
|
|
cur = conn.cursor()
|
|
|
|
cur.executescript(
|
|
"""
|
|
create table itemTypes (itemTypeID integer primary key, typeName text, templateItemTypeID int, display int);
|
|
create table items (itemID integer primary key, itemTypeID int, dateAdded text, dateModified text, clientDateModified text, libraryID int, key text, version int, synced int);
|
|
create table fields (fieldID integer primary key, fieldName text, fieldFormatID int);
|
|
create table itemDataValues (valueID integer primary key, value text);
|
|
create table itemData (itemID int, fieldID int, valueID int);
|
|
create table creators (creatorID integer primary key, firstName text, lastName text, fieldMode int);
|
|
create table creatorTypes (creatorTypeID integer primary key, creatorType text);
|
|
create table itemCreators (itemID int, creatorID int, creatorTypeID int, orderIndex int);
|
|
create table tags (tagID integer primary key, name text);
|
|
create table itemTags (itemID int, tagID int, type int);
|
|
create table collections (collectionID integer primary key, collectionName text, parentCollectionID int, clientDateModified text, libraryID int, key text, version int, synced int);
|
|
create table collectionItems (collectionID int, itemID int, orderIndex int);
|
|
create table itemNotes (itemID integer primary key, parentItemID int, note text, title text);
|
|
create table itemAttachments (itemID integer primary key, parentItemID int, linkMode int, contentType text, charsetID int, path text, syncState int, storageModTime int, storageHash text, lastProcessedModificationTime int);
|
|
"""
|
|
)
|
|
|
|
cur.executemany(
|
|
"insert into itemTypes(itemTypeID, typeName, templateItemTypeID, display) values (?, ?, ?, ?)",
|
|
[
|
|
(1, "journalArticle", None, 1),
|
|
(2, "note", None, 1),
|
|
(3, "attachment", None, 1),
|
|
],
|
|
)
|
|
cur.executemany(
|
|
"insert into fields(fieldID, fieldName, fieldFormatID) values (?, ?, ?)",
|
|
[
|
|
(1, "title", 1),
|
|
(2, "abstractNote", 1),
|
|
(3, "date", 1),
|
|
],
|
|
)
|
|
cur.executemany(
|
|
"insert into itemDataValues(valueID, value) values (?, ?)",
|
|
[
|
|
(1, "Card Pipelines for Research Writing"),
|
|
(2, "Merged metadata and notes improve drafting support."),
|
|
(3, "2024"),
|
|
],
|
|
)
|
|
cur.executemany(
|
|
"insert into items(itemID, itemTypeID, dateAdded, dateModified, clientDateModified, libraryID, key, version, synced) values (?, ?, '', '', '', 1, ?, 1, 1)",
|
|
[
|
|
(1, 1, "PAPER0001"),
|
|
(3, 3, "ATTACH01"),
|
|
],
|
|
)
|
|
cur.executemany(
|
|
"insert into itemData(itemID, fieldID, valueID) values (?, ?, ?)",
|
|
[
|
|
(1, 1, 1),
|
|
(1, 2, 2),
|
|
(1, 3, 3),
|
|
],
|
|
)
|
|
cur.execute(
|
|
"insert into creators(creatorID, firstName, lastName, fieldMode) values (1, 'Alice', 'Smith', 0)"
|
|
)
|
|
cur.execute(
|
|
"insert into creatorTypes(creatorTypeID, creatorType) values (1, 'author')"
|
|
)
|
|
cur.execute(
|
|
"insert into itemCreators(itemID, creatorID, creatorTypeID, orderIndex) values (1, 1, 1, 0)"
|
|
)
|
|
cur.executemany(
|
|
"insert into tags(tagID, name) values (?, ?)",
|
|
[
|
|
(1, "llm"),
|
|
(2, "writing"),
|
|
],
|
|
)
|
|
cur.executemany(
|
|
"insert into itemTags(itemID, tagID, type) values (?, ?, 0)",
|
|
[
|
|
(1, 1),
|
|
(1, 2),
|
|
],
|
|
)
|
|
cur.executemany(
|
|
"insert into collections(collectionID, collectionName, parentCollectionID, clientDateModified, libraryID, key, version, synced) values (?, ?, ?, '', 1, ?, 1, 1)",
|
|
[
|
|
(1, "Theory", None, "COLL0001"),
|
|
(2, "Drafting", 1, "COLL0002"),
|
|
],
|
|
)
|
|
cur.execute("insert into collectionItems(collectionID, itemID, orderIndex) values (2, 1, 0)")
|
|
cur.execute(
|
|
"insert into itemNotes(itemID, parentItemID, note, title) values (2, 1, '<div><p>Merged notes matter.</p></div>', 'note')"
|
|
)
|
|
cur.execute(
|
|
"insert into itemAttachments(itemID, parentItemID, linkMode, contentType, charsetID, path, syncState, storageModTime, storageHash, lastProcessedModificationTime) values (3, 1, 1, 'text/plain', null, 'storage:ATTACH01/paper.txt', 0, 0, '', 0)"
|
|
)
|
|
|
|
conn.commit()
|
|
conn.close()
|