diff --git a/re2oapi/client.py b/re2oapi/client.py index 31ecb7e..f561e03 100644 --- a/re2oapi/client.py +++ b/re2oapi/client.py @@ -174,44 +174,68 @@ class Re2oAPIClient: endpoint=endpoints.get_endpoint_for(name, **kwargs) ) + def _list_for(self, obj_name, max_results=None, params={}, **kwargs): + if not 'page_size' in params.keys(): + params['page_size'] = 'all' + response = self.get( + self.get_url_for('%s-list' % obj_name, **kwargs), + params=params + ) + results = response['results'] + while response['next'] is not None and \ + (max_results is None or len(results) < max_results): + response = self.get(response['next']) + results += response['results'] + return results[:max_results] if max_results else results + + def _count_for(self, obj_name, params={}, **kwargs): + if not 'page_size' in params.keys(): + params['page_size'] = 1 + return self.get( + self.get_url_for('%s-list' % obj_name, **kwargs), + params=params + )['count'] + + def _view_for(self, obj_name, params={}, **kwargs): + return self.get( + self.get_url_for('%s-details' % obj_name, **kwargs), + params=params + ) + def __getattr__(self, item): if item.startswith('list_'): - - def f(max_results=None, params={}, **kwargs): - if not 'page_size' in params.keys(): - params['page_size'] = 'all' - response = self.get( - self.get_url_for('%s-list' % item[len('list_'):], **kwargs), - params=params - ) - results = response['results'] - while response['next'] is not None and \ - (max_results is None or len(results) < max_results): - response = self.get(response['next']) - results += response['results'] - return results[:max_results] if max_results else results - return f + return lambda *args, **kwargs: self._list_for( + item[len('list_'):], + *args, + **kwargs + ) elif item.startswith('count_'): - - def f(params={}, **kwargs): - if not 'page_size' in params.keys(): - params['page_size'] = 1 - return self.get( - self.get_url_for('%s-list' % item[len('count_'):], **kwargs), - params=params - )['count'] - return f + return lambda *args, **kwargs: self._count_for( + item[len('count_'):], + *args, + **kwargs + ) elif item.startswith('view_'): + return lambda *args, **kwargs: self._view_for( + item[len('view_'):], + *args, + **kwargs + ) - def f(params={}, **kwargs): - return self.get( - self.get_url_for('%s-details' % item[len('view_'):], **kwargs), - params=params - ) - return f - else: raise AttributeError(item) + + def __dir__(self): + ret = ['use_tls', 'token_file', 'hostname', 'token', + 'need_renew_token', 'get_token', 'get', 'post', 'get_url_for'] + for name in endpoints.get_names(): + if name.endswith('-list'): + ret.append('list_%s' % name[:-len('-list')]) + ret.append('count_%s' % name[:-len('-list')]) + elif name.endswith('-details'): + ret.append('view_%s' % name[:-len('-details')]) + return ret +