Source code for arrested.mixins


__all__ = [
    'GetListMixin', 'CreateMixin', 'GetObjectMixin', 'PutObjectMixin',
    'PatchObjectMixin', 'DeleteObjectMixin', 'ObjectMixin'
]


class HTTPMixin(object):
    """
    """

    def _response(self, body, status):
        """
        """

        return (self.make_response(body, status=status))


[docs]class GetListMixin(HTTPMixin): """Base ListMixin class that defines the expected API for all ListMixins """
[docs] def get_objects(self): """ """ raise NotImplementedError()
[docs] def list_response(self, status=200): """Pull the processed data from the response_handler and return a response. :param status: The HTTP status code returned with the response .. seealso: :meth:`Endpoint.make_response` :meth:`Endpoint.handle_get_request` """ return self._response(self.response.get_response_data(), status=status)
[docs] def handle_get_request(self): """Handle incoming GET request to an Endpoint and return an array of results by calling :meth:`.GetListMixin.get_objects`. .. seealso:: :meth:`GetListMixin.get_objects` :meth:`Endpoint.get` """ self.objects = self.get_objects() self.response = self.get_response_handler() self.response.process(self.objects) return self.list_response()
[docs]class CreateMixin(HTTPMixin): """Base CreateMixin class that defines the expected API for all CreateMixins """
[docs] def save_object(self, obj): """Called by :meth:`CreateMixin.handle_post_request` ater the incoming data has been marshalled by the RequestHandler. :param obj: The marhsaled object from RequestHandler. """ return obj
[docs] def create_response(self, status=201): """Generate a Response object for a POST request. By default, the newly created object will be passed to the specified ResponseHandler and will be serialized as the response body. """ self.response = self.get_response_handler() self.response.process(self.obj) return self._response(self.response.get_response_data(), status=status)
[docs] def handle_post_request(self): """Handle incoming POST request to an Endpoint and marshal the request data via the specified RequestHandler. :meth:`.CreateMixin.save_object`. is then called and must be implemented by mixins implementing this interfce. .. seealso:: :meth:`CreateMixin.save_object` :meth:`Endpoint.post` """ self.request = self.get_request_handler() self.obj = self.request.process().data self.save_object(self.obj) return self.create_response()
[docs]class ObjectMixin(object): """Mixin that provides an interface for working with single data objects """ allow_none = False
[docs] def get_object(self): """Called by :meth:`GetObjectMixin.handle_get_request`. Concrete classes should implement this method and return object typically by id. :raises: NotImplementedError """ raise NotImplementedError()
[docs] def object_response(self, status=200): """Generic response generation for Endpoints that return a single serialized object. :param status: The HTTP status code returned with the response :returns: Response object """ self.response = self.get_response_handler() self.response.process(self.obj) return self._response(self.response.get_response_data(), status=status)
@property def obj(self): """Returns the value of :meth:`ObjectMixin.get_object` and sets a private property called _obj. This property ensures the logic around allow_none is enforced across Endpoints using the Object interface. :raises: :class:`werkzeug.exceptions.BadRequest` :returns: The result of :meth:ObjectMixin.get_object` """ if not getattr(self, '_obj', None): self._obj = self.get_object() if self._obj is None and not self.allow_none: self.return_error(404) return self._obj @obj.setter def obj(self, value): """Sets the value of the private _obj property. """ self._obj = value
[docs]class GetObjectMixin(HTTPMixin, ObjectMixin): """Base GetObjectMixins class that defines the expected API for all GetObjectMixins """
[docs] def handle_get_request(self): """Handle incoming GET request to an Endpoint and return a single object by calling :meth:`.GetListMixin.get_object`. .. seealso:: :meth:`GetListMixin.get_objects` :meth:`Endpoint.get` """ return self.object_response()
[docs]class PutObjectMixin(HTTPMixin, ObjectMixin): """Base PutObjectMixins class that defines the expected API for all PutObjectMixin """
[docs] def put_request_response(self, status=200): """Pull the processed data from the response_handler and return a response. :param status: The HTTP status code returned with the response .. seealso: :meth:`ObjectMixin.object_response` :meth:`Endpoint.handle_put_request` """ return self.object_response(status=status)
[docs] def handle_put_request(self): """ """ obj = self.obj self.request = self.get_request_handler() self.request.process() self.update_object(obj) return self.put_request_response()
[docs] def update_object(self, obj): """Called by :meth:`PutObjectMixin.handle_put_request` ater the incoming data has been marshalled by the RequestHandler. :param obj: The marhsaled object from RequestHandler. """ return obj
[docs]class PatchObjectMixin(HTTPMixin, ObjectMixin): """Base PatchObjectMixin class that defines the expected API for all PatchObjectMixin """
[docs] def patch_request_response(self, status=200): """Pull the processed data from the response_handler and return a response. :param status: The HTTP status code returned with the response .. seealso: :meth:`ObjectMixin.object_response` :meth:`Endpoint.handle_put_request` """ return self.object_response(status=status)
[docs] def handle_patch_request(self): """ """ obj = self.obj self.request = self.get_request_handler() self.request.process() self.patch_object(obj) return self.patch_request_response()
[docs] def patch_object(self, obj): """Called by :meth:`PatchObjectMixin.handle_patch_request` ater the incoming data has been marshalled by the RequestHandler. :param obj: The marhsaled object from RequestHandler. """ return obj
[docs]class DeleteObjectMixin(HTTPMixin, ObjectMixin): """Base DeletehObjecttMixin class that defines the expected API for all DeletehObjecttMixins. """
[docs] def delete_request_response(self, status=204): """Pull the processed data from the response_handler and return a response. :param status: The HTTP status code returned with the response """ return (self.make_response('', status=status))
[docs] def handle_delete_request(self): """ """ self.delete_object(self.obj) return self.delete_request_response()
[docs] def delete_object(self, obj): """Called by :meth:`DeleteObjectMixin.handle_delete_request`. :param obj: The marhsaled object being deleted. """ return obj