Skip to content

Some changes which enabled me to use the PagerDuty swagger #135

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion bravado_core/resource.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from collections import defaultdict
import logging
import re

from six import iteritems

Expand Down Expand Up @@ -71,7 +72,8 @@ def build_resources(swagger_spec):

resources = {}
for tag, ops in iteritems(tag_to_ops):
resources[tag] = Resource(tag, ops)
resource_identifier = re.sub('[^0-9a-zA-Z_]', '', tag)
resources[resource_identifier] = Resource(tag, ops)
return resources


Expand Down
30 changes: 24 additions & 6 deletions bravado_core/unmarshal.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# -*- coding: utf-8 -*-
import collections

from six import iteritems

from bravado_core import formatter
Expand All @@ -12,7 +14,8 @@
from bravado_core.schema import SWAGGER_PRIMITIVES


def unmarshal_schema_object(swagger_spec, schema_object_spec, value):
def unmarshal_schema_object(swagger_spec, schema_object_spec, value,
all_of_parent=False):
"""Unmarshal the value using the given schema object specification.

Unmarshaling includes:
Expand All @@ -23,21 +26,30 @@ def unmarshal_schema_object(swagger_spec, schema_object_spec, value):
:type swagger_spec: :class:`bravado_core.spec.Spec`
:type schema_object_spec: dict
:type value: int, float, long, string, unicode, boolean, list, dict, etc
:type all_of_parent: boolean

:return: unmarshaled value
:rtype: int, float, long, string, unicode, boolean, list, dict, object (in
the case of a 'format' conversion', or Model type
"""
deref = swagger_spec.deref
schema_object_spec = deref(schema_object_spec)

all_of = deref(schema_object_spec.get('allOf'))
if all_of:
return [unmarshal_schema_object(swagger_spec, one_schema, value, True)
for one_schema in all_of]

try:
obj_type = schema_object_spec['type']
except KeyError:
raise SwaggerMappingError(
"The following schema object is missing a type field: {0}"
.format(schema_object_spec.get('x-model', str(schema_object_spec))))

if obj_type in SWAGGER_PRIMITIVES:
if (obj_type in SWAGGER_PRIMITIVES or
(isinstance(obj_type, collections.Iterable) and
not isinstance(obj_type, str))):
return unmarshal_primitive(swagger_spec, schema_object_spec, value)

if obj_type == 'array':
Expand All @@ -51,7 +63,8 @@ def unmarshal_schema_object(swagger_spec, schema_object_spec, value):
return unmarshal_model(swagger_spec, schema_object_spec, value)

if obj_type == 'object':
return unmarshal_object(swagger_spec, schema_object_spec, value)
return unmarshal_object(swagger_spec, schema_object_spec, value,
all_of_parent)

if obj_type == 'file':
return value
Expand Down Expand Up @@ -102,12 +115,14 @@ def unmarshal_array(swagger_spec, array_spec, array_value):
]


def unmarshal_object(swagger_spec, object_spec, object_value):
def unmarshal_object(swagger_spec, object_spec, object_value,
filter_undeclared=False):
"""Unmarshal a jsonschema type of 'object' into a python dict.

:type swagger_spec: :class:`bravado_core.spec.Spec`
:type object_spec: dict
:type object_value: dict
:type filter_undeclared boolean
:rtype: dict
:raises: SwaggerMappingError
"""
Expand All @@ -122,9 +137,13 @@ def unmarshal_object(swagger_spec, object_spec, object_value):

object_spec = deref(object_spec)
required_fields = object_spec.get('required', [])
all_properties = collapsed_properties(deref(object_spec), swagger_spec)

result = {}
for k, v in iteritems(object_value):
if k not in all_properties and filter_undeclared:
continue

prop_spec = get_spec_for_prop(
swagger_spec, object_spec, object_value, k)
if v is None and k not in required_fields:
Expand All @@ -136,8 +155,7 @@ def unmarshal_object(swagger_spec, object_spec, object_value):
result[k] = v

# re-introduce and None'ify any properties that weren't passed
properties = collapsed_properties(deref(object_spec), swagger_spec)
for prop_name, prop_spec in iteritems(properties):
for prop_name, prop_spec in iteritems(all_properties):
if prop_name not in result:
result[prop_name] = None
return result
Expand Down
35 changes: 22 additions & 13 deletions bravado_core/validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,33 @@ def validate_schema_object(swagger_spec, schema_object_spec, value):
:raises SwaggerValidationError: when user-defined format validation fails.
"""
deref = swagger_spec.deref
schema_object_spec = deref(schema_object_spec)
obj_type = deref(schema_object_spec.get('type'))

if obj_type in SWAGGER_PRIMITIVES:
validate_primitive(swagger_spec, schema_object_spec, value)
schemas = []

elif obj_type == 'array':
validate_array(swagger_spec, schema_object_spec, value)
all_of = deref(schema_object_spec.get('allOf'))
if all_of is not None:
schemas = [deref(sub_schema) for sub_schema in all_of]
else:
schemas = [deref(schema_object_spec)]

elif obj_type == 'object':
validate_object(swagger_spec, schema_object_spec, value)
for one_schema in schemas:
obj_type = deref(one_schema.get('type'))

elif obj_type == 'file':
pass
if obj_type in SWAGGER_PRIMITIVES:
validate_primitive(swagger_spec, one_schema, value)

else:
raise SwaggerMappingError('Unknown type {0} for value {1}'.format(
obj_type, value))
elif obj_type == 'array':
validate_array(swagger_spec, one_schema, value)

elif obj_type == 'object':
validate_object(swagger_spec, one_schema, value)

elif obj_type == 'file':
pass

else:
raise SwaggerMappingError('Unknown type {0} for value {1}'.format(
obj_type, value))


def validate_primitive(swagger_spec, primitive_spec, value):
Expand Down