Eunomo (eunomo v2.0.0)

Sorts alias, import and require definitions alphabetically.

The sorting does not happen globally. Instead each "block" is sorted separately. An "block" is a set of expressions that are not separated by at least one empty newline or other non-(alias,import,require) expressions. Note that the file is first formatter by the default Elixir code formatter!

Only the order of lines is modified by this formatter. Neither the overall number of lines nor the content of a single line will change.

Besides the options Code.format_string!/2 and Mix.Tasks.Format, the .formatter.exs file supports the following Eunomo specific options:

  • :eunomo_opts (a keyword list) - toggles expressions to be sorted. Available switches:

    • sort_alias: :boolean
    • sort_import: :boolean
    • sort_require: :boolean

    By default all are false & the behavior is identical to the default formatter.

A complete my_app's .formatter.exs would look like this:

# my_app/.formatter.exs
[
  plugins: [Eunomo],
  eunomo_opts: [
    sort_alias: true,
    sort_import: true,
    sort_require: true
  ],
  inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
]

examples

Examples

Sorting only alias expressions:

iex> code_snippet = """
...> alias Eunomo.Z.{L, I}
...> alias Eunomo.Z
...> alias __MODULE__.B
...> alias __MODULE__.A
...> alias Eunomo.C
...> alias Eunomo.{
...>   L,
...>   B,
...>   # test
...> }
...> \nalias Eunomo.PG.Repo
...> alias A
...> alias Eunomo.Patient
...> """
...> Eunomo.format(code_snippet, [eunomo_opts: [sort_alias: true]])
"""
alias __MODULE__.A
alias __MODULE__.B
alias Eunomo.C
alias Eunomo.Z
alias Eunomo.Z.{L, I}
\nalias Eunomo.{
  L,
  B
  # test
}
\nalias A
alias Eunomo.Patient
alias Eunomo.PG.Repo
"""

Sorting only import expressions:

iex> code_snippet = """
...> import Eunomo.Z.{L, I}
...> import Eunomo.Z, only: [hello_world: 0]
...> import B, expect: [callback: 1]
...> import Eunomo.C
...> import Eunomo.{
...>   L,
...>   B,
...>   # test
...> }
...> \nimport Eunomo.PG.Repo
...> import A
...> import Eunomo.Patient
...> """
...> Eunomo.format(code_snippet, [eunomo_opts: [sort_import: true]])
"""
import B, expect: [callback: 1]
import Eunomo.C
import Eunomo.Z, only: [hello_world: 0]
import Eunomo.Z.{L, I}
\nimport Eunomo.{
  L,
  B
  # test
}
\nimport A
import Eunomo.Patient
import Eunomo.PG.Repo
"""

Sorting only require expressions:

iex> code_snippet = """
...> require Eunomo.Z.{L, I}
...> require Eunomo.Z
...> require Eunomo.C
...> require Eunomo.{
...>   L,
...>   B,
...>   # test
...> }
...> \nrequire Eunomo.PG.Repo
...> require A
...> require Eunomo.Patient
...> """
...> Eunomo.format(code_snippet, [eunomo_opts: [sort_require: true]])
"""
require Eunomo.C
require Eunomo.Z
require Eunomo.Z.{L, I}
\nrequire Eunomo.{
  L,
  B
  # test
}
\nrequire A
require Eunomo.Patient
require Eunomo.PG.Repo
"""