Skip to content

Commit

Permalink
Merge pull request #134 from jvgutierrez/master
Browse files Browse the repository at this point in the history
Pass formData parameters as keyword arguments
  • Loading branch information
jmcs committed Feb 3, 2016
2 parents 6a6144f + d126c42 commit 5222e44
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 0 deletions.
15 changes: 15 additions & 0 deletions connexion/decorators/parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,13 @@ def parameter_to_arg(parameters, function):
default_body = body_parameters[0].get('default')
query_types = {parameter['name']: parameter
for parameter in parameters if parameter['in'] == 'query'} # type: dict[str, str]
form_types = {parameter['name']: parameter
for parameter in parameters if parameter['in'] == 'formData'}
arguments = get_function_arguments(function)
default_query_params = {param['name']: param['default']
for param in parameters if param['in'] == 'query' and 'default' in param}
default_form_params = {param['name']: param['default']
for param in parameters if param['in'] == 'formData' and 'default' in param}

@functools.wraps(function)
def wrapper(*args, **kwargs):
Expand Down Expand Up @@ -97,6 +101,17 @@ def wrapper(*args, **kwargs):
logger.debug('%s is a %s', key, query_param)
kwargs[key] = get_val_from_param(value, query_param)

# Add formData parameters
form_arguments = copy.deepcopy(default_form_params)
form_arguments.update(flask.request.form.items())
for key, value in form_arguments.items():
if key not in arguments:
logger.debug("FormData parameter '%s' not in function arguments", key)
else:
logger.debug("FormData parameter '%s' in function arguments", key)
form_param = form_types[key]
kwargs[key] = get_val_from_param(value, form_param)

return function(*args, **kwargs)

return wrapper
20 changes: 20 additions & 0 deletions tests/fakeapi/api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -616,6 +616,26 @@ paths:
in: query
default: 1

/test-formData-param:
post:
summary: Test formData parameter
operationId: fakeapi.hello.test_formData_param
parameters:
- name: formData
type: string
in: formData
required: true

/test-formData-missing-param:
post:
summary: Test formData missing parameter in handler
operationId: fakeapi.hello.test_formData_missing_param
parameters:
- name: missing_formData
type: string
in: formData
required: true

/test-bool-param:
get:
summary: Test usage of boolean default value
Expand Down
8 changes: 8 additions & 0 deletions tests/fakeapi/hello.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,5 +220,13 @@ def test_falsy_param(falsy):
return falsy


def test_formData_param(formData):
return formData


def test_formData_missing_param():
return ''


def test_bool_default_param(thruthiness):
return thruthiness
15 changes: 15 additions & 0 deletions tests/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,21 @@ def test_falsy_param(app):
response = json.loads(resp.data.decode())
assert response == 1


def test_formData_param(app):
app_client = app.app.test_client()
resp = app_client.post('/v1.0/test-formData-param', data={'formData': 'test'})
assert resp.status_code == 200
response = json.loads(resp.data.decode())
assert response == 'test'


def test_formData_missing_param(app):
app_client = app.app.test_client()
resp = app_client.post('/v1.0/test-formData-missing-param', data={'missing_formData': 'test'})
assert resp.status_code == 200


def test_bool_as_default_param(app):
app_client = app.app.test_client()
resp = app_client.get('/v1.0/test-bool-param')
Expand Down

0 comments on commit 5222e44

Please sign in to comment.