diff --git a/anki/__init__.py b/anki/__init__.py
index 8382aa318..c7111a18d 100644
--- a/anki/__init__.py
+++ b/anki/__init__.py
@@ -27,10 +27,10 @@ Refresh after a change:
Edit the card:
- fact = card.fact()
- for (name, value) in fact.items():
- fact[name] = value + " new"
- fact.flush()
+ note = card.note()
+ for (name, value) in note.items():
+ note[name] = value + " new"
+ note.flush()
Save & close:
diff --git a/anki/cards.py b/anki/cards.py
index 40179c493..6b2ebfc80 100644
--- a/anki/cards.py
+++ b/anki/cards.py
@@ -12,7 +12,7 @@ from anki.utils import intTime, hexifyID, timestampID
# Queue: same as above, and:
# -1=suspended, -2=user buried, -3=sched buried
# Due is used differently for different queues.
-# - new queue: fact id or random int
+# - new queue: note id or random int
# - rev queue: integer day
# - lrn queue: integer timestamp
@@ -27,7 +27,7 @@ class Card(object):
self.id = id
self.load()
else:
- # to flush, set fid, ord, and due
+ # to flush, set nid, ord, and due
self.id = timestampID(deck.db, "cards")
self.gid = 1
self.crt = intTime()
@@ -44,7 +44,7 @@ class Card(object):
def load(self):
(self.id,
- self.fid,
+ self.nid,
self.gid,
self.ord,
self.mod,
@@ -72,7 +72,7 @@ class Card(object):
insert or replace into cards values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
self.id,
- self.fid,
+ self.nid,
self.gid,
self.ord,
self.mod,
@@ -108,21 +108,21 @@ lapses=?, left=?, edue=? where id = ?""",
def _getQA(self, reload=False):
if not self._qa or reload:
- f = self.fact(); m = self.model()
+ f = self.note(); m = self.model()
data = [self.id, f.id, m['id'], self.gid, self.ord, f.stringTags(),
f.joinedFields()]
self._qa = self.deck._renderQA(data)
return self._qa
def _reviewData(self, reload=False):
- "Fetch the model and fact."
+ "Fetch the model and note."
if not self._rd or reload:
- f = self.deck.getFact(self.fid)
+ f = self.deck.getNote(self.nid)
m = self.deck.models.get(f.mid)
self._rd = [f, m]
return self._rd
- def fact(self):
+ def note(self):
return self._reviewData()[0]
def model(self, reload=False):
diff --git a/anki/consts.py b/anki/consts.py
index 29f2f1e7c..bd5c586b5 100644
--- a/anki/consts.py
+++ b/anki/consts.py
@@ -24,7 +24,7 @@ REV_CARDS_NEW_FIRST = 2
# removal types
REM_CARD = 0
-REM_FACT = 1
+REM_NOTE = 1
REM_GROUP = 2
# count display
diff --git a/anki/deck.py b/anki/deck.py
index df0742d74..3db14dc77 100644
--- a/anki/deck.py
+++ b/anki/deck.py
@@ -16,7 +16,7 @@ from anki.consts import *
from anki.errors import AnkiError
import anki.latex # sets up hook
-import anki.cards, anki.facts, anki.template, anki.cram, anki.find
+import anki.cards, anki.notes, anki.template, anki.cram, anki.find
defaultConf = {
# scheduling options
@@ -29,7 +29,7 @@ defaultConf = {
'fontFamilies': [
[u'MS 明朝',u'ヒラギノ明朝 Pro W3',u'Kochi Mincho', u'東風明朝']
],
- 'sortType': "factFld",
+ 'sortType': "noteFld",
'sortBackwards': False,
}
@@ -180,7 +180,7 @@ crt=?, mod=?, scm=?, dty=?, usn=?, ls=?, conf=?""",
def beforeUpload(self):
"Called before a full upload."
- tbls = "facts", "cards", "revlog", "graves"
+ tbls = "notes", "cards", "revlog", "graves"
for t in tbls:
self.db.execute("update %s set usn=0 where usn=-1" % t)
self._usn = 0
@@ -194,8 +194,8 @@ crt=?, mod=?, scm=?, dty=?, usn=?, ls=?, conf=?""",
def getCard(self, id):
return anki.cards.Card(self, id)
- def getFact(self, id):
- return anki.facts.Fact(self, id=id)
+ def getNote(self, id):
+ return anki.notes.Note(self, id=id)
# Utils
##########################################################################
@@ -218,23 +218,23 @@ crt=?, mod=?, scm=?, dty=?, usn=?, ls=?, conf=?""",
self.db.executemany("insert into graves values (%d, ?, %d)" % (
self.usn(), type), ([x] for x in ids))
- # Facts
+ # Notes
##########################################################################
- def factCount(self):
- return self.db.scalar("select count() from facts")
+ def noteCount(self):
+ return self.db.scalar("select count() from notes")
- def newFact(self):
- "Return a new fact with the current model."
- return anki.facts.Fact(self, self.models.current())
+ def newNote(self):
+ "Return a new note with the current model."
+ return anki.notes.Note(self, self.models.current())
- def addFact(self, fact):
- "Add a fact to the deck. Return number of new cards."
+ def addNote(self, note):
+ "Add a note to the deck. Return number of new cards."
# check we have card models available, then save
- cms = self.findTemplates(fact)
+ cms = self.findTemplates(note)
if not cms:
return 0
- fact.flush()
+ note.flush()
# randomize?
if self.models.randomNew():
due = self._randPos()
@@ -243,65 +243,65 @@ crt=?, mod=?, scm=?, dty=?, usn=?, ls=?, conf=?""",
# add cards
ncards = 0
for template in cms:
- self._newCard(fact, template, due)
+ self._newCard(note, template, due)
ncards += 1
return ncards
def _randPos(self):
return random.randrange(1, sys.maxint)
- def remFacts(self, ids):
- self.remCards(self.db.list("select id from cards where fid in "+
+ def remNotes(self, ids):
+ self.remCards(self.db.list("select id from cards where nid in "+
ids2str(ids)))
- def _remFacts(self, ids):
- "Bulk delete facts by ID. Don't call this directly."
+ def _remNotes(self, ids):
+ "Bulk delete notes by ID. Don't call this directly."
if not ids:
return
strids = ids2str(ids)
# we need to log these independently of cards, as one side may have
# more card templates
- self._logRem(ids, REM_FACT)
- self.db.execute("delete from facts where id in %s" % strids)
- self.db.execute("delete from fsums where fid in %s" % strids)
+ self._logRem(ids, REM_NOTE)
+ self.db.execute("delete from notes where id in %s" % strids)
+ self.db.execute("delete from nsums where nid in %s" % strids)
# Card creation
##########################################################################
- def findTemplates(self, fact):
+ def findTemplates(self, note):
"Return (active), non-empty templates."
ok = []
- model = fact.model()
- avail = self.models.availOrds(model, joinFields(fact.fields))
+ model = note.model()
+ avail = self.models.availOrds(model, joinFields(note.fields))
ok = []
for t in model['tmpls']:
if t['ord'] in avail:
ok.append(t)
return ok
- def genCards(self, fids):
+ def genCards(self, nids):
"Generate cards for non-empty templates."
- # build map of (fid,ord) so we don't create dupes
- sfids = ids2str(fids)
+ # build map of (nid,ord) so we don't create dupes
+ snids = ids2str(nids)
have = {}
- for fid, ord in self.db.execute(
- "select fid, ord from cards where fid in "+sfids):
- have[(fid,ord)] = True
- # build cards for each fact
+ for nid, ord in self.db.execute(
+ "select nid, ord from cards where nid in "+snids):
+ have[(nid,ord)] = True
+ # build cards for each note
data = []
ts = maxID(self.db)
now = intTime()
- for fid, mid, gid, flds in self.db.execute(
- "select id, mid, gid, flds from facts where id in "+sfids):
+ for nid, mid, gid, flds in self.db.execute(
+ "select id, mid, gid, flds from notes where id in "+snids):
model = self.models.get(mid)
avail = self.models.availOrds(model, flds)
ok = []
for t in model['tmpls']:
- if (fid,t['ord']) in have:
+ if (nid,t['ord']) in have:
continue
if t['ord'] in avail:
- data.append((ts, fid, t['gid'] or gid, t['ord'],
- now, fid))
+ data.append((ts, nid, t['gid'] or gid, t['ord'],
+ now, nid))
ts += 1
# bulk update
self.db.executemany("""
@@ -311,26 +311,26 @@ insert into cards values (?,?,?,?,?,-1,0,0,?,0,0,0,0,0,0,0,"")""",
# type 0 - when previewing in add dialog, only non-empty
# type 1 - when previewing edit, only existing
# type 2 - when previewing in models dialog, all templates
- def previewCards(self, fact, type=0):
+ def previewCards(self, note, type=0):
if type == 0:
- cms = self.findTemplates(fact)
+ cms = self.findTemplates(note)
elif type == 1:
- cms = [c.template() for c in fact.cards()]
+ cms = [c.template() for c in note.cards()]
else:
- cms = fact.model()['tmpls']
+ cms = note.model()['tmpls']
if not cms:
return []
cards = []
for template in cms:
- cards.append(self._newCard(fact, template, 1, flush=False))
+ cards.append(self._newCard(note, template, 1, flush=False))
return cards
- def _newCard(self, fact, template, due, flush=True):
+ def _newCard(self, note, template, due, flush=True):
"Create a new card."
card = anki.cards.Card(self)
- card.fid = fact.id
+ card.nid = note.id
card.ord = template['ord']
- card.gid = template['gid'] or fact.gid
+ card.gid = template['gid'] or note.gid
card.due = due
if flush:
card.flush()
@@ -350,42 +350,42 @@ insert into cards values (?,?,?,?,?,-1,0,0,?,0,0,0,0,0,0,0,"")""",
if not ids:
return
sids = ids2str(ids)
- fids = self.db.list("select fid from cards where id in "+sids)
+ nids = self.db.list("select nid from cards where id in "+sids)
# remove cards
self._logRem(ids, REM_CARD)
self.db.execute("delete from cards where id in "+sids)
self.db.execute("delete from revlog where cid in "+sids)
- # then facts
- fids = self.db.list("""
-select id from facts where id in %s and id not in (select fid from cards)""" %
- ids2str(fids))
- self._remFacts(fids)
+ # then notes
+ nids = self.db.list("""
+select id from notes where id in %s and id not in (select nid from cards)""" %
+ ids2str(nids))
+ self._remNotes(nids)
# Field checksums and sorting fields
##########################################################################
- def _fieldData(self, sfids):
+ def _fieldData(self, snids):
return self.db.execute(
- "select id, mid, flds from facts where id in "+sfids)
+ "select id, mid, flds from notes where id in "+snids)
- def updateFieldCache(self, fids, csum=True):
+ def updateFieldCache(self, nids, csum=True):
"Update field checksums and sort cache, after find&replace, etc."
- sfids = ids2str(fids)
+ snids = ids2str(nids)
r = []
r2 = []
- for (fid, mid, flds) in self._fieldData(sfids):
+ for (nid, mid, flds) in self._fieldData(snids):
fields = splitFields(flds)
model = self.models.get(mid)
if csum:
for f in model['flds']:
if f['uniq'] and fields[f['ord']]:
- r.append((fid, mid, fieldChecksum(fields[f['ord']])))
- r2.append((stripHTML(fields[self.models.sortIdx(model)]), fid))
+ r.append((nid, mid, fieldChecksum(fields[f['ord']])))
+ r2.append((stripHTML(fields[self.models.sortIdx(model)]), nid))
if csum:
- self.db.execute("delete from fsums where fid in "+sfids)
- self.db.executemany("insert into fsums values (?,?,?)", r)
+ self.db.execute("delete from nsums where nid in "+snids)
+ self.db.executemany("insert into nsums values (?,?,?)", r)
# rely on calling code to bump usn+mod
- self.db.executemany("update facts set sfld = ? where id = ?", r2)
+ self.db.executemany("update notes set sfld = ? where id = ?", r2)
# Q/A generation
##########################################################################
@@ -394,7 +394,7 @@ select id from facts where id in %s and id not in (select fid from cards)""" %
# gather metadata
if type == "card":
where = "and c.id in " + ids2str(ids)
- elif type == "fact":
+ elif type == "note":
where = "and f.id in " + ids2str(ids)
elif type == "model":
where = "and m.id in " + ids2str(ids)
@@ -407,7 +407,7 @@ select id from facts where id in %s and id not in (select fid from cards)""" %
def _renderQA(self, data):
"Returns hash of id, question, answer."
- # data is [cid, fid, mid, gid, ord, tags, flds]
+ # data is [cid, nid, mid, gid, ord, tags, flds]
# unpack fields and create dict
flist = splitFields(data[6])
fields = {}
@@ -437,11 +437,11 @@ select id from facts where id in %s and id not in (select fid from cards)""" %
return d
def _qaData(self, where=""):
- "Return [cid, fid, mid, gid, ord, tags, flds] db query"
+ "Return [cid, nid, mid, gid, ord, tags, flds] db query"
return self.db.execute("""
select c.id, f.id, f.mid, c.gid, c.ord, f.tags, f.flds
-from cards c, facts f
-where c.fid == f.id
+from cards c, notes f
+where c.nid == f.id
%s""" % where)
# Finding cards
@@ -450,8 +450,8 @@ where c.fid == f.id
def findCards(self, query, full=False):
return anki.find.Finder(self).findCards(query, full)
- def findReplace(self, fids, src, dst, regex=None, field=None, fold=True):
- return anki.find.findReplace(self, fids, src, dst, regex, field, fold)
+ def findReplace(self, nids, src, dst, regex=None, field=None, fold=True):
+ return anki.find.findReplace(self, nids, src, dst, regex, field, fold)
def findDuplicates(self, fmids):
return anki.find.findDuplicates(self, fmids)
@@ -570,15 +570,15 @@ where c.fid == f.id
problems = []
self.save()
oldSize = os.stat(self.path)[stat.ST_SIZE]
- # delete any facts with missing cards
+ # delete any notes with missing cards
ids = self.db.list("""
-select id from facts where id not in (select distinct fid from cards)""")
- self._remFacts(ids)
+select id from notes where id not in (select distinct nid from cards)""")
+ self._remNotes(ids)
# tags
- self.tags.registerFacts()
+ self.tags.registerNotes()
# field cache
for m in self.models.all():
- self.updateFieldCache(self.models.fids(m))
+ self.updateFieldCache(self.models.nids(m))
# and finally, optimize
self.optimize()
newSize = os.stat(self.path)[stat.ST_SIZE]
diff --git a/anki/exporting.py b/anki/exporting.py
index 397386f00..02f2fb4dd 100644
--- a/anki/exporting.py
+++ b/anki/exporting.py
@@ -104,23 +104,23 @@ class AnkiExporter(Exporter):
cards = self.deck.db.all("""
select id, modified from cards
where id in %s""" % cStrIds)
- facts = self.deck.db.all("""
-select facts.id, facts.modified from cards, facts where
-facts.id = cards.factId and
+ notes = self.deck.db.all("""
+select notes.id, notes.modified from cards, notes where
+notes.id = cards.noteId and
cards.id in %s""" % cStrIds)
models = self.deck.db.all("""
-select models.id, models.modified from models, facts where
-facts.modelId = models.id and
-facts.id in %s""" % ids2str([f[0] for f in facts]))
+select models.id, models.modified from models, notes where
+notes.modelId = models.id and
+notes.id in %s""" % ids2str([f[0] for f in notes]))
media = self.deck.db.all("""
select id, modified from media""")
return {
# cards
"cards": cards,
"delcards": [],
- # facts
- "facts": facts,
- "delfacts": [],
+ # notes
+ "notes": notes,
+ "delnotes": [],
# models
"models": models,
"delmodels": [],
@@ -147,8 +147,8 @@ where cards.id in %s
order by cards.created""" % strids)
if self.includeTags:
self.cardTags = dict(self.deck.db.all("""
-select cards.id, facts.tags from cards, facts
-where cards.factId = facts.id
+select cards.id, notes.tags from cards, notes
+where cards.noteId = notes.id
and cards.id in %s
order by cards.created""" % strids))
out = u"\n".join(["%s\t%s%s" % (
@@ -166,7 +166,7 @@ order by cards.created""" % strids))
return "\t" + ", ".join(parseTags(self.cardTags[id]))
return ""
-class TextFactExporter(Exporter):
+class TextNoteExporter(Exporter):
key = _("Text files (*.txt)")
ext = ".txt"
@@ -177,20 +177,20 @@ class TextFactExporter(Exporter):
def doExport(self, file):
cardIds = self.cardIds()
- facts = self.deck.db.all("""
-select factId, value, facts.created from facts, fields
+ notes = self.deck.db.all("""
+select noteId, value, notes.created from notes, fields
where
-facts.id in
-(select distinct factId from cards
+notes.id in
+(select distinct noteId from cards
where cards.id in %s)
-and facts.id = fields.factId
-order by factId, ordinal""" % ids2str(cardIds))
+and notes.id = fields.noteId
+order by noteId, ordinal""" % ids2str(cardIds))
txt = ""
if self.includeTags:
- self.factTags = dict(self.deck.db.all(
- "select id, tags from facts where id in %s" %
- ids2str([fact[0] for fact in facts])))
- groups = itertools.groupby(facts, itemgetter(0))
+ self.noteTags = dict(self.deck.db.all(
+ "select id, tags from notes where id in %s" %
+ ids2str([note[0] for note in notes])))
+ groups = itertools.groupby(notes, itemgetter(0))
groups = [[x for x in y[1]] for y in groups]
groups = [(group[0][2],
"\t".join([self.escapeText(x[1]) for x in group]) +
@@ -205,7 +205,7 @@ order by factId, ordinal""" % ids2str(cardIds))
def tags(self, id):
if self.includeTags:
- return "\t" + self.factTags[id]
+ return "\t" + self.noteTags[id]
return ""
# Export modules
@@ -215,4 +215,4 @@ def exporters():
return (
(_("Anki Deck (*.anki)"), AnkiExporter),
(_("Cards in tab-separated text file (*.txt)"), TextCardExporter),
- (_("Facts in tab-separated text file (*.txt)"), TextFactExporter))
+ (_("Notes in tab-separated text file (*.txt)"), TextNoteExporter))
diff --git a/anki/find.py b/anki/find.py
index 873267f24..6416cb6b2 100644
--- a/anki/find.py
+++ b/anki/find.py
@@ -9,7 +9,7 @@ from anki.utils import ids2str, splitFields, joinFields, stripHTML, intTime
SEARCH_TAG = 0
SEARCH_TYPE = 1
SEARCH_PHRASE = 2
-SEARCH_FID = 3
+SEARCH_NID = 3
SEARCH_TEMPLATE = 4
SEARCH_FIELD = 5
SEARCH_MODEL = 6
@@ -54,9 +54,9 @@ class Finder(object):
def _whereClause(self):
x = []
- if self.lims['fact']:
- x.append("fid in (select id from facts where %s)" % " and ".join(
- self.lims['fact']))
+ if self.lims['note']:
+ x.append("nid in (select id from notes where %s)" % " and ".join(
+ self.lims['note']))
if self.lims['card']:
x.extend(self.lims['card'])
q = " and ".join(x)
@@ -68,17 +68,17 @@ class Finder(object):
type = self.deck.conf['sortType']
if not type:
return "select id from cards c where " + lim
- elif type.startswith("fact"):
- if type == "factCrt":
+ elif type.startswith("note"):
+ if type == "noteCrt":
sort = "f.id, c.ord"
- elif type == "factMod":
+ elif type == "noteMod":
sort = "f.mod, c.ord"
- elif type == "factFld":
+ elif type == "noteFld":
sort = "f.sfld collate nocase, c.ord"
else:
raise Exception()
return """
-select c.id from cards c, facts f where %s and c.fid=f.id
+select c.id from cards c, notes f where %s and c.nid=f.id
order by %s""" % (lim, sort)
elif type.startswith("card"):
if type == "cardMod":
@@ -101,9 +101,9 @@ order by %s""" % (lim, sort)
raise Exception()
def _findLimits(self):
- "Generate a list of fact/card limits for the query."
+ "Generate a list of note/card limits for the query."
self.lims = {
- 'fact': [],
+ 'note': [],
'card': [],
'args': {},
'valid': True
@@ -113,8 +113,8 @@ order by %s""" % (lim, sort)
self._findTag(token, isNeg, c)
elif type == SEARCH_TYPE:
self._findCardState(token, isNeg)
- elif type == SEARCH_FID:
- self._findFids(token)
+ elif type == SEARCH_NID:
+ self._findNids(token)
elif type == SEARCH_TEMPLATE:
self._findTemplate(token, isNeg)
elif type == SEARCH_FIELD:
@@ -128,7 +128,7 @@ order by %s""" % (lim, sort)
def _findTag(self, val, neg, c):
if val == "none":
- self.lims['fact'].append("select id from facts where tags = ''")
+ self.lims['note'].append("select id from notes where tags = ''")
return
extra = "not" if neg else ""
val = val.replace("*", "%")
@@ -137,7 +137,7 @@ order by %s""" % (lim, sort)
if not val.endswith("%"):
val += " %"
self.lims['args']["_tag_%d" % c] = val
- self.lims['fact'].append(
+ self.lims['note'].append(
"tags %s like :_tag_%d""" % (extra, c))
def _findCardState(self, val, neg):
@@ -168,20 +168,20 @@ order by %s""" % (lim, sort)
extra = "not" if neg else ""
if not self.full:
self.lims['args']["_text_%d"%c] = "%"+val+"%"
- self.lims['fact'].append("flds %s like :_text_%d escape '\\'" % (
+ self.lims['note'].append("flds %s like :_text_%d escape '\\'" % (
extra, c))
else:
# in the future we may want to apply this at the end to speed up
# the case where there are other limits
- fids = []
- for fid, flds in self.deck.db.execute(
- "select id, flds from facts"):
+ nids = []
+ for nid, flds in self.deck.db.execute(
+ "select id, flds from notes"):
if val in stripHTML(flds):
- fids.append(fid)
- self.lims['fact'].append("id in " + ids2str(fids))
+ nids.append(nid)
+ self.lims['note'].append("id in " + ids2str(nids))
- def _findFids(self, val):
- self.lims['fact'].append("id in (%s)" % val)
+ def _findNids(self, val):
+ self.lims['note'].append("id in (%s)" % val)
def _findModel(self, val, isNeg):
extra = "not" if isNeg else ""
@@ -189,7 +189,7 @@ order by %s""" % (lim, sort)
for m in self.deck.models.all():
if m['name'].lower() == val:
ids.append(m['id'])
- self.lims['fact'].append("mid %s in %s" % (extra, ids2str(ids)))
+ self.lims['note'].append("mid %s in %s" % (extra, ids2str(ids)))
def _findGroup(self, val, isNeg):
extra = "!" if isNeg else ""
@@ -214,7 +214,7 @@ order by %s""" % (lim, sort)
# template name?
elif t['name'].lower() == val.lower():
lims.append((
- "(fid in (select id from facts where mid = %s) "
+ "(nid in (select id from notes where mid = %s) "
"and ord %s %d)") % (m['id'], comp, t['ord']))
found = True
if lims:
@@ -236,11 +236,11 @@ order by %s""" % (lim, sort)
# nothing has that field
self.lims['valid'] = False
return
- # gather fids
+ # gather nids
regex = value.replace("%", ".*")
- fids = []
+ nids = []
for (id,mid,flds) in self.deck.db.execute("""
-select id, mid, flds from facts
+select id, mid, flds from notes
where mid in %s and flds like ? escape '\\'""" % (
ids2str(mods.keys())),
"%" if self.full else value):
@@ -250,9 +250,9 @@ where mid in %s and flds like ? escape '\\'""" % (
if self.full:
strg = stripHTML(strg)
if re.search(regex, strg):
- fids.append(id)
+ nids.append(id)
extra = "not" if isNeg else ""
- self.lims['fact'].append("id %s in %s" % (extra, ids2str(fids)))
+ self.lims['note'].append("id %s in %s" % (extra, ids2str(nids)))
# Most of this function was written by Marcus
def _parseQuery(self):
@@ -332,7 +332,7 @@ where mid in %s and flds like ? escape '\\'""" % (
elif token['value'].startswith("group:"):
token['value'] = token['value'][6:].lower()
type = SEARCH_GROUP
- elif token['value'].startswith("fid:") and len(token['value']) > 4:
+ elif token['value'].startswith("nid:") and len(token['value']) > 4:
dec = token['value'][4:]
try:
int(dec)
@@ -344,7 +344,7 @@ where mid in %s and flds like ? escape '\\'""" % (
token['value'] = token['value'][4:]
except:
token['value'] = "0"
- type = SEARCH_FID
+ type = SEARCH_NID
elif token['value'].startswith("card:"):
token['value'] = token['value'][5:]
type = SEARCH_TEMPLATE
@@ -370,8 +370,8 @@ where mid in %s and flds like ? escape '\\'""" % (
# Find and replace
##########################################################################
-def findReplace(deck, fids, src, dst, regex=False, field=None, fold=True):
- "Find and replace fields in a fact."
+def findReplace(deck, nids, src, dst, regex=False, field=None, fold=True):
+ "Find and replace fields in a note."
mmap = {}
if field:
for m in deck.models.all():
@@ -389,8 +389,8 @@ def findReplace(deck, fids, src, dst, regex=False, field=None, fold=True):
def repl(str):
return re.sub(regex, dst, str)
d = []
- for fid, mid, flds in deck.db.execute(
- "select id, mid, flds from facts where id in "+ids2str(fids)):
+ for nid, mid, flds in deck.db.execute(
+ "select id, mid, flds from notes where id in "+ids2str(nids)):
origFlds = flds
# does it match?
sflds = splitFields(flds)
@@ -402,12 +402,12 @@ def findReplace(deck, fids, src, dst, regex=False, field=None, fold=True):
sflds[c] = repl(sflds[c])
flds = joinFields(sflds)
if flds != origFlds:
- d.append(dict(fid=fid,flds=flds,u=deck.usn(),m=intTime()))
+ d.append(dict(nid=nid,flds=flds,u=deck.usn(),m=intTime()))
if not d:
return 0
# replace
- deck.db.executemany("update facts set flds=:flds,mod=:m,usn=:u where id=:fid", d)
- deck.updateFieldCache(fids)
+ deck.db.executemany("update notes set flds=:flds,mod=:m,usn=:u where id=:nid", d)
+ deck.updateFieldCache(nids)
return len(d)
# Find duplicates
@@ -415,14 +415,14 @@ def findReplace(deck, fids, src, dst, regex=False, field=None, fold=True):
def findDuplicates(deck, fmids):
data = deck.db.all(
- "select fid, value from fdata where fmid in %s" %
+ "select nid, value from fdata where fmid in %s" %
ids2str(fmids))
vals = {}
- for (fid, val) in data:
+ for (nid, val) in data:
if not val.strip():
continue
if val not in vals:
- vals[val] = [fid]
+ vals[val] = [nid]
else:
- vals[val].append(fid)
+ vals[val].append(nid)
return [(k,v) for (k,v) in vals.items() if len(v) > 1]
diff --git a/anki/groups.py b/anki/groups.py
index 519ab22ed..b1abd37cd 100644
--- a/anki/groups.py
+++ b/anki/groups.py
@@ -15,7 +15,7 @@ from anki.lang import _
# appropriate
# notes:
-# - it's difficult to enforce valid gids for models/facts/cards, as we
+# - it's difficult to enforce valid gids for models/notes/cards, as we
# may update the gid locally only to have it overwritten by a more recent
# change from somewhere else. to avoid this, we allow invalid gid
# references, and treat any invalid gids as the default group.
@@ -268,7 +268,7 @@ class GroupManager(object):
def sendHome(self, cids):
self.deck.db.execute("""
-update cards set gid=(select gid from facts f where f.id=fid),
+update cards set gid=(select gid from notes f where f.id=nid),
usn=?,mod=? where id in %s""" % ids2str(cids),
self.deck.usn(), intTime(), gid)
diff --git a/anki/importing/anki2.py b/anki/importing/anki2.py
index c9212e997..dc89002f5 100644
--- a/anki/importing/anki2.py
+++ b/anki/importing/anki2.py
@@ -11,9 +11,9 @@ from anki.importing.base import Importer
# shared decks, and import from a packaged deck.
#
# We can't rely on internal ids, so we:
-# - compare facts by guid
+# - compare notes by guid
# - compare models by schema signature
-# - compare cards by fact guid + ordinal
+# - compare cards by note guid + ordinal
# - compare groups by name
#
@@ -44,53 +44,53 @@ class Anki2Importer(Importer):
self.dst.groups.select(id)
self._prepareTS()
self._prepareModels()
- self._importFacts()
+ self._importNotes()
self._importCards()
self._importMedia()
self._postImport()
self.dst.db.execute("vacuum")
self.dst.db.execute("analyze")
- # Facts
+ # Notes
######################################################################
# - should note new for wizard
- def _importFacts(self):
+ def _importNotes(self):
# build guid -> (id,mod,mid) hash
- self._facts = {}
+ self._notes = {}
for id, guid, mod, mid in self.dst.db.execute(
- "select id, guid, mod, mid from facts"):
- self._facts[guid] = (id, mod, mid)
+ "select id, guid, mod, mid from notes"):
+ self._notes[guid] = (id, mod, mid)
# iterate over source deck
add = []
dirty = []
- for fact in self.src.db.execute(
- "select * from facts"):
+ for note in self.src.db.execute(
+ "select * from notes"):
# turn the db result into a mutable list
- fact = list(fact)
- guid, mid = fact[1:3]
+ note = list(note)
+ guid, mid = note[1:3]
# missing from local deck?
- if guid not in self._facts:
+ if guid not in self._notes:
# get corresponding local model
lmid = self._mid(mid)
# rewrite internal ids, models, etc
- fact[0] = self.ts()
- fact[2] = lmid
- fact[3] = self._gid(fact[3])
- fact[4] = intTime()
- fact[5] = -1 # usn
- add.append(fact)
- dirty.append(fact[0])
- # note we have the added fact
- self._facts[guid] = (fact[0], fact[4], fact[2])
+ note[0] = self.ts()
+ note[2] = lmid
+ note[3] = self._gid(note[3])
+ note[4] = intTime()
+ note[5] = -1 # usn
+ add.append(note)
+ dirty.append(note[0])
+ # note we have the added note
+ self._notes[guid] = (note[0], note[4], note[2])
else:
- continue #raise Exception("merging facts nyi")
+ continue #raise Exception("merging notes nyi")
# add to deck
self.dst.db.executemany(
- "insert or replace into facts values (?,?,?,?,?,?,?,?,?,?,?)",
+ "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)",
add)
self.dst.updateFieldCache(dirty)
- self.dst.tags.registerFacts(dirty)
+ self.dst.tags.registerNotes(dirty)
# Models
######################################################################
@@ -168,24 +168,24 @@ class Anki2Importer(Importer):
# build map of (guid, ord) -> cid
self._cards = {}
for guid, ord, cid in self.dst.db.execute(
- "select f.guid, c.ord, c.id from cards c, facts f "
- "where c.fid = f.id"):
+ "select f.guid, c.ord, c.id from cards c, notes f "
+ "where c.nid = f.id"):
self._cards[(guid, ord)] = cid
# loop through src
cards = []
revlog = []
print "fixme: need to check schema issues in card import"
for card in self.src.db.execute(
- "select f.guid, f.mid, c.* from cards c, facts f "
- "where c.fid = f.id"):
+ "select f.guid, f.mid, c.* from cards c, notes f "
+ "where c.nid = f.id"):
guid = card[0]
- # does the card's fact exist in dst deck?
- if guid not in self._facts:
+ # does the card's note exist in dst deck?
+ if guid not in self._notes:
continue
- dfid = self._facts[guid]
- # does the fact share the same schema?
+ dnid = self._notes[guid]
+ # does the note share the same schema?
# shash = self._srcModels[card[1]]
- # mid = self._facts[guid][2]
+ # mid = self._notes[guid][2]
# if shash != self._dstModels[mid]:
# continue
# does the card already exist in the dst deck?
@@ -193,12 +193,12 @@ class Anki2Importer(Importer):
if (guid, ord) in self._cards:
# fixme: in future, could update if newer mod time
continue
- # doesn't exist. strip off fact info, and save src id for later
+ # doesn't exist. strip off note info, and save src id for later
card = list(card[2:])
scid = card[0]
- # update cid, fid, etc
+ # update cid, nid, etc
card[0] = self.ts()
- card[1] = self._facts[guid][0]
+ card[1] = self._notes[guid][0]
card[2] = self._gid(card[2])
card[4] = intTime()
cards.append(card)
diff --git a/anki/importing/cardimp.py b/anki/importing/cardimp.py
index 308f8179d..8aa56615c 100644
--- a/anki/importing/cardimp.py
+++ b/anki/importing/cardimp.py
@@ -57,15 +57,15 @@ class CardImporter(Importer):
cards = self.foreignCards()
# grab data from db
fields = self.deck.db.all("""
-select factId, value from fields where fieldModelId = :id
+select noteId, value from fields where fieldModelId = :id
and value != ''""",
id=self.updateKey[1])
# hash it
vhash = {}
- fids = []
- for (fid, val) in fields:
- fids.append(fid)
- vhash[val] = fid
+ nids = []
+ for (nid, val) in fields:
+ nids.append(nid)
+ vhash[val] = nid
# prepare tags
tagsIdx = None
try:
@@ -82,7 +82,7 @@ and value != ''""",
if v in vhash:
# ignore empty keys
if v:
- # fid, card
+ # nid, card
upcards.append((vhash[v], c))
else:
newcards.append(c)
@@ -96,28 +96,28 @@ and value != ''""",
except ValueError:
# not mapped
continue
- data = [{'fid': fid,
+ data = [{'nid': nid,
'fmid': fm.id,
'v': c.fields[index],
'chk': self.maybeChecksum(c.fields[index], fm.unique)}
- for (fid, c) in upcards]
+ for (nid, c) in upcards]
self.deck.db.execute("""
-update fields set value = :v, chksum = :chk where factId = :fid
+update fields set value = :v, chksum = :chk where noteId = :nid
and fieldModelId = :fmid""", data)
# update tags
if tagsIdx is not None:
- data = [{'fid': fid,
+ data = [{'nid': nid,
't': c.fields[tagsIdx]}
- for (fid, c) in upcards]
+ for (nid, c) in upcards]
self.deck.db.execute(
- "update facts set tags = :t where id = :fid",
+ "update notes set tags = :t where id = :nid",
data)
# rebuild caches
cids = self.deck.db.column0(
- "select id from cards where factId in %s" %
- ids2str(fids))
+ "select id from cards where noteId in %s" %
+ ids2str(nids))
self.deck.updateCardTags(cids)
- self.deck.updateCardsFromFactIds(fids)
+ self.deck.updateCardsFromNoteIds(nids)
self.total = len(cards)
self.deck.setModified()
@@ -166,7 +166,7 @@ and fieldModelId = :fmid""", data)
model = property(getModel, setModel)
def importCards(self, cards):
- "Convert each card into a fact, apply attributes and add to deck."
+ "Convert each card into a note, apply attributes and add to deck."
# ensure all unique and required fields are mapped
for fm in self.model.fieldModels:
if fm.required or fm.unique:
@@ -187,7 +187,7 @@ and fieldModelId = :fmid""", data)
return cards
def addCards(self, cards):
- "Add facts in bulk from foreign cards."
+ "Add notes in bulk from foreign cards."
# map tags field to attr
try:
idx = self.mapping.index(0)
@@ -195,31 +195,31 @@ and fieldModelId = :fmid""", data)
c.tags += " " + c.fields[idx]
except ValueError:
pass
- # add facts
- factIds = [genID() for n in range(len(cards))]
- factCreated = {}
+ # add notes
+ noteIds = [genID() for n in range(len(cards))]
+ noteCreated = {}
def fudgeCreated(d, tmp=[]):
if not tmp:
tmp.append(time.time())
else:
tmp[0] += 0.0001
d['created'] = tmp[0]
- factCreated[d['id']] = d['created']
+ noteCreated[d['id']] = d['created']
return d
- self.deck.db.execute(factsTable.insert(),
+ self.deck.db.execute(notesTable.insert(),
[fudgeCreated({'modelId': self.model.id,
'tags': canonifyTags(self.tagsToAdd + " " + cards[n].tags),
- 'id': factIds[n]}) for n in range(len(cards))])
+ 'id': noteIds[n]}) for n in range(len(cards))])
self.deck.db.execute("""
-delete from factsDeleted
-where factId in (%s)""" % ",".join([str(s) for s in factIds]))
+delete from notesDeleted
+where noteId in (%s)""" % ",".join([str(s) for s in noteIds]))
# add all the fields
for fm in self.model.fieldModels:
try:
index = self.mapping.index(fm)
except ValueError:
index = None
- data = [{'factId': factIds[m],
+ data = [{'noteId': noteIds[m],
'fieldModelId': fm.id,
'ordinal': fm.ordinal,
'id': genID(),
@@ -239,8 +239,8 @@ where factId in (%s)""" % ",".join([str(s) for s in factIds]))
active += 1
data = [self.addMeta({
'id': genID(),
- 'factId': factIds[m],
- 'factCreated': factCreated[factIds[m]],
+ 'noteId': noteIds[m],
+ 'noteCreated': noteCreated[noteIds[m]],
'cardModelId': cm.id,
'ordinal': cm.ordinal,
'question': u"",
@@ -248,14 +248,14 @@ where factId in (%s)""" % ",".join([str(s) for s in factIds]))
},cards[m]) for m in range(len(cards))]
self.deck.db.execute(cardsTable.insert(),
data)
- self.deck.updateCardsFromFactIds(factIds)
- self.total = len(factIds)
+ self.deck.updateCardsFromNoteIds(noteIds)
+ self.total = len(noteIds)
def addMeta(self, data, card):
"Add any scheduling metadata to cards"
if 'fields' in card.__dict__:
del card.fields
- t = data['factCreated'] + data['ordinal'] * 0.00001
+ t = data['noteCreated'] + data['ordinal'] * 0.00001
data['created'] = t
data['modified'] = t
data['due'] = t
@@ -281,7 +281,7 @@ where factId in (%s)""" % ",".join([str(s) for s in factIds]))
for n in range(len(self.mapping)):
if self.mapping[n] and self.mapping[n].required:
if fieldNum <= n or not card.fields[n].strip():
- self.log.append("Fact is missing field '%s': %s" %
+ self.log.append("Note is missing field '%s': %s" %
(self.mapping[n].name,
", ".join(card.fields)))
return False
@@ -307,7 +307,7 @@ where factId in (%s)""" % ",".join([str(s) for s in factIds]))
if self.mapping[n] and self.mapping[n].unique:
if card.fields[n] in self.uniqueCache[self.mapping[n].id]:
if not self.tagDuplicates:
- self.log.append("Fact has duplicate '%s': %s" %
+ self.log.append("Note has duplicate '%s': %s" %
(self.mapping[n].name,
", ".join(card.fields)))
return False
diff --git a/anki/media.py b/anki/media.py
index d80010bc0..62b7b1308 100644
--- a/anki/media.py
+++ b/anki/media.py
@@ -161,7 +161,7 @@ If the same name exists, compare checksums."""
def allMedia(self):
"Return a set of all referenced filenames."
files = set()
- for mid, flds in self.deck.db.execute("select mid, flds from facts"):
+ for mid, flds in self.deck.db.execute("select mid, flds from notes"):
for f in self.filesInStr(mid, flds):
files.add(f)
return files
diff --git a/anki/models.py b/anki/models.py
index 8aa1d3bb6..c9055b9a6 100644
--- a/anki/models.py
+++ b/anki/models.py
@@ -75,7 +75,7 @@ class ModelManager(object):
m['usn'] = self.deck.usn()
self._updateRequired(m)
if gencards:
- self.deck.genCards(self.fids(m))
+ self.deck.genCards(self.nids(m))
self.changed = True
def flush(self):
@@ -129,12 +129,12 @@ class ModelManager(object):
return self._add(m)
def rem(self, m):
- "Delete model, and all its cards/facts."
+ "Delete model, and all its cards/notes."
self.deck.modSchema()
current = self.current()['id'] == m['id']
- # delete facts/cards
+ # delete notes/cards
self.deck.remCards(self.deck.db.list("""
-select id from cards where fid in (select id from facts where mid = ?)""",
+select id from cards where nid in (select id from notes where mid = ?)""",
m['id']))
# then the model
del self.models[str(m['id'])]
@@ -168,15 +168,15 @@ select id from cards where fid in (select id from facts where mid = ?)""",
# Tools
##################################################
- def fids(self, m):
- "Fact ids for M."
+ def nids(self, m):
+ "Note ids for M."
return self.deck.db.list(
- "select id from facts where mid = ?", m['id'])
+ "select id from notes where mid = ?", m['id'])
def useCount(self, m):
- "Number of fact using M."
+ "Number of note using M."
return self.deck.db.scalar(
- "select count() from facts where mid = ?", m['id'])
+ "select count() from notes where mid = ?", m['id'])
def randomNew(self):
return self.current()['newOrder'] == NEW_CARDS_RANDOM
@@ -212,7 +212,7 @@ select id from cards where fid in (select id from facts where mid = ?)""",
assert idx >= 0 and idx < len(m['flds'])
self.deck.modSchema()
m['sortf'] = idx
- self.deck.updateFieldCache(self.fids(m), csum=False)
+ self.deck.updateFieldCache(self.nids(m), csum=False)
self.save(m)
def addField(self, m, field):
@@ -234,7 +234,7 @@ select id from cards where fid in (select id from facts where mid = ?)""",
self._transformFields(m, delete)
if idx == self.sortIdx(m):
# need to rebuild
- self.deck.updateFieldCache(self.fids(m), csum=False)
+ self.deck.updateFieldCache(self.nids(m), csum=False)
# saves
self.renameField(m, field, None)
@@ -276,11 +276,11 @@ select id from cards where fid in (select id from facts where mid = ?)""",
self.deck.modSchema()
r = []
for (id, flds) in self.deck.db.execute(
- "select id, flds from facts where mid = ?", m['id']):
+ "select id, flds from notes where mid = ?", m['id']):
r.append((joinFields(fn(splitFields(flds))),
intTime(), self.deck.usn(), id))
self.deck.db.executemany(
- "update facts set flds=?,mod=?,usn=? where id = ?", r)
+ "update notes set flds=?,mod=?,usn=? where id = ?", r)
# Templates
##################################################
@@ -298,18 +298,18 @@ select id from cards where fid in (select id from facts where mid = ?)""",
self.save(m)
def remTemplate(self, m, template):
- "False if removing template would leave orphan facts."
+ "False if removing template would leave orphan notes."
# find cards using this template
ord = m['tmpls'].index(template)
cids = self.deck.db.list("""
-select c.id from cards c, facts f where c.fid=f.id and mid = ? and ord = ?""",
+select c.id from cards c, notes f where c.nid=f.id and mid = ? and ord = ?""",
m['id'], ord)
- # all facts with this template must have at least two cards, or we
- # could end up creating orphaned facts
+ # all notes with this template must have at least two cards, or we
+ # could end up creating orphaned notes
if self.deck.db.scalar("""
-select fid, count() from cards where
-fid in (select fid from cards where id in %s)
-group by fid
+select nid, count() from cards where
+nid in (select nid from cards where id in %s)
+group by nid
having count() < 2
limit 1""" % ids2str(cids)):
return False
@@ -319,7 +319,7 @@ limit 1""" % ids2str(cids)):
# shift ordinals
self.deck.db.execute("""
update cards set ord = ord - 1, usn = ?, mod = ?
- where fid in (select id from facts where mid = ?) and ord > ?""",
+ where nid in (select id from notes where mid = ?) and ord > ?""",
self.deck.usn(), intTime(), m['id'], ord)
m['tmpls'].remove(template)
self._updateTemplOrds(m)
@@ -345,8 +345,8 @@ update cards set ord = ord - 1, usn = ?, mod = ?
# apply
self.save(m)
self.deck.db.execute("""
-update cards set ord = (case %s end),usn=?,mod=? where fid in (
-select id from facts where mid = ?)""" % " ".join(map),
+update cards set ord = (case %s end),usn=?,mod=? where nid in (
+select id from notes where mid = ?)""" % " ".join(map),
self.deck.usn(), intTime(), m['id'])
# Model changing
@@ -354,19 +354,19 @@ select id from facts where mid = ?)""" % " ".join(map),
# - maps are ord->ord, and there should not be duplicate targets
# - newModel should be self if model is not changing
- def change(self, m, fids, newModel, fmap, cmap):
+ def change(self, m, nids, newModel, fmap, cmap):
self.deck.modSchema()
assert newModel['id'] == m['id'] or (fmap and cmap)
if fmap:
- self._changeFacts(fids, newModel, fmap)
+ self._changeNotes(nids, newModel, fmap)
if cmap:
- self._changeCards(fids, newModel, cmap)
+ self._changeCards(nids, newModel, cmap)
- def _changeFacts(self, fids, newModel, map):
+ def _changeNotes(self, nids, newModel, map):
d = []
nfields = len(newModel['flds'])
- for (fid, flds) in self.deck.db.execute(
- "select id, flds from facts where id in "+ids2str(fids)):
+ for (nid, flds) in self.deck.db.execute(
+ "select id, flds from notes where id in "+ids2str(nids)):
newflds = {}
flds = splitFields(flds)
for old, new in map.items():
@@ -375,17 +375,17 @@ select id from facts where mid = ?)""" % " ".join(map),
for c in range(nfields):
flds.append(newflds.get(c, ""))
flds = joinFields(flds)
- d.append(dict(fid=fid, flds=flds, mid=newModel['id'],
+ d.append(dict(nid=nid, flds=flds, mid=newModel['id'],
m=intTime(),u=self.deck.usn()))
self.deck.db.executemany(
- "update facts set flds=:flds,mid=:mid,mod=:m,usn=:u where id = :fid", d)
- self.deck.updateFieldCache(fids)
+ "update notes set flds=:flds,mid=:mid,mod=:m,usn=:u where id = :nid", d)
+ self.deck.updateFieldCache(nids)
- def _changeCards(self, fids, newModel, map):
+ def _changeCards(self, nids, newModel, map):
d = []
deleted = []
for (cid, ord) in self.deck.db.execute(
- "select id, ord from cards where fid in "+ids2str(fids)):
+ "select id, ord from cards where nid in "+ids2str(nids)):
if map[ord] is not None:
d.append(dict(
cid=cid,new=map[ord],u=self.deck.usn(),m=intTime()))
diff --git a/anki/facts.py b/anki/notes.py
similarity index 87%
rename from anki/facts.py
rename to anki/notes.py
index 5e93a0ba4..1329761e8 100644
--- a/anki/facts.py
+++ b/anki/notes.py
@@ -7,7 +7,7 @@ from anki.errors import AnkiError
from anki.utils import fieldChecksum, intTime, \
joinFields, splitFields, ids2str, stripHTML, timestampID, guid64
-class Fact(object):
+class Note(object):
def __init__(self, deck, model=None, id=None):
assert not (model and id)
@@ -16,7 +16,7 @@ class Fact(object):
self.id = id
self.load()
else:
- self.id = timestampID(deck.db, "facts")
+ self.id = timestampID(deck.db, "notes")
self.guid = guid64()
self._model = model
self.gid = model['gid']
@@ -38,7 +38,7 @@ class Fact(object):
self.flags,
self.data) = self.deck.db.first("""
select guid, mid, gid, mod, usn, tags, flds, flags, data
-from facts where id = ?""", self.id)
+from notes where id = ?""", self.id)
self.fields = splitFields(self.fields)
self.tags = self.deck.tags.split(self.tags)
self._model = self.deck.models.get(self.mid)
@@ -52,7 +52,7 @@ from facts where id = ?""", self.id)
sfld = stripHTML(self.fields[self.deck.models.sortIdx(self._model)])
tags = self.stringTags()
res = self.deck.db.execute("""
-insert or replace into facts values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
+insert or replace into notes values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
self.id, self.guid, self.mid, self.gid,
self.mod, self.usn, tags,
self.joinedFields(), sfld, self.flags, self.data)
@@ -66,7 +66,7 @@ insert or replace into facts values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
return joinFields(self.fields)
def updateFieldChecksums(self):
- self.deck.db.execute("delete from fsums where fid = ?", self.id)
+ self.deck.db.execute("delete from nsums where nid = ?", self.id)
d = []
for (ord, conf) in self._fmap.values():
if not conf['uniq']:
@@ -75,11 +75,11 @@ insert or replace into facts values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
if not val:
continue
d.append((self.id, self.mid, fieldChecksum(val)))
- self.deck.db.executemany("insert into fsums values (?, ?, ?)", d)
+ self.deck.db.executemany("insert into nsums values (?, ?, ?)", d)
def cards(self):
return [self.deck.getCard(id) for id in self.deck.db.list(
- "select id from cards where fid = ? order by ord", self.id)]
+ "select id from cards where nid = ? order by ord", self.id)]
def model(self):
return self._model
@@ -151,18 +151,18 @@ insert or replace into facts values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
return True
csum = fieldChecksum(val)
if self.id:
- lim = "and fid != :fid"
+ lim = "and nid != :nid"
else:
lim = ""
- fids = self.deck.db.list(
- "select fid from fsums where csum = ? and fid != ? and mid = ?",
+ nids = self.deck.db.list(
+ "select nid from nsums where csum = ? and nid != ? and mid = ?",
csum, self.id or 0, self.mid)
- if not fids:
+ if not nids:
return True
- # grab facts with the same checksums, and see if they're actually
+ # grab notes with the same checksums, and see if they're actually
# duplicates
- for flds in self.deck.db.list("select flds from facts where id in "+
- ids2str(fids)):
+ for flds in self.deck.db.list("select flds from notes where id in "+
+ ids2str(nids)):
fields = splitFields(flds)
if fields[ord] == val:
return False
@@ -185,19 +185,19 @@ insert or replace into facts values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
d.append((ord, None))
return [x[1] for x in sorted(d)]
- # Flushing cloze facts
+ # Flushing cloze notes
##################################################
def _clozePreFlush(self):
self.newlyAdded = not self.deck.db.scalar(
- "select 1 from cards where fid = ?", self.id)
+ "select 1 from cards where nid = ?", self.id)
tmpls = self.deck.findTemplates(self)
ok = []
for t in tmpls:
ok.append(t['ord'])
# check if there are cards referencing a deleted cloze
if self.deck.db.scalar(
- "select 1 from cards where fid = ? and ord not in %s" %
+ "select 1 from cards where nid = ? and ord not in %s" %
ids2str(ok), self.id):
# there are; abort, as the UI should have handled this
raise Exception("UI should have deleted cloze")
diff --git a/anki/sched.py b/anki/sched.py
index 10cc6a9b9..43b2efd1f 100644
--- a/anki/sched.py
+++ b/anki/sched.py
@@ -269,7 +269,7 @@ select id, due from cards where gid = ? and queue = 0 limit ?""", gid, lim)
self._newQueue.insert(0, self._newQueue.pop())
n -= 1
if not n:
- # we only have one fact in the queue; stop rotating
+ # we only have one note in the queue; stop rotating
break
self.newCount -= 1
return id
@@ -605,8 +605,8 @@ gid in %s and queue = 2 and due <= :lim %s limit %d""" % (
conf = self._cardConf(card)['rev']
# find sibling positions
dues = self.deck.db.list(
- "select due from cards where fid = ? and queue = 2"
- " and id != ?", card.fid, card.id)
+ "select due from cards where nid = ? and queue = 2"
+ " and id != ?", card.nid, card.id)
if not dues or idealDue not in dues:
return idealIvl
else:
@@ -637,7 +637,7 @@ gid in %s and queue = 2 and due <= :lim %s limit %d""" % (
if (lf >= card.lapses and
(card.lapses-lf) % (max(lf/2, 1)) == 0):
# add a leech tag
- f = card.fact()
+ f = card.note()
f.addTag("leech")
f.flush()
# handle
@@ -782,12 +782,12 @@ your short-term review workload will become."""))
"where queue = -1 and id in "+ ids2str(ids),
intTime(), self.deck.usn())
- def buryFact(self, fid):
- "Bury all cards for fact until next session."
+ def buryNote(self, nid):
+ "Bury all cards for note until next session."
self.deck.setDirty()
self.removeFailed(
- self.deck.db.list("select id from cards where fid = ?", fid))
- self.deck.db.execute("update cards set queue = -2 where fid = ?", fid)
+ self.deck.db.list("select id from cards where nid = ?", nid))
+ self.deck.db.execute("update cards set queue = -2 where nid = ?", nid)
# Resetting
##########################################################################
@@ -818,18 +818,18 @@ your short-term review workload will become."""))
def sortCards(self, cids, start=1, step=1, shuffle=False, shift=False):
scids = ids2str(cids)
now = intTime()
- fids = self.deck.db.list(
- ("select distinct fid from cards where type = 0 and id in %s "
- "order by fid") % scids)
- if not fids:
+ nids = self.deck.db.list(
+ ("select distinct nid from cards where type = 0 and id in %s "
+ "order by nid") % scids)
+ if not nids:
# no new cards
return
- # determine fid ordering
+ # determine nid ordering
due = {}
if shuffle:
- random.shuffle(fids)
- for c, fid in enumerate(fids):
- due[fid] = start+c*step
+ random.shuffle(nids)
+ for c, nid in enumerate(nids):
+ due[nid] = start+c*step
high = start+c*step
# shift?
if shift:
@@ -844,9 +844,9 @@ update cards set mod=?, usn=?, due=due+? where id not in %s
and due >= ?""" % scids, now, self.deck.usn(), shiftby, low)
# reorder cards
d = []
- for id, fid in self.deck.db.execute(
- "select id, fid from cards where type = 0 and id in "+scids):
- d.append(dict(now=now, due=due[fid], usn=self.deck.usn(), cid=id))
+ for id, nid in self.deck.db.execute(
+ "select id, nid from cards where type = 0 and id in "+scids):
+ d.append(dict(now=now, due=due[nid], usn=self.deck.usn(), cid=id))
self.deck.db.executemany(
"update cards set due=:due,mod=:now,usn=:usn where id = :cid""", d)
diff --git a/anki/stats.py b/anki/stats.py
index c0dd204c3..444c4d9aa 100644
--- a/anki/stats.py
+++ b/anki/stats.py
@@ -50,7 +50,7 @@ class CardStats(object):
self.addLine(_("Model"), c.model()['name'])
self.addLine(_("Template"), c.template()['name'])
self.addLine(_("Current Group"), self.deck.groups.name(c.gid))
- self.addLine(_("Home Group"), self.deck.groups.name(c.fact().gid))
+ self.addLine(_("Home Group"), self.deck.groups.name(c.note().gid))
self.txt += ""
return self.txt
@@ -538,10 +538,10 @@ group by hour having count() > 30 order by hour""" % lim,
# text data
i = []
(c, f) = self.deck.db.first("""
-select count(id), count(distinct fid) from cards
+select count(id), count(distinct nid) from cards
where gid in %s """ % self._limit())
self._line(i, _("Total cards"), c)
- self._line(i, _("Total facts"), f)
+ self._line(i, _("Total notes"), f)
(low, avg, high) = self._factors()
if low:
self._line(i, _("Lowest ease factor"), "%d%%" % low)
diff --git a/anki/storage.py b/anki/storage.py
index 3b795f11f..6f0a75b45 100644
--- a/anki/storage.py
+++ b/anki/storage.py
@@ -80,7 +80,7 @@ create table if not exists deck (
tags text not null
);
-create table if not exists facts (
+create table if not exists notes (
id integer primary key,
guid integer not null,
mid integer not null,
@@ -94,14 +94,14 @@ create table if not exists facts (
data text not null
);
-create table if not exists fsums (
- fid integer not null,
+create table if not exists nsums (
+ nid integer not null,
mid integer not null,
csum integer not null
);
create table if not exists cards (
id integer primary key,
- fid integer not null,
+ nid integer not null,
gid integer not null,
ord integer not null,
mod integer not null,
@@ -168,16 +168,16 @@ def _updateIndices(db):
"Add indices to the DB."
db.executescript("""
-- syncing
-create index if not exists ix_facts_usn on facts (usn);
+create index if not exists ix_notes_usn on notes (usn);
create index if not exists ix_cards_usn on cards (usn);
create index if not exists ix_revlog_usn on revlog (usn);
-- card spacing, etc
-create index if not exists ix_cards_fid on cards (fid);
+create index if not exists ix_cards_nid on cards (nid);
-- scheduling and group limiting
create index if not exists ix_cards_sched on cards (gid, queue, due);
-- revlog by card
create index if not exists ix_revlog_cid on revlog (cid);
-- field uniqueness check
-create index if not exists ix_fsums_fid on fsums (fid);
-create index if not exists ix_fsums_csum on fsums (csum);
+create index if not exists ix_nsums_nid on nsums (nid);
+create index if not exists ix_nsums_csum on nsums (csum);
""")
diff --git a/anki/sync.py b/anki/sync.py
index add11715a..041e65c95 100644
--- a/anki/sync.py
+++ b/anki/sync.py
@@ -128,10 +128,10 @@ class Syncer(object):
# some basic checks to ensure the sync went ok. this is slow, so will
# be removed before official release
assert not self.deck.db.scalar("""
-select count() from cards where fid not in (select id from facts)""")
+select count() from cards where nid not in (select id from notes)""")
assert not self.deck.db.scalar("""
-select count() from facts where id not in (select distinct fid from cards)""")
- for t in "cards", "facts", "revlog", "graves":
+select count() from notes where id not in (select distinct nid from cards)""")
+ for t in "cards", "notes", "revlog", "graves":
assert not self.deck.db.scalar(
"select count() from %s where usn = -1" % t)
for g in self.deck.groups.all():
@@ -142,9 +142,9 @@ select count() from facts where id not in (select distinct fid from cards)""")
assert m['usn'] != -1
return [
self.deck.db.scalar("select count() from cards"),
- self.deck.db.scalar("select count() from facts"),
+ self.deck.db.scalar("select count() from notes"),
self.deck.db.scalar("select count() from revlog"),
- self.deck.db.scalar("select count() from fsums"),
+ self.deck.db.scalar("select count() from nsums"),
self.deck.db.scalar("select count() from graves"),
len(self.deck.models.all()),
len(self.deck.tags.all()),
@@ -171,7 +171,7 @@ select count() from facts where id not in (select distinct fid from cards)""")
##########################################################################
def prepareToChunk(self):
- self.tablesLeft = ["revlog", "cards", "facts"]
+ self.tablesLeft = ["revlog", "cards", "notes"]
self.cursor = None
def cursorForTable(self, table):
@@ -184,12 +184,12 @@ select id, cid, %d, ease, ivl, lastIvl, factor, time, type
from revlog where %s""" % d)
elif table == "cards":
return x("""
-select id, fid, gid, ord, mod, %d, type, queue, due, ivl, factor, reps,
+select id, nid, gid, ord, mod, %d, type, queue, due, ivl, factor, reps,
lapses, left, edue, flags, data from cards where %s""" % d)
else:
return x("""
select id, guid, mid, gid, mod, %d, tags, flds, '', flags, data
-from facts where %s""" % d)
+from notes where %s""" % d)
def chunk(self):
buf = dict(done=False)
@@ -221,15 +221,15 @@ from facts where %s""" % d)
self.mergeRevlog(chunk['revlog'])
if "cards" in chunk:
self.mergeCards(chunk['cards'])
- if "facts" in chunk:
- self.mergeFacts(chunk['facts'])
+ if "notes" in chunk:
+ self.mergeNotes(chunk['notes'])
# Deletions
##########################################################################
def getGraves(self):
cards = []
- facts = []
+ notes = []
groups = []
if self.deck.server:
curs = self.deck.db.execute(
@@ -240,18 +240,18 @@ from facts where %s""" % d)
for oid, type in curs:
if type == REM_CARD:
cards.append(oid)
- elif type == REM_FACT:
- facts.append(oid)
+ elif type == REM_NOTE:
+ notes.append(oid)
else:
groups.append(oid)
if not self.deck.server:
self.deck.db.execute("update graves set usn=? where usn=-1",
self.maxUsn)
- return dict(cards=cards, facts=facts, groups=groups)
+ return dict(cards=cards, notes=notes, groups=groups)
def mergeGraves(self, graves):
- # facts first, so we don't end up with duplicate graves
- self.deck._remFacts(graves['facts'])
+ # notes first, so we don't end up with duplicate graves
+ self.deck._remNotes(graves['notes'])
self.deck.remCards(graves['cards'])
for oid in graves['groups']:
self.deck.groups.rem(oid)
@@ -326,7 +326,7 @@ from facts where %s""" % d)
def mergeTags(self, tags):
self.deck.tags.register(tags, usn=self.maxUsn)
- # Cards/facts/revlog
+ # Cards/notes/revlog
##########################################################################
def mergeRevlog(self, logs):
@@ -353,10 +353,10 @@ from facts where %s""" % d)
"(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
self.newerRows(cards, "cards", 4))
- def mergeFacts(self, facts):
- rows = self.newerRows(facts, "facts", 4)
+ def mergeNotes(self, notes):
+ rows = self.newerRows(notes, "notes", 4)
self.deck.db.executemany(
- "insert or replace into facts values (?,?,?,?,?,?,?,?,?,?,?)",
+ "insert or replace into notes values (?,?,?,?,?,?,?,?,?,?,?)",
rows)
self.deck.updateFieldCache([f[0] for f in rows])
diff --git a/anki/tags.py b/anki/tags.py
index 07de18723..49e9b64ea 100644
--- a/anki/tags.py
+++ b/anki/tags.py
@@ -10,7 +10,7 @@ Anki maintains a cache of used tags so it can quickly present a list of tags
for autocomplete and in the browser. For efficiency, deletions are not
tracked, so unused tags can only be removed from the list with a DB check.
-This module manages the tag cache and tags for facts.
+This module manages the tag cache and tags for notes.
"""
class TagManager(object):
@@ -45,17 +45,17 @@ class TagManager(object):
def all(self):
return self.tags.keys()
- def registerFacts(self, fids=None):
- "Add any missing tags from facts to the tags list."
+ def registerNotes(self, nids=None):
+ "Add any missing tags from notes to the tags list."
# when called without an argument, the old list is cleared first.
- if fids:
- lim = " where id in " + ids2str(fids)
+ if nids:
+ lim = " where id in " + ids2str(nids)
else:
lim = ""
self.tags = {}
self.changed = True
self.register(set(self.split(
- " ".join(self.deck.db.list("select distinct tags from facts"+lim)))))
+ " ".join(self.deck.db.list("select distinct tags from notes"+lim)))))
def allItems(self):
return self.tags.items()
@@ -63,7 +63,7 @@ class TagManager(object):
def save(self):
self.changed = True
- # Bulk addition/removal from facts
+ # Bulk addition/removal from notes
#############################################################
def bulkAdd(self, ids, tags, add=True):
@@ -73,7 +73,7 @@ class TagManager(object):
return
# cache tag names
self.register(newTags)
- # find facts missing the tags
+ # find notes missing the tags
if add:
l = "tags not "
fn = self.addToStr
@@ -83,18 +83,18 @@ class TagManager(object):
lim = " or ".join(
[l+"like :_%d" % c for c, t in enumerate(newTags)])
res = self.deck.db.all(
- "select id, tags from facts where id in %s and %s" % (
+ "select id, tags from notes where id in %s and %s" % (
ids2str(ids), lim),
**dict([("_%d" % x, '%% %s %%' % y)
for x, y in enumerate(newTags)]))
# update tags
- fids = []
+ nids = []
def fix(row):
- fids.append(row[0])
+ nids.append(row[0])
return {'id': row[0], 't': fn(tags, row[1]), 'n':intTime(),
'u':self.deck.usn()}
self.deck.db.executemany(
- "update facts set tags=:t,mod=:n,usn=:u where id = :id",
+ "update notes set tags=:t,mod=:n,usn=:u where id = :id",
[fix(row) for row in res])
def bulkRem(self, ids, tags):
@@ -149,12 +149,12 @@ class TagManager(object):
# Tag-based selective study
##########################################################################
- def selTagFids(self, yes, no):
+ def selTagNids(self, yes, no):
l = []
- # find facts that match yes
+ # find notes that match yes
lim = ""
args = []
- query = "select id from facts"
+ query = "select id from notes"
if not yes and not no:
pass
else:
@@ -172,7 +172,7 @@ class TagManager(object):
return self.deck.db.list(query, *args)
def setGroupForTags(self, yes, no, gid):
- fids = self.selTagFids(yes, no)
+ nids = self.selTagNids(yes, no)
self.deck.db.execute(
- "update cards set gid=?,mod=?,usn=? where fid in "+ids2str(fids),
+ "update cards set gid=?,mod=?,usn=? where nid in "+ids2str(nids),
gid, intTime(), self.deck.usn())
diff --git a/anki/upgrade.py b/anki/upgrade.py
index 69e333434..d3cad567e 100644
--- a/anki/upgrade.py
+++ b/anki/upgrade.py
@@ -133,7 +133,7 @@ analyze;""")
db.execute("pragma page_size = 4096")
db.execute("pragma legacy_file_format = 0")
- # facts
+ # notes
###########
# tags should have a leading and trailing space if not empty, and not
# use commas
@@ -177,7 +177,7 @@ select id, id, modelId, 1, cast(created*1000 as int), cast(modified as int),
# and put the facts into the new table
db.execute("drop table facts")
_addSchema(db, False)
- db.executemany("insert into facts values (?,?,?,?,?,?,?,?,'',0,'')", data)
+ db.executemany("insert into notes values (?,?,?,?,?,?,?,?,'',0,'')", data)
db.execute("drop table fields")
# cards
@@ -336,7 +336,7 @@ insert or replace into deck select id, cast(created as int), :t,
m['flds'] = self._fieldsForModel(row[0])
m['tmpls'] = self._templatesForModel(row[0], m['flds'])
mods[m['id']] = m
- db.execute("update facts set mid = ? where mid = ?", t, row[0])
+ db.execute("update notes set mid = ? where mid = ?", t, row[0])
# save and clean up
db.execute("update deck set models = ?", simplejson.dumps(mods))
db.execute("drop table fieldModels")
@@ -465,7 +465,7 @@ order by ordinal""", mid)):
# Media references
######################################################################
# In 2.0 we drop support for media and latex references in the template,
- # since they require generating card templates to see what media a fact
+ # since they require generating card templates to see what media a note
# uses, and are confusing for shared deck users. To ease the upgrade
# process, we automatically convert the references to new fields.
@@ -500,16 +500,16 @@ order by ordinal""", mid)):
# add the new field
f = deck.models.newField(fld)
deck.models.addField(m, f)
- # loop through facts and write reference into new field
+ # loop through notes and write reference into new field
data = []
for id, flds in self.deck.db.execute(
- "select id, flds from facts where id in "+
- ids2str(deck.models.fids(m))):
+ "select id, flds from notes where id in "+
+ ids2str(deck.models.nids(m))):
sflds = splitFields(flds)
ref = all.replace(fname, pre+sflds[idx]+suf)
data.append((flds+ref, id))
- # update facts
- deck.db.executemany("update facts set flds=? where id=?",
+ # update notes
+ deck.db.executemany("update notes set flds=? where id=?",
data)
# note field for future
state['mflds'][fname] = fld
@@ -544,7 +544,7 @@ order by ordinal""", mid)):
for t in m['tmpls']:
if not t['actv']:
if not d.db.scalar("""
-select 1 from cards where fid in (select id from facts where mid = ?)
+select 1 from cards where nid in (select id from notes where mid = ?)
and ord = ? limit 1""", m['id'], t['ord']):
remove.append(t)
del t['actv']
@@ -582,7 +582,7 @@ and ord = ? limit 1""", m['id'], t['ord']):
deck.crt = int(time.mktime(d.timetuple()))
deck.sched._updateCutoff()
# update uniq cache
- deck.updateFieldCache(deck.db.list("select id from facts"))
+ deck.updateFieldCache(deck.db.list("select id from notes"))
# remove old views
for v in ("failedCards", "revCardsOld", "revCardsNew",
"revCardsDue", "revCardsRandom", "acqCardsRandom",
@@ -595,11 +595,11 @@ and ord = ? limit 1""", m['id'], t['ord']):
deck.db.execute("update cards set queue=-2 where queue between 3 and 5")
deck.db.execute("update cards set queue=-3 where queue between 6 and 8")
# remove old deleted tables
- for t in ("cards", "facts", "models", "media"):
+ for t in ("cards", "notes", "models", "media"):
deck.db.execute("drop table if exists %sDeleted" % t)
# rewrite due times for new cards
deck.db.execute("""
-update cards set due = fid where type=0""")
+update cards set due = nid where type=0""")
# and failed cards
left = len(deck.groups.conf(1)['new']['delays'])
deck.db.execute("update cards set edue = ?, left=? where type = 1",
@@ -614,7 +614,7 @@ update cards set due = cast(
if deck.models.randomNew():
deck.sched.randomizeCards()
# update insertion id
- deck.conf['nextPos'] = deck.db.scalar("select max(id) from facts")+1
+ deck.conf['nextPos'] = deck.db.scalar("select max(id) from notes")+1
deck.save()
# optimize and finish
diff --git a/anki/utils.py b/anki/utils.py
index 2a60dfdc3..19acd2e32 100644
--- a/anki/utils.py
+++ b/anki/utils.py
@@ -185,7 +185,7 @@ def timestampID(db, table):
def maxID(db):
"Return the first safe ID to use."
now = intTime(1000)
- for tbl in "cards", "facts":
+ for tbl in "cards", "notes":
now = max(now, db.scalar(
"select max(id) from %s" % tbl))
return now + 1
diff --git a/tests/off/test_exporting.py b/tests/off/test_exporting.py
index ab0064e7a..c369f7b35 100644
--- a/tests/off/test_exporting.py
+++ b/tests/off/test_exporting.py
@@ -15,12 +15,12 @@ def setup1():
deck = Deck()
deck.addModel(BasicModel())
deck.currentModel.cardModels[1].active = True
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u"foo"; f['Back'] = u"bar"; f.tags = u"tag, tag2"
- deck.addFact(f)
- f = deck.newFact()
+ deck.addNote(f)
+ f = deck.newNote()
f['Front'] = u"baz"; f['Back'] = u"qux"
- deck.addFact(f)
+ deck.addNote(f)
##########################################################################
@@ -53,8 +53,8 @@ def test_export_textcard():
e.exportInto(f)
@nose.with_setup(setup1)
-def test_export_textfact():
- e = TextFactExporter(deck)
+def test_export_textnote():
+ e = TextNoteExporter(deck)
f = unicode(tempfile.mkstemp(prefix="ankitest")[1])
os.unlink(f)
e.exportInto(f)
diff --git a/tests/test_cards.py b/tests/test_cards.py
index 21d2eecc0..9e2462446 100644
--- a/tests/test_cards.py
+++ b/tests/test_cards.py
@@ -8,7 +8,7 @@ from tests.shared import getEmptyDeck
def test_previewCards():
deck = getEmptyDeck()
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u'1'
f['Back'] = u'2'
# non-empty and active
@@ -18,8 +18,8 @@ def test_previewCards():
# all templates
cards = deck.previewCards(f, 2)
assert len(cards) == 1
- # add the fact, and test existing preview
- deck.addFact(f)
+ # add the note, and test existing preview
+ deck.addNote(f)
cards = deck.previewCards(f, 1)
assert len(cards) == 1
assert cards[0].ord == 0
@@ -28,29 +28,29 @@ def test_previewCards():
def test_delete():
deck = getEmptyDeck()
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u'1'
f['Back'] = u'2'
- deck.addFact(f)
+ deck.addNote(f)
cid = f.cards()[0].id
deck.reset()
deck.sched.answerCard(deck.sched.getCard(), 2)
assert deck.db.scalar("select count() from revlog") == 1
deck.remCards([cid])
assert deck.cardCount() == 0
- assert deck.factCount() == 0
- assert deck.db.scalar("select count() from facts") == 0
+ assert deck.noteCount() == 0
+ assert deck.db.scalar("select count() from notes") == 0
assert deck.db.scalar("select count() from cards") == 0
- assert deck.db.scalar("select count() from fsums") == 0
+ assert deck.db.scalar("select count() from nsums") == 0
assert deck.db.scalar("select count() from revlog") == 0
assert deck.db.scalar("select count() from graves") == 2
def test_misc():
d = getEmptyDeck()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u'1'
f['Back'] = u'2'
- d.addFact(f)
+ d.addNote(f)
c = f.cards()[0]
id = d.models.current()['id']
assert c.template()['ord'] == 0
diff --git a/tests/test_deck.py b/tests/test_deck.py
index 8862716f3..f75ecdb07 100644
--- a/tests/test_deck.py
+++ b/tests/test_deck.py
@@ -41,12 +41,12 @@ def test_openReadOnly():
os.chmod(newPath, 0666)
os.unlink(newPath)
-def test_factAddDelete():
+def test_noteAddDelete():
deck = getEmptyDeck()
- # add a fact
- f = deck.newFact()
+ # add a note
+ f = deck.newNote()
f['Front'] = u"one"; f['Back'] = u"two"
- n = deck.addFact(f)
+ n = deck.addNote(f)
assert n == 1
# test multiple cards - add another template
m = deck.models.current(); mm = deck.models
@@ -61,10 +61,10 @@ def test_factAddDelete():
# should generate cards on close
mm.save(m, gencards=True)
assert deck.cardCount() == 2
- # creating new facts should use both cards
- f = deck.newFact()
+ # creating new notes should use both cards
+ f = deck.newNote()
f['Front'] = u"three"; f['Back'] = u"four"
- n = deck.addFact(f)
+ n = deck.addNote(f)
assert n == 2
assert deck.cardCount() == 4
# check q/a generation
@@ -74,7 +74,7 @@ def test_factAddDelete():
for p in f.problems():
assert not p
# now let's make a duplicate and test uniqueness
- f2 = deck.newFact()
+ f2 = deck.newNote()
f2.model()['flds'][1]['req'] = True
f2['Front'] = u"one"; f2['Back'] = u""
p = f2.problems()
@@ -84,66 +84,66 @@ def test_factAddDelete():
cards = f.cards()
id1 = cards[0].id; id2 = cards[1].id
assert deck.cardCount() == 4
- assert deck.factCount() == 2
+ assert deck.noteCount() == 2
deck.remCards([id1])
assert deck.cardCount() == 3
- assert deck.factCount() == 2
- # and the second should clear the fact
+ assert deck.noteCount() == 2
+ # and the second should clear the note
deck.remCards([id2])
assert deck.cardCount() == 2
- assert deck.factCount() == 1
+ assert deck.noteCount() == 1
def test_fieldChecksum():
deck = getEmptyDeck()
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u"new"; f['Back'] = u"new2"
- deck.addFact(f)
+ deck.addNote(f)
assert deck.db.scalar(
- "select csum from fsums") == int("c2a6b03f", 16)
+ "select csum from nsums") == int("c2a6b03f", 16)
# empty field should have no checksum
f['Front'] = u""
f.flush()
assert deck.db.scalar(
- "select count() from fsums") == 0
+ "select count() from nsums") == 0
# changing the val should change the checksum
f['Front'] = u"newx"
f.flush()
assert deck.db.scalar(
- "select csum from fsums") == int("302811ae", 16)
- # turning off unique and modifying the fact should delete the sum
+ "select csum from nsums") == int("302811ae", 16)
+ # turning off unique and modifying the note should delete the sum
m = f.model()
m['flds'][0]['uniq'] = False
deck.models.save(m)
f.flush()
assert deck.db.scalar(
- "select count() from fsums") == 0
+ "select count() from nsums") == 0
# and turning on both should ensure two checksums generated
m['flds'][0]['uniq'] = True
m['flds'][1]['uniq'] = True
deck.models.save(m)
f.flush()
assert deck.db.scalar(
- "select count() from fsums") == 2
+ "select count() from nsums") == 2
def test_selective():
deck = getEmptyDeck()
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u"1"; f.tags = ["one", "three"]
- deck.addFact(f)
- f = deck.newFact()
+ deck.addNote(f)
+ f = deck.newNote()
f['Front'] = u"2"; f.tags = ["two", "three", "four"]
- deck.addFact(f)
- f = deck.newFact()
+ deck.addNote(f)
+ f = deck.newNote()
f['Front'] = u"3"; f.tags = ["one", "two", "three", "four"]
- deck.addFact(f)
- assert len(deck.tags.selTagFids(["one"], [])) == 2
- assert len(deck.tags.selTagFids(["three"], [])) == 3
- assert len(deck.tags.selTagFids([], ["three"])) == 0
- assert len(deck.tags.selTagFids(["one"], ["three"])) == 0
- assert len(deck.tags.selTagFids(["one"], ["two"])) == 1
- assert len(deck.tags.selTagFids(["two", "three"], [])) == 3
- assert len(deck.tags.selTagFids(["two", "three"], ["one"])) == 1
- assert len(deck.tags.selTagFids(["one", "three"], ["two", "four"])) == 1
+ deck.addNote(f)
+ assert len(deck.tags.selTagNids(["one"], [])) == 2
+ assert len(deck.tags.selTagNids(["three"], [])) == 3
+ assert len(deck.tags.selTagNids([], ["three"])) == 0
+ assert len(deck.tags.selTagNids(["one"], ["three"])) == 0
+ assert len(deck.tags.selTagNids(["one"], ["two"])) == 1
+ assert len(deck.tags.selTagNids(["two", "three"], [])) == 3
+ assert len(deck.tags.selTagNids(["two", "three"], ["one"])) == 1
+ assert len(deck.tags.selTagNids(["one", "three"], ["two", "four"])) == 1
deck.tags.setGroupForTags(["three"], [], 3)
assert deck.db.scalar("select count() from cards where gid = 3") == 3
deck.tags.setGroupForTags(["one"], [], 2)
@@ -151,12 +151,12 @@ def test_selective():
def test_addDelTags():
deck = getEmptyDeck()
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u"1"
- deck.addFact(f)
- f2 = deck.newFact()
+ deck.addNote(f)
+ f2 = deck.newNote()
f2['Front'] = u"2"
- deck.addFact(f2)
+ deck.addNote(f2)
# adding for a given id
deck.tags.bulkAdd([f.id], "foo")
f.load(); f2.load()
diff --git a/tests/test_find.py b/tests/test_find.py
index 4ab77737e..afbe2950e 100644
--- a/tests/test_find.py
+++ b/tests/test_find.py
@@ -4,25 +4,25 @@ from tests.shared import getEmptyDeck
def test_findCards():
deck = getEmptyDeck()
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u'dog'
f['Back'] = u'cat'
f.tags.append(u"monkey")
f1id = f.id
- deck.addFact(f)
+ deck.addNote(f)
firstCardId = f.cards()[0].id
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u'goats are fun'
f['Back'] = u'sheep'
f.tags.append(u"sheep goat horse")
- deck.addFact(f)
+ deck.addNote(f)
f2id = f.id
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u'cat'
f['Back'] = u'sheep'
- deck.addFact(f)
+ deck.addNote(f)
catCard = f.cards()[0]
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u'template test'
f['Back'] = u'foo bar'
m = deck.models.current(); mm = deck.models
@@ -31,7 +31,7 @@ def test_findCards():
t['afmt'] = "{{Front}}"
mm.addTemplate(m, t)
mm.save(m)
- deck.addFact(f)
+ deck.addNote(f)
latestCardIds = [c.id for c in f.cards()]
# tag searches
assert not deck.findCards("tag:donkey")
@@ -41,11 +41,11 @@ def test_findCards():
assert len(deck.findCards("tag:monkey")) == 1
assert len(deck.findCards("tag:sheep -tag:monkey")) == 1
assert len(deck.findCards("-tag:sheep")) == 4
- deck.tags.bulkAdd(deck.db.list("select id from facts"), "foo bar")
+ deck.tags.bulkAdd(deck.db.list("select id from notes"), "foo bar")
assert (len(deck.findCards("tag:foo")) ==
len(deck.findCards("tag:bar")) ==
5)
- deck.tags.bulkRem(deck.db.list("select id from facts"), "foo")
+ deck.tags.bulkRem(deck.db.list("select id from notes"), "foo")
assert len(deck.findCards("tag:foo")) == 0
assert len(deck.findCards("tag:bar")) == 5
# text searches
@@ -71,10 +71,10 @@ def test_findCards():
import time; time.sleep(1)
c.flush()
assert deck.findCards("is:suspended") == [c.id]
- # fids
- assert deck.findCards("fid:54321") == []
- assert len(deck.findCards("fid:%d"%f.id)) == 2
- assert len(deck.findCards("fid:%d,%d" % (f1id, f2id))) == 2
+ # nids
+ assert deck.findCards("nid:54321") == []
+ assert len(deck.findCards("nid:%d"%f.id)) == 2
+ assert len(deck.findCards("nid:%d,%d" % (f1id, f2id))) == 2
# templates
assert len(deck.findCards("card:foo")) == 0
assert len(deck.findCards("card:forward")) == 4
@@ -89,10 +89,10 @@ def test_findCards():
assert len(deck.findCards("-back:sheep")) == 3
assert len(deck.findCards("front:")) == 5
# ordering
- deck.conf['sortType'] = "factCrt"
+ deck.conf['sortType'] = "noteCrt"
assert deck.findCards("front:")[-1] in latestCardIds
assert deck.findCards("")[-1] in latestCardIds
- deck.conf['sortType'] = "factFld"
+ deck.conf['sortType'] = "noteFld"
assert deck.findCards("")[0] == catCard.id
assert deck.findCards("")[-1] in latestCardIds
deck.conf['sortType'] = "cardMod"
@@ -109,10 +109,10 @@ def test_findCards():
assert len(deck.findCards("-group:default")) == 0
assert len(deck.findCards("-group:foo")) == 5
# full search
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u'helloworld'
f['Back'] = u''
- deck.addFact(f)
+ deck.addNote(f)
assert len(deck.findCards("helloworld")) == 0
assert len(deck.findCards("helloworld", full=True)) == 1
assert len(deck.findCards("front:helloworld")) == 0
@@ -122,27 +122,27 @@ def test_findCards():
def test_findReplace():
deck = getEmptyDeck()
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u'foo'
f['Back'] = u'bar'
- deck.addFact(f)
- f2 = deck.newFact()
+ deck.addNote(f)
+ f2 = deck.newNote()
f2['Front'] = u'baz'
f2['Back'] = u'foo'
- deck.addFact(f2)
- fids = [f.id, f2.id]
+ deck.addNote(f2)
+ nids = [f.id, f2.id]
# should do nothing
- assert deck.findReplace(fids, "abc", "123") == 0
+ assert deck.findReplace(nids, "abc", "123") == 0
# global replace
- assert deck.findReplace(fids, "foo", "qux") == 2
+ assert deck.findReplace(nids, "foo", "qux") == 2
f.load(); assert f['Front'] == "qux"
f2.load(); assert f2['Back'] == "qux"
# single field replace
- assert deck.findReplace(fids, "qux", "foo", field="Front") == 1
+ assert deck.findReplace(nids, "qux", "foo", field="Front") == 1
f.load(); assert f['Front'] == "foo"
f2.load(); assert f2['Back'] == "qux"
# regex replace
- assert deck.findReplace(fids, "B.r", "reg") == 0
+ assert deck.findReplace(nids, "B.r", "reg") == 0
f.load(); assert f['Back'] != "reg"
- assert deck.findReplace(fids, "B.r", "reg", regex=True) == 1
+ assert deck.findReplace(nids, "B.r", "reg", regex=True) == 1
f.load(); assert f['Back'] == "reg"
diff --git a/tests/test_groups.py b/tests/test_groups.py
index b730dad2d..722f8d128 100644
--- a/tests/test_groups.py
+++ b/tests/test_groups.py
@@ -39,12 +39,12 @@ def test_remove():
deck = getEmptyDeck()
# can't remove the default group
assertException(AssertionError, lambda: deck.groups.rem(1))
- # create a new group, and add a fact/card to it
+ # create a new group, and add a note/card to it
g1 = deck.groups.id("g1")
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u"1"
f.gid = g1
- deck.addFact(f)
+ deck.addNote(f)
c = f.cards()[0]
assert c.gid == g1
# by default deleting the group leaves the cards with an invalid gid
@@ -58,10 +58,10 @@ def test_remove():
# let's create another group and explicitly set the card to it
g2 = deck.groups.id("g2")
c.gid = g2; c.flush()
- # this time we'll delete the card/fact too
+ # this time we'll delete the card/note too
deck.groups.rem(g2, cardsToo=True)
assert deck.cardCount() == 0
- assert deck.factCount() == 0
+ assert deck.noteCount() == 0
def test_rename():
d = getEmptyDeck()
diff --git a/tests/test_importing.py b/tests/test_importing.py
index 368104d66..0437e8be4 100644
--- a/tests/test_importing.py
+++ b/tests/test_importing.py
@@ -8,23 +8,23 @@ from anki.errors import *
from anki import Deck
from anki.importing import Anki1Importer, Anki2Importer, TextImporter, \
SupermemoXmlImporter
-from anki.facts import Fact
+from anki.notes import Note
from anki.db import *
testDir = os.path.dirname(__file__)
-srcFacts=None
+srcNotes=None
srcCards=None
def test_anki2():
- global srcFacts, srcCards
+ global srcNotes, srcCards
# get the deck to import
tmp = getUpgradeDeckPath()
u = Upgrader()
src = u.upgrade(tmp)
srcpath = src.path
- srcFacts = src.factCount()
+ srcNotes = src.noteCount()
srcCards = src.cardCount()
srcRev = src.db.scalar("select count() from revlog")
# add a media file for testing
@@ -36,14 +36,14 @@ def test_anki2():
imp = Anki2Importer(dst, srcpath)
imp.run()
def check():
- assert dst.factCount() == srcFacts
+ assert dst.noteCount() == srcNotes
assert dst.cardCount() == srcCards
assert srcRev == dst.db.scalar("select count() from revlog")
mids = [int(x) for x in dst.models.models.keys()]
assert not dst.db.scalar(
- "select count() from facts where mid not in "+ids2str(mids))
+ "select count() from notes where mid not in "+ids2str(mids))
assert not dst.db.scalar(
- "select count() from cards where fid not in (select id from facts)")
+ "select count() from cards where nid not in (select id from notes)")
assert not dst.db.scalar(
"select count() from revlog where cid not in (select id from cards)")
assert dst.fixIntegrity().startswith("Database rebuilt")
@@ -68,7 +68,7 @@ def test_anki1():
imp = Anki1Importer(dst, tmp)
imp.run()
def check():
- assert dst.factCount() == srcFacts
+ assert dst.noteCount() == srcNotes
assert dst.cardCount() == srcCards
assert len(os.listdir(dst.media.dir())) == 1
check()
@@ -96,9 +96,9 @@ def test_csv_tags():
file = unicode(os.path.join(testDir, "importing/text-tags.txt"))
i = csvfile.TextImporter(deck, file)
i.run()
- facts = deck.db.query(Fact).all()
- assert len(facts) == 2
- assert facts[0].tags == "baz qux" or facts[1].tags == "baz qux"
+ notes = deck.db.query(Note).all()
+ assert len(notes) == 2
+ assert notes[0].tags == "baz qux" or notes[1].tags == "baz qux"
deck.close()
def test_supermemo_xml_01_unicode():
diff --git a/tests/test_latex.py b/tests/test_latex.py
index 09978703f..1ce6c425c 100644
--- a/tests/test_latex.py
+++ b/tests/test_latex.py
@@ -10,10 +10,10 @@ def test_latex():
# change latex cmd to simulate broken build
import anki.latex
anki.latex.latexCmd[0] = "nolatex"
- # add a fact with latex
- f = d.newFact()
+ # add a note with latex
+ f = d.newNote()
f['Front'] = u"[latex]hello[/latex]"
- d.addFact(f)
+ d.addNote(f)
# but since latex couldn't run, there's nothing there
assert len(os.listdir(d.media.dir())) == 0
# check the error message
@@ -31,25 +31,25 @@ def test_latex():
d.media.check()
assert len(os.listdir(d.media.dir())) == 1
assert ".png" in f.cards()[0].q()
- # adding new facts should cause generation on question display
- f = d.newFact()
+ # adding new notes should cause generation on question display
+ f = d.newNote()
f['Front'] = u"[latex]world[/latex]"
- d.addFact(f)
+ d.addNote(f)
f.cards()[0].q()
assert len(os.listdir(d.media.dir())) == 2
- # another fact with the same media should reuse
- f = d.newFact()
+ # another note with the same media should reuse
+ f = d.newNote()
f['Front'] = u" [latex]world[/latex]"
- d.addFact(f)
+ d.addNote(f)
assert len(os.listdir(d.media.dir())) == 2
oldcard = f.cards()[0]
assert ".png" in oldcard.q()
# if we turn off building, then previous cards should work, but cards with
# missing media will show the latex
anki.latex.build = False
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"[latex]foo[/latex]"
- d.addFact(f)
+ d.addNote(f)
assert len(os.listdir(d.media.dir())) == 2
assert stripHTML(f.cards()[0].q()) == "[latex]foo[/latex]"
assert ".png" in oldcard.q()
diff --git a/tests/test_media.py b/tests/test_media.py
index 42a973c2f..a41f2cb5d 100644
--- a/tests/test_media.py
+++ b/tests/test_media.py
@@ -46,14 +46,14 @@ def test_deckIntegration():
# put a file into it
file = unicode(os.path.join(testDir, "support/fake.png"))
d.media.addFile(file)
- # add a fact which references it
- f = d.newFact()
+ # add a note which references it
+ f = d.newNote()
f['Front'] = u"one"; f['Back'] = u"
"
- d.addFact(f)
+ d.addNote(f)
# and one which references a non-existent file
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"; f['Back'] = u"
"
- d.addFact(f)
+ d.addNote(f)
# and add another file which isn't used
open(os.path.join(d.media.dir(), "foo.jpg"), "wb").write("test")
# check media
diff --git a/tests/test_models.py b/tests/test_models.py
index e62f7cd9b..6b496fe37 100644
--- a/tests/test_models.py
+++ b/tests/test_models.py
@@ -5,10 +5,10 @@ from anki.utils import stripHTML
def test_modelDelete():
deck = getEmptyDeck()
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u'1'
f['Back'] = u'2'
- deck.addFact(f)
+ deck.addNote(f)
assert deck.cardCount() == 1
deck.models.rem(deck.models.current())
assert deck.cardCount() == 0
@@ -28,10 +28,10 @@ def test_modelCopy():
def test_fields():
d = getEmptyDeck()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u'1'
f['Back'] = u'2'
- d.addFact(f)
+ d.addNote(f)
m = d.models.current()
# make sure renaming a field updates the templates
d.models.renameField(m, m['flds'][0], "NewFront")
@@ -41,37 +41,37 @@ def test_fields():
f = d.models.newField(m)
f['name'] = "foo"
d.models.addField(m, f)
- assert d.getFact(d.models.fids(m)[0]).fields == ["1", "2", ""]
+ assert d.getNote(d.models.nids(m)[0]).fields == ["1", "2", ""]
assert d.models.scmhash(m) != h
# rename it
d.models.renameField(m, f, "bar")
- assert d.getFact(d.models.fids(m)[0])['bar'] == ''
+ assert d.getNote(d.models.nids(m)[0])['bar'] == ''
# delete back
d.models.remField(m, m['flds'][1])
- assert d.getFact(d.models.fids(m)[0]).fields == ["1", ""]
+ assert d.getNote(d.models.nids(m)[0]).fields == ["1", ""]
# move 0 -> 1
d.models.moveField(m, m['flds'][0], 1)
- assert d.getFact(d.models.fids(m)[0]).fields == ["", "1"]
+ assert d.getNote(d.models.nids(m)[0]).fields == ["", "1"]
# move 1 -> 0
d.models.moveField(m, m['flds'][1], 0)
- assert d.getFact(d.models.fids(m)[0]).fields == ["1", ""]
+ assert d.getNote(d.models.nids(m)[0]).fields == ["1", ""]
# add another and put in middle
f = d.models.newField(m)
f['name'] = "baz"
d.models.addField(m, f)
- f = d.getFact(d.models.fids(m)[0])
+ f = d.getNote(d.models.nids(m)[0])
f['baz'] = "2"
f.flush()
- assert d.getFact(d.models.fids(m)[0]).fields == ["1", "", "2"]
+ assert d.getNote(d.models.nids(m)[0]).fields == ["1", "", "2"]
# move 2 -> 1
d.models.moveField(m, m['flds'][2], 1)
- assert d.getFact(d.models.fids(m)[0]).fields == ["1", "2", ""]
+ assert d.getNote(d.models.nids(m)[0]).fields == ["1", "2", ""]
# move 0 -> 2
d.models.moveField(m, m['flds'][0], 2)
- assert d.getFact(d.models.fids(m)[0]).fields == ["2", "", "1"]
+ assert d.getNote(d.models.nids(m)[0]).fields == ["2", "", "1"]
# move 0 -> 1
d.models.moveField(m, m['flds'][0], 1)
- assert d.getFact(d.models.fids(m)[0]).fields == ["", "2", "1"]
+ assert d.getNote(d.models.nids(m)[0]).fields == ["", "2", "1"]
def test_templates():
d = getEmptyDeck()
@@ -81,10 +81,10 @@ def test_templates():
t['afmt'] = "{{Front}}"
mm.addTemplate(m, t)
mm.save(m)
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u'1'
f['Back'] = u'2'
- d.addFact(f)
+ d.addNote(f)
assert d.cardCount() == 2
(c, c2) = f.cards()
# first card should have first ord
@@ -102,7 +102,7 @@ def test_templates():
c = f.cards()[0]
assert c.ord == 0
stripHTML(c.q()) == "2"
- # it shouldn't be possible to orphan facts by removing templates
+ # it shouldn't be possible to orphan notes by removing templates
assert not d.models.remTemplate(m, m['tmpls'][0])
def test_text():
@@ -110,22 +110,22 @@ def test_text():
m = d.models.current()
m['tmpls'][0]['qfmt'] = "{{text:Front}}"
d.models.save(m)
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u'helloworld'
- d.addFact(f)
+ d.addNote(f)
assert "helloworld" in f.cards()[0].q()
def test_cloze():
d = getEmptyDeck()
d.models.setCurrent(d.models.byName("Cloze"))
- f = d.newFact()
+ f = d.newNote()
assert f.model()['name'] == "Cloze"
# a cloze model with no clozes is empty
f['Text'] = u'nothing'
- assert d.addFact(f) == 0
+ assert d.addNote(f) == 0
# try with one cloze
f['Text'] = "hello {{c1::world}}"
- assert d.addFact(f) == 1
+ assert d.addNote(f) == 1
assert "hello [...]" in f.cards()[0].q()
# the default is no context
assert "world" in f.cards()[0].a()
@@ -134,15 +134,15 @@ def test_cloze():
f.model()['clozectx'] = True
assert "hello world" in f.cards()[0].a()
# and with a comment
- f = d.newFact()
+ f = d.newNote()
f['Text'] = "hello {{c1::world::typical}}"
- assert d.addFact(f) == 1
+ assert d.addNote(f) == 1
assert "[...(typical)]" in f.cards()[0].q()
assert "world" in f.cards()[0].a()
# and with 2 clozes
- f = d.newFact()
+ f = d.newNote()
f['Text'] = "hello {{c1::world}} {{c2::bar}}"
- assert d.addFact(f) == 2
+ assert d.addNote(f) == 2
(c1, c2) = f.cards()
assert "[...] bar" in c1.q()
assert "world bar" in c1.a()
@@ -151,21 +151,21 @@ def test_cloze():
# if there are multiple answers for a single cloze, they are given in a
# list
f.model()['clozectx'] = False
- f = d.newFact()
+ f = d.newNote()
f['Text'] = "a {{c1::b}} {{c1::c}}"
- assert d.addFact(f) == 1
+ assert d.addNote(f) == 1
assert "b, c" in (
f.cards()[0].a())
# clozes should be supported in sections too
m = d.models.current()
m['tmpls'][0]['qfmt'] = "{{#cloze:1:Text}}{{Notes}}{{/cloze:1:Text}}"
d.models.save(m)
- f = d.newFact()
+ f = d.newNote()
f['Text'] = "hello"
f['Notes'] = "world"
- assert d.addFact(f) == 0
+ assert d.addNote(f) == 0
f['Text'] = "hello {{c1::foo}}"
- assert d.addFact(f) == 1
+ assert d.addNote(f) == 1
# deleting a cloze should fail; the ui should clean up invalid cards
cnt = d.cardCount()
f['Text'] = "hello"
@@ -181,17 +181,17 @@ def test_modelChange():
deck = getEmptyDeck()
basic = deck.models.byName("Basic")
cloze = deck.models.byName("Cloze")
- # enable second template and add a fact
+ # enable second template and add a note
m = deck.models.current(); mm = deck.models
t = mm.newTemplate("Reverse")
t['qfmt'] = "{{Back}}"
t['afmt'] = "{{Front}}"
mm.addTemplate(m, t)
mm.save(m)
- f = deck.newFact()
+ f = deck.newNote()
f['Front'] = u'f'
f['Back'] = u'b'
- deck.addFact(f)
+ deck.addNote(f)
# switch fields
map = {0: 1, 1: 0}
deck.models.change(basic, [f.id], basic, map, None)
@@ -231,11 +231,11 @@ def test_modelChange():
f.load()
assert f['Front'] == ''
assert f['Back'] == 'f'
- # another fact to try model conversion
- f = deck.newFact()
+ # another note to try model conversion
+ f = deck.newNote()
f['Front'] = u'f2'
f['Back'] = u'b2'
- deck.addFact(f)
+ deck.addNote(f)
assert deck.models.useCount(basic) == 2
assert deck.models.useCount(cloze) == 0
map = {0: 0, 1: 1}
diff --git a/tests/test_remote_sync.py b/tests/test_remote_sync.py
index f3598b525..b5360ce75 100644
--- a/tests/test_remote_sync.py
+++ b/tests/test_remote_sync.py
@@ -8,7 +8,7 @@ from anki import Deck
from anki.utils import intTime
from anki.sync import Syncer, FullSyncer, LocalServer, RemoteServer, \
MediaSyncer, RemoteMediaServer
-from anki.facts import Fact
+from anki.notes import Note
from anki.cards import Card
from tests.shared import getEmptyDeck
diff --git a/tests/test_sched.py b/tests/test_sched.py
index eeefb887a..e7b4b812a 100644
--- a/tests/test_sched.py
+++ b/tests/test_sched.py
@@ -13,10 +13,10 @@ def test_basics():
def test_new():
d = getEmptyDeck()
assert d.sched.newCount == 0
- # add a fact
- f = d.newFact()
+ # add a note
+ f = d.newNote()
f['Front'] = u"one"; f['Back'] = u"two"
- d.addFact(f)
+ d.addNote(f)
d.reset()
assert d.sched.newCount == 1
# fetch it
@@ -38,12 +38,12 @@ def test_new():
t['afmt'] = "{{Front}}"
mm.addTemplate(m, t)
mm.save(m)
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"2"; f['Back'] = u"2"
- d.addFact(f)
- f = d.newFact()
+ d.addNote(f)
+ f = d.newNote()
f['Front'] = u"3"; f['Back'] = u"3"
- d.addFact(f)
+ d.addNote(f)
d.reset()
qs = ("2", "3", "2", "3")
for n in range(4):
@@ -53,14 +53,14 @@ def test_new():
def test_newLimits():
d = getEmptyDeck()
- # add some facts
+ # add some notes
g2 = d.groups.id("Default::foo")
for i in range(30):
- f = d.newFact()
+ f = d.newNote()
f['Front'] = str(i)
if i > 4:
f.gid = g2
- d.addFact(f)
+ d.addNote(f)
# give the child group a different configuration
c2 = d.groups.confId("new conf")
d.groups.setConf(d.groups.get(g2), c2)
@@ -92,11 +92,11 @@ def test_newOrder():
t['actv'] = i > 25
d.models.addTemplate(m, t)
d.models.save(m)
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u'1'
f['Back'] = u'2'
# add first half
- d.addFact(f)
+ d.addNote(f)
# generate second half
d.db.execute("update cards set gid = random()")
d.conf['newPerDay'] = 100
@@ -106,9 +106,9 @@ def test_newOrder():
def test_newBoxes():
d = getEmptyDeck()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
d.reset()
c = d.sched.getCard()
d.sched._cardConf(c)['new']['delays'] = [1,2,3,4,5]
@@ -119,10 +119,10 @@ def test_newBoxes():
def test_learn():
d = getEmptyDeck()
- # add a fact
- f = d.newFact()
+ # add a note
+ f = d.newNote()
f['Front'] = u"one"; f['Back'] = u"two"
- f = d.addFact(f)
+ f = d.addNote(f)
# set as a learn card and rebuild queues
d.db.execute("update cards set queue=0, type=0")
d.reset()
@@ -191,10 +191,10 @@ def test_learn():
def test_reviews():
d = getEmptyDeck()
- # add a fact
- f = d.newFact()
+ # add a note
+ f = d.newNote()
f['Front'] = u"one"; f['Back'] = u"two"
- d.addFact(f)
+ d.addNote(f)
# set the card up as a review card, due 8 days ago
c = f.cards()[0]
c.type = 2
@@ -286,9 +286,9 @@ def test_finished():
# nothing due
assert "Congratulations" in d.sched.finishedMsg()
assert "limit" not in d.sched.finishedMsg()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"; f['Back'] = u"two"
- d.addFact(f)
+ d.addNote(f)
# have a new card
assert "new cards available" in d.sched.finishedMsg()
# turn it into a review
@@ -301,9 +301,9 @@ def test_finished():
def test_nextIvl():
d = getEmptyDeck()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"; f['Back'] = u"two"
- d.addFact(f)
+ d.addNote(f)
d.reset()
c = d.sched.getCard()
d.sched._cardConf(c)['new']['delays'] = [0.5, 3, 10]
@@ -356,12 +356,12 @@ def test_nextIvl():
def test_misc():
d = getEmptyDeck()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
c = f.cards()[0]
# burying
- d.sched.buryFact(c.fid)
+ d.sched.buryNote(c.nid)
d.reset()
assert not d.sched.getCard()
d.sched.onClose()
@@ -370,9 +370,9 @@ def test_misc():
def test_suspend():
d = getEmptyDeck()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
c = f.cards()[0]
# suspending
d.reset()
@@ -403,9 +403,9 @@ def test_cram():
print "disabled for now"
return
d = getEmptyDeck()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
c = f.cards()[0]
c.ivl = 100
c.type = c.queue = 2
@@ -485,9 +485,9 @@ def test_cramLimits():
d = getEmptyDeck()
# create three cards, due tomorrow, the next, etc
for i in range(3):
- f = d.newFact()
+ f = d.newNote()
f['Front'] = str(i)
- d.addFact(f)
+ d.addNote(f)
c = f.cards()[0]
c.type = c.queue = 2
c.due = d.sched.today + 1 + i
@@ -539,10 +539,10 @@ def test_adjIvl():
t['afmt'] = "{{Back}}"
d.models.addTemplate(m, t)
d.models.save(m)
- # create a new fact; it should have 4 cards
- f = d.newFact()
+ # create a new note; it should have 4 cards
+ f = d.newNote()
f['Front'] = "1"; f['Back'] = "1"
- d.addFact(f)
+ d.addNote(f)
assert d.cardCount() == 4
d.reset()
# immediately remove first; it should get ideal ivl
@@ -561,10 +561,10 @@ def test_adjIvl():
c = d.sched.getCard()
d.sched.answerCard(c, 3)
assert c.ivl == 4
- # try again with another fact
- f = d.newFact()
+ # try again with another note
+ f = d.newNote()
f['Front'] = "2"; f['Back'] = "2"
- d.addFact(f)
+ d.addNote(f)
d.reset()
# set a minSpacing of 0
conf = d.sched._cardConf(c)
@@ -601,10 +601,10 @@ def test_ordcycle():
t['afmt'] = "{{Back}}"
mm.addTemplate(m, t)
mm.save(m)
- # create a new fact; it should have 3 cards
- f = d.newFact()
+ # create a new note; it should have 3 cards
+ f = d.newNote()
f['Front'] = "1"; f['Back'] = "1"
- d.addFact(f)
+ d.addNote(f)
assert d.cardCount() == 3
d.reset()
# ordinals should arrive in order
@@ -620,10 +620,10 @@ def test_cardcounts():
for type in range(3):
# and each of the groups
for gid in (1,grp):
- # create a new fact
- f = d.newFact()
+ # create a new note
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
c = f.cards()[0]
# set type/gid
c.type = type
@@ -641,9 +641,9 @@ def test_cardcounts():
def test_counts_idx():
d = getEmptyDeck()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"; f['Back'] = u"two"
- d.addFact(f)
+ d.addNote(f)
d.reset()
assert d.sched.cardCounts() == (1, 0, 0)
c = d.sched.getCard()
@@ -663,9 +663,9 @@ def test_counts_idx():
def test_repCounts():
d = getEmptyDeck()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
d.reset()
# lrnReps should be accurate on pass/fail
assert d.sched.repCounts() == (1, 0, 0)
@@ -681,9 +681,9 @@ def test_repCounts():
assert d.sched.repCounts() == (0, 1, 0)
d.sched.answerCard(d.sched.getCard(), 2)
assert d.sched.repCounts() == (0, 0, 0)
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"two"
- d.addFact(f)
+ d.addNote(f)
d.reset()
# initial pass should be correct too
d.sched.answerCard(d.sched.getCard(), 2)
@@ -693,16 +693,16 @@ def test_repCounts():
d.sched.answerCard(d.sched.getCard(), 3)
assert d.sched.repCounts() == (0, 0, 0)
# immediate graduate should work
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"three"
- d.addFact(f)
+ d.addNote(f)
d.reset()
d.sched.answerCard(d.sched.getCard(), 3)
assert d.sched.repCounts() == (0, 0, 0)
# and failing a review should too
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"three"
- d.addFact(f)
+ d.addNote(f)
c = f.cards()[0]
c.type = 2
c.queue = 2
@@ -717,9 +717,9 @@ def test_timing():
d = getEmptyDeck()
# add a few review cards, due today
for i in range(5):
- f = d.newFact()
+ f = d.newNote()
f['Front'] = "num"+str(i)
- d.addFact(f)
+ d.addNote(f)
c = f.cards()[0]
c.type = 2
c.queue = 2
@@ -741,10 +741,10 @@ def test_timing():
def test_collapse():
d = getEmptyDeck()
- # add a fact
- f = d.newFact()
+ # add a note
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
d.reset()
# test collapsing
c = d.sched.getCard()
@@ -755,30 +755,30 @@ def test_collapse():
def test_groupCounts():
d = getEmptyDeck()
- # add a fact with default group
- f = d.newFact()
+ # add a note with default group
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
# and one that's a child
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"two"
default1 = f.gid = d.groups.id("Default::1")
- d.addFact(f)
+ d.addNote(f)
# make it a review card
c = f.cards()[0]
c.queue = 2
c.due = 0
c.flush()
# add one more with a new group
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"two"
foobar = f.gid = d.groups.id("foo::bar")
- d.addFact(f)
+ d.addNote(f)
# and one that's a sibling
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"three"
foobaz = f.gid = d.groups.id("foo::baz")
- d.addFact(f)
+ d.addNote(f)
d.reset()
assert len(d.groups.groups) == 5
cnts = d.sched.groupCounts()
@@ -815,37 +815,37 @@ def test_groupTree():
def test_groupFlow():
d = getEmptyDeck()
- # add a fact with default group
- f = d.newFact()
+ # add a note with default group
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
# and one that's a child
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"two"
default1 = f.gid = d.groups.id("Default::2")
- d.addFact(f)
+ d.addNote(f)
# and another that's higher up
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"three"
default1 = f.gid = d.groups.id("Default::1")
- d.addFact(f)
+ d.addNote(f)
# should get top level one first, then ::1, then ::2
d.reset()
assert d.sched.cardCounts() == (3,0,0)
for i in "one", "three", "two":
c = d.sched.getCard()
- assert c.fact()['Front'] == i
+ assert c.note()['Front'] == i
d.sched.answerCard(c, 2)
def test_reorder():
d = getEmptyDeck()
- # add a fact with default group
- f = d.newFact()
+ # add a note with default group
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
- f2 = d.newFact()
+ d.addNote(f)
+ f2 = d.newNote()
f2['Front'] = u"two"
- d.addFact(f2)
+ d.addNote(f2)
assert f2.cards()[0].due == 2
found=False
# 50/50 chance of being reordered
@@ -858,12 +858,12 @@ def test_reorder():
d.sched.orderCards()
assert f.cards()[0].due == 1
# shifting
- f3 = d.newFact()
+ f3 = d.newNote()
f3['Front'] = u"three"
- d.addFact(f3)
- f4 = d.newFact()
+ d.addNote(f3)
+ f4 = d.newNote()
f4['Front'] = u"four"
- d.addFact(f4)
+ d.addNote(f4)
assert f.cards()[0].due == 1
assert f2.cards()[0].due == 2
assert f3.cards()[0].due == 3
@@ -877,9 +877,9 @@ def test_reorder():
def test_forget():
d = getEmptyDeck()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
c = f.cards()[0]
c.queue = 2; c.type = 2; c.ivl = 100; c.due = 0
c.flush()
@@ -891,9 +891,9 @@ def test_forget():
def test_resched():
d = getEmptyDeck()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
c = f.cards()[0]
d.sched.reschedCards([c.id], 0, 0)
c.load()
@@ -908,9 +908,9 @@ def test_resched():
def test_revlim():
d = getEmptyDeck()
for i in range(20):
- f = d.newFact()
+ f = d.newNote()
f['Front'] = str(i)
- d.addFact(f)
+ d.addNote(f)
d.db.execute("update cards set due = 0, queue = 2, type = 2")
d.reset()
assert d.sched.repCounts()[2] == 20
diff --git a/tests/test_stats.py b/tests/test_stats.py
index 45fb6a905..cd8433c56 100644
--- a/tests/test_stats.py
+++ b/tests/test_stats.py
@@ -7,9 +7,9 @@ from anki.hooks import addHook
def test_stats():
d = getEmptyDeck()
- f = d.newFact()
+ f = d.newNote()
f['Front'] = "foo"
- d.addFact(f)
+ d.addNote(f)
c = f.cards()[0]
# card stats
assert d.cardStats(c)
diff --git a/tests/test_sync.py b/tests/test_sync.py
index 40e7b15b6..eb35d2b32 100644
--- a/tests/test_sync.py
+++ b/tests/test_sync.py
@@ -8,7 +8,7 @@ from anki import Deck
from anki.utils import intTime
from anki.sync import Syncer, FullSyncer, LocalServer, RemoteServer, \
MediaSyncer, RemoteMediaServer
-from anki.facts import Fact
+from anki.notes import Note
from anki.cards import Card
from tests.shared import getEmptyDeck
@@ -24,17 +24,17 @@ server2=None
def setup_basic():
global deck1, deck2, client, server
deck1 = getEmptyDeck()
- # add a fact to deck 1
- f = deck1.newFact()
+ # add a note to deck 1
+ f = deck1.newNote()
f['Front'] = u"foo"; f['Back'] = u"bar"; f.tags = [u"foo"]
- deck1.addFact(f)
+ deck1.addNote(f)
# answer it
deck1.reset(); deck1.sched.answerCard(deck1.sched.getCard(), 4)
# repeat for deck2
deck2 = getEmptyDeck(server=True)
- f = deck2.newFact()
+ f = deck2.newNote()
f['Front'] = u"bar"; f['Back'] = u"bar"; f.tags = [u"bar"]
- deck2.addFact(f)
+ deck2.addNote(f)
deck2.reset(); deck2.sched.answerCard(deck2.sched.getCard(), 4)
# start with same schema and sync time
deck1.scm = deck2.scm = 0
@@ -62,7 +62,7 @@ def test_changedSchema():
def test_sync():
def check(num):
for d in deck1, deck2:
- for t in ("revlog", "facts", "cards", "fsums"):
+ for t in ("revlog", "notes", "cards", "nsums"):
assert d.db.scalar("select count() from %s" % t) == num
assert len(d.models.all()) == num*2
# the default group and config have an id of 1, so always 1
@@ -107,31 +107,31 @@ def test_models():
assert client.sync() == "fullSync"
@nose.with_setup(setup_modified)
-def test_facts():
+def test_notes():
test_sync()
# modifications should be synced
- fid = deck1.db.scalar("select id from facts")
- fact = deck1.getFact(fid)
- assert fact['Front'] != "abc"
- fact['Front'] = "abc"
- fact.flush()
+ nid = deck1.db.scalar("select id from notes")
+ note = deck1.getNote(nid)
+ assert note['Front'] != "abc"
+ note['Front'] = "abc"
+ note.flush()
deck1.save()
assert client.sync() == "success"
- assert deck2.getFact(fid)['Front'] == "abc"
+ assert deck2.getNote(nid)['Front'] == "abc"
# deletions too
- assert deck1.db.scalar("select 1 from facts where id = ?", fid)
- deck1.remFacts([fid])
+ assert deck1.db.scalar("select 1 from notes where id = ?", nid)
+ deck1.remNotes([nid])
deck1.save()
assert client.sync() == "success"
- assert not deck1.db.scalar("select 1 from facts where id = ?", fid)
- assert not deck2.db.scalar("select 1 from facts where id = ?", fid)
+ assert not deck1.db.scalar("select 1 from notes where id = ?", nid)
+ assert not deck2.db.scalar("select 1 from notes where id = ?", nid)
@nose.with_setup(setup_modified)
def test_cards():
test_sync()
- fid = deck1.db.scalar("select id from facts")
- fact = deck1.getFact(fid)
- card = fact.cards()[0]
+ nid = deck1.db.scalar("select id from notes")
+ note = deck1.getNote(nid)
+ card = note.cards()[0]
# answer the card locally
card.startTimer()
deck1.sched.answerCard(card, 4)
@@ -215,26 +215,26 @@ def test_threeway():
assert client2.sync() == "noChanges"
# client 1 adds a card at time 1
time.sleep(1)
- f = deck1.newFact()
+ f = deck1.newNote()
f['Front'] = u"1";
- deck1.addFact(f)
+ deck1.addNote(f)
deck1.save()
# at time 2, client 2 syncs to server
time.sleep(1)
deck3.save()
assert client2.sync() == "success"
- # at time 3, client 1 syncs, adding the older fact
+ # at time 3, client 1 syncs, adding the older note
time.sleep(1)
assert client.sync() == "success"
- assert deck1.factCount() == deck2.factCount()
+ assert deck1.noteCount() == deck2.noteCount()
# syncing client2 should pick it up
assert client2.sync() == "success"
- assert deck1.factCount() == deck2.factCount() == deck3.factCount()
+ assert deck1.noteCount() == deck2.noteCount() == deck3.noteCount()
def _test_speed():
t = time.time()
deck1 = Deck(os.path.expanduser("~/rapid.anki"))
- for tbl in "revlog", "cards", "facts", "graves":
+ for tbl in "revlog", "cards", "notes", "graves":
deck1.db.execute("update %s set usn = -1 where usn != -1"%tbl)
for m in deck1.models.all():
m['usn'] = -1
diff --git a/tests/test_undo.py b/tests/test_undo.py
index 870c92fa6..702435b11 100644
--- a/tests/test_undo.py
+++ b/tests/test_undo.py
@@ -26,9 +26,9 @@ def test_op():
assert not d.undoName()
# and a review will, too
d.save("add")
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
d.reset()
assert d.undoName() == "add"
c = d.sched.getCard()
@@ -38,9 +38,9 @@ def test_op():
def test_review():
d = getEmptyDeck()
d.conf['counts'] = COUNT_REMAINING
- f = d.newFact()
+ f = d.newNote()
f['Front'] = u"one"
- d.addFact(f)
+ d.addNote(f)
d.reset()
assert not d.undoName()
# answer
@@ -62,7 +62,7 @@ def test_review():
assert not d.undoName()
# we should be able to undo multiple answers too
f['Front'] = u"two"
- d.addFact(f)
+ d.addNote(f)
d.reset()
assert d.sched.cardCounts() == (2, 0, 0)
c = d.sched.getCard()