[Python-checkins] python/dist/src/Lib/plat-mac plistlib.py,1.6,1.7

jvr at users.sourceforge.net jvr at users.sourceforge.net
Mon Oct 25 17:10:45 CEST 2004


Update of /cvsroot/python/python/dist/src/Lib/plat-mac
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7517
Modified Files:
	plistlib.py 
Log Message:
Patch from Bob Ippolito, slighly edited:
[ 1052399 ] plistlib: add plst resource functionality, fix bugs
Index: plistlib.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/plat-mac/plistlib.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- plistlib.py	2 Oct 2004 14:06:56 -0000	1.6
+++ plistlib.py	25 Oct 2004 15:10:42 -0000	1.7
@@ -57,9 +57,15 @@
 """
 
 
-__all__ = ["readPlist", "writePlist", "Plist", "Data", "Date", "Dict"]
+__all__ = [
+ "readPlist", "writePlist",
+ "readPlistFromResource", "writePlistToResource",
+ "Plist", "Data", "Date", "Dict"
+]
 # Note: the Plist class has been deprecated.
 
+import base64, datetime
+
 
 def readPlist(pathOrFile):
 """Read a .plist file. 'pathOrFile' may either be a file name or a
@@ -93,6 +99,44 @@
 pathOrFile.close()
 
 
+def readPlistFromResource(path, restype='plst', resid=0):
+ """Read plst resource from the resource fork of path.
+ """
+ from Carbon.File import FSRef, FSGetResourceForkName
+ from Carbon.Files import fsRdPerm
+ from Carbon import Res
+ from cStringIO import StringIO
+ fsRef = FSRef(path)
+ resNum = Res.FSOpenResourceFile(fsRef, FSGetResourceForkName(), fsRdPerm)
+ Res.UseResFile(resNum)
+ plistData = StringIO(Res.Get1Resource(restype, resid).data)
+ Res.CloseResFile(resNum)
+ return readPlist(plistData)
+
+
+def writePlistToResource(rootObject, path, restype='plst', resid=0):
+ """Write 'rootObject' as a plst resource to the resource fork of path.
+ """
+ from Carbon.File import FSRef, FSGetResourceForkName
+ from Carbon.Files import fsRdWrPerm
+ from Carbon import Res
+ from cStringIO import StringIO
+ plistData = StringIO()
+ writePlist(rootObject, plistData)
+ plistData = plistData.getvalue()
+ fsRef = FSRef(path)
+ resNum = Res.FSOpenResourceFile(fsRef, FSGetResourceForkName(), fsRdWrPerm)
+ Res.UseResFile(resNum)
+ try:
+ Res.Get1Resource(restype, resid).RemoveResource()
+ except Res.Error:
+ pass
+ res = Res.Resource(plistData)
+ res.AddResource(restype, resid, '')
+ res.WriteResource()
+ Res.CloseResFile(resNum)
+
+
 class DumbXMLWriter:
 
 def __init__(self, file, indentLevel=0, indent="\t"):
@@ -131,6 +175,11 @@
 _controlStripper = re.compile(r"[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0e\x0f"
 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]")
 
+# Contents should conform to a subset of ISO 8601
+# (in particular, YYYY '-' MM '-' DD 'T' HH ':' MM ':' SS 'Z'. Smaller units may be omitted with
+# a loss of precision)
+_dateParser = re.compile(r"(?P<year>\d\d\d\d)(?:-(?P<month>\d\d)(?:-(?P<day>\d\d)(?:T(?P<hour>\d\d)(?::(?P<minute>\d\d)(?::(?P<second>\d\d))?)?)?)?)?Z")
+
 def _escapeAndEncode(text):
 text = text.replace("\r\n", "\n") # convert DOS line endings
 text = text.replace("\r", "\n") # convert Mac line endings
@@ -165,8 +214,7 @@
 elif isinstance(value, int):
 self.simpleElement("integer", str(value))
 elif isinstance(value, float):
- # should perhaps use repr() for better precision?
- self.simpleElement("real", str(value))
+ self.simpleElement("real", repr(value))
 elif isinstance(value, dict):
 self.writeDict(value)
 elif isinstance(value, Data):
@@ -262,12 +310,10 @@
 self.data = data
 
 def fromBase64(cls, data):
- import base64
 return cls(base64.decodestring(data))
 fromBase64 = classmethod(fromBase64)
 
 def asBase64(self):
- import base64
 return base64.encodestring(self.data)
 
 def __cmp__(self, other):
@@ -284,25 +330,40 @@
 
 class Date:
 
- """Primitive date wrapper, uses time floats internally, is agnostic
- about time zones.
+ """Primitive date wrapper, uses UTC datetime instances internally.
 """
 
 def __init__(self, date):
- if isinstance(date, str):
- from xml.utils.iso8601 import parse
- date = parse(date)
+ if isinstance(date, datetime.datetime):
+ pass
+ elif isinstance(date, (float, int)):
+ date = datetime.datetime.fromtimestamp(date)
+ elif isinstance(date, basestring):
+ order = ('year', 'month', 'day', 'hour', 'minute', 'second')
+ gd = _dateParser.match(date).groupdict()
+ lst = []
+ for key in order:
+ val = gd[key]
+ if val is None:
+ break
+ lst.append(int(val))
+ date = datetime.datetime(*lst)
+ else:
+ raise ValueError, "Can't convert %r to datetime" % (date,)
 self.date = date
 
 def toString(self):
- from xml.utils.iso8601 import tostring
- return tostring(self.date)
+ d = self.date
+ return '%04d-%02d-%02dT%02d:%02d:%02dZ' % (
+ d.year, d.month, d.day,
+ d.second, d.minute, d.hour,
+ )
 
 def __cmp__(self, other):
 if isinstance(other, self.__class__):
 return cmp(self.date, other.date)
- elif isinstance(other, (int, float)):
- return cmp(self.date, other)
+ elif isinstance(other, (datetime.datetime, float, int, basestring)):
+ return cmp(self.date, Date(other).date)
 else:
 return cmp(id(self), id(other))
 
@@ -317,13 +378,13 @@
 self.currentKey = None
 self.root = None
 
- def parse(self, file):
+ def parse(self, fileobj):
 from xml.parsers.expat import ParserCreate
 parser = ParserCreate()
 parser.StartElementHandler = self.handleBeginElement
 parser.EndElementHandler = self.handleEndElement
 parser.CharacterDataHandler = self.handleData
- parser.ParseFile(file)
+ parser.ParseFile(fileobj)
 return self.root
 
 def handleBeginElement(self, element, attrs):


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /