项目作者: aerosol

项目描述 :
:u7533: Pretty printer for maps/structs collections (Elixir)
高级语言: Elixir
项目地址: git://github.com/aerosol/Tabula.git
创建时间: 2015-10-12T20:04:11Z
项目社区:https://github.com/aerosol/Tabula

开源协议:MIT License

下载


SWUbanner

Tabula

Build Status
Hex.pm

Tabula can transform a list of maps (structs too, e.g.
Ecto models) or Keywords
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:

    1. def deps do
    2. [{:tabula, "~> 2.1.1"}]
    3. end
  2. Ensure Tabula is started before your application:

    1. def application do
    2. [applications: [:tabula]]
    3. end

Let’s get down to business :beers:

Examples

  1. defmodule Demo do
  2. use Tabula, style: :github_md
  3. def run do
  4. [ %{"name" => "Joe", "age" => 31, "city" => "New York"},
  5. %{"name" => "Adam", "age" => 33, "city" => "Warsaw"},
  6. %{"name" => "Yolanda", "age" => 28, "city" => "Berlin"}
  7. ] |> print_table
  8. end
  9. end

Demo.run yields:

  1. age | city | name
  2. --- | -------- | -------
  3. 31 | New York | Joe
  4. 33 | Warsaw | Adam
  5. 28 | Berlin | Yolanda

Which renders in GitHub markdown as:

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

Alternatively, you can use the default :org_mode style:

  1. defmodule Demo do
  2. def run do
  3. Code.get_docs(Atom, :docs)
  4. |> Enum.sort
  5. |> Enum.map(fn {{function, arity}, _line, _kind, _signature, text} ->
  6. %{"function" => function,
  7. "arity" => arity,
  8. "text" => text |> String.split("\n") |> Enum.at(0) }
  9. end) |> Tabula.print_table
  10. end
  11. end

So that Demo.run yields:

  1. arity | function | text
  2. ------+---------------+---------------------------------
  3. 1 | :to_char_list | Converts an atom to a char list.
  4. 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:

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

You can use render_table to return an iolist of the rendered data,
if you wish not to write to stdout.

Struct values will be printed using their string representation, provided
String.Chars is implemented. If in doubt, please consult the tests.

MaybeFutureFeatures

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

  • ANSI styles, because we all love colored output, don’t we?
  • Custom formatters
  • Cell contents wrapping
  • Option to define max table width

Contributors

Adam Rutkowski - https://twitter.com/hq1aerosol

Adrian Gruntkowski - https://twitter.com/adrgrunt

Gian D - https://twitter.com/fusillicode

Wojtek Mach - https://twitter.com/wojtekmach