class PlanboxAPI(): def __init__(self): '''Initializes a fetcher and uses planbox.yaml to populate a listing of endpoints''' self.fetcher = HTTPClient() path = re.sub("/[^/]+$",'/planbox.yaml',os.path.realpath(__file__)) self.config = self.__loadconfig__(path,'planbox') def __endpoint__(self,endpoint,*args,**kwargs): '''Handles a request to a supplied endpoint''' params = {} if not endpoint.params is None: for param,description in endpoint.params.iteritems(): if not param in kwargs and not param.startswith('Optional'): raise MissingParameterError,'Missing parameter "%s": %s' % (param,description) params[param] = kwargs[param] url = ''.join([self.config.uri,endpoint.path]) headers,data = self.fetcher.do_POST(url,data=params) return data def __getattr__(self,key): '''Allows access to individual endpoints''' if key in self.config.endpoints.keys(): def wrapper(*args,**kwargs): return self.__endpoint__(DotDict(self.config.endpoints[key]),*args,**kwargs) return wrapper else: raise AttributeError,"No attribute %s could be found for the Planbox API" % key def __loadconfig__(self,path,root): '''Loads a configuration file for the API''' data = open(path).read() data = re.sub('None\n','!!python/none\n',data) config = yaml.load(data) endpoints = {} cfgep = config[root]['endpoints'] for endpoint in cfgep: endpoints[endpoint['name']] = endpoint config[root]['endpoints'] = endpoints return DotDict(config[root]) def help(self,endpoint=None): '''Basic info about the package/endpoints''' if not endpoint: print "Planbox API Methods" for key,endpoint in self.config.endpoints.iteritems(): print '\t%s: %s' % (key,endpoint['description']) if not endpoint['params'] is None: for param,description in endpoint['params'].iteritems(): print '\t\t%s: %s' % (param,description) else: print "\t\tNo params" else: p = PrettyPrinter() p.pprint(self.config.endpoints[endpoint])
def __init__(self): '''Initializes a fetcher and uses planbox.yaml to populate a listing of endpoints''' self.fetcher = HTTPClient() path = re.sub("/[^/]+$",'/planbox.yaml',os.path.realpath(__file__)) self.config = self.__loadconfig__(path,'planbox')