Skip to content
This repository was archived by the owner on Jan 21, 2021. It is now read-only.

Commit 63b48d0

Browse files
committed
Partial implementation of allOf (models remain incomplete).
1 parent 2108907 commit 63b48d0

File tree

2 files changed

+24
-37
lines changed

2 files changed

+24
-37
lines changed

openapi_python_client/parser/properties.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,8 +498,20 @@ def _property_from_data(
498498
inner_properties=sub_properties,
499499
nullable=data.nullable,
500500
)
501+
if data.allOf:
502+
sub_properties: List[Property] = []
503+
for sub_prop_data in data.allOf:
504+
sub_prop = property_from_data(name=name, required=required and (not data.nullable), data=sub_prop_data)
505+
if isinstance(sub_prop, PropertyError):
506+
return PropertyError(detail=f"Invalid property in union {name}", data=sub_prop_data)
507+
sub_properties.append(sub_prop)
508+
return UnionProperty(
509+
name=name, required=required, default=data.default, inner_properties=sub_properties, nullable=data.nullable,
510+
)
501511
if not data.type:
502-
return PropertyError(data=data, detail="Schemas must either have one of enum, anyOf, or type defined.")
512+
return PropertyError(
513+
data=data, detail="Schemas must either have one of enum, anyOf, oneOf, allOf, or type defined."
514+
)
503515
if data.type == "string":
504516
return _string_based_property(name=name, required=required, data=data)
505517
elif data.type == "number":

tests/test_openapi_parser/test_properties.py

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -609,9 +609,7 @@ def test_property_from_data_enum(self, mocker):
609609
data.title = mocker.MagicMock()
610610

611611
property_from_data(
612-
name=name,
613-
required=required,
614-
data=data,
612+
name=name, required=required, data=data,
615613
)
616614
EnumProperty.assert_called_once_with(
617615
name=name,
@@ -683,19 +681,14 @@ def test_property_from_data_simple_types(self, mocker, openapi_type, python_type
683681
data.nullable = mocker.MagicMock()
684682

685683
property_from_data(
686-
name=name,
687-
required=required,
688-
data=data,
684+
name=name, required=required, data=data,
689685
)
690686
clazz.assert_called_once_with(name=name, required=required, default=data.default, nullable=data.nullable)
691687

692688
def test_property_from_data_array(self, mocker):
693689
name = mocker.MagicMock()
694690
required = mocker.MagicMock()
695-
data = oai.Schema(
696-
type="array",
697-
items={"type": "number", "default": "0.0"},
698-
)
691+
data = oai.Schema(type="array", items={"type": "number", "default": "0.0"},)
699692
ListProperty = mocker.patch(f"{MODULE_NAME}.ListProperty")
700693
FloatProperty = mocker.patch(f"{MODULE_NAME}.FloatProperty")
701694
mocker.patch("openapi_python_client.utils.remove_string_escapes", return_value=name)
@@ -724,10 +717,7 @@ def test_property_from_data_array_no_items(self, mocker):
724717
def test_property_from_data_array_invalid_items(self, mocker):
725718
name = mocker.MagicMock()
726719
required = mocker.MagicMock()
727-
data = oai.Schema(
728-
type="array",
729-
items={},
730-
)
720+
data = oai.Schema(type="array", items={},)
731721
mocker.patch("openapi_python_client.utils.remove_string_escapes", return_value=name)
732722

733723
from openapi_python_client.parser.properties import property_from_data
@@ -739,12 +729,7 @@ def test_property_from_data_array_invalid_items(self, mocker):
739729
def test_property_from_data_union(self, mocker):
740730
name = mocker.MagicMock()
741731
required = mocker.MagicMock()
742-
data = oai.Schema(
743-
anyOf=[{"type": "number", "default": "0.0"}],
744-
oneOf=[
745-
{"type": "integer", "default": "0"},
746-
],
747-
)
732+
data = oai.Schema(anyOf=[{"type": "number", "default": "0.0"}], oneOf=[{"type": "integer", "default": "0"},],)
748733
UnionProperty = mocker.patch(f"{MODULE_NAME}.UnionProperty")
749734
FloatProperty = mocker.patch(f"{MODULE_NAME}.FloatProperty")
750735
IntProperty = mocker.patch(f"{MODULE_NAME}.IntProperty")
@@ -795,7 +780,7 @@ def test_property_from_data_no_valid_props_in_data(self):
795780

796781
data = oai.Schema()
797782
assert property_from_data(name="blah", required=True, data=data) == PropertyError(
798-
data=data, detail="Schemas must either have one of enum, anyOf, or type defined."
783+
data=data, detail="Schemas must either have one of enum, anyOf, oneOf, allOf, or type defined."
799784
)
800785

801786
def test_property_from_data_validation_error(self, mocker):
@@ -832,9 +817,7 @@ def test__string_based_property_no_format(self, mocker):
832817
data.pattern = mocker.MagicMock()
833818

834819
_string_based_property(
835-
name=name,
836-
required=required,
837-
data=data,
820+
name=name, required=required, data=data,
838821
)
839822
StringProperty.assert_called_once_with(
840823
name=name, required=required, pattern=data.pattern, default=data.default, nullable=data.nullable
@@ -858,9 +841,7 @@ def test__string_based_property_datetime_format(self, mocker):
858841
data.default = mocker.MagicMock()
859842

860843
_string_based_property(
861-
name=name,
862-
required=required,
863-
data=data,
844+
name=name, required=required, data=data,
864845
)
865846
DateTimeProperty.assert_called_once_with(
866847
name=name, required=required, default=data.default, nullable=data.nullable
@@ -883,9 +864,7 @@ def test__string_based_property_date_format(self, mocker):
883864
data.default = mocker.MagicMock()
884865

885866
_string_based_property(
886-
name=name,
887-
required=required,
888-
data=data,
867+
name=name, required=required, data=data,
889868
)
890869
DateProperty.assert_called_once_with(name=name, required=required, default=data.default, nullable=data.nullable)
891870

@@ -906,9 +885,7 @@ def test__string_based_property_binary_format(self, mocker):
906885
data.default = mocker.MagicMock()
907886

908887
_string_based_property(
909-
name=name,
910-
required=required,
911-
data=data,
888+
name=name, required=required, data=data,
912889
)
913890
FileProperty.assert_called_once_with(name=name, required=required, default=data.default, nullable=data.nullable)
914891

@@ -934,9 +911,7 @@ def test__string_based_property_unsupported_format(self, mocker):
934911
data.pattern = mocker.MagicMock()
935912

936913
_string_based_property(
937-
name=name,
938-
required=required,
939-
data=data,
914+
name=name, required=required, data=data,
940915
)
941916
StringProperty.assert_called_once_with(
942917
name=name, required=required, pattern=data.pattern, default=data.default, nullable=data.nullable

0 commit comments

Comments
 (0)