@@ 28,13 28,46 @@ structured reports based on a model:
def email(self, row):
return row.email
+Once a report is defined, executing it and sending it multiple places at once is
+easy:
+
+.. code-block:: python
+
+ from columnist import transform, destination
+
+ report = RegisteredUsersReport()
+ # Save the CSV to disk
+ report.add_output(
+ transform.CSV,
+ destination.File('/var/log/reports/users.csv'),
+ )
+ # Send encrypted CSV as an email attachment
+ report.add_output(
+ transform.CSV,
+ transform.GPG(recipient='...'),
+ destination.Email('lyndsy@lyndsysimon.com'),
+ )
+ report.output()
+
+Note that ``add_output()`` defines a workflow, but *does not perform it*.
+``.output()`` must be called before the report is generated. This is due to the
+fact that Columnist is designed to iterate over the source query *once and only
+once*. Transformations are applied one row at a time, and that row is sent to
+each destination in turn before the next row is transformed. This allows large
+reports to be streamed to multiple destinations simultaneously, potentially even
+in multiple formats?
+
+Have a query that takes ten minutes to run, and need it to output it to disk,
+encrypt it with GPG and send it to an SFTP server, and store a backup on S3
+after running it through SOPS? No problem!
+
Project Roadmap
---------------
``columnist`` is currently incomplete, but under active development. Upcoming
features include:
-- [ ] Explicit column ordering in output, other than the order in which the
+- [x] Explicit column ordering in output, other than the order in which the
are defined
- [ ] Simpler definition of columns that are simply untransformed row attributes
- [ ] Aggregation based on a time series
@@ 44,7 77,7 @@ features include:
- [ ] Report generation in multiple formats
- - [ ] CSV
+ - [x] CSV
- [ ] JSON
- [ ] XML
- [ ] Plugin architecture for arbitrary output