enkeksi 0.3.0
enkeksi takes a markdown-formatted input and executes the sql queries found in it, and returns a pretty markdown-formatted output where the results of the SQL queries have been added. To make usage of package easy, enkeksi comes with a command line tool markdown-sql-eval which can be used to process markdown files. Project is developed and hosted in GitHub: https://github.com/ahojukka5/enkeksi.
Keywords: markdown sql evaluator

# enkeksi - Markdown-SQL evaluator

[![Python CI][ci-img]][ci-url]
[![Coverate Status][coveralls-img]][coveralls-url]
[![Documentation Status][documentation-img]][documentation-url]

Package author: Jukka Aho (@ahojukka5, ahojukka5@gmail.com)

enkeksi takes a markdown-formatted input and executes the sql queries found in
it, and returns a markdown-formatted output where the results of the sql queries
have been added. Package can be used, for example, to create a dynamic project
documentation where SQL queries are automatically executed to get example
results in a dynamic manner. This way it is easy to spot from the non-working
documentation is there is problems with the database.

enkeksi comes with a command line tool `markdown-sql-eval` which can be used
to process markdown files efficiently.

Project is hosted in GitHub: <https://github.com/ahojukka5/enkeksi>.

Documentation is hosted in ReadTheDocs: <https://enkeksi.readthedocs.io/>.

## Installing package

To install the most recent package from Python Package Index (PyPi), use git:

```bash
pip install enkeksi
```

To install the development version, you can install the package directly from
the GitHub:

```bash
pip install git+git://github.com/ahojukka5/enkeksi.git
```

## CLI Usage

Consider the following demo markdown file:

````markdown
# Sample file

Hello, this is a sample file. Below, we initialize some test data to sqlite
database. It doesn't show in the final output, because of `--hide-input` flag.

```sql
--hide-input
CREATE TABLE Movies (id INTEGER PRIMARY KEY, name TEXT, year INTEGER);
INSERT INTO Movies (name, year) VALUES ("Snow White", 1937);
INSERT INTO Movies (name, year) VALUES ("Fantasia", 1940);
```

To list the content of the database, we need to use `SELECT` in SQL query. We
can use extra option `--caption='Table: Movies'` to add caption to output:

```sql
--hide-input --caption='Table: Movies'
SELECT * FROM Movies;
```

SQL results are formatted using [tabulate](https://pypi.org/project/tabulate/).
Using option `--table-format` we can change how the end results looks like.
By default, `psgl` is used and there rest options can be found from tabulate's
documentation. The total number of rows in database is:

```sql
--caption='With psql formatting'
SELECT COUNT(*) AS 'Number of movies in database' FROM Movies;
```

Option `--hide-headers` can be used to hide the header row of the result.

```sql
--table-format='github' --hide-headers --caption='With github formatting and headers removed'
SELECT COUNT(*) AS 'Now shown' FROM Movies;
```
````

Processing the file with `markdown-sql-eval`:

```bash
markdown-sql-eval examples/example2.md > examples/example2_rendered.md
```

Result is:

````markdown
# Sample file

Hello, this is a sample file. Below, we initialize some test data to sqlite
database. It doesn't show in the final output, because of `--hide-input` flag.

To list the content of the database, we need to use `SELECT` in SQL query. We
can use extra option `--caption='Table: Movies'` to add caption to output:

```text
Table: Movies

+------+------------+--------+
|   id | name       |   year |
|------+------------+--------|
|    1 | Snow White |   1937 |
|    2 | Fantasia   |   1940 |
+------+------------+--------+
```

SQL results are formatted using [tabulate](https://pypi.org/project/tabulate/).
Using option `--table-format` we can change how the end results looks like.
By default, `psgl` is used and there rest options can be found from tabulate's
documentation. The total number of rows in database is:

```sql
SELECT COUNT(*) AS 'Number of movies in database' FROM Movies;
```

```text
With psql formatting

+--------------------------------+
|   Number of movies in database |
|--------------------------------|
|                              2 |
+--------------------------------+
```

Option `--hide-headers` can be used to hide the header row of the result.

```sql
SELECT COUNT(*) AS 'Now shown' FROM Movies;
```

```text
With github formatting and headers removed

|---|
| 2 |
```
````

The generated markdown file can then be added to your project documentation
and hosted using e.g. mkdocs. For that idea, take a look of `docs/demo.md`,
which is hosted in [here](https://enkeksi.readthedocs.io/en/latest/demo/),
and generated from `docs/demo_tmpl.md`.

## Contributing

Contributions are welcome as usual. If you have any good idea, and especially,
a better name for a package, raise an issue.

[ci-img]: https://github.com/ahojukka5/enkeksi/workflows/Python%20CI/badge.svg
[ci-url]: https://github.com/ahojukka5/enkeksi/actions
[coveralls-img]: https://coveralls.io/repos/github/ahojukka5/enkeksi/badge.svg?branch=master
[coveralls-url]: https://coveralls.io/github/ahojukka5/enkeksi?branch=master
[documentation-img]: https://readthedocs.org/projects/enkeksi/badge/?version=latest
[documentation-url]: https://enkeksi.readthedocs.io/en/latest/?badge=latest