# Source: read codebases.

```elixir
Mix.install([
  # {:kino_vega_lite, "~> 0.1.11"},
  {:source, path: "~/share/gram/source"},
  # {:source, "~> 0.1.0"},
  {:kino, "~> 0.19.0"},
  {:cachex, "~> 4.0"},
  {:kino_explorer, "~> 0.1"},
],
  config: [
    source: [
      bases: [
        {"~/share/gram/*", :gram},
        {"~/page", :page},
        {"~/read", :read}
      ],
      local: true,
      cache: false
] ] )
```

## Config

There are a few config options you can use for this package.
For this livebook, see the config options used in the earlier 'Notebook dependencies and setup'.

<!-- livebook:{"force_markdown":true} -->

```elixir
import Config

config :source,
  bases: [
    {"~/share/gram/*", :gram},
    {"~/page", :page},
    {"~/read", :read}
  ],
  local: true,
  cache: false
```

```elixir
Application.fetch_env!(:source, :bases) |> Map.new
```

```elixir
Source.Scheme.scheme(:gram)
|> Enum.map(& Path.basename(&1))
```

```elixir
"nue"
|> Source.Scheme.base(:gram)
|> Source.measure("README.md")
|> Kino.Markdown.new()
```

````elixir
Kino.Markdown.new("```nu
#{"nue"
|> Source.Scheme.base(:gram)
|> Source.measure("cache.nu")
}
```")
````

```elixir
Source.Page.query() |> Enum.map(& &1.key)
```

```elixir
Source.Page.query_by_key!("happy")
|> Map.get(:body)
|> Kino.Markdown.new
```

```elixir
"nue" |> Source.Scheme.base(:gram) |> Source.changes_by_day
```

```elixir
base = "read"
|> Source.Scheme.base(:read)

read = (
  base
  |> Source.nodes()
  |> Enum.map(& Source.measure(base, &1.address))
  |> Enum.map(&YamlElixir.read_all_from_string!/1)
  |> List.flatten()
)
```

```elixir
read
|> Enum.filter(& &1)
|> Explorer.DataFrame.new
# |> Kino.Explorer.new
```
