# `Rivet.Migration`
[🔗](https://github.com/srevenant/rivet/blob/main/lib/rivet/migration/index.ex#L1)

# `rivet_config`

```elixir
@type rivet_config() :: %{
  app: String.t(),
  base: atom(),
  base_path: String.t(),
  models_root: String.t(),
  opts: Keyword.t(),
  tests_root: String.t()
}
```

# `rivet_error`

```elixir
@type rivet_error() :: {:error, String.t() | atom()}
```

# `rivet_migration_input_any`

```elixir
@type rivet_migration_input_any() ::
  rivet_migration_input_include()
  | rivet_migration_input_external()
  | rivet_migration_input_model()
```

# `rivet_migration_input_external`

```elixir
@type rivet_migration_input_external() :: %{
  external: String.t(),
  migrations: [rivet_migration_input_include()]
}
```

# `rivet_migration_input_include`

```elixir
@type rivet_migration_input_include() :: %{include: module(), prefix: integer()}
```

# `rivet_migration_input_model`

```elixir
@type rivet_migration_input_model() :: map()
```

# `rivet_migration_state`

```elixir
@type rivet_migration_state() :: %{
  idx: %{required(integer()) =&gt; t()},
  mods: %{required(atom()) =&gt; list()}
}
```

# `rivet_migrations`

```elixir
@type rivet_migrations() :: [t()]
```

# `rivet_state_result`

```elixir
@type rivet_state_result() :: {:ok, rivet_migration_state()} | rivet_error()
```

# `t`

```elixir
@type t() :: %Rivet.Migration{
  base: boolean(),
  external: nil | String.t(),
  include: nil | module(),
  index: nil | String.t(),
  migrations: nil | list(),
  model: nil | module(),
  module: nil | module(),
  parent: nil | module(),
  path: nil | String.t(),
  prefix: nil | integer(),
  version: integer()
}
```

# `as_module`

# `datestamp`

```
iex> datestamp(~N[2023-05-31 08:11:59])
"20230531081159"
iex> String.length(datestamp()) == 20
```

# `datestamp`

# `load_data_file`

```elixir
@spec load_data_file(String.t()) :: {:ok, [list()]} | rivet_error()
```

```
iex> load_data_file("nar")
{:error, "Cannot find file 'nar'"}
iex> load_data_file("test/support/rivet_test_input")
{:error, "Cannot load file 'test/support/rivet_test_input': Invalid contents"}

# force an error
iex> load_data_file("LICENSE.txt")
{:error, "Cannot load file 'LICENSE.txt': keyword argument must be followed by space after: http:"}
```

# `maxlen_in`

```
iex> maxlen_in(["a", "bcde", "fgh", "xyzabcdef"])
9
```

# `migration_model`

```
iex> migration_model(This.Narf.Migrations)
"Narf"
iex> migration_model(This.Narf.Not)
"Not"
```

# `module_extend`

```
iex> module_extend(This.Module, Narf)
This.Module.Narf
```

# `module_pop`

```
iex> module_pop(This.Module.Narf)
This.Module
```

# `nodot`

```
iex> nodot("this/narf/not.ex")
["this", "narf", "not.ex"]
iex> nodot("./narf/not.ex")
["narf", "not.ex"]
```

# `pad`

```
iex> pad("x", 4)
"000x"
iex> pad("4", -4)
"4000"
iex> pad(4, -4)
"4000"
iex> pad(4, 4)
"0004"
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
