Custom DSI Writer
DSI Writers are the primary way to translate data from DSI to an external format.
All Writers must be structured as a Class with 2 mandatory methods: __init__
, and get_rows
.
Loading Custom Writer into DSI
Before understanding the structure of Writers, it is important to know how they can be loaded via the User API and the Contributor API:
User API: Users loading a custom external Writer can use the
write()
method from the DSI class. Unlike a normalwrite()
, the second argument should be the path to the Python script containing the user’s custom Writer.While there currently isn’t an example of loading an external Writer, Example 9: Load an external Reader has a similar process to load an external Reader.
Contributor API: Users loading a custom external Writer must first call
Terminal.add_external_python_module()
to temporarily register the Writer with DSI before loading the Writer and its data normally. For detailed instructions, follow Example 9: External Readers/Writers.Users intending to add the custom Writer to DSI’s codebase must include the file in the dsi/plugins directory and include the Writer name in the
Terminal.VALID_WRITERS
class variable of dsi/core.py. If done correctly, the Writer will be accessible byTerminal.load_module()
.
Initializer: __init__(self) -> None:
__init__
is where you can include all of your initialization logic, and specify the parameters needed for a given application.
Example __init__
:
def __init__(self, filename, table_name) -> None:
# see "plugins" to determine which superclass your Writer should extend
super().__init__()
self.output_filename = filename
# a Writer might be table-specific and require a table_name input. Ex: Plotting a table's data.
self.table_name = table_name
Get Rows: get_rows(self, collection) -> None
get_rows
is responsible for converting data from DSI’s internal abstraction, an OrderedDict, to whichever format this Writer’s goal is.
It is important to note that collection
will be a nested OrderedDict with at least one table of data.
Essentially, each entry in the larger OrderedDict has a table’s name as a key and its data as a value.
That table’s data will be an inner OrderedDict.
Unlike DSI Readers, there is no standard structure for get_rows
as each Writer can have a vastly different output.
If a Writer requires units of data, or primary key/foreign key relations, they are stored in tables named ‘dsi_units’ and ‘dsi_relations’ respectively.
Various examples of get_rows
can be found in dsi/plugins/file_writer.py.
Contributing Your Writer
If your Writer is helpful and acceptable for public use, you should consider making a pull request (PR) into DSI.
- Please note that any accepted PRs into DSI should satisfy the following:
Passes all tests in
dsi/plugins/tests
Has no
pylama
errors/warnings (see dsi/.githooks)