Skip to content

Commit

Permalink
optimizations
Browse files Browse the repository at this point in the history
  • Loading branch information
Diogo Laginha authored and laginha committed Mar 11, 2015
1 parent 12e9104 commit 50ea43d
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 17 deletions.
11 changes: 4 additions & 7 deletions src/yard/api.py
Expand Up @@ -48,13 +48,10 @@ def build_collection_pattern():
path = r'%s%s/?$' %(self.__path, resource_path)
return build_pattern(path, self.__collection_routes, name)

self.__urlpatterns.append( single_pattern() )
self.__urlpatterns.append( collection_pattern() )

#if has_any( resource_class, self.__single_routes ):
# self.__urlpatterns.append( build_single_pattern() )
#if has_any( resource_class, self.__collection_routes ):
# self.__urlpatterns.append( build_collection_pattern() )
if has_any( resource_class, self.__single_routes ):
self.__urlpatterns.append( build_single_pattern() )
if has_any( resource_class, self.__collection_routes ):
self.__urlpatterns.append( build_collection_pattern() )
if hasattr(resource_class, 'model'):
self.__mapping[ resource_class.model ] = resource_class

Expand Down
28 changes: 18 additions & 10 deletions src/yard/resources/__init__.py
Expand Up @@ -24,7 +24,7 @@ class Meta(object):
class Pagination(object):
pass

def __init__(self, api, routes):
def __init__(self, api, routes):
self._api = api
self.__routes = routes # maps http methods with respective views
self.__meta = ResourceMeta( self.Meta )
Expand All @@ -33,15 +33,23 @@ def __init__(self, api, routes):
self.fields = self.__get_fields()
self.index_fields = getattr(self, "index_fields", self.fields)
self.show_fields = getattr(self, "show_fields", self.fields)
self.description = getattr(self, "description", "not provided")
self.description = getattr(self, "description", "not provided")
self.__allowed_methods = [k for k,v in self.__routes.items() if hasattr(self, v)]
self.__builders = self.__create_json_builders()
self.__meta.page_class = self.__pagination #TEMPORARY

def __get_fields(self):
if hasattr(self, "fields"):
return self.fields
elif not hasattr(self, "model"):
return {}
return model_to_fields(self.model)

def __create_json_builders(self):
return {
id(i): JSONbuilder(self._api, i)
for i in [self.index_fields, self.show_fields, self.fields] if not callable(i)
}

def __call__(self, request, **parameters):
'''
Expand Down Expand Up @@ -77,12 +85,12 @@ def __resource_parameters(self, request, parameters):
for i in self.__parameters.get( request ):
resource_params.update( i )
return resource_params

def __get_builder(self, fields, parameters):
if callable(fields):
current_fields = fields(parameters)
return JSONbuilder( self._api, current_fields ), current_fields
return JSONbuilder( self._api, fields ), fields
return self.__builders[ id(fields) ], fields

def __handle_response(self, request, response, current_fields, resource_parameters, builder):
'''
Expand Down Expand Up @@ -146,7 +154,7 @@ def __serialize_all(self, resources, builder):
return [builder.to_json(i) for i in resources]

def serialize_all(self, resources, fields):
builder = JSONbuilder( self._api, fields )
builder = self.__builders.get( id(fields) ) or JSONbuilder(self._api, fields)
return self.__serialize_all( resources, builder )

def __serialize(self, resource, builder):
Expand All @@ -156,7 +164,7 @@ def __serialize(self, resource, builder):
return builder.to_json(resource)

def serialize(self, resource, fields):
builder = JSONbuilder( self._api, fields )
builder = self.__builders.get( id(fields) ) or JSONbuilder(self._api, fields)
return self.__serialize( resource, builder )

#
Expand Down Expand Up @@ -199,8 +207,8 @@ def handle_options(self, request, parameters):
response = self.options(request, **parameters)
builder, fields = self.__get_builder(self.fields, parameters)
response = self.__handle_response(request, response, fields, parameters, builder)
response['Allow'] = ','.join([k for k,v in self.__routes.items() if hasattr(self, v)])
response['Allow'] = self.__allowed_methods
return response

def options(self, request, **parameters):
return 200
return 404 if len(self.__allowed_methods) <= 1 else 200

0 comments on commit 50ea43d

Please sign in to comment.