ymlr - A YAML encoder for Elixir.
The package can be installed by adding ymlr to your list of dependencies in mix.exs:
def deps do
[
{:ymlr, "~> 5.0"}
]
endSee The usage livebook usage.livemd for more detailed examples.
iex> Ymlr.document!(%{a: 1})
"""
---
a: 1
"""
iex> Ymlr.document!({"comment", %{a: 1}})
"""
---
# comment
a: 1
"""
iex> Ymlr.document!({["comment 1", "comment 2"], %{"a" => "a", "b" => :b, "c" => "true", "d" => "100"}})
"""
---
# comment 1
# comment 2
a: a
b: b
c: 'true'
d: '100'
"""iex> Ymlr.documents!([%{a: 1}, %{b: 2}])
"""
---
a: 1
---
b: 2
"""By default, atoms as map keys are encoded as strings (without the leading
colon). If you want atoms to be encoded with a leading colon in order to be able
to parse it later using YamlElixir's atoms
option, you can
pass atoms: true as second argument to any of the Ymlr module's functions:
iex> Ymlr.document!(%{a: 1}, atoms: true)
"""
---
:a: 1
"""Maps in elixir, implemented by erlang :maps, internally are flatmaps or hashmaps by size.
Large maps will be encoded in strange order.
iex> 1..33 |> Map.new(&{&1, &1})|> Ymlr.document!() |> IO.puts
---
4: 4
25: 25
8: 8
...By using :sort_maps option, ymlr will encode all entries sorted.
iex> 1..33 |> Map.new(&{&1, &1})|> Ymlr.document!(sort_maps: true) |> IO.puts
---
1: 1
2: 2
3: 3
...This library does not claim to be particularly performant. We do have a script to benchmark encoding so we know if performance gets better or worse with changes.
You can find the last Benchmark in BENCHMARK.md
cd benchmark/
elixir run.exsWe're using mise-en-place to install and manage
tooling. Please install it and run
mise init before you start coding. This installs the toolchain and sets up the
git hooks via hk.
The hooks are configured in hk.pkl:
pre-commitrunsmix format(fixes are staged automatically) followed bymix credo --strictpre-pushrunsmix dialyzer
You can run the checks yourself at any time:
hk check --all # everything, read-only
hk fix --all # apply formatting fixes