#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import re import httplib import urllib import simplejson class Data(object): def __init__(self, data): self._data = data def __getitem__(self, key): return self._data[key] def __setitem__(self, key, value): self._data[key] = value def __delitem__(self, key): del self._data[key] def __setattr__(self, name, value): self.__dict__[name] = value def __getattr__(self, name): if not name in self.__dict__: return self._data[name] def __str__(self): return simplejson.dumps(self._data) def keys(self): return self._data.keys() def items(self): return self._data.items() def values(self): return self._data.values() class Item(object): def __init__(self, name, data): self._api_key = api._api_key self._conn = api._conn self._data = data def __getitem__(self, key): return self._data[key] def __setitem__(self, key, value): self._data[key] = value def __delitem__(self, key): del self._data[key] def __setattr__(self, name, value): self.__dict__[name] = value def __getattr__(self, name): if not name in self.__dict__: if name == 'data': return Data(self._data['data']) else: return self._data[name] def __str__(self): return simplejson.dumps(self._data) def id(self): return self._data['resource_url'].split('/')[-1] def keys(self): return self._data.keys() def items(self): return self._data.items() def values(self): return self._data.values() class Database(object): def __init__(self, api, data): self._api_key = api._api_key self._conn = api._conn self._data = data def __getitem__(self, key): return self._data[key] def __setitem__(self, key, value): self._data[key] = value def __delitem__(self, key): del self._data[key] def __setattr__(self, name, value): if '_data' in self.__dict__ and name in self._data: self._data[name] = value else: self.__dict__[name] = value def __getattr__(self, name): if '_data' in self.__dict__ and name in self._data: return self._data[name] def __delattr__(self, name): if not name in self.__dict__: del self._data[name] def __str__(self): return simplejson.dumps(self._data) def keys(self): return self._data.keys() def create_item(self, name, keys): query = { 'api_key' : self._api_key, } query['name'] = name for key in keys: query['data[%s]' % key] = keys[key] headers = {} self._conn.request('POST', '/databases/%s/items' % self['name'], body = urllib.urlencode(query), headers = headers) response = self._conn.getresponse() data = response.read() if response.status != 201: raise Exception(data) return response.getheader("Location").split('/')[-1] def update_item(self, id, keys): query = { 'api_key' : self._api_key, } for key in keys: query['data[%s]' % key] = keys[key] headers = { 'Content-Type' : 'application/x-www-form-urlencoded', } self._conn.request('PUT', '/databases/%s/items/%s' % (self['name'], id), body = urllib.urlencode(query), headers = headers) response = self._conn.getresponse() data = response.read() if response.status != 200: raise Exception(data) return True def delete_item(self, id): query = { 'api_key' : self._api_key, } headers = { 'Content-Type' : 'application/x-www-form-urlencoded', } self._conn.request('DELETE', '/databases/%s/items/%s' % (self['name'], id), body = urllib.urlencode(query), headers = headers) response = self._conn.getresponse() data = response.read() if response.status != 200: raise Exception(data) return True def item(self, name): query = { 'api_key' : self._api_key, } headers = {} self._conn.request('GET', '/databases/%s/items/%s.json' % (self['name'], name), body = urllib.urlencode(query), headers = headers) response = self._conn.getresponse() data = response.read() return Item(self, simplejson.loads(data)) def items(self, page=0): query = { 'api_key' : self._api_key, } if page > 0: query['page'] = int(page) headers = {} self._conn.request('GET', '/databases/%s/items.json' % self['name'], body = urllib.urlencode(query), headers = headers) response = self._conn.getresponse() data = response.read() items = [] for item in simplejson.loads(data): items.append(Item(self, item)) return items class Wedata: def __init__(self, api_key): self._api_key = api_key self._conn = httplib.HTTPConnection("wedata.net") def create_database(self, name, description, required_keys, optional_keys, permit_other_keys): query = { 'api_key' : self._api_key, } query['database[name]'] = name query['database[description]'] = description query['database[required_keys]'] = ' '.join(required_keys) query['database[optional_keys]'] = ' '.join(optional_keys) query['database[permit_other_keys]'] = permit_other_keys headers = {} self._conn.request('POST', '/databases', body = urllib.urlencode(query), headers = headers) response = self._conn.getresponse() data = response.read() if response.status != 201: raise Exception(data) return response.getheader("Location").split('/')[-1] def update_database(self, name, description, required_keys, optional_keys, permit_other_keys): query = { 'api_key' : self._api_key, } query['database[name]'] = name query['database[description]'] = description query['database[required_keys]'] = ' '.join(required_keys) query['database[optional_keys]'] = ' '.join(optional_keys) query['database[permit_other_keys]'] = permit_other_keys headers = { 'Content-Type' : 'application/x-www-form-urlencoded', } self._conn.request('PUT', '/databases/%s' % name, body = urllib.urlencode(query), headers = headers) response = self._conn.getresponse() data = response.read() if response.status != 200: raise Exception(data) return True def delete_database(self, name): query = { 'api_key' : self._api_key, } headers = { 'Content-Type' : 'application/x-www-form-urlencoded', } self._conn.request('DELETE', '/databases/%s' % name, body = urllib.urlencode(query), headers = headers) response = self._conn.getresponse() data = response.read() if response.status != 200: raise Exception(data) return True def databases(self, page=0): query = { 'api_key' : self._api_key, } if page > 0: query['page'] = int(page) headers = {} self._conn.request('GET', '/databases.json', body = urllib.urlencode(query), headers = headers) response = self._conn.getresponse() data = response.read() databases = [] for database in simplejson.loads(data): databases.append(Database(self, database)) return databases def database(self, name): query = { 'api_key' : self._api_key, } headers = {} self._conn.request('GET', '/databases/%s.json' % name, body = urllib.urlencode(query), headers = headers) response = self._conn.getresponse() data = response.read() return Database(self, simplejson.loads(data)) if __name__ == '__main__': import os api = Wedata(open(os.path.expanduser('~/.wedata-api-key')).readline().strip()) # databases databases = api.databases() for database in databases: print database for key in database.keys(): print " %s=%s" % (key, database[key]) print print # create database #db = api.update_database('your-new-database', 'my new database: this is a example database', # ['name', 'description'], ['value', 'xpath'], False) #print db database = api.database('AutoPagerize') print "%s : %s" % (database.name, database.description) items = database.items() for item in database.items(): print item for key in item.keys(): print " %s=%s" % (key, item[key]) print " %s" % item.data.pageElement print database = api.database('Wedata API Example') id = database.create_item('TEST', { 'name': 'a', 'description': 'b', 'value': '1', 'xpath': '//', }) print database.update_item(id, { 'name': 'hoge', 'description': 'c' }) print database.delete_item(id)