@@ -65,7 +65,7 @@ def __init__(
65
65
:param dict info: Application information
66
66
:param dict openapi: OpenAPI configuration options
67
67
68
- :return: api instance
68
+ :return: API instance
69
69
"""
70
70
info = info or {}
71
71
openapi = openapi or {}
@@ -107,6 +107,7 @@ def __init__(
107
107
self ._add_docs ()
108
108
109
109
def _add_handlers (self ):
110
+ """Add custom media handlers."""
110
111
extra_handlers = {
111
112
"application/yaml" : YAMLHandler (),
112
113
"text/html; charset=utf-8" : TextHandler (),
@@ -118,6 +119,7 @@ def _add_handlers(self):
118
119
self .resp_options .media_handlers .update (extra_handlers )
119
120
120
121
def _load_resources (self ):
122
+ """Load resource classes from the specified resource path."""
121
123
resources = []
122
124
path = f"{ self .resource_path } /*.py"
123
125
print (f"searching { path } " )
@@ -128,10 +130,11 @@ def _load_resources(self):
128
130
classes = self ._get_classes (file )
129
131
resources .extend (classes )
130
132
131
- # add config to resource
133
+ # Add config to resource
132
134
self .resources = [x (app_config = self .config , ** self .resource_attributes ) for x in resources ]
133
135
134
136
def _is_route_method (self , name , suffix ):
137
+ """Check if a method name is a route method."""
135
138
if not name .startswith ("on_" ):
136
139
return None
137
140
@@ -141,6 +144,7 @@ def _is_route_method(self, name, suffix):
141
144
return re .search (r"^on_([a-z]+)$" , name )
142
145
143
146
def _parse_methods (self , resource , route , methods ):
147
+ """Parse methods of a resource for a given route."""
144
148
parser = SphinxParser ()
145
149
for name in methods :
146
150
operation_id = f"{ resource .__class__ .__name__ } .{ name } "
@@ -149,23 +153,30 @@ def _parse_methods(self, resource, route, methods):
149
153
resource .__data__ [route ][action ] = parser .parse (method , operation_id = operation_id )
150
154
151
155
def _parse_resource (self , resource ):
156
+ """Parse a resource to extract routes and methods."""
152
157
for route , data in resource .__routes__ .items ():
153
158
resource .__data__ [route ] = {}
154
159
suffix = data .get ("suffix" , None )
155
160
methods = [x for x in dir (resource ) if self ._is_route_method (x , suffix )]
156
161
self ._parse_methods (resource , route , methods )
157
162
158
163
def _parse_docstrings (self ):
164
+ """Parse docstrings of all resources."""
159
165
for resource in self .resources :
160
166
resource .__data__ = {}
161
167
self ._parse_resource (resource )
162
168
163
169
def _get_classes (self , filename ):
170
+ """Get resource classes from a file."""
164
171
classes = []
165
172
module_name = str (uuid .uuid3 (uuid .NAMESPACE_OID , filename ))
166
173
spec = importlib .util .spec_from_file_location (module_name , filename )
167
174
module = importlib .util .module_from_spec (spec )
168
- spec .loader .exec_module (module )
175
+ try :
176
+ spec .loader .exec_module (module )
177
+ except (ImportError , FileNotFoundError , SyntaxError , TypeError , AttributeError ) as e :
178
+ print (f"Error loading module { module_name } : { e } " )
179
+ return classes
169
180
170
181
for _ , c in inspect .getmembers (module , inspect .isclass ):
171
182
if issubclass (c , Resource ) and hasattr (c , "__routes__" ):
@@ -174,12 +185,14 @@ def _get_classes(self, filename):
174
185
return classes
175
186
176
187
def _add_routes (self ):
188
+ """Add routes for all resources."""
177
189
for resource in self .resources :
178
190
routes = resource .__routes__
179
191
for route , kwargs in routes .items ():
180
192
self .add_route (route , resource , ** kwargs )
181
193
182
194
def _add_docs (self ):
195
+ """Add Swagger and OpenAPI documentation routes."""
183
196
swagger = Swagger (
184
197
self .openapi ["static_url" ],
185
198
self .openapi ["spec_url" ],
0 commit comments