def load(fp, fmt=None, use_builtin_types=None, dict_type=dict): if _check_py3(): use_builtin_types = True if use_builtin_types == None else use_builtin_types return plistlib.load(fp, fmt=fmt, use_builtin_types=use_builtin_types, dict_type=dict_type) elif not _is_binary(fp): # We monkey patch the begin_dict function to allow for other # dict types p = plistlib.PlistParser() def begin_dict(attrs): d = dict_type() p.addObject(d) p.stack.append(d) p.begin_dict = begin_dict root = p.parse(fp) return root else: use_builtin_types = False if use_builtin_types == None else use_builtin_types p = _BinaryPlistParser(use_builtin_types=use_builtin_types, dict_type=dict_type) return p.parse(fp)
def loads(value, fmt=None, use_builtin_types=True, dict_type=dict): if _check_py3(): # Requires fp to be a BytesIO wrapper around a bytes object if isinstance(value, _get_inst()): # If it's a string - encode it value = value.encode() # Load it return plistlib.load(BytesIO(value), fmt=fmt, use_builtin_types=use_builtin_types, dict_type=dict_type) else: if _is_binary(value): # Has the proper header to be a binary plist return readBinaryPlistFile(BytesIO(value)) else: # Is not binary - assume a string - and try to load # We avoid using readPlistFromString() as that uses # cStringIO and fails when Unicode strings are detected # Don't subclass - keep the parser local from xml.parsers.expat import ParserCreate # Create a new PlistParser object - then we need to set up # the values and parse. p = plistlib.PlistParser() parser = ParserCreate() parser.StartElementHandler = p.handleBeginElement parser.EndElementHandler = p.handleEndElement parser.CharacterDataHandler = p.handleData if isinstance(value, unicode): # Encode unicode -> string; use utf-8 for safety value = value.encode("utf-8") # Parse the string parser.Parse(value, 1) return p.root rootObject = p.parse(s) return rootObject
def _get_plist(self, s): p = {} try: if sys.version_info >= (3, 0): p = plistlib.loads(s.encode("utf-8")) else: # p = plistlib.readPlistFromString(s) # We avoid using readPlistFromString() as that uses # cStringIO and fails when Unicode strings are detected # Don't subclass - keep the parser local from xml.parsers.expat import ParserCreate # Create a new PlistParser object - then we need to set up # the values and parse. pa = plistlib.PlistParser() # We also monkey patch this to encode unicode as utf-8 def end_string(): d = pa.getData() if isinstance(d, unicode): d = d.encode("utf-8") pa.addObject(d) pa.end_string = end_string parser = ParserCreate() parser.StartElementHandler = pa.handleBeginElement parser.EndElementHandler = pa.handleEndElement parser.CharacterDataHandler = pa.handleData if isinstance(s, unicode): # Encode unicode -> string; use utf-8 for safety s = s.encode("utf-8") # Parse the string parser.Parse(s, 1) p = pa.root except Exception as e: print(e) pass return p
def main(): from twisted.python.log import startLogging, err options = BenchmarkOptions() try: options.parseOptions(sys.argv[1:]) except UsageError, e: print(e) return 1 if options['debug']: from twisted.python.failure import startDebugMode startDebugMode() if options['source-directory']: source = options['source-directory'] conf = source.child('conf').child('caldavd-dev.plist') pids = whichPIDs(source, plistlib.PlistParser().parse(conf.open())) else: pids = [] msg("Using dtrace to monitor pids %r" % (pids, )) startLogging(file('benchmark.log', 'a'), False) d = benchmark(options['host'], options['port'], pids, options['label'], options['parameters'], [(arg, resolveBenchmark(arg).measure) for arg in options['benchmarks']]) d.addErrback(err, "Failure at benchmark runner top-level") reactor.callWhenRunning(d.addCallback, lambda ign: reactor.stop()) reactor.run()
def load(fp, fmt=None, use_builtin_types=None, dict_type=dict): if _check_py3(): use_builtin_types = True if use_builtin_types == None else use_builtin_types # We need to monkey patch this to allow for hex integers - code taken/modified from # https://github.com/python/cpython/blob/3.8/Lib/plistlib.py if fmt is None: header = fp.read(32) fp.seek(0) for info in plistlib._FORMATS.values(): if info['detect'](header): P = info['parser'] break else: raise plistlib.InvalidFileException() else: P = plistlib._FORMATS[fmt]['parser'] try: p = P(use_builtin_types=use_builtin_types, dict_type=dict_type) except: # Python 3.9 removed use_builtin_types p = P(dict_type=dict_type) if isinstance(p, plistlib._PlistParser): # Monkey patch! def end_integer(): d = p.get_data() p.add_object( int(d, 16) if d.lower().startswith("0x") else int(d)) p.end_integer = end_integer return p.parse(fp) elif not _is_binary(fp): # Is not binary - assume a string - and try to load # We avoid using readPlistFromString() as that uses # cStringIO and fails when Unicode strings are detected # Don't subclass - keep the parser local from xml.parsers.expat import ParserCreate # Create a new PlistParser object - then we need to set up # the values and parse. p = plistlib.PlistParser() # We also need to monkey patch this to allow for other dict_types def begin_dict(attrs): d = dict_type() p.addObject(d) p.stack.append(d) def end_integer(): d = p.getData() p.addObject(int(d, 16) if d.lower().startswith("0x") else int(d)) p.begin_dict = begin_dict p.end_integer = end_integer parser = ParserCreate() parser.StartElementHandler = p.handleBeginElement parser.EndElementHandler = p.handleEndElement parser.CharacterDataHandler = p.handleData if isinstance(fp, unicode): # Encode unicode -> string; use utf-8 for safety fp = fp.encode("utf-8") if isinstance(fp, basestring): # It's a string - let's wrap it up fp = StringIO(fp) # Parse it parser.ParseFile(fp) return p.root else: use_builtin_types = False if use_builtin_types == None else use_builtin_types try: p = _BinaryPlistParser(use_builtin_types=use_builtin_types, dict_type=dict_type) except: # Python 3.9 removed use_builtin_types p = _BinaryPlistParser(dict_type=dict_type) return p.parse(fp)