Packages
igniter
0.4.4
0.8.2
0.8.1
0.8.0
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.30
0.6.29
0.6.28
0.6.27
0.6.26
0.6.25
0.6.24
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.52
0.5.51
0.5.50
0.5.49
0.5.48
0.5.47
0.5.46
0.5.45
0.5.44
0.5.43
0.5.42
0.5.41
0.5.40
0.5.39
0.5.38
0.5.37
0.5.36
0.5.35
0.5.34
0.5.33
0.5.32
0.5.31
0.5.30
0.5.29
0.5.28
0.5.27
0.5.26
0.5.25
0.5.24
0.5.23
0.5.22
0.5.21
0.5.20
0.5.19
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.78
0.3.77
0.3.76
0.3.75
0.3.74
0.3.73
0.3.72
0.3.71
0.3.70
0.3.69
0.3.68
0.3.67
0.3.66
0.3.65
0.3.64
0.3.63
0.3.62
0.3.61
0.3.60
0.3.59
0.3.58
0.3.57
0.3.56
0.3.55
0.3.54
0.3.53
0.3.52
0.3.51
0.3.50
0.3.49
0.3.48
0.3.47
0.3.46
0.3.45
0.3.44
0.3.43
0.3.42
0.3.41
0.3.40
0.3.39
0.3.38
0.3.37
0.3.36
0.3.35
0.3.34
0.3.33
0.3.32
0.3.31
0.3.30
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A code generation and project patching framework
Current section
Files
Jump to
Current section
Files
lib/igniter/project/formatter.ex
defmodule Igniter.Project.Formatter do
@moduledoc "Codemods and utilities for interacting with `.formatter.exs` files"
alias Igniter.Code.Common
alias Sourceror.Zipper
@default_formatter """
# Used by "mix format"
[
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
]
"""
@doc """
Adds a new dep to the list of imported deps in the root `.formatter.exs`
"""
@spec import_dep(Igniter.t(), dep :: atom) :: Igniter.t()
def import_dep(igniter, dep) do
igniter
|> Igniter.include_or_create_file(".formatter.exs", @default_formatter)
|> Igniter.update_elixir_file(".formatter.exs", fn zipper ->
zipper
|> Zipper.down()
|> case do
nil ->
code =
quote do
[import_deps: [unquote(dep)]]
end
{:ok, Common.add_code(zipper, code)}
zipper ->
zipper
|> Zipper.rightmost()
|> Igniter.Code.Keyword.put_in_keyword([:import_deps], [dep], fn nested_zipper ->
Igniter.Code.List.prepend_new_to_list(
nested_zipper,
dep
)
end)
|> case do
{:ok, zipper} ->
zipper
:error ->
{:warning,
"""
Could not import dependency #{inspect(dep)} into `.formatter.exs`.
Please add the import manually, i.e
import_deps: [#{inspect(dep)}]
"""}
end
end
end)
end
@doc """
Removes an imported dep from the list of imported deps in the root `.formatter.exs`
"""
@spec remove_imported_dep(Igniter.t(), dep :: atom) :: Igniter.t()
def remove_imported_dep(igniter, dep) do
igniter
|> Igniter.include_or_create_file(".formatter.exs", @default_formatter)
|> Igniter.update_elixir_file(".formatter.exs", fn zipper ->
zipper
|> Zipper.down()
|> case do
nil ->
{:ok, zipper}
zipper ->
zipper
|> Zipper.rightmost()
|> Igniter.Code.Keyword.put_in_keyword([:import_deps], [], fn nested_zipper ->
Igniter.Code.List.remove_from_list(
nested_zipper,
&Igniter.Code.Common.nodes_equal?(&1, dep)
)
end)
|> case do
{:ok, zipper} ->
zipper
:error ->
{:warning,
"""
Could not remove imported dependency #{inspect(dep)} from `.formatter.exs`.
Please remove the import manually, i.e replacing
import_deps: [:foo, #{inspect(dep)}, :bar]
with
import_deps: [:foo, :bar]
"""}
end
end
end)
end
@doc """
Adds a new plugin to the list of plugins in the root `.formatter.exs`
"""
@spec add_formatter_plugin(Igniter.t(), plugin :: module()) :: Igniter.t()
def add_formatter_plugin(igniter, plugin) do
igniter
|> Igniter.include_or_create_file(".formatter.exs", @default_formatter)
|> Igniter.update_elixir_file(".formatter.exs", fn zipper ->
zipper
|> Zipper.down()
|> case do
nil ->
code =
quote do
[plugins: [unquote(plugin)]]
end
{:ok, Common.add_code(zipper, code)}
zipper ->
zipper
|> Zipper.rightmost()
|> Igniter.Code.Keyword.put_in_keyword(
[:plugins],
[plugin],
fn nested_zipper ->
Igniter.Code.List.prepend_new_to_list(
nested_zipper,
plugin
)
end
)
|> case do
{:ok, zipper} ->
{:ok, zipper}
_ ->
{:warning,
"""
Could not add formatter plugin #{inspect(plugin)} into `.formatter.exs`.
Please add the plugin manually, i.e
plugins: [#{inspect(plugin)}]
"""}
end
end
end)
end
@doc """
REmoves a plugin to the list of plugins in the root `.formatter.exs`
"""
@spec remove_formatter_plugin(Igniter.t(), plugin :: module()) :: Igniter.t()
def remove_formatter_plugin(igniter, plugin) do
igniter
|> Igniter.include_or_create_file(".formatter.exs", @default_formatter)
|> Igniter.update_elixir_file(".formatter.exs", fn zipper ->
zipper
|> Zipper.down()
|> case do
nil ->
{:ok, zipper}
zipper ->
zipper
|> Zipper.rightmost()
|> Igniter.Code.Keyword.put_in_keyword(
[:plugins],
[],
fn nested_zipper ->
Igniter.Code.List.remove_from_list(
nested_zipper,
&Igniter.Code.Common.nodes_equal?(&1, plugin)
)
end
)
|> case do
{:ok, zipper} ->
zipper
_ ->
{:warning,
"""
Could not remove formatter plugin #{inspect(plugin)} from `.formatter.exs`.
Please remove the plugin manually, i.e by replacing
plugins: [Foo, #{inspect(plugin)}, Bar]
with
plugins: [Foo, Bar]
"""}
end
end
end)
end
end