diff options
author | Rasmus Andersson <rasmus@notion.se> | 2017-09-04 06:03:17 +0300 |
---|---|---|
committer | Rasmus Andersson <rasmus@notion.se> | 2017-09-04 18:12:34 +0300 |
commit | 8234b62ab762637ef24c3398b4204a8ce8db31a7 (patch) | |
tree | 1c8df547021cdb58951630a015e4101ede46dbf1 /misc/pylib/robofab/tools/rfPrefs.py | |
parent | 31ae014e0c827dd76696fdab7e4ca3fed9f6402b (diff) | |
download | inter-8234b62ab762637ef24c3398b4204a8ce8db31a7.tar.xz |
Speeds up font compilation by around 200%
Cython is used to compile some hot paths into native Python extensions.
These hot paths were identified through running ufocompile with the hotshot
profiler and then converting file by file to Cython, starting with the "hottest"
paths and continuing until returns were deminishing. This means that only a few
Python files were converted to Cython.
Closes #23
Closes #20 (really this time)
Diffstat (limited to 'misc/pylib/robofab/tools/rfPrefs.py')
-rwxr-xr-x | misc/pylib/robofab/tools/rfPrefs.py | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/misc/pylib/robofab/tools/rfPrefs.py b/misc/pylib/robofab/tools/rfPrefs.py new file mode 100755 index 000000000..440984d0d --- /dev/null +++ b/misc/pylib/robofab/tools/rfPrefs.py @@ -0,0 +1,122 @@ +"""A simple module for dealing with preferences that are used by scripts. Based almost entirely on MacPrefs. + +To save some preferences: +myPrefs = RFPrefs(drive/directory/directory/myPrefs.plist) +myPrefs.myString = 'xyz' +myPrefs.myInteger = 1234 +myPrefs.myList = ['a', 'b', 'c'] +myPrefs.myDict = {'a':1, 'b':2} +myPrefs.save() + +To retrieve some preferences: +myPrefs = RFPrefs(drive/directory/directory/myPrefs.plist) +myString = myPrefs.myString +myInteger = myPrefs.myInteger +myList = myPrefs.myList +myDict = myPrefs.myDict + +When using this module within FontLab, it is not necessary to +provide the RFPrefs class with a path. If a path is not given, +it will look for a file in FontLab/RoboFab Data/RFPrefs.plist. +If that file does not exist, it will make it. +""" + +from robofab import RoboFabError +from robofab.plistlib import Plist +from cStringIO import StringIO +import os + +class _PrefObject: + + def __init__(self, dict=None): + if not dict: + self._prefs = {} + else: + self._prefs = dict + + def __len__(self): + return len(self._prefs) + + def __delattr__(self, attr): + if self._prefs.has_key(attr): + del self._prefs[attr] + else: + raise AttributeError, 'delete non-existing instance attribute' + + def __getattr__(self, attr): + if attr == '__members__': + keys = self._prefs.keys() + keys.sort() + return keys + try: + return self._prefs[attr] + except KeyError: + raise AttributeError, attr + + def __setattr__(self, attr, value): + if attr[0] != '_': + self._prefs[attr] = value + else: + self.__dict__[attr] = value + + def asDict(self): + return self._prefs + +class RFPrefs(_PrefObject): + + """The main preferences object to call""" + + def __init__(self, path=None): + from robofab.world import world + self.__path = path + self._prefs = {} + if world.inFontLab: + #we don't have a path, but we know where we can put it + if not path: + from robofab.tools.toolsFL import makeDataFolder + settingsPath = makeDataFolder() + path = os.path.join(settingsPath, 'RFPrefs.plist') + self.__path = path + self._makePrefsFile() + #we do have a path, make sure it exists and load it + else: + self._makePrefsFile() + else: + #no path, raise error + if not path: + raise RoboFabError, "no preferences path defined" + #we do have a path, make sure it exists and load it + else: + self._makePrefsFile() + self._prefs = Plist.fromFile(path) + + def _makePrefsFile(self): + if not os.path.exists(self.__path): + self.save() + + def __getattr__(self, attr): + if attr[0] == '__members__': + keys = self._prefs.keys() + keys.sort() + return keys + try: + return self._prefs[attr] + except KeyError: + raise AttributeError, attr + #if attr[0] != '_': + # self._prefs[attr] = _PrefObject() + # return self._prefs[attr] + #else: + # raise AttributeError, attr + + def save(self): + """save the plist file""" + f = StringIO() + pl = Plist() + for i in self._prefs.keys(): + pl[i] = self._prefs[i] + pl.write(f) + data = f.getvalue() + f = open(self.__path, 'wb') + f.write(data) + f.close() |