mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Delay instantiating all the formatter function classes
This commit is contained in:
parent
6b73a151a1
commit
c8f566dfb8
@ -10,6 +10,7 @@ __docformat__ = 'restructuredtext en'
|
||||
|
||||
import inspect, re, traceback
|
||||
from math import trunc
|
||||
from threading import RLock
|
||||
|
||||
from calibre import human_readable
|
||||
from calibre.constants import DEBUG
|
||||
@ -25,6 +26,15 @@ class FormatterFunctions(object):
|
||||
def __init__(self):
|
||||
self._builtins = {}
|
||||
self._functions = {}
|
||||
self._lock = RLock()
|
||||
self._loaded = False
|
||||
|
||||
def load_builtins(self):
|
||||
with self._lock:
|
||||
if not self._loaded:
|
||||
self._loaded = True
|
||||
for c in _formatter_builtins:
|
||||
c()
|
||||
|
||||
def register_builtin(self, func_class):
|
||||
if not isinstance(func_class, FormatterFunction):
|
||||
@ -39,6 +49,7 @@ class FormatterFunctions(object):
|
||||
self._functions[a] = func_class
|
||||
|
||||
def register_function(self, func_class):
|
||||
self.load_builtins()
|
||||
if not isinstance(func_class, FormatterFunction):
|
||||
raise ValueError('Class %s is not an instance of FormatterFunction'%(
|
||||
func_class.__class__.__name__))
|
||||
@ -48,9 +59,11 @@ class FormatterFunctions(object):
|
||||
self._functions[name] = func_class
|
||||
|
||||
def get_builtins(self):
|
||||
self.load_builtins()
|
||||
return self._builtins
|
||||
|
||||
def get_builtins_and_aliases(self):
|
||||
self.load_builtins()
|
||||
res = {}
|
||||
for f in self._builtins.itervalues():
|
||||
res[f.name] = f
|
||||
@ -59,10 +72,12 @@ class FormatterFunctions(object):
|
||||
return res
|
||||
|
||||
def get_functions(self):
|
||||
self.load_builtins()
|
||||
return self._functions
|
||||
|
||||
def reset_to_builtins(self):
|
||||
self._functions = {}
|
||||
self.load_builtins()
|
||||
for n,c in self._builtins.items():
|
||||
self._functions[n] = c
|
||||
for a in c.aliases:
|
||||
@ -1210,27 +1225,27 @@ class BuiltinFinishFormatting(BuiltinFormatterFunction):
|
||||
return prefix + formatter._do_format(val, fmt) + suffix
|
||||
|
||||
_formatter_builtins = [
|
||||
BuiltinAdd(), BuiltinAnd(), BuiltinApproximateFormats(),
|
||||
BuiltinAssign(), BuiltinBooksize(),
|
||||
BuiltinCapitalize(), BuiltinCmp(), BuiltinContains(), BuiltinCount(),
|
||||
BuiltinCurrentLibraryName(), BuiltinCurrentLibraryPath(),
|
||||
BuiltinDaysBetween(), BuiltinDivide(), BuiltinEval(), BuiltinFirstNonEmpty(),
|
||||
BuiltinField(), BuiltinFinishFormatting(), BuiltinFormatDate(),
|
||||
BuiltinFormatNumber(), BuiltinFormatsModtimes(), BuiltinFormatsPaths(),
|
||||
BuiltinFormatsSizes(),
|
||||
BuiltinHasCover(), BuiltinHumanReadable(), BuiltinIdentifierInList(),
|
||||
BuiltinIfempty(), BuiltinLanguageCodes(), BuiltinLanguageStrings(),
|
||||
BuiltinInList(), BuiltinListDifference(), BuiltinListEquals(),
|
||||
BuiltinListIntersection(), BuiltinListitem(), BuiltinListRe(),
|
||||
BuiltinListSort(), BuiltinListUnion(), BuiltinLookup(),
|
||||
BuiltinLowercase(), BuiltinMultiply(), BuiltinNot(),
|
||||
BuiltinOndevice(), BuiltinOr(), BuiltinPrint(), BuiltinRawField(),
|
||||
BuiltinRe(), BuiltinSelect(), BuiltinSeriesSort(), BuiltinShorten(),
|
||||
BuiltinStrcat(), BuiltinStrcatMax(),
|
||||
BuiltinStrcmp(), BuiltinStrInList(), BuiltinStrlen(), BuiltinSubitems(),
|
||||
BuiltinSublist(),BuiltinSubstr(), BuiltinSubtract(), BuiltinSwapAroundComma(),
|
||||
BuiltinSwitch(), BuiltinTemplate(), BuiltinTest(), BuiltinTitlecase(),
|
||||
BuiltinToday(), BuiltinUppercase(),
|
||||
BuiltinAdd, BuiltinAnd, BuiltinApproximateFormats,
|
||||
BuiltinAssign, BuiltinBooksize,
|
||||
BuiltinCapitalize, BuiltinCmp, BuiltinContains, BuiltinCount,
|
||||
BuiltinCurrentLibraryName, BuiltinCurrentLibraryPath,
|
||||
BuiltinDaysBetween, BuiltinDivide, BuiltinEval, BuiltinFirstNonEmpty,
|
||||
BuiltinField, BuiltinFinishFormatting, BuiltinFormatDate,
|
||||
BuiltinFormatNumber, BuiltinFormatsModtimes, BuiltinFormatsPaths,
|
||||
BuiltinFormatsSizes,
|
||||
BuiltinHasCover, BuiltinHumanReadable, BuiltinIdentifierInList,
|
||||
BuiltinIfempty, BuiltinLanguageCodes, BuiltinLanguageStrings,
|
||||
BuiltinInList, BuiltinListDifference, BuiltinListEquals,
|
||||
BuiltinListIntersection, BuiltinListitem, BuiltinListRe,
|
||||
BuiltinListSort, BuiltinListUnion, BuiltinLookup,
|
||||
BuiltinLowercase, BuiltinMultiply, BuiltinNot,
|
||||
BuiltinOndevice, BuiltinOr, BuiltinPrint, BuiltinRawField,
|
||||
BuiltinRe, BuiltinSelect, BuiltinSeriesSort, BuiltinShorten,
|
||||
BuiltinStrcat, BuiltinStrcatMax,
|
||||
BuiltinStrcmp, BuiltinStrInList, BuiltinStrlen, BuiltinSubitems,
|
||||
BuiltinSublist,BuiltinSubstr, BuiltinSubtract, BuiltinSwapAroundComma,
|
||||
BuiltinSwitch, BuiltinTemplate, BuiltinTest, BuiltinTitlecase,
|
||||
BuiltinToday, BuiltinUppercase,
|
||||
]
|
||||
|
||||
class FormatterUserFunction(FormatterFunction):
|
||||
@ -1260,10 +1275,11 @@ class UserFunction(FormatterUserFunction):
|
||||
return cls
|
||||
|
||||
def load_user_template_functions(funcs):
|
||||
formatter_functions().reset_to_builtins()
|
||||
for func in funcs:
|
||||
try:
|
||||
cls = compile_user_function(*func)
|
||||
formatter_functions().register_function(cls)
|
||||
except:
|
||||
traceback.print_exc()
|
||||
if funcs:
|
||||
formatter_functions().reset_to_builtins()
|
||||
for func in funcs:
|
||||
try:
|
||||
cls = compile_user_function(*func)
|
||||
formatter_functions().register_function(cls)
|
||||
except:
|
||||
traceback.print_exc()
|
||||
|
Loading…
x
Reference in New Issue
Block a user