From 7776b5930b7263f3e2fbf9f28c751a79678d04d3 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sat, 10 Sep 2011 22:10:48 -0400 Subject: [PATCH] kill Resource --- Readme.rst | 2 +- resources/core.py | 61 +++++++++++++++++++++++------------------------ toy.py | 18 ++++++++++---- 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/Readme.rst b/Readme.rst index 87c65a7..3660fbb 100644 --- a/Readme.rst +++ b/Readme.rst @@ -31,7 +31,7 @@ Potentially:: api = Interface() @api.collection('bookmarks') - class Bookmarks(Resource): + class Bookmarks(object): """Haystack's Bookmarks Resource.""" __bookmarks = {} diff --git a/resources/core.py b/resources/core.py index 7718c37..78c62a1 100644 --- a/resources/core.py +++ b/resources/core.py @@ -12,7 +12,7 @@ import warnings from uuid import uuid4 -__all__ = ('Resource', 'Interface', 'Element') +__all__ = ['Interface'] def method_not_allowed(f): @@ -27,36 +27,32 @@ def method_not_allowed(f): -class Resource(object): - """A RESTful Resource.""" - - def __init__(self, name=None, interface=None): - self.name = name - self.interface = interface - self.ri = uuid4().hex - self.contains = None - - super(Resource, self).__init__() - - def __repr__(self): - return ''.format(self.name) - class Collection(object): """A RESTful Collection.""" - def __init__(self, resource=None): + def __init__(self, interface=None, resource=None): + self.interface = interface self.resource = resource self.ri = uuid4().hex super(Collection, self).__init__() + @property + def name(self): + return self.interface.name_for(self) + def __repr__(self): - return ''.format(self.resource.name, self.ri) + return ''.format(self.name, self.ri) def __getitem__(self, key): - element_exists = self.resource.element_head(key) + try: + element_exists = self.resource.element_head(key) + # Assume element exist if head isn't provided. + except AttributeError: + element_exists = True + if element_exists: element = Element(resource=self.resource, collection=self) @@ -64,8 +60,6 @@ class Collection(object): return element - else: - raise IndexError def content(content_type): pass @@ -75,7 +69,7 @@ class Collection(object): def get(self, **options): # fire pre get element get hook - r = self.resource.collection_get(self.ri, **options) + r = self.resource.collection_get(**options) # fire post get element get hook return r @@ -84,7 +78,7 @@ class Collection(object): @method_not_allowed def put(self, data, **options): - r = self.resource.collection_put(self.ri, data, **options) + r = self.resource.collection_put(self.resource, data, **options) return r @@ -117,15 +111,16 @@ class Collection(object): class Element(object): """A RESTful Element.""" - def __init__(self, resource=None, collection=None): - self.resource = resource + def __init__(self, interface=None, collection=None): + self.interface = interface self.collection = collection + self.resource = None self.ri = uuid4().hex super(Element, self).__init__() def __repr__(self): - return ''.format(self.resource.name, self.ri) + return ''.format(self.name, self.ri) def content(content_type): @@ -193,21 +188,25 @@ class Interface(object): pass if key in self.resources: - return self.resources.get(key).contains + return self.resources.get(key) return object.__getattribute__(self, key) + def name_for(self, instance): + """Returns the resource name for the given element/collection.""" + + for name, resource in self.resources.items(): + if resource == instance: + return name + def map(self, key, resource=None, is_collection=True): """Maps a given resource to the given namespace.""" - new_resource = resource(interface=self, name=key) - self.resources[key] = new_resource - if is_collection: - self.resources[key].contains = Collection(resource=new_resource) + self.resources[key] = Collection(interface=self, resource=resource()) else: - self.resources[key].contains = Element(resource=new_resource) + self.resources[key] = Element(interface=self, resource=resource()) def element(self, key): diff --git a/toy.py b/toy.py index 647331f..aa75f6f 100644 --- a/toy.py +++ b/toy.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import resources -from resources import Interface, Resource +from resources import Interface # built in verbs @@ -10,13 +10,18 @@ from resources import Interface, Resource api = Interface() -@api.map('bookmarks') -class Bookmarks(Resource): +@api.collection('bookmarks') +class Bookmarks(object): """Haystack's Bookmarks Resource.""" + # __bookmarks = {'test': 'hi'} __bookmarks = {} # get(*args, **kwargs) <-- automatic + # ri = resource identifier + + def element_head(self, ri): + return ri in self.__bookmarks def element_get(self, ri): return self.__bookmarks.get(ri) @@ -76,11 +81,16 @@ def test(x): # print api -print api.bookmarks.uuid +print api.bookmarks +# print api.resources print api.bookmarks.get() # print api.bookmarks.get(id='0') +# api.bookmarks.get() +# print api.bookmarks['test2'] + + # >>> print api.bookmarks[00001] # # You'll be able to use this as a reference in other objects