View Source Mix Configs

THIS CAN BREAK YOUR PROGRAM

It's important to double check your configuration after running Quokka on it for the first time.

This can be enabled or disabled by setting the exclude: :configs option in your .formatter.exs file. See the README for more information.

Mix Config files have their config stanzas sorted. Similar to the sorting of aliases, this delivers consistency to an otherwise arbitrary world, and can even help catch bugs like configuring the same key multiple times.

A file is considered a config file if

  1. its path matches ~r|config/.*\.exs| ~r|rel/overlays/.*\.exs|
  2. the file has import Config

Once a file is detected as a mix config, its config/2,3 stanzas are grouped and ordered like so:

  • group config stanzas separated by assignments (x = y) together
  • sort each group according to erlang term sorting
  • move all existing assignments between the config stanzas to above the stanzas (without changing their ordering)

Imagine your application configures the same value twice, once with an invalid or application breaking value, and then again with a correct value, like so:

string = "i am a string"
atom = :i_am_an_atom

config :my_app, value_must_be_an_atom: string
...
...
config :my_app, value_must_be_an_atom: atom

When quokka sorts the configuration file, this dormant mistake can become a bug if the sorting changes the order such that the invalid value takes precedence (aka comes last)

string = "i am a string"
atom = :i_am_an_atom

# The value that must be an atom is now a string!
config :my_app, value_must_be_an_atom: atom
config :my_app, value_must_be_an_atom: string

Examples

Sorts configs by erlang term ordering:

# Given
import Config

config :z, :x, :c
config :a, :b, :c
config :y, :x, :z
config :a, :c, :d

# Styled:
import Config

config :a, :b, :c
config :a, :c, :d

config :y, :x, :z

config :z, :x, :c

Non-config statements break the file up into chunks, where each chunk is sorted separately relative to itself.

# Given
import Config

config :z, :x, :c
config :a, :b, :c
var = "value"
config :y, :x, var
config :a, :c, var

# Styled:
import Config

config :a, :b, :c
config :z, :x, :c

var = "value"

config :a, :c, var
config :y, :x, var