diff --git a/ares/client/lib/client.rb b/ares/client/lib/client.rb index 5b0be31..c946ab5 100644 --- a/ares/client/lib/client.rb +++ b/ares/client/lib/client.rb @@ -5,6 +5,10 @@ SITE = 'http://localhost:9282' unless defined?(SITE) class Person < ActiveResource::Base self.site = SITE + + def family + Family.find(self.surname.downcase) + end end class Family < ActiveResource::Base diff --git a/ares/run-server b/ares/run-server index 4d50e98..5adbf29 100755 --- a/ares/run-server +++ b/ares/run-server @@ -6,4 +6,4 @@ if [ $? -ne 0 ]; then fi cd $(dirname $(readlink -f $0)) export PYTHONPATH="$PWD:$PYTHONPATH" -exec aspen -w ./www -a '0.0.0.0:9282' +exec aspen --changes_reload=yes -w ./www -a '0.0.0.0:9282' diff --git a/ares/server/__init__.py b/ares/server/__init__.py index e69de29..c9a02ec 100644 --- a/ares/server/__init__.py +++ b/ares/server/__init__.py @@ -0,0 +1,15 @@ +import redis + +_MEMCACHE = {'pool': None} + + +def get_pool(): + if not _MEMCACHE['pool']: + _MEMCACHE['pool'] = \ + redis.ConnectionPool(host='localhost', port=6379, db=0) + return _MEMCACHE['pool'] + + +def get_redis_conn(): + return redis.Redis(connection_pool=get_pool()) + diff --git a/ares/server/families.py b/ares/server/families.py new file mode 100644 index 0000000..344e38f --- /dev/null +++ b/ares/server/families.py @@ -0,0 +1,12 @@ +from server.resource import Resource + + +class Families(Resource): + __collection__ = 'families' + __required_keys__ = ('surname',) + + def get_by_surname(self, surname): + for family in self.getall(): + if family['surname'] == surname: + return family + return None diff --git a/ares/server/people.py b/ares/server/people.py new file mode 100644 index 0000000..f2caed0 --- /dev/null +++ b/ares/server/people.py @@ -0,0 +1,6 @@ +from server.resource import Resource + + +class People(Resource): + __collection__ = 'people' + __required_keys__ = ('name', 'surname', 'age') diff --git a/ares/server/person.py b/ares/server/person.py deleted file mode 100644 index f77642f..0000000 --- a/ares/server/person.py +++ /dev/null @@ -1,41 +0,0 @@ -class Person(object): - _people = [ - { - 'name': { - 'first': 'Hammy', - 'last': 'Spammy', - }, - 'age': 42, - 'id': 1, - }, - { - 'name': { - 'first': 'Sampers', - 'last': 'Dancer', - }, - 'age': 38, - 'id': 2 - }, - ] - - def __init__(self): - self._index() - - def _index(self): - self._people_by_id = dict(((p['id'], p) for p in self._people)) - - def getall(self): - return self._people - - def get(self, person_id): - return self._people_by_id[person_id] - - def add(self, person): - if None in (person.get('name'), person.get('age')): - raise ValueError('Missing required fields!: {}'.format(person)) - - person['id'] = len(self._people) + 1 - self._people.append(person) - self._index() - return person['id'] - diff --git a/ares/server/resource.py b/ares/server/resource.py new file mode 100644 index 0000000..a368478 --- /dev/null +++ b/ares/server/resource.py @@ -0,0 +1,46 @@ +import json + +from server import get_redis_conn + + +class Resource(object): + __collection__ = 'generic' + __required_keys__ = () + + def __init__(self): + self._db = get_redis_conn() + + def getall(self): + ret = [] + + for resource in self._db.hgetall(self.__collection__).itervalues(): + try: + ret.append(json.loads(resource)) + except ValueError, exc: + print_exc() + + return ret + + def get(self, resource_id): + raw_resource = self._db.hget(self.__collection__, resource_id) + + if not raw_resource: + return None + + resource = json.loads(raw_resource) + return resource + + def add(self, resource_dict): + if None in (resource_dict.get(k) for k in self.__required_keys__): + raise ValueError( + 'Missing required fields!: {}'.format(resource_dict) + ) + + resource_dict['id'] = self._db.incr(self.__collection__ + '_ids') + success = self._db.hset( + self.__collection__, resource_dict['id'], json.dumps(resource_dict) + ) + assert success, 'Failed to save!' + + return resource_dict['id'] + diff --git a/ares/www/families.json b/ares/www/families.json new file mode 100644 index 0000000..bac3005 --- /dev/null +++ b/ares/www/families.json @@ -0,0 +1,20 @@ +import json +from server.families import Families + +__families__ = Families() + + + +if GET: + response.body = __families__.getall() +elif POST: + family = json.loads( + request.body.s_iter.read(int(request.headers['Content-Length'])) + )['family'] + family_id = __families__.add(family) + response.headers['Location'] = '/families/{}.json'.format(family_id) + family['id'] = family_id + response.body = family + response.code = 201 + +# vim:filetype=python diff --git a/ares/www/families/%surname.json b/ares/www/families/%surname.json new file mode 100644 index 0000000..7e65cb4 --- /dev/null +++ b/ares/www/families/%surname.json @@ -0,0 +1,10 @@ +from server.families import Families +__families__ = Families() + +family = __families__.get_by_surname(path['surname']) +if family: + response.body = {'family': family} +else: + response.code = 404 + +# vim:filetype=python diff --git a/ares/www/people.json b/ares/www/people.json index e88b982..b95c5df 100644 --- a/ares/www/people.json +++ b/ares/www/people.json @@ -1,8 +1,8 @@ import json -from server.person import Person +from server.people import People from aspen import Response -__people__ = Person() +__people__ = People() diff --git a/ares/www/people/%id.json b/ares/www/people/%id.json index d4f13b3..7a89741 100644 --- a/ares/www/people/%id.json +++ b/ares/www/people/%id.json @@ -1,6 +1,11 @@ -from server.person import Person -__people__ = Person() +from server.people import People +__people__ = People() + -response.body = {'person': __people__.get(int(path['id']))} +person = __people__.get(int(path['id'])) +if person: + response.body = {'person': person} +else: + response.code = 404 # vim:filetype=python