1
- from dataclasses import dataclass
1
+ from dataclasses import dataclass , field
2
2
from typing import Optional , List , Dict , Union , ClassVar
3
3
import stringcase
4
4
@@ -40,6 +40,7 @@ def to_string(self) -> str:
40
40
@dataclass
41
41
class DateTimeProperty (Property ):
42
42
""" A property of type datetime.datetime """
43
+
43
44
_type_string : ClassVar [str ] = "datetime"
44
45
45
46
def to_string (self ) -> str :
@@ -80,6 +81,7 @@ def to_string(self) -> str:
80
81
@dataclass
81
82
class BooleanProperty (Property ):
82
83
""" Property for bool """
84
+
83
85
_type_string : ClassVar [str ] = "bool"
84
86
85
87
def to_string (self ) -> str :
@@ -109,19 +111,38 @@ def to_string(self) -> str:
109
111
class EnumProperty (Property ):
110
112
""" A property that should use an enum """
111
113
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 )
113
119
114
120
def get_type_string (self ):
115
121
""" Get a string representation of type that should be used when declaring this property """
116
- class_name = stringcase . pascalcase ( self . name )
122
+
117
123
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 } ]"
120
126
121
127
def to_string (self ) -> str :
122
128
""" How this should be declared in a dataclass """
123
129
return f"{ self .name } : { self .get_type_string ()} "
124
130
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
+
125
146
126
147
@dataclass
127
148
class RefProperty (Property ):
@@ -165,23 +186,23 @@ def property_from_dict(
165
186
) -> Property :
166
187
""" Generate a Property from the OpenAPI dictionary representation of it """
167
188
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" ]) )
169
190
if "$ref" in data :
170
191
ref = data ["$ref" ].split ("/" )[- 1 ]
171
- return RefProperty (name = name , required = required , ref = ref , )
192
+ return RefProperty (name = name , required = required , ref = ref )
172
193
if data ["type" ] == "string" :
173
194
if "format" not in data :
174
195
return StringProperty (
175
196
name = name , default = data .get ("default" ), required = required , pattern = data .get ("pattern" ),
176
197
)
177
198
elif data ["format" ] == "date-time" :
178
- return DateTimeProperty (name = name , required = required , )
199
+ return DateTimeProperty (name = name , required = required )
179
200
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 )
181
202
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 )
183
204
elif data ["type" ] == "boolean" :
184
- return BooleanProperty (name = name , required = required , )
205
+ return BooleanProperty (name = name , required = required )
185
206
elif data ["type" ] == "array" :
186
207
ref = None
187
208
if "$ref" in data ["items" ]:
@@ -191,5 +212,5 @@ def property_from_dict(
191
212
_type = _openapi_types_to_python_type_strings [data ["items" ]["type" ]]
192
213
return ListProperty (name = name , required = required , type = _type , ref = ref )
193
214
elif data ["type" ] == "object" :
194
- return DictProperty (name = name , required = required , )
215
+ return DictProperty (name = name , required = required )
195
216
raise ValueError (f"Did not recognize type of { data } " )
0 commit comments