[Yum-devel] [PATCH 06/10] _dumps + _loads: custom serializer/parser
Zdeněk Pavlas
zpavlas at redhat.com
Mon Nov 7 10:55:13 UTC 2011
---
urlgrabber/grabber.py | 73 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 73 insertions(+), 0 deletions(-)
diff --git a/urlgrabber/grabber.py b/urlgrabber/grabber.py
index d3d0eec..e447435 100644
--- a/urlgrabber/grabber.py
+++ b/urlgrabber/grabber.py
@@ -1911,6 +1911,79 @@ class _DirectDownloader:
self.multi.remove_handle(curl)
fo._do_close_fo()
+#####################################################################
+# Serializer + parser: A replacement of the rather bulky Json code.
+#
+# - handles basic python literals, lists and tuples.
+# - dumped strings never contain the ' ' character.
+#
+#####################################################################
+
+_quoter_map = {}
+for c in '%[(,)] ':
+ _quoter_map[c] = '%%%02x' % ord(c)
+del c
+
+def _dumps(v):
+ if v is None: return 'None'
+ if v is True: return 'True'
+ if v is False: return 'False'
+ if type(v) in (int, long, float):
+ return str(v)
+ if type(v) == unicode:
+ v = v.encode('UTF8')
+ if type(v) == str:
+ def quoter(c): return _quoter_map.get(c, c)
+ return "'%s'" % ''.join(map(quoter, v))
+ if type(v) == tuple:
+ return "(%s)" % ','.join(map(_dumps, v))
+ if type(v) == list:
+ return "[%s]" % ','.join(map(_dumps, v))
+ raise TypeError
+
+def _loads(s):
+ def decode(v):
+ if v == 'None': return None
+ if v == 'True': return True
+ if v == 'False': return False
+ try: return int(v)
+ except ValueError: pass
+ try: return float(v)
+ except ValueError: pass
+ if len(v) >= 2 and v[0] == v[-1] == "'":
+ ret = []; i = 1
+ while True:
+ j = v.find('%', i)
+ ret.append(v[i:j]) # skips the final "'"
+ if j == -1: break
+ ret.append(chr(int(v[j + 1:j + 3], 16)))
+ i = j + 3
+ v = ''.join(ret)
+ return v
+ stk = None
+ l = []
+ i = j = 0
+ while True:
+ if j == len(s) or s[j] in ',)]':
+ if j > i:
+ l.append(decode(s[i:j]))
+ if j == len(s): break
+ if s[j] in ')]':
+ if s[j] == ')':
+ l = tuple(l)
+ stk[0].append(l)
+ l, stk = stk
+ i = j = j + 1
+ elif s[j] in '[(':
+ stk = l, stk
+ l = []
+ i = j = j + 1
+ else:
+ j += 1 # safe because '[(,)]' are quoted
+ if stk: raise ValueError
+ if len(l) == 1: l = l[0]
+ return l
+
#####################################################################
# High level async API
--
1.7.4.4
More information about the Yum-devel
mailing list