Skip to content

Commit

Permalink
Another experiment: have an internal (mutable) version of report that…
Browse files Browse the repository at this point in the history
… is not tied to output format. This allows the post_task to work on a version of the report that is consistent: previous it depended on the output format
  • Loading branch information
pwalsh committed Mar 30, 2015
1 parent db06ef5 commit b225984
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 29 deletions.
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
name='tellme',
description='A toolkit for generating user-facing reports from things happening in code.',
long_description='A toolkit for generating user-facing reports from things happening in code.',
version='0.2.4',
version='0.2.5',
author='Open Knowledge Foundation',
author_email='info@okfn.org',
url='http://okfn.org',
Expand Down
65 changes: 37 additions & 28 deletions tellme/reporters.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ def __init__(self, name='report', schema=None, limit=None, template=None,
self.limit = limit
self.count = 0
self.post_task = post_task
self._mutable_report = None
self.backend = backend

if self.backend not in self.REPORT_BACKENDS:
raise ValueError

Expand Down Expand Up @@ -108,27 +108,31 @@ def read(self, only=None, exclude=None):

def read_yaml(self, only=None, exclude=None):
"""Read all data from a YAML backend."""

self.storage.seek(0)
_results = yaml.load(self.storage.read()) or []
_results = yaml.load(self.storage.read()) or []
if only:
return [{k: v for k, v in r.items() if k in only} for r in _results]
if exclude:
return [{k: v for k, v in r.items() if not k in exclude} for r in _results]
else:
return _results
_results = [{k: v for k, v in r.items() if k in only} for r in _results]
elif exclude:
_results = [{k: v for k, v in r.items() if not k in exclude} for r in _results]

self.storage.seek(0)
return _results

def read_sql(self, only=None, exclude=None):
"""Read all data from an SQLite backend."""

_results = [result for result in self.storage.all()]
if only:
return [{k: v for k, v in r.items() if k in only} for r in _results]
if exclude:
return [{k: v for k, v in r.items() if not k in exclude} for r in _results]
else:
return _results
_results = [{k: v for k, v in r.items() if k in only} for r in _results]
elif exclude:
_results = [{k: v for k, v in r.items() if not k in exclude} for r in _results]

return _results

def read_client(self, only=None, exclude=None):
"""Read all data from a client backend."""

_results = []
self.storage.seek(0)
for line in self.storage:
Expand All @@ -139,6 +143,7 @@ def read_client(self, only=None, exclude=None):
else:
_results.append(json.loads(line.rstrip('\n')))

self.storage.seek(0)
return _results

def close(self):
Expand All @@ -150,7 +155,8 @@ def close_file(self):
"""Close backend file."""
return self.storage.close()

def generate(self, format='dict', only=None, exclude=None):
def generate(self, output='dict', only=None, exclude=None):

"""Generate a report.
Args:
Expand All @@ -162,30 +168,33 @@ def generate(self, format='dict', only=None, exclude=None):
"""

if format not in self.REPORT_FORMATS:
if output not in self.REPORT_FORMATS:
raise ValueError
elif only and exclude:

if only and exclude:
raise ValueError
elif only is not None and not isinstance(only, (list, tuple, set)):

if only is not None and not isinstance(only, (list, tuple, set)):
raise ValueError
elif exclude is not None and not isinstance(exclude, (list, tuple, set)):

if exclude is not None and not isinstance(exclude, (list, tuple, set)):
raise ValueError
else:
rv = getattr(self, 'generate_{0}'.format(format))(only=only, exclude=exclude)
self.close()

if self.post_task:
self.post_task(rv)
self._mutable_report = {
'meta': self.meta,
'results': self.read(only=only, exclude=exclude) or []
}
self.close()

if self.post_task:
self.post_task(self._mutable_report)

return rv
handler = getattr(self, 'generate_{0}'.format(output))
return handler(only=only, exclude=exclude)

def generate_dict(self, only=None, exclude=None):
"""Generate a report as a Python dictionary."""

return {
'meta': self.meta,
'results': self.read(only=only, exclude=exclude) or []
}
return self._mutable_report

def generate_txt(self, only=None, exclude=None):
"""Generate a report as plain text, using an ASCII table for data."""
Expand Down

0 comments on commit b225984

Please sign in to comment.