convert some pylib strings to f-strings with flynt
excluded some changes where readability got noticeably worse
This commit is contained in:
parent
bb29ce88f3
commit
5ab115c145
@ -123,7 +123,7 @@ class Card:
|
|||||||
|
|
||||||
# legacy
|
# legacy
|
||||||
def css(self) -> str:
|
def css(self) -> str:
|
||||||
return "<style>%s</style>" % self.render_output().css
|
return f"<style>{self.render_output().css}</style>"
|
||||||
|
|
||||||
def render_output(
|
def render_output(
|
||||||
self, reload: bool = False, browser: bool = False
|
self, reload: bool = False, browser: bool = False
|
||||||
|
@ -329,7 +329,7 @@ class Collection:
|
|||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
def nextID(self, type: str, inc: bool = True) -> Any:
|
def nextID(self, type: str, inc: bool = True) -> Any:
|
||||||
type = "next" + type.capitalize()
|
type = f"next{type.capitalize()}"
|
||||||
id = self.conf.get(type, 1)
|
id = self.conf.get(type, 1)
|
||||||
if inc:
|
if inc:
|
||||||
self.conf[type] = id + 1
|
self.conf[type] = id + 1
|
||||||
@ -368,7 +368,7 @@ class Collection:
|
|||||||
def remove_notes_by_card(self, card_ids: List[int]) -> None:
|
def remove_notes_by_card(self, card_ids: List[int]) -> None:
|
||||||
if hooks.notes_will_be_deleted.count():
|
if hooks.notes_will_be_deleted.count():
|
||||||
nids = self.db.list(
|
nids = self.db.list(
|
||||||
"select nid from cards where id in " + ids2str(card_ids)
|
f"select nid from cards where id in {ids2str(card_ids)}"
|
||||||
)
|
)
|
||||||
hooks.notes_will_be_deleted(self, nids)
|
hooks.notes_will_be_deleted(self, nids)
|
||||||
self._backend.remove_notes(note_ids=[], card_ids=card_ids)
|
self._backend.remove_notes(note_ids=[], card_ids=card_ids)
|
||||||
@ -503,7 +503,7 @@ class Collection:
|
|||||||
return fields[mid]
|
return fields[mid]
|
||||||
|
|
||||||
for nid, mid, flds in self.db.all(
|
for nid, mid, flds in self.db.all(
|
||||||
"select id, mid, flds from notes where id in " + ids2str(nids)
|
f"select id, mid, flds from notes where id in {ids2str(nids)}"
|
||||||
):
|
):
|
||||||
flds = splitFields(flds)
|
flds = splitFields(flds)
|
||||||
ord = ordForMid(mid)
|
ord = ordForMid(mid)
|
||||||
@ -794,7 +794,7 @@ table.review-log {{ {revlog_style} }}
|
|||||||
fn,
|
fn,
|
||||||
", ".join([customRepr(x) for x in args]),
|
", ".join([customRepr(x) for x in args]),
|
||||||
)
|
)
|
||||||
self._logHnd.write(buf + "\n")
|
self._logHnd.write(f"{buf}\n")
|
||||||
if devMode:
|
if devMode:
|
||||||
print(buf)
|
print(buf)
|
||||||
|
|
||||||
@ -803,7 +803,7 @@ table.review-log {{ {revlog_style} }}
|
|||||||
return
|
return
|
||||||
lpath = re.sub(r"\.anki2$", ".log", self.path)
|
lpath = re.sub(r"\.anki2$", ".log", self.path)
|
||||||
if os.path.exists(lpath) and os.path.getsize(lpath) > 10 * 1024 * 1024:
|
if os.path.exists(lpath) and os.path.getsize(lpath) > 10 * 1024 * 1024:
|
||||||
lpath2 = lpath + ".old"
|
lpath2 = f"{lpath}.old"
|
||||||
if os.path.exists(lpath2):
|
if os.path.exists(lpath2):
|
||||||
os.unlink(lpath2)
|
os.unlink(lpath2)
|
||||||
os.rename(lpath, lpath2)
|
os.rename(lpath, lpath2)
|
||||||
|
@ -385,7 +385,7 @@ class DeckManager:
|
|||||||
|
|
||||||
def setDeck(self, cids: List[int], did: int) -> None:
|
def setDeck(self, cids: List[int], did: int) -> None:
|
||||||
self.col.db.execute(
|
self.col.db.execute(
|
||||||
"update cards set did=?,usn=?,mod=? where id in " + ids2str(cids),
|
f"update cards set did=?,usn=?,mod=? where id in {ids2str(cids)}",
|
||||||
did,
|
did,
|
||||||
self.col.usn(),
|
self.col.usn(),
|
||||||
intTime(),
|
intTime(),
|
||||||
@ -397,7 +397,7 @@ class DeckManager:
|
|||||||
dids = [did]
|
dids = [did]
|
||||||
for name, id in self.children(did):
|
for name, id in self.children(did):
|
||||||
dids.append(id)
|
dids.append(id)
|
||||||
return self.col.db.list("select id from cards where did in " + ids2str(dids))
|
return self.col.db.list(f"select id from cards where did in {ids2str(dids)}")
|
||||||
|
|
||||||
def for_card_ids(self, cids: List[int]) -> List[int]:
|
def for_card_ids(self, cids: List[int]) -> List[int]:
|
||||||
return self.col.db.list(f"select did from cards where id in {ids2str(cids)}")
|
return self.col.db.list(f"select did from cards where id in {ids2str(cids)}")
|
||||||
@ -465,12 +465,12 @@ class DeckManager:
|
|||||||
name = self.get(did)["name"]
|
name = self.get(did)["name"]
|
||||||
actv = []
|
actv = []
|
||||||
for g in self.all_names_and_ids():
|
for g in self.all_names_and_ids():
|
||||||
if g.name.startswith(name + "::"):
|
if g.name.startswith(f"{name}::"):
|
||||||
actv.append((g.name, g.id))
|
actv.append((g.name, g.id))
|
||||||
return actv
|
return actv
|
||||||
|
|
||||||
def child_ids(self, parent_name: str) -> Iterable[int]:
|
def child_ids(self, parent_name: str) -> Iterable[int]:
|
||||||
prefix = parent_name + "::"
|
prefix = f"{parent_name}::"
|
||||||
return (d.id for d in self.all_names_and_ids() if d.name.startswith(prefix))
|
return (d.id for d in self.all_names_and_ids() if d.name.startswith(prefix))
|
||||||
|
|
||||||
def deck_and_child_ids(self, deck_id: int) -> List[int]:
|
def deck_and_child_ids(self, deck_id: int) -> List[int]:
|
||||||
@ -519,7 +519,7 @@ class DeckManager:
|
|||||||
if not parents_names:
|
if not parents_names:
|
||||||
parents_names.append(part)
|
parents_names.append(part)
|
||||||
else:
|
else:
|
||||||
parents_names.append(parents_names[-1] + "::" + part)
|
parents_names.append(f"{parents_names[-1]}::{part}")
|
||||||
parents: List[Deck] = []
|
parents: List[Deck] = []
|
||||||
# convert to objects
|
# convert to objects
|
||||||
for parent_name in parents_names:
|
for parent_name in parents_names:
|
||||||
|
@ -103,4 +103,4 @@ class DeckRenameError(Exception):
|
|||||||
self.description = description
|
self.description = description
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return "Couldn't rename deck: " + self.description
|
return f"Couldn't rename deck: {self.description}"
|
||||||
|
@ -265,7 +265,7 @@ class Anki2Importer(Importer):
|
|||||||
tmpname = "::".join(DeckManager.path(name)[1:])
|
tmpname = "::".join(DeckManager.path(name)[1:])
|
||||||
name = self.deckPrefix
|
name = self.deckPrefix
|
||||||
if tmpname:
|
if tmpname:
|
||||||
name += "::" + tmpname
|
name += f"::{tmpname}"
|
||||||
# manually create any parents so we can pull in descriptions
|
# manually create any parents so we can pull in descriptions
|
||||||
head = ""
|
head = ""
|
||||||
for parent in DeckManager.immediate_parent_path(name):
|
for parent in DeckManager.immediate_parent_path(name):
|
||||||
@ -441,7 +441,7 @@ insert or ignore into revlog values (?,?,?,?,?,?,?,?,?)""",
|
|||||||
return match.group(0)
|
return match.group(0)
|
||||||
# if model-local file exists from a previous import, use that
|
# if model-local file exists from a previous import, use that
|
||||||
name, ext = os.path.splitext(fname)
|
name, ext = os.path.splitext(fname)
|
||||||
lname = "%s_%s%s" % (name, mid, ext)
|
lname = f"{name}_{mid}{ext}"
|
||||||
if self.dst.media.have(lname):
|
if self.dst.media.have(lname):
|
||||||
return match.group(0).replace(fname, lname)
|
return match.group(0).replace(fname, lname)
|
||||||
# if missing or the same, pass unmodified
|
# if missing or the same, pass unmodified
|
||||||
|
@ -25,7 +25,7 @@ class AnkiPackageImporter(Anki2Importer):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
suffix = ".anki2"
|
suffix = ".anki2"
|
||||||
|
|
||||||
col = z.read("collection" + suffix)
|
col = z.read(f"collection{suffix}")
|
||||||
colpath = tmpfile(suffix=".anki2")
|
colpath = tmpfile(suffix=".anki2")
|
||||||
with open(colpath, "wb") as f:
|
with open(colpath, "wb") as f:
|
||||||
f.write(col)
|
f.write(col)
|
||||||
|
@ -78,7 +78,7 @@ class TextImporter(NoteImporter):
|
|||||||
return re.sub(r"^\#.*$", "__comment", s)
|
return re.sub(r"^\#.*$", "__comment", s)
|
||||||
|
|
||||||
self.data = [
|
self.data = [
|
||||||
sub(x) + "\n" for x in self.data.split("\n") if sub(x) != "__comment"
|
f"{sub(x)}\n" for x in self.data.split("\n") if sub(x) != "__comment"
|
||||||
]
|
]
|
||||||
if self.data:
|
if self.data:
|
||||||
if self.data[0].startswith("tags:"):
|
if self.data[0].startswith("tags:"):
|
||||||
|
@ -229,7 +229,7 @@ class NoteImporter(Importer):
|
|||||||
else:
|
else:
|
||||||
unchanged = 0
|
unchanged = 0
|
||||||
part3 = self.col.tr(TR.IMPORTING_NOTE_UNCHANGED, count=unchanged)
|
part3 = self.col.tr(TR.IMPORTING_NOTE_UNCHANGED, count=unchanged)
|
||||||
self.log.append("%s, %s, %s." % (part1, part2, part3))
|
self.log.append(f"{part1}, {part2}, {part3}.")
|
||||||
self.log.extend(updateLog)
|
self.log.extend(updateLog)
|
||||||
self.total = len(self._ids)
|
self.total = len(self._ids)
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ def _save_latex_image(
|
|||||||
svg: bool,
|
svg: bool,
|
||||||
) -> Optional[str]:
|
) -> Optional[str]:
|
||||||
# add header/footer
|
# add header/footer
|
||||||
latex = header + "\n" + extracted.latex_body + "\n" + footer
|
latex = f"{header}\n{extracted.latex_body}\n{footer}"
|
||||||
# it's only really secure if run in a jail, but these are the most common
|
# it's only really secure if run in a jail, but these are the most common
|
||||||
tmplatex = latex.replace("\\includegraphics", "")
|
tmplatex = latex.replace("\\includegraphics", "")
|
||||||
for bad in (
|
for bad in (
|
||||||
@ -127,7 +127,7 @@ def _save_latex_image(
|
|||||||
"\\shipout",
|
"\\shipout",
|
||||||
):
|
):
|
||||||
# don't mind if the sequence is only part of a command
|
# don't mind if the sequence is only part of a command
|
||||||
bad_re = "\\" + bad + "[^a-zA-Z]"
|
bad_re = f"\\{bad}[^a-zA-Z]"
|
||||||
if re.search(bad_re, tmplatex):
|
if re.search(bad_re, tmplatex):
|
||||||
return col.tr(TR.MEDIA_FOR_SECURITY_REASONS_IS_NOT, val=bad)
|
return col.tr(TR.MEDIA_FOR_SECURITY_REASONS_IS_NOT, val=bad)
|
||||||
|
|
||||||
@ -146,7 +146,7 @@ def _save_latex_image(
|
|||||||
texfile.write(latex)
|
texfile.write(latex)
|
||||||
texfile.close()
|
texfile.close()
|
||||||
oldcwd = os.getcwd()
|
oldcwd = os.getcwd()
|
||||||
png_or_svg = namedtmp("tmp.%s" % ext)
|
png_or_svg = namedtmp(f"tmp.{ext}")
|
||||||
try:
|
try:
|
||||||
# generate png/svg
|
# generate png/svg
|
||||||
os.chdir(tmpdir())
|
os.chdir(tmpdir())
|
||||||
@ -165,14 +165,14 @@ def _save_latex_image(
|
|||||||
|
|
||||||
|
|
||||||
def _errMsg(col: anki.collection.Collection, type: str, texpath: str) -> Any:
|
def _errMsg(col: anki.collection.Collection, type: str, texpath: str) -> Any:
|
||||||
msg = col.tr(TR.MEDIA_ERROR_EXECUTING, val=type) + "<br>"
|
msg = f"{col.tr(TR.MEDIA_ERROR_EXECUTING, val=type)}<br>"
|
||||||
msg += col.tr(TR.MEDIA_GENERATED_FILE, val=texpath) + "<br>"
|
msg += f"{col.tr(TR.MEDIA_GENERATED_FILE, val=texpath)}<br>"
|
||||||
try:
|
try:
|
||||||
with open(namedtmp("latex_log.txt", rm=False)) as f:
|
with open(namedtmp("latex_log.txt", rm=False)) as f:
|
||||||
log = f.read()
|
log = f.read()
|
||||||
if not log:
|
if not log:
|
||||||
raise Exception()
|
raise Exception()
|
||||||
msg += "<small><pre>" + html.escape(log) + "</pre></small>"
|
msg += f"<small><pre>{html.escape(log)}</pre></small>"
|
||||||
except:
|
except:
|
||||||
msg += col.tr(TR.MEDIA_HAVE_YOU_INSTALLED_LATEX_AND_DVIPNGDVISVGM)
|
msg += col.tr(TR.MEDIA_HAVE_YOU_INSTALLED_LATEX_AND_DVIPNGDVISVGM)
|
||||||
return msg
|
return msg
|
||||||
|
@ -24,7 +24,7 @@ from anki.utils import intTime
|
|||||||
|
|
||||||
def media_paths_from_col_path(col_path: str) -> Tuple[str, str]:
|
def media_paths_from_col_path(col_path: str) -> Tuple[str, str]:
|
||||||
media_folder = re.sub(r"(?i)\.(anki2)$", ".media", col_path)
|
media_folder = re.sub(r"(?i)\.(anki2)$", ".media", col_path)
|
||||||
media_db = media_folder + ".db2"
|
media_db = f"{media_folder}.db2"
|
||||||
return (media_folder, media_db)
|
return (media_folder, media_db)
|
||||||
|
|
||||||
|
|
||||||
|
@ -440,7 +440,7 @@ and notes.mid = ? and cards.ord = ?""",
|
|||||||
d = []
|
d = []
|
||||||
nfields = len(newModel["flds"])
|
nfields = len(newModel["flds"])
|
||||||
for (nid, flds) in self.col.db.execute(
|
for (nid, flds) in self.col.db.execute(
|
||||||
"select id, flds from notes where id in " + ids2str(nids)
|
f"select id, flds from notes where id in {ids2str(nids)}"
|
||||||
):
|
):
|
||||||
newflds = {}
|
newflds = {}
|
||||||
flds = splitFields(flds)
|
flds = splitFields(flds)
|
||||||
@ -473,7 +473,7 @@ and notes.mid = ? and cards.ord = ?""",
|
|||||||
d = []
|
d = []
|
||||||
deleted = []
|
deleted = []
|
||||||
for (cid, ord) in self.col.db.execute(
|
for (cid, ord) in self.col.db.execute(
|
||||||
"select id, ord from cards where nid in " + ids2str(nids)
|
f"select id, ord from cards where nid in {ids2str(nids)}"
|
||||||
):
|
):
|
||||||
# if the src model is a cloze, we ignore the map, as the gui
|
# if the src model is a cloze, we ignore the map, as the gui
|
||||||
# doesn't currently support mapping them
|
# doesn't currently support mapping them
|
||||||
|
@ -77,7 +77,7 @@ class Scheduler(V2):
|
|||||||
self._answerRevCard(card, ease)
|
self._answerRevCard(card, ease)
|
||||||
review_delta = +1
|
review_delta = +1
|
||||||
else:
|
else:
|
||||||
raise Exception("Invalid queue '%s'" % card)
|
raise Exception(f"Invalid queue '{card}'")
|
||||||
|
|
||||||
self.update_stats(
|
self.update_stats(
|
||||||
card.did,
|
card.did,
|
||||||
@ -374,7 +374,7 @@ limit %d"""
|
|||||||
def removeLrn(self, ids: Optional[List[int]] = None) -> None:
|
def removeLrn(self, ids: Optional[List[int]] = None) -> None:
|
||||||
"Remove cards from the learning queues."
|
"Remove cards from the learning queues."
|
||||||
if ids:
|
if ids:
|
||||||
extra = " and id in " + ids2str(ids)
|
extra = f" and id in {ids2str(ids)}"
|
||||||
else:
|
else:
|
||||||
# benchmarks indicate it's about 10x faster to search all decks
|
# benchmarks indicate it's about 10x faster to search all decks
|
||||||
# with the index than scan the table
|
# with the index than scan the table
|
||||||
|
@ -118,7 +118,7 @@ class Scheduler:
|
|||||||
self._answerRevCard(card, ease)
|
self._answerRevCard(card, ease)
|
||||||
review_delta = +1
|
review_delta = +1
|
||||||
else:
|
else:
|
||||||
raise Exception("Invalid queue '%s'" % card)
|
raise Exception(f"Invalid queue '{card}'")
|
||||||
|
|
||||||
self.update_stats(
|
self.update_stats(
|
||||||
card.did,
|
card.did,
|
||||||
@ -1120,7 +1120,7 @@ due = (case when odue>0 then odue else due end), odue = 0, odid = 0, usn = ? whe
|
|||||||
)
|
)
|
||||||
|
|
||||||
def remFromDyn(self, cids: List[int]) -> None:
|
def remFromDyn(self, cids: List[int]) -> None:
|
||||||
self.emptyDyn(None, "id in %s and odid" % ids2str(cids))
|
self.emptyDyn(None, f"id in {ids2str(cids)} and odid")
|
||||||
|
|
||||||
# Leeches
|
# Leeches
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
@ -58,13 +58,13 @@ class TagManager:
|
|||||||
def byDeck(self, did: int, children: bool = False) -> List[str]:
|
def byDeck(self, did: int, children: bool = False) -> List[str]:
|
||||||
basequery = "select n.tags from cards c, notes n WHERE c.nid = n.id"
|
basequery = "select n.tags from cards c, notes n WHERE c.nid = n.id"
|
||||||
if not children:
|
if not children:
|
||||||
query = basequery + " AND c.did=?"
|
query = f"{basequery} AND c.did=?"
|
||||||
res = self.col.db.list(query, did)
|
res = self.col.db.list(query, did)
|
||||||
return list(set(self.split(" ".join(res))))
|
return list(set(self.split(" ".join(res))))
|
||||||
dids = [did]
|
dids = [did]
|
||||||
for name, id in self.col.decks.children(did):
|
for name, id in self.col.decks.children(did):
|
||||||
dids.append(id)
|
dids.append(id)
|
||||||
query = basequery + " AND c.did IN " + ids2str(dids)
|
query = f"{basequery} AND c.did IN {ids2str(dids)}"
|
||||||
res = self.col.db.list(query)
|
res = self.col.db.list(query)
|
||||||
return list(set(self.split(" ".join(res))))
|
return list(set(self.split(" ".join(res))))
|
||||||
|
|
||||||
@ -127,7 +127,7 @@ class TagManager:
|
|||||||
"Join tags into a single string, with leading and trailing spaces."
|
"Join tags into a single string, with leading and trailing spaces."
|
||||||
if not tags:
|
if not tags:
|
||||||
return ""
|
return ""
|
||||||
return " %s " % " ".join(tags)
|
return f" {' '.join(tags)} "
|
||||||
|
|
||||||
def addToStr(self, addtags: str, tags: str) -> str:
|
def addToStr(self, addtags: str, tags: str) -> str:
|
||||||
"Add tags if they don't exist, and canonify."
|
"Add tags if they don't exist, and canonify."
|
||||||
@ -142,7 +142,7 @@ class TagManager:
|
|||||||
|
|
||||||
def wildcard(pat: str, repl: str) -> Match:
|
def wildcard(pat: str, repl: str) -> Match:
|
||||||
pat = re.escape(pat).replace("\\*", ".*")
|
pat = re.escape(pat).replace("\\*", ".*")
|
||||||
return re.match("^" + pat + "$", repl, re.IGNORECASE)
|
return re.match(f"^{pat}$", repl, re.IGNORECASE)
|
||||||
|
|
||||||
currentTags = self.split(tags)
|
currentTags = self.split(tags)
|
||||||
for tag in self.split(deltags):
|
for tag in self.split(deltags):
|
||||||
|
@ -306,7 +306,7 @@ def apply_custom_filters(
|
|||||||
)
|
)
|
||||||
# legacy hook - the second and fifth argument are no longer used.
|
# legacy hook - the second and fifth argument are no longer used.
|
||||||
field_text = anki.hooks.runFilter(
|
field_text = anki.hooks.runFilter(
|
||||||
"fmod_" + filter_name,
|
f"fmod_{filter_name}",
|
||||||
field_text,
|
field_text,
|
||||||
"",
|
"",
|
||||||
ctx.note().items(),
|
ctx.note().items(),
|
||||||
|
@ -141,7 +141,7 @@ def timestampID(db: DBProxy, table: str) -> int:
|
|||||||
# be careful not to create multiple objects without flushing them, or they
|
# be careful not to create multiple objects without flushing them, or they
|
||||||
# may share an ID.
|
# may share an ID.
|
||||||
t = intTime(1000)
|
t = intTime(1000)
|
||||||
while db.scalar("select id from %s where id = ?" % table, t):
|
while db.scalar(f"select id from {table} where id = ?", t):
|
||||||
t += 1
|
t += 1
|
||||||
return t
|
return t
|
||||||
|
|
||||||
@ -150,7 +150,7 @@ def maxID(db: DBProxy) -> int:
|
|||||||
"Return the first safe ID to use."
|
"Return the first safe ID to use."
|
||||||
now = intTime(1000)
|
now = intTime(1000)
|
||||||
for tbl in "cards", "notes":
|
for tbl in "cards", "notes":
|
||||||
now = max(now, db.scalar("select max(id) from %s" % tbl) or 0)
|
now = max(now, db.scalar(f"select max(id) from {tbl}") or 0)
|
||||||
return now + 1
|
return now + 1
|
||||||
|
|
||||||
|
|
||||||
@ -326,14 +326,14 @@ def platDesc() -> str:
|
|||||||
try:
|
try:
|
||||||
system = platform.system()
|
system = platform.system()
|
||||||
if isMac:
|
if isMac:
|
||||||
theos = "mac:%s" % (platform.mac_ver()[0])
|
theos = f"mac:{platform.mac_ver()[0]}"
|
||||||
elif isWin:
|
elif isWin:
|
||||||
theos = "win:%s" % (platform.win32_ver()[0])
|
theos = f"win:{platform.win32_ver()[0]}"
|
||||||
elif system == "Linux":
|
elif system == "Linux":
|
||||||
import distro # pytype: disable=import-error # pylint: disable=import-error
|
import distro # pytype: disable=import-error # pylint: disable=import-error
|
||||||
|
|
||||||
r = distro.linux_distribution(full_distribution_name=False)
|
r = distro.linux_distribution(full_distribution_name=False)
|
||||||
theos = "lin:%s:%s" % (r[0], r[1])
|
theos = f"lin:{r[0]}:{r[1]}"
|
||||||
else:
|
else:
|
||||||
theos = system
|
theos = system
|
||||||
break
|
break
|
||||||
@ -365,7 +365,7 @@ class TimedLog:
|
|||||||
def versionWithBuild() -> str:
|
def versionWithBuild() -> str:
|
||||||
from anki.buildinfo import buildhash, version
|
from anki.buildinfo import buildhash, version
|
||||||
|
|
||||||
return "%s (%s)" % (version, buildhash)
|
return f"{version} ({buildhash})"
|
||||||
|
|
||||||
|
|
||||||
def pointVersion() -> int:
|
def pointVersion() -> int:
|
||||||
|
Loading…
Reference in New Issue
Block a user