Tabula

Tabula can transform a collection of maps (structs too, e.g. Ecto models) into an ASCII/GitHub Markdown table.

It's a weekend-over-beer-project of mine, loosely based on clojure.pprint.print-table.

Installation

  1. Add Tabula to your list of dependencies in mix.exs:
def deps do
[{:tabula, "~> 1.0.0"}]
end
  1. Ensure Tabula is started before your application:
def application do
[applications: [:tabula]]
end

Let's get down to business 🍻

Examples

defmodule Demo do
use Tabula, style: :github_md
def run do
[ %{"name" => "Joe", "age" => 31, "city" => "New York"},
%{"name" => "Adam", "age" => 33, "city" => "Warsaw"},
%{"name" => "Yolanda", "age" => 28, "city" => "Berlin"}
] |> print_table
end
end

Demo.run yields:

age | city | name
--- | -------- | -------
31 | New York | Joe
33 | Warsaw | Adam
28 | Berlin | Yolanda

Which renders in GitHub markdown as:

agecityname
31New YorkJoe
33WarsawAdam
28BerlinYolanda

Alternatively, you can use the default :org_mode style:

defmodule Demo do
def run do
Code.get_docs(Atom, :docs)
|> Enum.sort
|> Enum.map(fn {{function, arity}, _line, _kind, _signature, text} ->
%{"function" => function,
"arity" => arity,
"text" => text |> String.split("\n") |> Enum.at(0) }
end) |> Tabula.print_table
end
end

So that Demo.run yields:

arity | function | text
------+---------------+---------------------------------
1 | :to_char_list | Converts an atom to a char list.
1 | :to_string | Converts an atom to a string.

You can specify the columns you want to render. If you wish Tabula to automatically index your rows, you need to provide it with a special # key:

iex(1)> Repo.all(Account) |> Tabula.print_table(only: ["#", :name, :key])
# | :name | :key
----+----------+-----------------------------
1 | Adam | e1210f10a721485be4ad50604cda
2 | Thomas | c0ae1f149298ffded9f41a828cf5

If in doubt, please consult the tests.

MaybeFutureFeatures

If time permits I would like to implement the following extensions (contributions very much welcome!):

Contact

Author: Adam Rutkowski <hq@mtod.org>, freenode: hq1