Add checking that parameters passed in conform the pattern supplied in the discovery document, if supplied.
diff --git a/apiclient/discovery.py b/apiclient/discovery.py
index 71e901b..7d884af 100644
--- a/apiclient/discovery.py
+++ b/apiclient/discovery.py
@@ -150,7 +150,16 @@
pathUrl = re.sub(r'\{', r'{+', pathUrl)
httpMethod = methodDesc['httpMethod']
args = methodDesc['parameters'].keys()
- required = [arg for arg in args if methodDesc['parameters'][arg].get('required', True)]
+
+ required = [] # Required parameters
+ pattern = {} # Parameters the must match a regex
+ for arg, desc in methodDesc['parameters'].iteritems():
+ param = key2param(arg)
+ if desc.get('pattern', ''):
+ pattern[param] = desc['pattern']
+ if desc.get('required', False):
+ required.append(param)
+
if httpMethod in ['PUT', 'POST']:
args.append('body')
argmap = dict([(key2param(key), key) for key in args])
@@ -159,20 +168,30 @@
for name in kwargs.iterkeys():
if name not in argmap:
raise TypeError('Got an unexpected keyword argument "%s"' % name)
- params = dict(
- [(argmap[key], value) for key, value in kwargs.iteritems()]
- )
+
for name in required:
if name not in kwargs:
raise TypeError('Missing required parameter "%s"' % name)
+
+ for name, regex in pattern.iteritems():
+ if name in kwargs:
+ if re.match(regex, kwargs[name]) is None:
+ raise TypeError('Parameter "%s" value "%s" does match the pattern "%s"' % (name, kwargs[name], regex))
+
+ params = {}
+ for key, value in kwargs.iteritems():
+ params[argmap[key]] = value
+
headers = {}
headers, params, query, body = self._model.request(headers, params)
url = urlparse.urljoin(self._baseUrl,
uritemplate.expand(pathUrl, params) + query)
- return self._model.response(*self._http.request(
- url, method=httpMethod, headers=headers, body=body))
+ resp, content = self._http.request(
+ url, method=httpMethod, headers=headers, body=body)
+
+ return self._model.response(resp, content)
docs = ['A description of how to use this function\n\n']
for arg in argmap.iterkeys():