summaryrefslogtreecommitdiff
path: root/misc/pylib/robofab/tools/rfPrefs.py
diff options
context:
space:
mode:
Diffstat (limited to 'misc/pylib/robofab/tools/rfPrefs.py')
-rwxr-xr-xmisc/pylib/robofab/tools/rfPrefs.py122
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()