Skip to content
This repository has been archived by the owner on Apr 27, 2020. It is now read-only.

Commit

Permalink
Base resource now takes request as third positional argument
Browse files Browse the repository at this point in the history
  • Loading branch information
hadrien committed Feb 27, 2015
1 parent 566f1b8 commit 2480208
Show file tree
Hide file tree
Showing 8 changed files with 38 additions and 35 deletions.
2 changes: 2 additions & 0 deletions CHANGES.rst
Expand Up @@ -5,6 +5,8 @@ Development
-----------

- Fix issue #6: HTTP 500 error when using POST verb on Item resources.
- Breaking changes: Base resource now takes request as third positional
argument.

0.7.4
-----
Expand Down
4 changes: 2 additions & 2 deletions example/resources/photos.py
Expand Up @@ -24,8 +24,8 @@ def index(self, params):

class Item(royal.Item):

def __init__(self, key, parent, document=None):
super(Item, self).__init__(key, parent)
def __init__(self, key, parent, request, document=None):
super(Item, self).__init__(key, parent, request)
self.document = document

def load_document(self):
Expand Down
9 changes: 5 additions & 4 deletions example/resources/users.py
Expand Up @@ -17,7 +17,8 @@ def index(self, params):
offset = params['offset']
limit = params['limit']
cursor = User.get_newests(self.root.db, offset, limit)
documents = [Item(user.username, self, user).show() for user in cursor]
documents = [Item(user.username, self, self.request, user).show()
for user in cursor]
result = {
'users': documents,
'href': self.url(offset=offset, limit=limit),
Expand All @@ -35,8 +36,8 @@ def index(self, params):

class Item(royal.Item):

def __init__(self, key, parent, document=None):
super(Item, self).__init__(key, parent)
def __init__(self, key, parent, request, document=None):
super(Item, self).__init__(key, parent, request)
self.document = document

def load_document(self):
Expand Down Expand Up @@ -64,7 +65,7 @@ def replace(self, params):
new_username=new_username,
new_email=new_email)
Photo.replace_author(self.root.db, self.name, new_username)
new_item = Item(new_username, self.parent, user)
new_item = Item(new_username, self.parent, self.request, user)
user['href'] = new_item.url()
user['photos'] = {
'href': new_item['photos'].url()
Expand Down
8 changes: 5 additions & 3 deletions example/resources/users_photos.py
Expand Up @@ -20,8 +20,9 @@ def index(self, query_params):
limit = query_params['limit']
cursor = Photo.get_newests(self.root.db, offset, limit,
author=self.parent.name)
documents = [photos.Item(str(doc._id), self.root, doc).show()
for doc in cursor]
documents = [
photos.Item(str(doc._id), self.root, self.request, doc).show()
for doc in cursor]
result = {
'photos': documents,
'href': self.url(offset=offset, limit=limit),
Expand All @@ -41,4 +42,5 @@ def create(self, params):
author = unicode(self.parent.name)
mime_type = mimetypes.guess_extension(fs.filename)
doc = Photo.create(self.root.db, author, fs.file, mime_type)
return photos.Item(str(doc._id), self.root['photos'], doc)
return photos.Item(str(doc._id), self.root['photos'], self.request,
doc)
3 changes: 2 additions & 1 deletion royal/interfaces.py
Expand Up @@ -44,7 +44,8 @@ def delete():
"DELETE /items"


class IResourceConfigurator(Interface):
class IResourcesConfigurator(Interface):
intr_category_name = Attribute('Introspectable category')

def add_resource(dot_path):
"Add a resource by its dot notation: 'apps.users' is apps/{id}/users"
Expand Down
29 changes: 13 additions & 16 deletions royal/resource.py
Expand Up @@ -19,16 +19,17 @@ def includeme(config):
@implementer(IBase)
class Base(object):

def __init__(self, name, parent):
children = {}

def __init__(self, name, parent, request):
self.__name__ = unicode(name)
self.__parent__ = parent
if not hasattr(self, 'children'):
self.children = {}
self.request = request

def __getitem__(self, key):
key = unicode(key)
self.on_traversing(key)
return self.children[key](key, self)
return self.children[key](key, self, self.request)

def _not_allowed(self, name):
raise exceptions.MethodNotAllowed(self, name)
Expand Down Expand Up @@ -61,15 +62,12 @@ def delete(self):
def root(self):
return find_root(self)

def resource_url(self, resource, request=None, **query_params):
def resource_url(self, resource, **query_params):
kw = {'query': query_params}
if request is None:
request = self.root.request
return request.resource_url(resource, **kw)
return self.request.resource_url(resource, **kw)


def url(self, request=None, **query_params):
return self.resource_url(self, request, **query_params)
def url(self, **query_params):
return self.resource_url(self, **query_params)

@property
def parent(self):
Expand All @@ -81,7 +79,7 @@ def name(self):

@property
def links(self):
_links = {name: {'href': cls(name, self).url()}
_links = {name: {'href': cls(name, self, self.request).url()}
for name, cls in self.children.iteritems()}
_links['href'] = self.url()
return _links
Expand All @@ -96,8 +94,7 @@ class Root(Base):
request = None

def __init__(self, request):
super(Root, self).__init__('', None)
self.request = request
super(Root, self).__init__('', None, request)

def show(self, params):
return self.links
Expand All @@ -114,5 +111,5 @@ class Collection(Base):
def __getitem__(self, key):
self.on_traversing(key)
if hasattr(self, 'item_cls'):
return self.item_cls(key, self)
return self.children[key](key, self)
return self.item_cls(key, self, self.request)
return self.children[key](key, self, self.request)
4 changes: 2 additions & 2 deletions royal/tests/unittests/test_resources.py
Expand Up @@ -5,7 +5,7 @@
class Test(unittest.TestCase):

def check_assertions(self, cls, name, parent=None):
b = cls(name, parent)
b = cls(name, parent, None)
if parent is None:
root = b
else:
Expand Down Expand Up @@ -47,7 +47,7 @@ def test_resource(self):
from royal.exceptions import MethodNotAllowed
request = DummyRequest()
root = Root(request)
c = Collection('users', root)
c = Collection('users', root, None)
resource = self.check_assertions(Item, 'hadrien', parent=c)

with self.assertRaises(MethodNotAllowed):
Expand Down
14 changes: 7 additions & 7 deletions royal/utility.py
Expand Up @@ -4,35 +4,35 @@
from zope.interface import implementer

from royal import exceptions
from royal.interfaces import IResourceConfigurator
from royal.interfaces import IResourcesConfigurator

log = logging.getLogger(__name__)


def includeme(config):
utility = config.registry.queryUtility(IResourceConfigurator)
utility = config.registry.queryUtility(IResourcesConfigurator)

if utility is None:
utility = ResourceConfigurator()
utility = ResourcesConfigurator()
config.registry.registerUtility(utility, name=u'')
config.add_directive('add_resource', utility.add_resource)


class ResourceDefinition(object):
def __init__(self, resource_path, collection_cls, item_cls, parent,
name):
self.resource_path = resource_path
self.path = resource_path
self.collection_cls = collection_cls
self.item_cls = item_cls
self.parent = parent
self.name = name

def __repr__(self):
return '<ResourceDefinition(%s)>' % self.resource_path
return '<ResourceDefinition(%s)>' % self.path


@implementer(IResourceConfigurator)
class ResourceConfigurator(object):
@implementer(IResourcesConfigurator)
class ResourcesConfigurator(object):
"""Internal configurator of royal resources.
"""

Expand Down

0 comments on commit 2480208

Please sign in to comment.