pulling up the activeresource stuff again mostly to play with Aspen + more permanently removing the git-web-ui and ruby soap stuff
This commit is contained in:
13
activeresource-aspen/README
Normal file
13
activeresource-aspen/README
Normal file
@@ -0,0 +1,13 @@
|
||||
_______________________________________
|
||||
/ This started out with just some \
|
||||
| ActiveResource bits and then roped in |
|
||||
\ Aspen and then Redis. Gads. /
|
||||
---------------------------------------
|
||||
\ \
|
||||
\ \
|
||||
\ _\^
|
||||
\ _- oo\
|
||||
\---- \______
|
||||
\ )\
|
||||
||-----|| \
|
||||
|| ||
|
23
activeresource-aspen/client.rb
Normal file
23
activeresource-aspen/client.rb
Normal file
@@ -0,0 +1,23 @@
|
||||
require 'active_resource'
|
||||
|
||||
SITE = 'http://localhost:9282' unless defined?(SITE)
|
||||
|
||||
class Person < ActiveResource::Base
|
||||
self.site = SITE
|
||||
|
||||
def family
|
||||
Family.find(self.surname.downcase)
|
||||
end
|
||||
|
||||
def family=(family_surname)
|
||||
self.surname = family_surname
|
||||
Family.find(family_surname)
|
||||
rescue StandardError => e
|
||||
STDERR.puts("#{e.class.name}:#{e.message}\n#{e.backtrace.join("\n")}")
|
||||
Family.create(surname: family_surname.downcase)
|
||||
end
|
||||
end
|
||||
|
||||
class Family < ActiveResource::Base
|
||||
self.site = SITE
|
||||
end
|
2
activeresource-aspen/run-client-shell
Executable file
2
activeresource-aspen/run-client-shell
Executable file
@@ -0,0 +1,2 @@
|
||||
#!/bin/bash
|
||||
exec irb -I. -rclient -rawesome_print --simple-prompt --readline "$@"
|
9
activeresource-aspen/run-server
Executable file
9
activeresource-aspen/run-server
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/bin/bash
|
||||
which aspen >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "You need to 'pip install aspen'"
|
||||
exit 1
|
||||
fi
|
||||
cd $(dirname $(readlink -f $0))
|
||||
export PYTHONPATH="$PWD:$PYTHONPATH"
|
||||
exec aspen --changes_reload=yes -w ./www -a '0.0.0.0:9282'
|
15
activeresource-aspen/server/__init__.py
Normal file
15
activeresource-aspen/server/__init__.py
Normal file
@@ -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())
|
||||
|
12
activeresource-aspen/server/families.py
Normal file
12
activeresource-aspen/server/families.py
Normal file
@@ -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
|
5
activeresource-aspen/server/helpers.py
Normal file
5
activeresource-aspen/server/helpers.py
Normal file
@@ -0,0 +1,5 @@
|
||||
import json
|
||||
|
||||
def json_loads_from_request(request):
|
||||
raw = request.body.s_iter.read(int(request.headers['Content-Length']))
|
||||
return json.loads(raw)
|
6
activeresource-aspen/server/people.py
Normal file
6
activeresource-aspen/server/people.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from server.resource import Resource
|
||||
|
||||
|
||||
class People(Resource):
|
||||
__collection__ = 'people'
|
||||
__required_keys__ = ('name', 'surname', 'age')
|
46
activeresource-aspen/server/resource.py
Normal file
46
activeresource-aspen/server/resource.py
Normal file
@@ -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']
|
||||
|
18
activeresource-aspen/www/families.json
Normal file
18
activeresource-aspen/www/families.json
Normal file
@@ -0,0 +1,18 @@
|
||||
from server.families import Families
|
||||
from server.helpers import json_loads_from_request
|
||||
|
||||
__families__ = Families()
|
||||
|
||||
|
||||
|
||||
if GET:
|
||||
response.body = __families__.getall()
|
||||
elif POST:
|
||||
family = json_loads_from_request(request)['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
|
10
activeresource-aspen/www/families/%surname.json
Normal file
10
activeresource-aspen/www/families/%surname.json
Normal file
@@ -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
|
18
activeresource-aspen/www/people.json
Normal file
18
activeresource-aspen/www/people.json
Normal file
@@ -0,0 +1,18 @@
|
||||
from server.people import People
|
||||
from server.helpers import json_loads_from_request
|
||||
|
||||
__people__ = People()
|
||||
|
||||
|
||||
|
||||
if GET:
|
||||
response.body = __people__.getall()
|
||||
elif POST:
|
||||
person = json_loads_from_request(request)['person']
|
||||
person_id = __people__.add(person)
|
||||
response.headers['Location'] = '/people/{}.json'.format(person_id)
|
||||
person['id'] = person_id
|
||||
response.body = person
|
||||
response.code = 201
|
||||
|
||||
# vim:filetype=python
|
11
activeresource-aspen/www/people/%id.json
Normal file
11
activeresource-aspen/www/people/%id.json
Normal file
@@ -0,0 +1,11 @@
|
||||
from server.people import People
|
||||
__people__ = People()
|
||||
|
||||
|
||||
person = __people__.get(int(path['id']))
|
||||
if person:
|
||||
response.body = {'person': person}
|
||||
else:
|
||||
response.code = 404
|
||||
|
||||
# vim:filetype=python
|
Reference in New Issue
Block a user