1- from dataclasses import dataclass
1+ from dataclasses import dataclass , field
22from typing import Optional , List , Dict , Union , ClassVar
33import stringcase
44
@@ -40,6 +40,7 @@ def to_string(self) -> str:
4040@dataclass
4141class DateTimeProperty (Property ):
4242 """ A property of type datetime.datetime """
43+
4344 _type_string : ClassVar [str ] = "datetime"
4445
4546 def to_string (self ) -> str :
@@ -80,6 +81,7 @@ def to_string(self) -> str:
8081@dataclass
8182class BooleanProperty (Property ):
8283 """ Property for bool """
84+
8385 _type_string : ClassVar [str ] = "bool"
8486
8587 def to_string (self ) -> str :
@@ -109,19 +111,38 @@ def to_string(self) -> str:
109111class EnumProperty (Property ):
110112 """ A property that should use an enum """
111113
112- values : List [str ]
114+ values : Dict [str , str ]
115+ class_name : str = field (init = False )
116+
117+ def __post_init__ (self ):
118+ self .class_name = stringcase .pascalcase (self .name )
113119
114120 def get_type_string (self ):
115121 """ Get a string representation of type that should be used when declaring this property """
116- class_name = stringcase . pascalcase ( self . name )
122+
117123 if self .required :
118- return class_name
119- return f"Optional[{ class_name } ]"
124+ return self . class_name
125+ return f"Optional[{ self . class_name } ]"
120126
121127 def to_string (self ) -> str :
122128 """ How this should be declared in a dataclass """
123129 return f"{ self .name } : { self .get_type_string ()} "
124130
131+ @staticmethod
132+ def values_from_list (l : List [str ], / ) -> Dict [str , str ]:
133+ """ Convert a list of values into dict of {name: value} """
134+ output : Dict [str , str ] = {}
135+
136+ for i , value in enumerate (l ):
137+ if value .isalpha ():
138+ key = value .upper ()
139+ else :
140+ key = f"VALUE_{ i } "
141+ assert key not in output , f"Duplicate key { key } in Enum"
142+ output [key ] = value
143+
144+ return output
145+
125146
126147@dataclass
127148class RefProperty (Property ):
@@ -165,23 +186,23 @@ def property_from_dict(
165186) -> Property :
166187 """ Generate a Property from the OpenAPI dictionary representation of it """
167188 if "enum" in data :
168- return EnumProperty (name = name , required = required , values = data ["enum" ], )
189+ return EnumProperty (name = name , required = required , values = EnumProperty . values_from_list ( data ["enum" ]) )
169190 if "$ref" in data :
170191 ref = data ["$ref" ].split ("/" )[- 1 ]
171- return RefProperty (name = name , required = required , ref = ref , )
192+ return RefProperty (name = name , required = required , ref = ref )
172193 if data ["type" ] == "string" :
173194 if "format" not in data :
174195 return StringProperty (
175196 name = name , default = data .get ("default" ), required = required , pattern = data .get ("pattern" ),
176197 )
177198 elif data ["format" ] == "date-time" :
178- return DateTimeProperty (name = name , required = required , )
199+ return DateTimeProperty (name = name , required = required )
179200 elif data ["type" ] == "number" :
180- return FloatProperty (name = name , default = data .get ("default" ), required = required , )
201+ return FloatProperty (name = name , default = data .get ("default" ), required = required )
181202 elif data ["type" ] == "integer" :
182- return IntProperty (name = name , default = data .get ("default" ), required = required , )
203+ return IntProperty (name = name , default = data .get ("default" ), required = required )
183204 elif data ["type" ] == "boolean" :
184- return BooleanProperty (name = name , required = required , )
205+ return BooleanProperty (name = name , required = required )
185206 elif data ["type" ] == "array" :
186207 ref = None
187208 if "$ref" in data ["items" ]:
@@ -191,5 +212,5 @@ def property_from_dict(
191212 _type = _openapi_types_to_python_type_strings [data ["items" ]["type" ]]
192213 return ListProperty (name = name , required = required , type = _type , ref = ref )
193214 elif data ["type" ] == "object" :
194- return DictProperty (name = name , required = required , )
215+ return DictProperty (name = name , required = required )
195216 raise ValueError (f"Did not recognize type of { data } " )
0 commit comments