Packages
tableau
0.27.1
0.30.0
0.29.0
0.28.0
0.27.1
0.27.0
0.26.1
0.26.0
0.25.1
0.25.0
0.24.1
0.24.0
0.23.1
0.23.0
0.22.0
0.21.0
0.20.1
0.20.0
0.19.0
0.18.0
0.17.1
0.17.0
0.16.0
0.15.3
0.15.2
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.1
0.7.0
0.6.0
0.5.0
0.4.0
0.3.1
0.3.0
0.2.0
0.1.2
0.1.1
0.1.0
Static site generator for elixir
Current section
Files
Jump to
Current section
Files
lib/tableau/extensions/data_extension.ex
defmodule Tableau.DataExtension do
@moduledoc """
YAML files and Elixir scripts (.exs) in the configured directory will be automatically parsed/executed and made available in an `@data` assign in your templates.
Elixir scripts will be executed and the last expression returned as the data.
## Configuration
- `:enabled` - boolean - Extension is active or not.
- `:dir` - string - Directory to scan for data files. Defaults to `_data`
### Example
```elixir
config :tableau, Tableau.DataExtension,
enabled: true,
dir: "_facts"
```
<!-- tabs-open -->
### YAML
```yaml
# _facts/homies.yaml
- name: Mitch
- name: Jimbo
- name: Bobby
```
```heex
<ul>
<li :for={homie <- @data["homies"]}>
<%= homie.name %>
</li>
</ul>
```
### Elixir
```elixir
# _facts/homies.exs
resp = Req.get!("https://example.com/homies")
resp.body["homies"]
```
```heex
<ul>
<li :for={homie <- @data["homies"]}>
<%= homie.name %>
</li>
</ul>
```
<!-- tabs-close -->
"""
use Tableau.Extension, key: :data, priority: 200
import Schematic
@impl Tableau.Extension
def config(config) do
unify(
map(%{
optional(:enabled, true) => bool(),
optional(:dir, "_data") => str()
}),
config
)
end
@impl Tableau.Extension
def pre_build(token) do
data =
for file <- Path.wildcard(Path.join(token.extensions.data.config.dir, "**/*.{yml,yaml,exs}")), into: %{} do
case Path.extname(file) do
".exs" ->
key = Path.basename(file, ".exs")
{result, _binding} = Code.eval_file(file)
{key, result}
yaml when yaml in ~w[.yml .yaml] ->
key =
file
|> Path.basename(".yaml")
|> Path.basename(".yml")
{key, YamlElixir.read_from_file!(file)}
end
end
{:ok, Map.put(token, :data, data)}
end
end