Packages
io_ansi_table
0.3.6
1.0.40
1.0.39
1.0.38
1.0.37
1.0.36
1.0.34
1.0.33
1.0.32
1.0.31
1.0.30
1.0.29
1.0.28
1.0.27
1.0.26
1.0.25
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.4.32
0.4.31
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Writes data to "stdio" in a table with borders and colors. Can choose a table style to change the look of the table.
Current section
Files
Jump to
Current section
Files
lib/io/ansi/table.ex
# ┌───────────────────────────────────────────────────────────┐
# │ Inspired by the book "Programming Elixir" by Dave Thomas. │
# └───────────────────────────────────────────────────────────┘
defmodule IO.ANSI.Table do
@moduledoc """
Prints data to STDOUT in a table with borders and colors.
Can choose a table style among the 35 already predefined.
"""
use PersistConfig
alias IO.ANSI.Table.{Server, Style}
@async Application.get_env(@app, :async)
@doc """
Same as `format/2` but will use configured options.
"""
@spec format([Access.container]) :: :ok
if @async do
def format(maps), do: GenServer.cast(Server, {maps})
else
def format(maps), do: GenServer.call(Server, {maps})
end
@doc """
Prints data from `maps` to STDOUT in a table tailored by `options`.
The columns are identified by the `:headers` option (`map` keys).
We calculate the width of each column to fit the longest element
in that column, also considering the column heading.
However, the `:max_width` option prevails.
If the `:count` option is positive, we format the first _n_
`maps` in the list, once sorted. If negative, the last _n_ ones.
See `IO.ANSI.Table.Options` for examples of all options.
## Parameters
- `maps` - list of maps/keywords/structs (list)
- `options` - up to 10 options all configurable (keyword)
## Options
- `:align_specs` - to align column elements (list)
- `:bell` - ring the bell? (boolean)
- `:count` - number of `maps` to format (integer)
- `:headers` - to identify each column (list)
- `:header_fixes` - to alter the `headers` (map)
- `:margins` - to position the table (keyword)
- `:max_width` - to cap column widths (non_neg_integer)
- `:sort_specs` - to sort the `maps` (list)
- `:sort_symbols` - to denote sort direction (keyword)
- `:style` - table style (atom)
## Table styles
#{Style.texts(" - `&style`&filler - ¬e\n")}
## Examples
alias IO.ANSI.Table
people = [
%{name: "Mike", likes: "ski, arts", dob: "1992-04-15"},
%{name: "Mary", likes: "reading" , dob: "1985-07-11"},
%{name: "Ray" , likes: "cycling" , dob: "1977-08-28"}
]
Table.format(
people, bell: true, count: 3, style: :dark,
headers: [:name, :dob, :likes],
header_fixes: %{~r[^dob$]i => "Date of Birth"},
sort_specs: [:dob],
align_specs: [center: :dob],
margins: [top: 2, bottom: 2]
)
## 
"""
@spec format([Access.container], Keyword.t) :: :ok
if @async do
def format(maps, options), do: GenServer.cast(Server, {maps, options})
else
def format(maps, options), do: GenServer.call(Server, {maps, options})
end
end