Index: reviewbot/third_party/google-api-python-client/uritemplate/__init__.py |
=================================================================== |
--- reviewbot/third_party/google-api-python-client/uritemplate/__init__.py (revision 0) |
+++ reviewbot/third_party/google-api-python-client/uritemplate/__init__.py (revision 0) |
@@ -0,0 +1,147 @@ |
+# Early, and incomplete implementation of -04. |
+# |
+import re |
+import urllib |
+ |
+RESERVED = ":/?#[]@!$&'()*+,;=" |
+OPERATOR = "+./;?|!@" |
+EXPLODE = "*+" |
+MODIFIER = ":^" |
+TEMPLATE = re.compile(r"{(?P<operator>[\+\./;\?|!@])?(?P<varlist>[^}]+)}", re.UNICODE) |
+VAR = re.compile(r"^(?P<varname>[^=\+\*:\^]+)((?P<explode>[\+\*])|(?P<partial>[:\^]-?[0-9]+))?(=(?P<default>.*))?$", re.UNICODE) |
+ |
+def _tostring(varname, value, explode, operator, safe=""): |
+ if type(value) == type([]): |
+ if explode == "+": |
+ return ",".join([varname + "." + urllib.quote(x, safe) for x in value]) |
+ else: |
+ return ",".join([urllib.quote(x, safe) for x in value]) |
+ if type(value) == type({}): |
+ keys = value.keys() |
+ keys.sort() |
+ if explode == "+": |
+ return ",".join([varname + "." + urllib.quote(key, safe) + "," + urllib.quote(value[key], safe) for key in keys]) |
+ else: |
+ return ",".join([urllib.quote(key, safe) + "," + urllib.quote(value[key], safe) for key in keys]) |
+ else: |
+ return urllib.quote(value, safe) |
+ |
+ |
+def _tostring_path(varname, value, explode, operator, safe=""): |
+ joiner = operator |
+ if type(value) == type([]): |
+ if explode == "+": |
+ return joiner.join([varname + "." + urllib.quote(x, safe) for x in value]) |
+ elif explode == "*": |
+ return joiner.join([urllib.quote(x, safe) for x in value]) |
+ else: |
+ return ",".join([urllib.quote(x, safe) for x in value]) |
+ elif type(value) == type({}): |
+ keys = value.keys() |
+ keys.sort() |
+ if explode == "+": |
+ return joiner.join([varname + "." + urllib.quote(key, safe) + joiner + urllib.quote(value[key], safe) for key in keys]) |
+ elif explode == "*": |
+ return joiner.join([urllib.quote(key, safe) + joiner + urllib.quote(value[key], safe) for key in keys]) |
+ else: |
+ return ",".join([urllib.quote(key, safe) + "," + urllib.quote(value[key], safe) for key in keys]) |
+ else: |
+ if value: |
+ return urllib.quote(value, safe) |
+ else: |
+ return "" |
+ |
+def _tostring_query(varname, value, explode, operator, safe=""): |
+ joiner = operator |
+ varprefix = "" |
+ if operator == "?": |
+ joiner = "&" |
+ varprefix = varname + "=" |
+ if type(value) == type([]): |
+ if 0 == len(value): |
+ return "" |
+ if explode == "+": |
+ return joiner.join([varname + "=" + urllib.quote(x, safe) for x in value]) |
+ elif explode == "*": |
+ return joiner.join([urllib.quote(x, safe) for x in value]) |
+ else: |
+ return varprefix + ",".join([urllib.quote(x, safe) for x in value]) |
+ elif type(value) == type({}): |
+ if 0 == len(value): |
+ return "" |
+ keys = value.keys() |
+ keys.sort() |
+ if explode == "+": |
+ return joiner.join([varname + "." + urllib.quote(key, safe) + "=" + urllib.quote(value[key], safe) for key in keys]) |
+ elif explode == "*": |
+ return joiner.join([urllib.quote(key, safe) + "=" + urllib.quote(value[key], safe) for key in keys]) |
+ else: |
+ return varprefix + ",".join([urllib.quote(key, safe) + "," + urllib.quote(value[key], safe) for key in keys]) |
+ else: |
+ if value: |
+ return varname + "=" + urllib.quote(value, safe) |
+ else: |
+ return varname |
+ |
+TOSTRING = { |
+ "" : _tostring, |
+ "+": _tostring, |
+ ";": _tostring_query, |
+ "?": _tostring_query, |
+ "/": _tostring_path, |
+ ".": _tostring_path, |
+ } |
+ |
+ |
+def expand(template, vars): |
+ def _sub(match): |
+ groupdict = match.groupdict() |
+ operator = groupdict.get('operator') |
+ if operator is None: |
+ operator = '' |
+ varlist = groupdict.get('varlist') |
+ |
+ safe = "@" |
+ if operator == '+': |
+ safe = RESERVED |
+ varspecs = varlist.split(",") |
+ varnames = [] |
+ defaults = {} |
+ for varspec in varspecs: |
+ m = VAR.search(varspec) |
+ groupdict = m.groupdict() |
+ varname = groupdict.get('varname') |
+ explode = groupdict.get('explode') |
+ partial = groupdict.get('partial') |
+ default = groupdict.get('default') |
+ if default: |
+ defaults[varname] = default |
+ varnames.append((varname, explode, partial)) |
+ |
+ retval = [] |
+ joiner = operator |
+ prefix = operator |
+ if operator == "+": |
+ prefix = "" |
+ joiner = "," |
+ if operator == "?": |
+ joiner = "&" |
+ if operator == "": |
+ joiner = "," |
+ for varname, explode, partial in varnames: |
+ if varname in vars: |
+ value = vars[varname] |
+ #if not value and (type(value) == type({}) or type(value) == type([])) and varname in defaults: |
+ if not value and value != "" and varname in defaults: |
+ value = defaults[varname] |
+ elif varname in defaults: |
+ value = defaults[varname] |
+ else: |
+ continue |
+ retval.append(TOSTRING[operator](varname, value, explode, operator, safe=safe)) |
+ if "".join(retval): |
+ return prefix + joiner.join(retval) |
+ else: |
+ return "" |
+ |
+ return TEMPLATE.sub(_sub, template) |
Property changes on: reviewbot/third_party/google-api-python-client/uritemplate/__init__.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |